Skip to content

Commit a91fc0a

Browse files
committed
Add logic to prevent incorrect result caching
1 parent f690467 commit a91fc0a

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ static public HaxeExpressionEvaluatorContext evaluateWithRecursionGuard(@NotNull
102102
ProgressIndicatorProvider.checkCanceled();
103103
HaxeExpressionEvaluatorContext context = new HaxeExpressionEvaluatorContext(element);
104104
ResultHolder result = handleWithRecursionGuard(element, context, null);
105-
context.result = result != null ? result : createUnknown(element);
105+
context.result = result != null ? result : createUnknown(element, false);
106106
return context;
107107
}
108108

src/main/java/com/intellij/plugins/haxe/model/evaluator/HaxeExpressionEvaluatorHandlers.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,12 @@ static ResultHolder handleForStatement(
943943
}
944944

945945
static ResultHolder createUnknown(PsiElement element) {
946-
return SpecificHaxeClassReference.getUnknown(element).createHolder();
946+
return createUnknown(element, true);
947+
}
948+
static ResultHolder createUnknown(PsiElement element, boolean cacheable) {
949+
ResultHolder holder = getUnknown(element).createHolder();
950+
holder.cacheable = cacheable;
951+
return holder;
947952
}
948953

949954
static ResultHolder handlePrefixExpression(
@@ -1809,7 +1814,7 @@ static ResultHolder handleCallExpression(
18091814
}
18101815

18111816
// @TODO: resolve the function type return type
1812-
return createUnknown(callExpression);
1817+
return createUnknown(callExpression, false);
18131818
}
18141819

18151820
private static ResultHolder tryHandleFunctionBind(SpecificFunctionReference functionReference, HaxeCallExpression callExpression) {

src/main/java/com/intellij/plugins/haxe/model/evaluator/callexpression/CallExpressionArgumentModel.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
public class CallExpressionArgumentModel {
1111
PsiElement psiElement;
1212
SpecificTypeReference type;
13+
boolean canCache;
1314

1415

15-
public static CallExpressionArgumentModel create(PsiElement psiElement, SpecificTypeReference type) {
16-
return new CallExpressionArgumentModel(psiElement, type);
16+
public static CallExpressionArgumentModel create(PsiElement psiElement, SpecificTypeReference type, boolean canCache) {
17+
return new CallExpressionArgumentModel(psiElement, type, canCache);
1718
}
1819

1920

src/main/java/com/intellij/plugins/haxe/model/evaluator/callexpression/HaxeCallExpressionContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ private record RecursionKey(PsiElement argumentContext, PsiElement parameterCont
5454
@Nullable
5555
private PsiElement sourceExpression;
5656

57+
public boolean canCache = true;
5758
public boolean isConstructor = false;
5859
public boolean isMacroFunction = false;
5960
public boolean isStaticExtension = false;
@@ -186,7 +187,7 @@ private HaxeCallExpressionEvaluation evaluate(boolean trackErrors, PsiElement so
186187
// while it might be a waste to re-evaluate the callie assignability
187188
// we do it here because we need to keep track if typeParameters
188189
// perhaps the logic above can be moved down into the argument/parameter check loop
189-
argumentsList.addFirst(new CallExpressionArgumentModel(callie.context, callie));
190+
argumentsList.addFirst(new CallExpressionArgumentModel(callie.context, callie, false));
190191
}
191192

192193
CallExpressionArgumentModel argumentModel = null;

src/main/java/com/intellij/plugins/haxe/model/evaluator/callexpression/HaxeCallExpressionUtil.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ public static HaxeCallExpressionContext createContextForConstructorCall(@NotNull
238238
List<CallExpressionArgumentModel> argumentList = getArgumentList(newExpression);
239239
ResultHolder type = HaxeTypeResolver.getTypeFromType(newExpression.getType());
240240
SpecificHaxeClassReference classType = type.getClassType();
241+
boolean canCache = type.cacheable && argumentList.stream().allMatch(CallExpressionArgumentModel::isCanCache);
241242
if (classType != null) {
242243
SpecificTypeReference typeRef = classType.fullyResolveTypeDefAndUnwrapNullTypeReference();
243244
if (typeRef instanceof SpecificHaxeClassReference classReference ) {
@@ -273,6 +274,7 @@ public static HaxeCallExpressionContext createContextForConstructorCall(@NotNull
273274
evaluation.isMacroFunction = false;
274275
evaluation.isEnumConstructor = false; // enums dont use the new keyword
275276
evaluation.isConstructor = true;
277+
evaluation.canCache = canCache;
276278
return evaluation;
277279
}
278280
}
@@ -303,7 +305,7 @@ private static List<CallExpressionParameterModel> getParameterList(@NotNull Spec
303305
List<HaxeExpression> expressions = expressionListPsi.getExpressionList();
304306
for (HaxeExpression expression : expressions) {
305307
ResultHolder result = HaxeExpressionEvaluator.evaluateWithRecursionGuard(expression).result;
306-
CallExpressionArgumentModel model = CallExpressionArgumentModel.create(expression, result.getType());
308+
CallExpressionArgumentModel model = CallExpressionArgumentModel.create(expression, result.getType(), result.cacheable);
307309
argumentList.add(model);
308310
}
309311
}
@@ -313,17 +315,18 @@ private static List<CallExpressionParameterModel> getParameterList(@NotNull Spec
313315
List<CallExpressionArgumentModel> argumentList = new ArrayList<>();
314316
List<HaxeExpression> expressions = newExpression.getExpressionList();
315317
for (HaxeExpression expression : expressions) {
316-
ResultHolder result = HaxeExpressionEvaluator.evaluateWithRecursionGuard(expression).result;
317-
CallExpressionArgumentModel model = CallExpressionArgumentModel.create(expression, result.getType());
318-
argumentList.add(model);
318+
ResultHolder result = HaxeExpressionEvaluator.evaluateWithRecursionGuard(expression).result;
319+
CallExpressionArgumentModel model = CallExpressionArgumentModel.create(expression, result.getType(), result.cacheable);
320+
model.canCache = result.cacheable;
321+
argumentList.add(model);
319322
}
320323
return argumentList;
321324
}
322325

323326
private static @NotNull List<CallExpressionArgumentModel> getArgumentList(@NotNull List<SpecificTypeReference> types) {
324327
List<CallExpressionArgumentModel> argumentList = new ArrayList<>();
325328
for (SpecificTypeReference type : types) {
326-
CallExpressionArgumentModel model = CallExpressionArgumentModel.create(type.getElementContext(), type);
329+
CallExpressionArgumentModel model = CallExpressionArgumentModel.create(type.getElementContext(), type, false);
327330
argumentList.add(model);
328331
}
329332
return argumentList;

0 commit comments

Comments
 (0)