Skip to content

Commit 8915f06

Browse files
cirrasfourls
authored andcommitted
Enable references to system types in intrinsic routine signatures
Now that we defer the injection of intrinsic routines into `System`, we can resolve public `System` types for intrinsic parameter types and return types.
1 parent 05603dc commit 8915f06

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

delphi-frontend/src/main/java/au/com/integradev/delphi/type/intrinsic/IntrinsicRoutine.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.sonar.plugins.communitydelphi.api.symbol.Qualifiable;
2626
import org.sonar.plugins.communitydelphi.api.symbol.QualifiedName;
2727
import org.sonar.plugins.communitydelphi.api.symbol.declaration.RoutineKind;
28+
import org.sonar.plugins.communitydelphi.api.symbol.declaration.TypedDeclaration;
29+
import org.sonar.plugins.communitydelphi.api.symbol.scope.DelphiScope;
2830
import org.sonar.plugins.communitydelphi.api.type.Type;
2931
import org.sonar.plugins.communitydelphi.api.type.TypeFactory;
3032

@@ -123,8 +125,9 @@ Builder hasDefaultValue(boolean hasDefaultValue) {
123125
return this;
124126
}
125127

126-
IntrinsicParameterData build() {
127-
return new IntrinsicParameterData(type, isOut, isVar, isConst, hasDefaultValue);
128+
IntrinsicParameterData build(DelphiScope scope) {
129+
Type resolvedType = resolveType(type, scope);
130+
return new IntrinsicParameterData(resolvedType, isOut, isVar, isConst, hasDefaultValue);
128131
}
129132
}
130133
}
@@ -185,26 +188,43 @@ Builder returns(Type returnType) {
185188
return this;
186189
}
187190

188-
IntrinsicRoutine build() {
191+
IntrinsicRoutine build(DelphiScope scope) {
189192
return new IntrinsicRoutine(
190-
routineName, buildParameters(), returnType, variadicParameter != null);
193+
routineName, buildParameters(scope), buildReturnType(scope), variadicParameter != null);
191194
}
192195

193-
private List<IntrinsicParameterData> buildParameters() {
196+
private List<IntrinsicParameterData> buildParameters(DelphiScope scope) {
194197
List<IntrinsicParameterData> result = new ArrayList<>();
195198

196199
for (int i = 0; i < parameters.size(); ++i) {
197200
IntrinsicParameterData.Builder paramBuilder = parameters.get(i);
198201
paramBuilder.hasDefaultValue(requiredParameters != -1 && i >= requiredParameters);
199-
result.add(paramBuilder.build());
202+
result.add(paramBuilder.build(scope));
200203
}
201204

202205
if (variadicParameter != null) {
203206
variadicParameter.hasDefaultValue(true);
204-
result.add(variadicParameter.build());
207+
result.add(variadicParameter.build(scope));
205208
}
206209

207210
return result;
208211
}
212+
213+
private Type buildReturnType(DelphiScope scope) {
214+
return resolveType(returnType, scope);
215+
}
216+
}
217+
218+
private static Type resolveType(Type type, DelphiScope scope) {
219+
if (type.isUnresolved()) {
220+
String simpleName = type.getImage();
221+
type =
222+
scope.getTypeDeclarations().stream()
223+
.filter(declaration -> declaration.getName().equalsIgnoreCase(simpleName))
224+
.map(TypedDeclaration::getType)
225+
.findFirst()
226+
.orElse(type);
227+
}
228+
return type;
209229
}
210230
}

delphi-frontend/src/main/java/au/com/integradev/delphi/type/intrinsic/IntrinsicsInjector.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import au.com.integradev.delphi.symbol.declaration.TypeNameDeclarationImpl;
5555
import au.com.integradev.delphi.symbol.declaration.VariableNameDeclarationImpl;
5656
import au.com.integradev.delphi.symbol.scope.DelphiScopeImpl;
57+
import au.com.integradev.delphi.type.UnresolvedTypeImpl;
5758
import au.com.integradev.delphi.type.factory.TypeFactoryImpl;
5859
import java.util.ArrayList;
5960
import java.util.List;
@@ -101,6 +102,10 @@ private Type type(IntrinsicType type) {
101102
return typeFactory.getIntrinsic(type);
102103
}
103104

105+
private Type systemType(String image) {
106+
return UnresolvedTypeImpl.referenceTo(image);
107+
}
108+
104109
private Type openArraySizeType() {
105110
return ((TypeFactoryImpl) typeFactory).openArraySizeType();
106111
}
@@ -387,7 +392,7 @@ private void injectType(IntrinsicType intrinsic, DelphiScopeImpl scope) {
387392
}
388393

389394
private void injectRoutine(IntrinsicRoutine.Builder builder, DelphiScopeImpl scope) {
390-
IntrinsicRoutine routine = builder.build();
395+
IntrinsicRoutine routine = builder.build(scope);
391396
SymbolicNode node = SymbolicNode.imaginary(routine.simpleName(), scope);
392397
RoutineNameDeclaration declaration =
393398
RoutineNameDeclarationImpl.create(node, routine, typeFactory);

0 commit comments

Comments
 (0)