diff --git a/lib/tapioca/runtime/trackers/constant_definition.rb b/lib/tapioca/runtime/trackers/constant_definition.rb index a05270c80..21c1afa5a 100644 --- a/lib/tapioca/runtime/trackers/constant_definition.rb +++ b/lib/tapioca/runtime/trackers/constant_definition.rb @@ -10,6 +10,12 @@ module Trackers # available in the ruby runtime without extra accounting. module ConstantDefinition extend Reflection + extend T::Sig + + class ConstantLocation < T::Struct + const :lineno, Integer + const :path, String + end @class_files = {} @@ -18,13 +24,19 @@ module ConstantDefinition unless tp.self.singleton_class? key = name_of(tp.self) file = tp.path + lineno = tp.lineno + if file == "(eval)" - file = T.must(caller_locations) + caller_location = T.must(caller_locations) .drop_while { |loc| loc.path == "(eval)" } - .first&.path + .first + + file = caller_location&.path + lineno = caller_location&.lineno end + @class_files[key] ||= Set.new - @class_files[key] << file + @class_files[key] << ConstantLocation.new(path: T.must(file), lineno: T.must(lineno)) end end @@ -33,8 +45,8 @@ module ConstantDefinition # or where metaprogramming was used via +eval+, etc. def self.files_for(klass) name = String === klass ? klass : name_of(klass) - files = @class_files[name] - files || Set.new + files = @class_files.fetch(name, []) + files.map(&:path).to_set end end end