Skip to content

Commit 957de68

Browse files
authored
Fix stack StackLevelError during self referential constant resolution (#3799)
* Fix stack StackLevelError during self referential constant resolution * Move test case and simplify it
1 parent d421abe commit 957de68

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

lib/ruby_indexer/lib/ruby_indexer/index.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,9 @@ def resolve_alias(entry, seen_names)
907907
target = resolve(entry.target, entry.nesting, seen_names)
908908
return entry unless target
909909

910+
# Self referential alias can be unresolved we should bail out from resolving
911+
return entry if target.first == entry
912+
910913
target_name = target.first #: as !nil
911914
.name
912915
resolved_alias = Entry::ConstantAlias.new(target_name, entry)

lib/ruby_indexer/test/index_test.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,6 +1175,23 @@ module D
11751175
assert_equal("A::B::C", entry.target)
11761176
end
11771177

1178+
def test_resolving_non_existing_self_referential_constant_alias
1179+
index(<<~RUBY)
1180+
module Foo
1181+
SomeClass = ::SomeClass
1182+
UNRESOLVED = SomeClass::CONSTANT
1183+
end
1184+
RUBY
1185+
1186+
entry = @index.resolve("Foo::UNRESOLVED", [])&.first #: as Entry::UnresolvedConstantAlias
1187+
assert_kind_of(Entry::UnresolvedConstantAlias, entry)
1188+
assert_equal(3, entry.location.start_line)
1189+
assert_equal("SomeClass::CONSTANT", entry.target)
1190+
1191+
entry = @index.resolve("SomeClass::CONSTANT", ["Foo"])
1192+
refute(entry)
1193+
end
1194+
11781195
def test_resolving_qualified_references
11791196
index(<<~RUBY)
11801197
module Namespace

0 commit comments

Comments
 (0)