diff --git a/lib/ruby_indexer/lib/ruby_indexer/index.rb b/lib/ruby_indexer/lib/ruby_indexer/index.rb index bc3692753..ca4b18f21 100644 --- a/lib/ruby_indexer/lib/ruby_indexer/index.rb +++ b/lib/ruby_indexer/lib/ruby_indexer/index.rb @@ -907,6 +907,9 @@ def resolve_alias(entry, seen_names) target = resolve(entry.target, entry.nesting, seen_names) return entry unless target + # Self referential alias can be unresolved we should bail out from resolving + return entry if target.first == entry + target_name = target.first #: as !nil .name resolved_alias = Entry::ConstantAlias.new(target_name, entry) diff --git a/lib/ruby_indexer/test/index_test.rb b/lib/ruby_indexer/test/index_test.rb index 5c39ef3b9..52a2d939d 100644 --- a/lib/ruby_indexer/test/index_test.rb +++ b/lib/ruby_indexer/test/index_test.rb @@ -1175,6 +1175,23 @@ module D assert_equal("A::B::C", entry.target) end + def test_resolving_non_existing_self_referential_constant_alias + index(<<~RUBY) + module Foo + SomeClass = ::SomeClass + UNRESOLVED = SomeClass::CONSTANT + end + RUBY + + entry = @index.resolve("Foo::UNRESOLVED", [])&.first #: as Entry::UnresolvedConstantAlias + assert_kind_of(Entry::UnresolvedConstantAlias, entry) + assert_equal(3, entry.location.start_line) + assert_equal("SomeClass::CONSTANT", entry.target) + + entry = @index.resolve("SomeClass::CONSTANT", ["Foo"]) + refute(entry) + end + def test_resolving_qualified_references index(<<~RUBY) module Namespace