|
25 | 25 | import org.sonar.plugins.communitydelphi.api.symbol.Qualifiable;
|
26 | 26 | import org.sonar.plugins.communitydelphi.api.symbol.QualifiedName;
|
27 | 27 | 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; |
28 | 30 | import org.sonar.plugins.communitydelphi.api.type.Type;
|
29 | 31 | import org.sonar.plugins.communitydelphi.api.type.TypeFactory;
|
30 | 32 |
|
@@ -123,8 +125,9 @@ Builder hasDefaultValue(boolean hasDefaultValue) {
|
123 | 125 | return this;
|
124 | 126 | }
|
125 | 127 |
|
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); |
128 | 131 | }
|
129 | 132 | }
|
130 | 133 | }
|
@@ -185,26 +188,43 @@ Builder returns(Type returnType) {
|
185 | 188 | return this;
|
186 | 189 | }
|
187 | 190 |
|
188 |
| - IntrinsicRoutine build() { |
| 191 | + IntrinsicRoutine build(DelphiScope scope) { |
189 | 192 | return new IntrinsicRoutine(
|
190 |
| - routineName, buildParameters(), returnType, variadicParameter != null); |
| 193 | + routineName, buildParameters(scope), buildReturnType(scope), variadicParameter != null); |
191 | 194 | }
|
192 | 195 |
|
193 |
| - private List<IntrinsicParameterData> buildParameters() { |
| 196 | + private List<IntrinsicParameterData> buildParameters(DelphiScope scope) { |
194 | 197 | List<IntrinsicParameterData> result = new ArrayList<>();
|
195 | 198 |
|
196 | 199 | for (int i = 0; i < parameters.size(); ++i) {
|
197 | 200 | IntrinsicParameterData.Builder paramBuilder = parameters.get(i);
|
198 | 201 | paramBuilder.hasDefaultValue(requiredParameters != -1 && i >= requiredParameters);
|
199 |
| - result.add(paramBuilder.build()); |
| 202 | + result.add(paramBuilder.build(scope)); |
200 | 203 | }
|
201 | 204 |
|
202 | 205 | if (variadicParameter != null) {
|
203 | 206 | variadicParameter.hasDefaultValue(true);
|
204 |
| - result.add(variadicParameter.build()); |
| 207 | + result.add(variadicParameter.build(scope)); |
205 | 208 | }
|
206 | 209 |
|
207 | 210 | return result;
|
208 | 211 | }
|
| 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; |
209 | 229 | }
|
210 | 230 | }
|
0 commit comments