|
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