From 63131ab1b2b78d51f78e13fa067e25e4a60aed6d Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Fri, 16 Sep 2016 15:56:27 +0300 Subject: [PATCH] Java inspection: Support inferred return type of lambda expression in EqualsReplaceableByObjectsCallInspection (IDEA-161076) --- ...eturnSeparatedFromComputationInspection.java | 17 ++--------------- .../afterInferredInLambda.java | 13 +++++++++++++ .../beforeInferredInLambda.java | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/beforeInferredInLambda.java diff --git a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java index e2e006aa72af..6383ebb8708f 100644 --- a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java @@ -37,7 +37,7 @@ import java.util.*; * @author Pavel.Dolgov */ public class ReturnSeparatedFromComputationInspection extends BaseJavaBatchLocalInspectionTool { - private static final Logger LOG = Logger.getInstance("#" + ReturnSeparatedFromComputationInspection.class.getName()); + private static final Logger LOG = Logger.getInstance(ReturnSeparatedFromComputationInspection.class); @NotNull @Override @@ -89,20 +89,7 @@ public class ReturnSeparatedFromComputationInspection extends BaseJavaBatchLocal return ((PsiMethod)returnFrom).getReturnType(); } if (returnFrom instanceof PsiLambdaExpression) { - return getNonParametrizedReturnType((PsiLambdaExpression)returnFrom); - } - return null; - } - - @Nullable - private static PsiType getNonParametrizedReturnType(PsiLambdaExpression lambdaExpression) { - final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(lambdaExpression.getFunctionalInterfaceType()); - if (interfaceMethod != null) { - final PsiType returnType = interfaceMethod.getReturnType(); - if (returnType instanceof PsiPrimitiveType || - returnType instanceof PsiClassType && ((PsiClassType)returnType).getParameterCount() == 0) { - return returnType; - } + return LambdaUtil.getFunctionalInterfaceReturnType((PsiLambdaExpression)returnFrom); } return null; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java new file mode 100644 index 000000000000..aa256fdb7b2a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java @@ -0,0 +1,13 @@ +// "Move 'return' closer to computation of the value of 'r'" "true" +import java.util.stream.Stream; + +class T { + String[] f(String[] a) { + return Stream.of(a).map(s -> { + String r; + if (s.startsWith("#")) return s.substring(1); + else if (s.startsWith("//")) return s.substring(2); + else return s; + }).toArray(String[]::new); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/beforeInferredInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/beforeInferredInLambda.java new file mode 100644 index 000000000000..5cfd5d1515c8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/beforeInferredInLambda.java @@ -0,0 +1,14 @@ +// "Move 'return' closer to computation of the value of 'r'" "true" +import java.util.stream.Stream; + +class T { + String[] f(String[] a) { + return Stream.of(a).map(s -> { + String r; + if (s.startsWith("#")) r = s.substring(1); + else if (s.startsWith("//")) r = s.substring(2); + else r = s; + return r; + }).toArray(String[]::new); + } +} \ No newline at end of file