3737import com .intellij .plugins .haxe .metadata .psi .HaxeMetadataCompileTimeMeta ;
3838import com .intellij .plugins .haxe .metadata .util .HaxeMetadataUtils ;
3939import com .intellij .plugins .haxe .model .*;
40+ import com .intellij .plugins .haxe .model .evaluator .HaxeCallExpressionEvaluatorCacheService ;
4041import com .intellij .plugins .haxe .model .evaluator .HaxeExpressionEvaluator ;
4142import com .intellij .plugins .haxe .model .evaluator .HaxeExpressionEvaluatorContext ;
4243import com .intellij .plugins .haxe .model .evaluator .callexpression .HaxeCallExpressionContextContainer ;
@@ -259,7 +260,7 @@ private List<? extends PsiElement> doResolveInner(@NotNull HaxeReference referen
259260 }
260261 return matchesInImport .isEmpty () ? null : matchesInImport ;
261262 }
262- boolean expectedEnumIsConstructor = parent instanceof HaxeCallExpression ;
263+ boolean expectedEnumIsConstructor = parent instanceof HaxeCallExpression || parent . getParent () instanceof HaxeEnumArgumentExtractor ;
263264 PsiElement target = HaxeResolveUtil .searchInSamePackage (fileModel , referenceText , true , expectedEnumIsConstructor );
264265
265266 if (target != null ) {
@@ -432,8 +433,7 @@ private ResultHolder findParentAssignType(@NotNull PsiElement reference, boolean
432433 PsiElement resolve = referenceExpression .resolve ();
433434 if (resolve instanceof HaxeMethod method ) {
434435 int index = expressionList .getExpressionList ().indexOf (reference );
435- HaxeCallExpressionContextContainer contextContainer = createContextForMethodCall (callExpression , method );
436- HaxeCallExpressionEvaluation evaluate = contextContainer .evaluateContexts ();
436+ HaxeCallExpressionEvaluation evaluate = cachedHaxeCallExpressionEvaluation (method , callExpression );
437437 return evaluate == null ? null : evaluate .getParameterType (index );
438438 }
439439 }
@@ -477,8 +477,7 @@ private ResultHolder findParentAssignType(@NotNull PsiElement reference, boolean
477477 PsiElement resolve = referenceExpression .resolve ();
478478 if (resolve instanceof HaxeMethod method ) {
479479 int index = expressionList .getExpressionList ().indexOf (reference );
480- HaxeCallExpressionContextContainer contextContainer = createContextForMethodCall (callExpression , method );
481- HaxeCallExpressionEvaluation evaluate = contextContainer .evaluateContexts ();
480+ HaxeCallExpressionEvaluation evaluate = cachedHaxeCallExpressionEvaluation (method , callExpression );
482481 return evaluate == null ? null : evaluate .getParameterType (index );
483482 }
484483 }
@@ -538,11 +537,17 @@ private ResultHolder findParentAssignType(@NotNull PsiElement reference, boolean
538537 return findParentAssignType (parent , isValueExpression );
539538 }
540539
540+ private static @ Nullable HaxeCallExpressionEvaluation cachedHaxeCallExpressionEvaluation (HaxeMethod method , HaxeCallExpression callExpression ) {
541+
542+ HaxeCallExpressionEvaluatorCacheService service = method .getProject ().getService (HaxeCallExpressionEvaluatorCacheService .class );
543+ HaxeCallExpressionEvaluation evaluation = service .callExpressionCachedEvaluation (method , callExpression );
544+ return evaluation ;
545+ }
546+
541547 private static boolean testAsEnumValueConstructor (@ NotNull HaxeEnumValueDeclarationConstructor enumValueDeclaration , @ NotNull HaxeReference reference ) {
542548 if (reference .getParent () instanceof HaxeCallExpression haxeCallExpression ) {
543549 HaxeMethod method = enumValueDeclaration .getModel ().getMethod ();
544- HaxeCallExpressionContextContainer contextContainer = createContextForMethodCall (haxeCallExpression , method );
545- HaxeCallExpressionEvaluation validation = contextContainer .evaluateContexts ();
550+ HaxeCallExpressionEvaluation validation = cachedHaxeCallExpressionEvaluation (method , haxeCallExpression );
546551 return validation != null && validation .isCompleted () && validation .isValid ();
547552 }
548553 return false ;
@@ -909,8 +914,7 @@ private List<? extends PsiElement> checkEnumMemberHints(HaxeReference reference)
909914 if (argumentList != null ) {
910915 int argumentIndex = argumentList .getExpressionList ().indexOf (argument );
911916 if (argumentIndex > -1 ) {
912- HaxeCallExpressionContextContainer contextContainer = createContextForMethodCall (methodCallCall , haxeMethod );
913- HaxeCallExpressionEvaluation validation = contextContainer .evaluateContexts ();
917+ HaxeCallExpressionEvaluation validation = cachedHaxeCallExpressionEvaluation (haxeMethod , methodCallCall );
914918 if (validation != null ) {
915919 int parameterIndex = validation .getParameterForArgument (argumentIndex );
916920 ResultHolder parameterType = validation .getParameterType (parameterIndex );
@@ -1915,8 +1919,7 @@ private List<? extends PsiElement> checkByTreeWalk(HaxeReference reference, @Nu
19151919 // the code might be incomplete and validation might fail so we keep track of the element
19161920 // as a method match is more correct than a field match
19171921 bestGuess = psiElement ;
1918- HaxeCallExpressionContextContainer contextContainer = createContextForMethodCall (callExpression , method );
1919- HaxeCallExpressionEvaluation evaluation = contextContainer .evaluateContexts ();
1922+ HaxeCallExpressionEvaluation evaluation = cachedHaxeCallExpressionEvaluation (method , callExpression );
19201923 if (evaluation != null && evaluation .isValid ()) {
19211924 LogResolution (reference , "via tree walk. (method filtered)" );
19221925 return List .of (psiElement );
@@ -2445,8 +2448,7 @@ private static void clearFakePsi(HaxeReference reference) {
24452448 for (HaxeBaseMemberModel member : members ) {
24462449 if (member instanceof HaxeMethodModel methodModel ) {
24472450 if (reference .getParent () instanceof HaxeCallExpression callExpression ) {
2448- HaxeCallExpressionContextContainer contextContainer = createContextForMethodCall (callExpression , methodModel .getMethod ());
2449- HaxeCallExpressionEvaluation evaluate = contextContainer .evaluateContexts ();
2451+ HaxeCallExpressionEvaluation evaluate = cachedHaxeCallExpressionEvaluation (methodModel .getMethod (), callExpression );
24502452 if (evaluate != null && evaluate .isValid ()) {
24512453 return Collections .singletonList (member .getNamedComponentPsi ());
24522454 }
@@ -2455,8 +2457,7 @@ private static void clearFakePsi(HaxeReference reference) {
24552457 if (argumentList .getParent () instanceof HaxeCallExpression callExpression ) {
24562458 if (callExpression .getExpression () instanceof HaxeReferenceExpression referenceExpression ) {
24572459 if (referenceExpression .resolve () instanceof HaxeMethod haxeMethod ) {
2458- HaxeCallExpressionContextContainer contextContainer = createContextForMethodCall (callExpression , haxeMethod );
2459- HaxeCallExpressionEvaluation evaluate = contextContainer .evaluateContexts ();
2460+ HaxeCallExpressionEvaluation evaluate = cachedHaxeCallExpressionEvaluation (haxeMethod , callExpression );
24602461 if (evaluate != null ) {
24612462 int paramIndex = evaluate .getParameterForArgument (argIndex );
24622463 if (paramIndex != -1 ) {
0 commit comments