• G
    Fixed STI classes not defining an attribute method if there is a · 41554319
    Godfrey Chan 提交于
    conflicting private method defined on its ancestors.
    
    The problem is that `method_defined_within?(name, klass, superklass)`
    only works correclty when `klass` and `superklass` are both `Class`es.
    
    If both `klass` and `superklass` are both `Class`es, they share the
    same inheritance chain, so if a method is defined on `klass` but not
    `superklass`, this method must be introduced at some point between
    `klass` and `superklass`.
    
    This does not work when `superklass` is a `Module`. A `Module`'s
    inheritance chain contains just itself. So if a method is defined on
    `klass` but not on `superklass`, the method could still be defined
    somewhere upstream, e.g. in `Object`.
    
    This fix works by avoiding calling `method_defined_within?` with a
    module while still fufilling the requirement (checking that the
    method is defined withing `superclass` but not is not a generated
    attribute method).
    
    4d8ee288 is likely an attempted partial fix for this problem. This
    unrolls that fix and properly check the `superclass` as intended.
    
    Fixes #11569.
    41554319
attribute_methods.rb 16.0 KB