Skip to content

Commit 7f83ebf

Browse files
committed
Disambiguate index property stored methods correctly
When a property has an `index` specifier, its `stored` specifier must be a function with a single `Integer` argument.
1 parent 46846b7 commit 7f83ebf

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
import org.sonar.plugins.communitydelphi.api.ast.PrimaryExpressionNode;
104104
import org.sonar.plugins.communitydelphi.api.ast.ProcedureTypeHeadingNode;
105105
import org.sonar.plugins.communitydelphi.api.ast.PropertyNode;
106+
import org.sonar.plugins.communitydelphi.api.ast.PropertyStoredSpecifierNode;
106107
import org.sonar.plugins.communitydelphi.api.ast.RecordTypeNode;
107108
import org.sonar.plugins.communitydelphi.api.ast.RecordVariantTagNode;
108109
import org.sonar.plugins.communitydelphi.api.ast.RepeatStatementNode;
@@ -517,6 +518,12 @@ public Data visit(PropertyNode node, Data data) {
517518
return createDeclarationScope(node, data);
518519
}
519520

521+
@Override
522+
public Data visit(PropertyStoredSpecifierNode node, Data data) {
523+
// Already resolved by the PropertyNode visit.
524+
return data;
525+
}
526+
520527
@Nullable
521528
private static PropertyNameDeclaration findConcretePropertyDeclaration(PropertyNode property) {
522529
if (!property.getType().isUnknown()) {

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import au.com.integradev.delphi.symbol.scope.RoutineScopeImpl;
3333
import au.com.integradev.delphi.type.generic.TypeParameterTypeImpl;
3434
import java.util.ArrayList;
35+
import java.util.Collections;
3536
import java.util.List;
3637
import java.util.Set;
3738
import java.util.stream.Collectors;
@@ -56,6 +57,7 @@
5657
import org.sonar.plugins.communitydelphi.api.ast.PropertyImplementsSpecifierNode;
5758
import org.sonar.plugins.communitydelphi.api.ast.PropertyNode;
5859
import org.sonar.plugins.communitydelphi.api.ast.PropertyReadSpecifierNode;
60+
import org.sonar.plugins.communitydelphi.api.ast.PropertyStoredSpecifierNode;
5961
import org.sonar.plugins.communitydelphi.api.ast.PropertyWriteSpecifierNode;
6062
import org.sonar.plugins.communitydelphi.api.ast.RecordExpressionItemNode;
6163
import org.sonar.plugins.communitydelphi.api.ast.RoutineDeclarationNode;
@@ -269,6 +271,16 @@ public void resolve(PropertyNode property) {
269271
if (impl != null) {
270272
impl.getTypeReferences().stream().map(TypeReferenceNode::getNameNode).forEach(this::resolve);
271273
}
274+
275+
PropertyStoredSpecifierNode stored = property.getStoredSpecifier();
276+
if (stored != null && stored.getExpression() instanceof PrimaryExpressionNode) {
277+
NameResolver storedResolver = createNameResolver();
278+
storedResolver.readPrimaryExpression((PrimaryExpressionNode) stored.getExpression());
279+
if (isResolvingRoutine(storedResolver)) {
280+
storedResolver.disambiguateParameters(getStorageParameterTypes(property));
281+
}
282+
storedResolver.addToSymbolTable();
283+
}
272284
}
273285

274286
private List<Type> getGetterParameterTypes(PropertyNode property) {
@@ -290,6 +302,14 @@ private List<Type> getSetterParameterTypes(PropertyNode property) {
290302
return parameterTypes;
291303
}
292304

305+
private List<Type> getStorageParameterTypes(PropertyNode property) {
306+
if (property.getIndexSpecifier() != null) {
307+
return List.of(typeFactory.getIntrinsic(IntrinsicType.INTEGER));
308+
} else {
309+
return Collections.emptyList();
310+
}
311+
}
312+
293313
public void resolve(RoutineDeclarationNode routine) {
294314
resolveRoutine(routine);
295315
}

delphi-frontend/src/test/java/au/com/integradev/delphi/executor/DelphiSymbolTableExecutorTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,11 @@ void testProperties() {
119119
// Alias getter
120120
verifyUsages(17, 13, reference(22, 33));
121121
// Index getter
122-
verifyUsages(29, 13, reference(32, 41));
122+
verifyUsages(29, 13, reference(33, 41));
123123
// Index setter
124-
verifyUsages(30, 14, reference(32, 58));
124+
verifyUsages(30, 14, reference(33, 58));
125+
// Index storage
126+
verifyUsages(31, 13, reference(33, 76));
125127
}
126128

127129
@Test

delphi-frontend/src/test/resources/au/com/integradev/delphi/symbol/Properties.pas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ TIndexObj = class(TObject)
2828

2929
function GetMyField(Index: Integer): TObject;
3030
procedure SetMyField(Index: Integer; Value: TObject);
31+
function IsStored(Index: Integer): Boolean;
3132
public
32-
property Prop1: TObject index 0 read GetMyField write SetMyField;
33+
property Prop1: TObject index 0 read GetMyField write SetMyField stored IsStored;
3334
end;
3435

3536
implementation

0 commit comments

Comments
 (0)