From 54b7e4a57ea40d5763448772bbfb17b6ec171f6b Mon Sep 17 00:00:00 2001 From: Vinicius Stock Date: Wed, 19 Jun 2024 10:36:44 -0400 Subject: [PATCH] Search aliased namespaces in the top level too (#2208) --- lib/ruby_indexer/lib/ruby_indexer/index.rb | 7 +--- lib/ruby_indexer/test/index_test.rb | 37 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/lib/ruby_indexer/lib/ruby_indexer/index.rb b/lib/ruby_indexer/lib/ruby_indexer/index.rb index 9e9225f70..dfbc3a0f3 100644 --- a/lib/ruby_indexer/lib/ruby_indexer/index.rb +++ b/lib/ruby_indexer/lib/ruby_indexer/index.rb @@ -204,7 +204,7 @@ def resolve(name, nesting, seen_names = []) return entries if entries # Finally, as a fallback, Ruby will search for the constant in the top level namespace - search_top_level(name, seen_names) + direct_or_aliased_constant(name, seen_names) rescue UnresolvableAliasError nil end @@ -604,11 +604,6 @@ def direct_or_aliased_constant(full_name, seen_names) entries&.map { |e| e.is_a?(Entry::UnresolvedAlias) ? resolve_alias(e, seen_names) : e } end - sig { params(name: String, seen_names: T::Array[String]).returns(T.nilable(T::Array[Entry])) } - def search_top_level(name, seen_names) - @entries[name]&.map { |e| e.is_a?(Entry::UnresolvedAlias) ? resolve_alias(e, seen_names) : e } - end - # Attempt to resolve a given unresolved method alias. This method returns the resolved alias if we managed to # identify the target or the same unresolved alias entry if we couldn't sig do diff --git a/lib/ruby_indexer/test/index_test.rb b/lib/ruby_indexer/test/index_test.rb index 77e6bd4be..ed4b1166d 100644 --- a/lib/ruby_indexer/test/index_test.rb +++ b/lib/ruby_indexer/test/index_test.rb @@ -1007,6 +1007,43 @@ module Namespace assert_instance_of(Entry::Alias, baz_entry) end + def test_resolving_constants_in_aliased_namespace + index(<<~RUBY) + module Original + module Something + CONST = 123 + end + end + + module Other + ALIAS = Original::Something + end + + module Third + Other::ALIAS::CONST + end + RUBY + + entry = T.must(@index.resolve("Other::ALIAS::CONST", ["Third"])&.first) + assert_kind_of(Entry::Constant, entry) + assert_equal("Original::Something::CONST", entry.name) + end + + def test_resolving_top_level_aliases + index(<<~RUBY) + class Foo + CONST = 123 + end + + FOO = Foo + FOO::CONST + RUBY + + entry = T.must(@index.resolve("FOO::CONST", [])&.first) + assert_kind_of(Entry::Constant, entry) + assert_equal("Foo::CONST", entry.name) + end + def test_resolving_top_level_compact_reference index(<<~RUBY) class Foo::Bar