diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java index f20c6fcc2cfb..97b1a99bbc99 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java @@ -89,12 +89,16 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp final PsiParameter[] parameters, PsiType functionalInterfaceType) { final PsiCallExpression callExpression = extractMethodCallFromBlock(body); - if (callExpression instanceof PsiNewExpression && ((PsiNewExpression)callExpression).getAnonymousClass() != null) { - return null; + if (callExpression instanceof PsiNewExpression) { + final PsiNewExpression newExpression = (PsiNewExpression)callExpression; + if (newExpression.getAnonymousClass() != null || newExpression.getArrayInitializer() != null) { + return null; + } } final String methodReferenceText = createMethodReferenceText(callExpression, functionalInterfaceType, parameters); if (methodReferenceText != null) { + LOG.assertTrue(callExpression != null); final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(callExpression.getProject()); final PsiMethodReferenceExpression methodReferenceExpression = (PsiMethodReferenceExpression)elementFactory.createExpressionFromText(methodReferenceText, callExpression); @@ -108,6 +112,16 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp return null; } if (!(element instanceof PsiMethod)) { + LOG.assertTrue(callExpression instanceof PsiNewExpression); + final PsiExpression[] dims = ((PsiNewExpression)callExpression).getArrayDimensions(); + if (dims.length == 1 && parameters.length == 1){ + if (!resolvesToParameter(dims[0], parameters[0])) { + return null; + } + } + else if (dims.length > 0) { + return null; + } return callExpression; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeArrayConstructorRefNonParameterDimension.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeArrayConstructorRefNonParameterDimension.java new file mode 100644 index 000000000000..402e1d43710b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeArrayConstructorRefNonParameterDimension.java @@ -0,0 +1,6 @@ +// "Replace lambda with method reference" "false" +class Test { + { + java.util.stream.IntStream.range(0, 8).mapToObj(i -> new String[i + 4]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeArrayConstructorRefTooManyDimensions.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeArrayConstructorRefTooManyDimensions.java new file mode 100644 index 000000000000..cd90d288cce6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeArrayConstructorRefTooManyDimensions.java @@ -0,0 +1,6 @@ +// "Replace lambda with method reference" "false" +class Test { + { + java.util.stream.IntStream.range(0, 8).mapToObj(i -> new String[i][i]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeNewArrayExpressionWithArrayInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeNewArrayExpressionWithArrayInitializer.java new file mode 100644 index 000000000000..d1223903e5f3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeNewArrayExpressionWithArrayInitializer.java @@ -0,0 +1,6 @@ +// "Replace lambda with method reference" "false" +class Test { + { + java.util.stream.IntStream.range(0, 8).mapToObj(i -> new String[] {"".substring(i)}); + } +} \ No newline at end of file