Skip to content

Commit 347508b

Browse files
fourlscirras
authored andcommitted
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 347508b

File tree

4 files changed

+25
-4
lines changed

4 files changed

+25
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5959
- Name resolution failures when accessing ancestors of enclosing types from nested type methods.
6060
- Name resolution failures on invocations of methods with generic open array parameters.
6161
- Name resolution failures around `Create` calls on types with `constructor` constraints.
62-
- Name resolution failures on `read` and `write` specifiers of indexed properties.
62+
- Name resolution failures on `read`, `write`, and `stored` specifiers of indexed properties.
6363
- Incorrect file position calculation for multiline string tokens.
6464
- Analysis errors around `type of` type declarations.
6565

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

Lines changed: 18 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,14 @@ 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+
storedResolver.disambiguateParameters(getStorageParameterTypes(property));
280+
storedResolver.addToSymbolTable();
281+
}
272282
}
273283

274284
private List<Type> getGetterParameterTypes(PropertyNode property) {
@@ -290,6 +300,14 @@ private List<Type> getSetterParameterTypes(PropertyNode property) {
290300
return parameterTypes;
291301
}
292302

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

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)