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 88df46359853..06481d5e428e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java @@ -211,8 +211,11 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection if (element instanceof PsiNewExpression) { if (!FileModificationService.getInstance().preparePsiElementForWrite(element)) return; final PsiAnonymousClass anonymousClass = ((PsiNewExpression)element).getAnonymousClass(); - + LOG.assertTrue(anonymousClass != null); + + final boolean voidCompatible = PsiType.VOID.equals(LambdaUtil.getFunctionalInterfaceReturnType(anonymousClass.getBaseClassType())); + ChangeContextUtil.encodeContextInfo(anonymousClass, true); final PsiElement lambdaContext = anonymousClass.getParent().getParent(); boolean validContext = LambdaUtil.isValidLambdaContext(lambdaContext); @@ -254,7 +257,7 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection if (value != null) { copy = value.copy(); } - } else if (statements[0] instanceof PsiExpressionStatement) { + } else if (statements[0] instanceof PsiExpressionStatement && !(voidCompatible && lambdaContext instanceof PsiExpressionList)) { copy = ((PsiExpressionStatement)statements[0]).getExpression().copy(); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterValueVoidCompatibleAmbiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterValueVoidCompatibleAmbiguity.java new file mode 100644 index 000000000000..0a2993ab531c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterValueVoidCompatibleAmbiguity.java @@ -0,0 +1,27 @@ +// "Replace with lambda" "true" +import java.util.HashSet; +import java.util.Set; + +class Test { + public static void main(String[] args) { + Set strings = new HashSet<>(); + new Test().query((ResultSet var1) -> strings.add("Col1")); + } + + public void query(RowCallbackHandler rch){ + System.out.println(); + } + + public Object query( final ResultSetExtractor rse) { + return null; + } +} + +interface RowCallbackHandler { + void processRow(ResultSet var1); +} + +interface ResultSetExtractor { + Object extractData(ResultSet var1); +} +class ResultSet {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterVoidValueCompatibleAmbiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterVoidValueCompatibleAmbiguity.java new file mode 100644 index 000000000000..3bb07509b274 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterVoidValueCompatibleAmbiguity.java @@ -0,0 +1,29 @@ +// "Replace with lambda" "true" +import java.util.HashSet; +import java.util.Set; + +class Test { + public static void main(String[] args) { + Set strings = new HashSet<>(); + new Test().query(pResultSet -> { + strings.add("Col1"); + }); + } + + public void query(RowCallbackHandler rch){ + System.out.println(); + } + + public Object query( final ResultSetExtractor rse) { + return null; + } +} + +interface RowCallbackHandler { + void processRow(ResultSet var1); +} + +interface ResultSetExtractor { + Object extractData(ResultSet var1); +} +class ResultSet {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeValueVoidCompatibleAmbiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeValueVoidCompatibleAmbiguity.java new file mode 100644 index 000000000000..5964cd77df7f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeValueVoidCompatibleAmbiguity.java @@ -0,0 +1,32 @@ +// "Replace with lambda" "true" +import java.util.HashSet; +import java.util.Set; + +class Test { + public static void main(String[] args) { + Set strings = new HashSet<>(); + new Test().query(new ResultSetExtractor() { + @Override + public Object extractData(ResultSet var1) { + return strings.add("Col1"); + } + }); + } + + public void query(RowCallbackHandler rch){ + System.out.println(); + } + + public Object query( final ResultSetExtractor rse) { + return null; + } +} + +interface RowCallbackHandler { + void processRow(ResultSet var1); +} + +interface ResultSetExtractor { + Object extractData(ResultSet var1); +} +class ResultSet {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeVoidValueCompatibleAmbiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeVoidValueCompatibleAmbiguity.java new file mode 100644 index 000000000000..1deefca2895f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeVoidValueCompatibleAmbiguity.java @@ -0,0 +1,32 @@ +// "Replace with lambda" "true" +import java.util.HashSet; +import java.util.Set; + +class Test { + public static void main(String[] args) { + Set strings = new HashSet<>(); + new Test().query(new RowCallbackHandler() { + @Override + public void processRow(ResultSet pResultSet) { + strings.add("Col1"); + } + }); + } + + public void query(RowCallbackHandler rch){ + System.out.println(); + } + + public Object query( final ResultSetExtractor rse) { + return null; + } +} + +interface RowCallbackHandler { + void processRow(ResultSet var1); +} + +interface ResultSetExtractor { + Object extractData(ResultSet var1); +} +class ResultSet {} \ No newline at end of file