From 6c33188ef5929bedfffb9ecfe542f33fb1965836 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 14 Jul 2010 21:23:09 +0100 Subject: [PATCH] fix g++ test: allow partial argument->parameter mapping --- .../impl/types/GrClosureSignatureUtil.java | 17 ++++++++------ .../processors/MethodResolverProcessor.java | 22 ++++++++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java index d07fffb2af5a..55a5b122a538 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java @@ -125,7 +125,7 @@ public class GrClosureSignatureUtil { } public static boolean isSignatureApplicable(GrClosureSignature signature, PsiType[] args, GroovyPsiElement context) { - if (mapArgTypesToParameters(signature, args, context) != null) return true; + if (mapArgTypesToParameters(signature, args, context, false) != null) return true; if (args.length == 1) { final GrClosureParameter[] parameters = signature.getParameters(); @@ -133,27 +133,30 @@ public class GrClosureSignatureUtil { PsiType arg = args[0]; if (arg instanceof GrTupleType) { args = ((GrTupleType)arg).getComponentTypes(); - if (mapArgTypesToParameters(signature, args, context) != null) return true; + if (mapArgTypesToParameters(signature, args, context, false) != null) return true; } } return false; } - public static ArgInfo[] mapArgTypesToParameters(GrClosureSignature signature, PsiType[] args, GroovyPsiElement context) { - return mapParametersToArguments(signature, args, (Function)Function.ID, context); + public static ArgInfo[] mapArgTypesToParameters(GrClosureSignature signature, + PsiType[] args, + GroovyPsiElement context, + boolean partial) { + return mapParametersToArguments(signature, args, (Function)Function.ID, context, partial); } @Nullable private static ArgInfo[] mapParametersToArguments(GrClosureSignature signature, Arg[] args, Function typeComputer, - GroovyPsiElement context) { + GroovyPsiElement context, boolean partial) { GrClosureParameter[] params = signature.getParameters(); if (args.length > params.length && !signature.isVarargs()) return null; int optional = getOptionalParamCount(signature, false); int notOptional = params.length - optional; if (signature.isVarargs()) notOptional--; - if (notOptional > args.length) return null; + if (notOptional > args.length && !partial) return null; final ArgInfo[] map = mapSimple(params, args, typeComputer, context); if (map != null) return map; @@ -374,7 +377,7 @@ public class GrClosureSignatureUtil { public PsiType fun(InnerArg o) { return o.type; } - }, list); + }, list, false); if (innerMap == null) return null; ArgInfo[] map = new ArgInfo[innerMap.length]; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java index c2eef6a9aeaf..302737d3fc76 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java @@ -138,7 +138,7 @@ public class MethodResolverProcessor extends ResolverProcessor { final GrClosureParameter[] params = signature.getParameters(); final GrClosureSignatureUtil.ArgInfo[] argInfos = - GrClosureSignatureUtil.mapArgTypesToParameters(erasedSignature, argTypes, (GroovyPsiElement)myPlace); + GrClosureSignatureUtil.mapArgTypesToParameters(erasedSignature, argTypes, (GroovyPsiElement)myPlace, myAllVariants); if (argInfos == null) return partialSubstitutor; int max = Math.max(params.length, argTypes.length); @@ -147,15 +147,21 @@ public class MethodResolverProcessor extends ResolverProcessor { PsiType[] argumentTypes = new PsiType[max]; int i = 0; for (int paramIndex = 0; paramIndex < argInfos.length; paramIndex++) { - GrClosureSignatureUtil.ArgInfo argInfo = argInfos[paramIndex]; - final List psiTypes = argInfo.args; PsiType paramType = params[paramIndex].getType(); - if (argInfo.isMultiArg) { - if (paramType instanceof PsiArrayType) paramType = ((PsiArrayType)paramType).getComponentType(); - } - for (PsiType type : psiTypes) { + + GrClosureSignatureUtil.ArgInfo argInfo = argInfos[paramIndex]; + if (argInfo != null) { + if (argInfo.isMultiArg) { + if (paramType instanceof PsiArrayType) paramType = ((PsiArrayType)paramType).getComponentType(); + } + for (PsiType type : argInfo.args) { + argumentTypes[i] = handleConversion(paramType, type); + parameterTypes[i] = paramType; + i++; + } + } else { parameterTypes[i] = paramType; - argumentTypes[i] = handleConversion(paramType, type); + argumentTypes[i] = PsiType.NULL; i++; } }