diff --git a/lib/rbs/resolver/constant_resolver.rb b/lib/rbs/resolver/constant_resolver.rb index 9c670111b2..02b1aac864 100644 --- a/lib/rbs/resolver/constant_resolver.rb +++ b/lib/rbs/resolver/constant_resolver.rb @@ -106,12 +106,17 @@ def load_context_constants(context) # @type var consts: Hash[Symbol, Constant] consts = {} + # Toplevel constants has the lowest precedence + consts.merge!(table.toplevel) if context if last = context[1] + # Ancestor constants has the next precedence constants_from_ancestors(last, constants: consts) end end + # Context (module nesting) constants has the next precedence constants_from_context(context, constants: consts) or return + # The constant itself comes the last constants_itself(context, constants: consts) context_constants_cache[context] = consts @@ -152,8 +157,6 @@ def constants_from_context(context, constants:) consts = table.children(last) or return false constants.merge!(consts) end - else - constants.merge!(table.toplevel) end true diff --git a/test/rbs/resolver/constant_resolver_test.rb b/test/rbs/resolver/constant_resolver_test.rb index 7b7fd0ef5e..de88b6b1f3 100644 --- a/test/rbs/resolver/constant_resolver_test.rb +++ b/test/rbs/resolver/constant_resolver_test.rb @@ -282,4 +282,27 @@ class Stuff end end end + + def test_reference_constant_toplevel + SignatureManager.new do |manager| + manager.files[Pathname("foo.rbs")] = <