Skip to content

Commit 4b017e4

Browse files
committed
Fix type resolution failures on property/routine attribute lists
Specifically... - `PropertyNameDeclaration::attributeTypes` were always unknown. - `RoutineNameDeclaration::attributeTypes` were unknown for implementation-local routines.
1 parent c9771bf commit 4b017e4

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2525
### Fixed
2626

2727
- Grammar ambiguity causing attributes to be misinterpreted as interface GUIDs.
28+
- Type resolution failures on property attribute lists.
29+
- Type resolution failures on implementation-local routine attribute lists.
2830

2931
## [1.16.0] - 2025-05-09
3032

delphi-frontend/src/main/java/au/com/integradev/delphi/antlr/ast/visitors/SymbolTableVisitor.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import javax.annotation.Nullable;
6464
import org.sonar.plugins.communitydelphi.api.ast.AnonymousMethodNode;
6565
import org.sonar.plugins.communitydelphi.api.ast.ArrayConstructorNode;
66+
import org.sonar.plugins.communitydelphi.api.ast.AttributeListNode;
6667
import org.sonar.plugins.communitydelphi.api.ast.AttributeNode;
6768
import org.sonar.plugins.communitydelphi.api.ast.CaseItemStatementNode;
6869
import org.sonar.plugins.communitydelphi.api.ast.CaseStatementNode;
@@ -112,6 +113,7 @@
112113
import org.sonar.plugins.communitydelphi.api.ast.RepeatStatementNode;
113114
import org.sonar.plugins.communitydelphi.api.ast.RoutineBodyNode;
114115
import org.sonar.plugins.communitydelphi.api.ast.RoutineDeclarationNode;
116+
import org.sonar.plugins.communitydelphi.api.ast.RoutineHeadingNode;
115117
import org.sonar.plugins.communitydelphi.api.ast.RoutineImplementationNode;
116118
import org.sonar.plugins.communitydelphi.api.ast.RoutineNameNode;
117119
import org.sonar.plugins.communitydelphi.api.ast.RoutineNode;
@@ -824,6 +826,23 @@ public Data visit(PrimaryExpressionNode node, Data data) {
824826
return data;
825827
}
826828

829+
@Override
830+
public Data visit(AttributeListNode node, Data data) {
831+
DelphiNode parent = node.getParent();
832+
833+
if (parent instanceof PropertyNode) {
834+
// Already resolved by the PropertyNode visit.
835+
return data;
836+
}
837+
838+
if (parent instanceof RoutineHeadingNode) {
839+
// Already resolved by the RoutineNode visit.
840+
return data;
841+
}
842+
843+
return DelphiParserVisitor.super.visit(node, data);
844+
}
845+
827846
@Override
828847
public Data visit(AttributeNode node, Data data) {
829848
data.nameResolutionHelper.resolve(node);

delphi-frontend/src/main/java/au/com/integradev/delphi/symbol/resolve/NameResolutionHelper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ public void resolve(NameReferenceNode reference) {
167167
resolver.addToSymbolTable();
168168
}
169169

170+
private void resolve(@Nullable AttributeListNode attributeList) {
171+
if (attributeList != null) {
172+
attributeList.getAttributes().forEach(this::resolve);
173+
}
174+
}
175+
170176
public void resolve(AttributeNode attribute) {
171177
NameResolver resolver = createNameResolver();
172178
resolver.readAttribute(attribute);
@@ -255,6 +261,7 @@ public void resolve(MethodResolutionClauseNode resolutionClause) {
255261
}
256262

257263
public void resolve(PropertyNode property) {
264+
resolve(property.getAttributeList());
258265
resolve(property.getParameterListNode());
259266

260267
TypeNode type = property.getTypeNode();
@@ -427,6 +434,7 @@ private static boolean isBareInterfaceRoutineReference(
427434
}
428435

429436
private void resolveRoutine(RoutineNode routine) {
437+
resolve(routine.getRoutineHeading().getAttributeList());
430438
SearchMode previousSearchMode = searchMode;
431439
try {
432440
searchMode = SearchMode.ROUTINE_HEADING;

0 commit comments

Comments
 (0)