From 90dd4c5a31fe7464f524aecd8133998f9e1c48da Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 12 May 2015 12:26:42 +0200 Subject: [PATCH] EA-68330 - AIOOBE: RedundantLambdaParameterTypeIntention.isAvailable process lambdas with formal param types at vararg position --- .../RedundantLambdaParameterTypeIntention.java | 16 ++++++++++++++-- .../beforeAtVarargPlace.java | 10 ++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantLambdaParameterType/beforeAtVarargPlace.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/RedundantLambdaParameterTypeIntention.java b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/RedundantLambdaParameterTypeIntention.java index 56c8860f2365..2a43212b535e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/RedundantLambdaParameterTypeIntention.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/RedundantLambdaParameterTypeIntention.java @@ -81,15 +81,27 @@ public class RedundantLambdaParameterTypeIntention extends PsiElementBaseIntenti return parameter.getName(); } }, ", ") + ") -> {}", expression); + final PsiParameter[] methodParams = method.getParameterList().getParameters(); final PsiSubstitutor substitutor = javaPsiFacade.getResolveHelper() - .inferTypeArguments(typeParameters, method.getParameterList().getParameters(), arguments, ((MethodCandidateInfo)resolveResult).getSiteSubstitutor(), + .inferTypeArguments(typeParameters, methodParams, arguments, ((MethodCandidateInfo)resolveResult).getSiteSubstitutor(), gParent, DefaultParameterTypeInferencePolicy.INSTANCE); for (PsiTypeParameter parameter : typeParameters) { final PsiType psiType = substitutor.substitute(parameter); if (psiType == null || dependsOnTypeParams(psiType, expression, parameter)) return false; } - return functionalInterfaceType.isAssignableFrom(substitutor.substitute(method.getParameterList().getParameters()[idx].getType())); + + + final PsiType paramType; + if (idx < methodParams.length) { + paramType = methodParams[idx].getType(); + } + else { + final PsiParameter lastParam = methodParams[methodParams.length - 1]; + if (!lastParam.isVarArgs()) return false; + paramType = ((PsiEllipsisType)lastParam.getType()).getComponentType(); + } + return functionalInterfaceType.isAssignableFrom(substitutor.substitute(paramType)); } } if (!LambdaUtil.isLambdaFullyInferred(expression, functionalInterfaceType)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantLambdaParameterType/beforeAtVarargPlace.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantLambdaParameterType/beforeAtVarargPlace.java new file mode 100644 index 000000000000..e2bbbb7c9c4f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantLambdaParameterType/beforeAtVarargPlace.java @@ -0,0 +1,10 @@ +// "Remove redundant types" "false" +import java.util.function.Function; + +class Test { + void f(Function... l){} + + { + f(null, (String s) -> s); + } +} \ No newline at end of file