From 2596fd1b96d3291080c5af6f181420119f09550c Mon Sep 17 00:00:00 2001 From: m0rkeulv Date: Sun, 15 Sep 2024 03:25:05 +0200 Subject: [PATCH] handle callExpression eval when expression references is macro reification --- .../HaxeExpressionEvaluatorHandlers.java | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/intellij/plugins/haxe/model/evaluator/HaxeExpressionEvaluatorHandlers.java b/src/main/java/com/intellij/plugins/haxe/model/evaluator/HaxeExpressionEvaluatorHandlers.java index 2fc64a1b1..42e6de51f 100644 --- a/src/main/java/com/intellij/plugins/haxe/model/evaluator/HaxeExpressionEvaluatorHandlers.java +++ b/src/main/java/com/intellij/plugins/haxe/model/evaluator/HaxeExpressionEvaluatorHandlers.java @@ -1245,25 +1245,32 @@ static ResultHolder handleCallExpression( HaxeGenericResolver localResolver = HaxeGenericResolverUtil.generateResolverFromScopeParents(callExpression); localResolver.addAll(resolver); - - // map type Parameters to methods declaring class resolver if necessary - SpecificHaxeClassReference callieClassRef = tryGetCallieType(callExpression).getClassType(); - HaxeClass callieType = callieClassRef != null ? callieClassRef.getHaxeClass() : null; - HaxeClass methodTypeClassType = tryGetMethodDeclaringClass(callExpression); - if(callieType != null && methodTypeClassType != null) { - localResolver = HaxeGenericResolverUtil.createInheritedClassResolver(methodTypeClassType,callieType, localResolver); - } - - SpecificTypeReference functionType = handle(callExpressionRef, context, localResolver).getType(); - boolean varIsMacroFunction = isCallExpressionToMacroMethod(callExpressionRef); - boolean callIsFromMacroContext = isInMacroFunction(callExpressionRef); - if (varIsMacroFunction && !callIsFromMacroContext) { - ResultHolder holder = resolveMacroTypesForFunction(functionType.createHolder()); - functionType = holder.getFunctionType(); + SpecificTypeReference functionType; + if (callExpressionRef != null) { // can be null if the entire expression is a macro of callExpression + // map type Parameters to methods declaring class resolver if necessary + SpecificHaxeClassReference callieClassRef = tryGetCallieType(callExpression).getClassType(); + HaxeClass callieType = callieClassRef != null ? callieClassRef.getHaxeClass() : null; + HaxeClass methodTypeClassType = tryGetMethodDeclaringClass(callExpression); + if (callieType != null && methodTypeClassType != null) { + localResolver = HaxeGenericResolverUtil.createInheritedClassResolver(methodTypeClassType, callieType, localResolver); + } + + functionType = handle(callExpressionRef, context, localResolver).getType(); + boolean varIsMacroFunction = isCallExpressionToMacroMethod(callExpressionRef); + boolean callIsFromMacroContext = isInMacroFunction(callExpressionRef); + if (varIsMacroFunction && !callIsFromMacroContext) { + ResultHolder holder = resolveMacroTypesForFunction(functionType.createHolder()); + functionType = holder.getFunctionType(); + } + }else if (callExpression.getMacroExpressionReification() != null) { + functionType = SpecificTypeReference.getUnknown(callExpression.getMacroExpressionReification()); + }else { + // should not happen + functionType = SpecificTypeReference.getUnknown(callExpression); } // @TODO: this should be innecessary when code is working right! - if (functionType.isUnknown()) { + if ( functionType == null || functionType.isUnknown()) { if (callExpressionRef instanceof HaxeReference) { PsiReference reference = callExpressionRef.getReference(); if (reference != null) { @@ -1275,8 +1282,8 @@ static ResultHolder handleCallExpression( } } - if (functionType.isUnknown()) { - if(log.isDebugEnabled()) log.debug("Couldn't resolve " + callExpressionRef.getText()); + if (functionType == null || functionType.isUnknown()) { + if(log.isDebugEnabled()) log.debug("Couldn't resolve " + callExpressionRef); } List parameterExpressions = null;