Skip to content

Commit

Permalink
handle callExpression eval when expression references is macro reific…
Browse files Browse the repository at this point in the history
…ation
  • Loading branch information
m0rkeulv committed Sep 15, 2024
1 parent e711f6e commit 2596fd1
Showing 1 changed file with 25 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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<HaxeExpression> parameterExpressions = null;
Expand Down

0 comments on commit 2596fd1

Please sign in to comment.