Skip to content

Commit 716a427

Browse files
committed
trying to fix resolver regression
1 parent 64a391e commit 716a427

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

src/main/java/com/intellij/plugins/haxe/model/type/HaxeExpressionEvaluator.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.intellij.openapi.progress.ProgressIndicatorProvider;
2727
import com.intellij.plugins.haxe.HaxeBundle;
2828
import com.intellij.plugins.haxe.ide.annotator.HaxeStandardAnnotation;
29+
import com.intellij.plugins.haxe.ide.annotator.semantics.HaxeCallExpressionUtil;
2930
import com.intellij.plugins.haxe.lang.lexer.HaxeTokenTypeSets;
3031
import com.intellij.plugins.haxe.lang.lexer.HaxeTokenTypes;
3132
import com.intellij.plugins.haxe.lang.psi.*;
@@ -350,30 +351,40 @@ static private ResultHolder _handle(final PsiElement element,
350351
HaxeMethod method = constructor.getMethod();
351352
HaxeMethodModel methodModel = method.getModel();
352353
if (methodModel.getGenericParams().isEmpty()) {
354+
boolean changedTypeParameters = false;
355+
HaxeCallExpressionUtil.CallExpressionValidation validation = HaxeCallExpressionUtil.checkConstructor(expression);
356+
Map<Integer, Integer> toParameterIndex = validation.getArgumentToParameterIndex();
357+
358+
353359
List<HaxeExpression> arguments = expression.getExpressionList();
354360
List<HaxeParameterModel> parameters = methodModel.getParameters();
361+
355362
if (!parameters.isEmpty()) {
356-
for (HaxeParameterModel parameter : parameters) {
363+
364+
for (Map.Entry<Integer, Integer> entry : toParameterIndex.entrySet()) {
365+
Integer argumentIndex = entry.getKey();
366+
Integer parameterIndex = entry.getValue();
367+
368+
HaxeParameterModel parameter = parameters.get(parameterIndex);
357369
if (parameter.getType().isTypeParameter()) {
358370
for (int i = 0; i < Math.min(specificNames.length, arguments.size()); i++) {
359371
if (specificNames[i].equals(parameter.getTypeTagPsi().getTypeOrAnonymous().getText())) {
360372
// we could try to map parameters and args, but in most cases this probably won't be necessary and it would make this part very complex
361373
@NotNull ResultHolder[] specifics = classReference.getSpecifics();
362374
if (specifics[i].isUnknown()) {
363-
ResultHolder handle = handle(arguments.get(i), context, resolver);
364-
if (specifics[i].isUnknown()) {
375+
ResultHolder handle = handle(arguments.get(argumentIndex), context, resolver);
376+
if (!handle.isUnknown()) {
377+
changedTypeParameters = true;
365378
specifics[i] = handle;
366-
}else {
367-
ResultHolder unified = HaxeTypeUnifier.unify(handle, specifics[i]);
368-
specifics[i] = unified;
369379
}
370380
}
371381
}
372382
}
373383
}
374384
}
375385
}
376-
}
386+
if (changedTypeParameters) return typeHolder.duplicate();
387+
}
377388
}
378389
}
379390
}

0 commit comments

Comments
 (0)