diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java index f1a601117e62..cbb715cb12b1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java @@ -35,6 +35,7 @@ import com.intellij.psi.controlFlow.AnalysisCanceledException; import com.intellij.psi.controlFlow.ControlFlow; import com.intellij.psi.controlFlow.ControlFlowUtil; import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy; +import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfaceParameterizationUtil; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; @@ -439,7 +440,7 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection PsiAnonymousClass aClass) { myMethod = method; myAnonymClass = aClass; - final PsiType inferredType = getInferredType(aClass); + final PsiType inferredType = FunctionalInterfaceParameterizationUtil.getGroundTargetType(getInferredType(aClass)); myEqualInference = !aClass.getBaseClassType().equals(inferredType); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterGetGroundTypeForInferredTypeBeforeChecks.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterGetGroundTypeForInferredTypeBeforeChecks.java new file mode 100644 index 000000000000..e2f8e7825584 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterGetGroundTypeForInferredTypeBeforeChecks.java @@ -0,0 +1,21 @@ +// "Replace with lambda" "true" +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +class Test { + + void f(List r){ + List l = r.stream().filter(status -> stringContainingSort(status)) + .map(Status::new) + .collect(Collectors.toList()); + } + + boolean stringContainingSort(Object text) { + return true; + } + + class Status { + public Status(Status s) {} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterVoidValueTransformation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterVoidValueTransformation.java index 9cbf793206d4..b3bec72aa1e5 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterVoidValueTransformation.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterVoidValueTransformation.java @@ -1,9 +1,10 @@ // "Replace with lambda" "true" -import javax.swing.*; class Test { String c = null; public void main(String[] args){ - SwingUtilities.invokeLater(() -> c.substring(0).toString()); + invokeLater(() -> c.substring(0).toString()); } + + public void invokeLater(Runnable r) {} } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeGetGroundTypeForInferredTypeBeforeChecks.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeGetGroundTypeForInferredTypeBeforeChecks.java new file mode 100644 index 000000000000..5759c051f507 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeGetGroundTypeForInferredTypeBeforeChecks.java @@ -0,0 +1,26 @@ +// "Replace with lambda" "true" +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +class Test { + + void f(List r){ + List l = r.stream().filter(new Predicate() { + @Override + public boolean test(Status status) { + return stringContainingSort(status); + } + }) + .map(Status::new) + .collect(Collectors.toList()); + } + + boolean stringContainingSort(Object text) { + return true; + } + + class Status { + public Status(Status s) {} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeVoidValueTransformation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeVoidValueTransformation.java index a676def55b15..bb0c9b6715e7 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeVoidValueTransformation.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeVoidValueTransformation.java @@ -1,13 +1,14 @@ // "Replace with lambda" "true" -import javax.swing.*; class Test { String c = null; public void main(String[] args){ - SwingUtilities.invokeLater(new Runnable() { + invokeLater(new Runnable() { public void run() { c.substring(0).toString(); } }); } + + public void invokeLater(Runnable r) {} } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Anonymous2LambdaInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Anonymous2LambdaInspectionTest.java index 4689fe1b0079..fd88b4b3dbb8 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Anonymous2LambdaInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Anonymous2LambdaInspectionTest.java @@ -17,6 +17,9 @@ package com.intellij.codeInsight.daemon.quickFix; import com.intellij.codeInspection.AnonymousCanBeLambdaInspection; import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.testFramework.IdeaTestUtil; import org.jetbrains.annotations.NotNull; @@ -36,4 +39,8 @@ public class Anonymous2LambdaInspectionTest extends LightQuickFixParameterizedTe return "/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda"; } + @Override + protected Sdk getProjectJDK() { + return IdeaTestUtil.getMockJdk18(); + } } \ No newline at end of file