Project

General

Profile

Actions

Bug #21193

open

Inherited callback returns `nil` for `Object.const_source_location`

Added by eileencodes (Eileen Uchitelle) 8 days ago. Updated 8 days ago.


Description

Since https://github.com/ruby/ruby/pull/12927 the inherited callback no longer can access the Object.const_source_location. A simplified reproduction is the following:

class A
  def self.inherited(other)
    super
    p Object.const_source_location(other.name)
  end 
end

class B < A 
end

Prior to this change Object.const_source_location(other.name) would return ["test.rb", 8] and now returns nil.

Shopify's application uses the inherited callback to load configuration classes and since it's unable to find these classes they aren't loaded when they are called. It's not clear if this was intended or if there's a workaround. In chatting with folks at GitHub, they have a similar issue (although that case sounds less straightforward). A more accurate example of what we have (I did strip this down a bunch too):


def self.inherited(config)
  return super unless config.superclass == Config

  if (class_name = config.name) &&
    (config_location = Object.const_source_location(class_name)) &&
    (parent_dirname = File.dirname(config_location[0]))
    config_dirname = File.join(parent_dirname, "config")
      config.autoload(:Something, File.join(config_dirname, "something.rb"))
  end

  super
end

Original issue: https://bugs.ruby-lang.org/issues/21143

cc/ @byroot (Jean Boussier) @fxn


Related issues 1 (0 open1 closed)

Related to Ruby - Misc #21143: Speficy order of execution const_added vs inheritedFeedbackActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like1Like0Like0Like0Like0Like0