diff --git a/CHANGELOG.md b/CHANGELOG.md index a2acccca9..e17dd6daa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - False positives on enumerator method `MoveNext` in `UnusedRoutine`. - False positives on enumerator property `Current` in `UnusedProperty`. - Name resolution failures in legacy initialization sections referencing the implementation section. +- Name resolution failures whena accessing ancestors of enclosing types from nested type methods. - Incorrect file position calculation for multiline string tokens. ## [1.15.0] - 2025-04-03 diff --git a/delphi-frontend/src/main/java/au/com/integradev/delphi/symbol/Search.java b/delphi-frontend/src/main/java/au/com/integradev/delphi/symbol/Search.java index a2e82664f..543f72922 100644 --- a/delphi-frontend/src/main/java/au/com/integradev/delphi/symbol/Search.java +++ b/delphi-frontend/src/main/java/au/com/integradev/delphi/symbol/Search.java @@ -253,14 +253,14 @@ private Set searchTypeScope(TypeScope scope) { private Set searchEnclosingTypes(@Nullable DelphiScope scope) { Set result = Collections.emptySet(); if (scope != null) { - TypeScope nextTypeScope = scope.getEnclosingScope(TypeScope.class); - if (nextTypeScope != null) { + TypeScope enclosingTypeScope = scope.getEnclosingScope(TypeScope.class); + if (enclosingTypeScope != null) { if (TRACE) { - LOG.info(" checking enclosing type scope {}", nextTypeScope); + LOG.info(" checking enclosing type scope {}", enclosingTypeScope); } - result = filterTypeScopeResults(nextTypeScope.findDeclaration(occurrence)); + result = searchTypeScope(enclosingTypeScope); if (result.isEmpty()) { - return searchEnclosingTypes(nextTypeScope.getParent()); + return searchEnclosingTypes(enclosingTypeScope.getParent()); } } } diff --git a/delphi-frontend/src/test/java/au/com/integradev/delphi/executor/DelphiSymbolTableExecutorTest.java b/delphi-frontend/src/test/java/au/com/integradev/delphi/executor/DelphiSymbolTableExecutorTest.java index 19970f82a..4c507128a 100644 --- a/delphi-frontend/src/test/java/au/com/integradev/delphi/executor/DelphiSymbolTableExecutorTest.java +++ b/delphi-frontend/src/test/java/au/com/integradev/delphi/executor/DelphiSymbolTableExecutorTest.java @@ -179,6 +179,7 @@ void testNestedTypes() { execute("NestedTypes.pas"); verifyUsages(7, 8, reference(20, 10), reference(21, 5)); verifyUsages(8, 26, reference(23, 4), reference(24, 4)); + verifyUsages(29, 20, reference(46, 2)); } @Test diff --git a/delphi-frontend/src/test/resources/au/com/integradev/delphi/symbol/NestedTypes.pas b/delphi-frontend/src/test/resources/au/com/integradev/delphi/symbol/NestedTypes.pas index 87fb836f7..a19161de5 100644 --- a/delphi-frontend/src/test/resources/au/com/integradev/delphi/symbol/NestedTypes.pas +++ b/delphi-frontend/src/test/resources/au/com/integradev/delphi/symbol/NestedTypes.pas @@ -24,4 +24,26 @@ procedure TFoo.TBaz.Test; B.DoStuff; end; +type + TFlimFlam = class + class procedure Flarp; + end; + + TFoo = class(TFlimFlam) + type + TBar = class + procedure Baz; + end; + end; + +class procedure TFlimFlam.Flarp; +begin + // do nothing +end; + +procedure TFoo.TBar.Baz; +begin + Flarp; +end; + end. \ No newline at end of file