From 1b50ea2eb2e60cc7c6e5aa12f71db52647f12245 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 25 Feb 2014 10:11:35 +0100 Subject: [PATCH] lambda -> anonym: disable in unexpected context where cast won't help (IDEA-120165) --- .../AnonymousCanBeLambdaInspection.java | 29 ++++++++++--------- .../anonymous2lambda/beforeNotAStatement.java | 17 +++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeNotAStatement.java 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 ea1c64b97f10..ed3494096265 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java @@ -83,20 +83,23 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection if (PsiUtil.getLanguageLevel(aClass).isAtLeast(LanguageLevel.JDK_1_8)) { final PsiClassType baseClassType = aClass.getBaseClassType(); if (LambdaUtil.isFunctionalType(baseClassType)) { - final PsiMethod[] methods = aClass.getMethods(); - if (methods.length == 1 && aClass.getFields().length == 0) { - final PsiCodeBlock body = methods[0].getBody(); - if (body != null) { - final ForbiddenRefsChecker checker = new ForbiddenRefsChecker(methods[0], aClass); - body.accept(checker); - if (!checker.hasForbiddenRefs()) { - PsiResolveHelper helper = PsiResolveHelper.SERVICE.getInstance(body.getProject()); - for (PsiLocalVariable local : checker.getLocals()) { - final String localName = local.getName(); - if (localName != null && helper.resolveReferencedVariable(localName, aClass) != null) return; + final PsiElement lambdaContext = aClass.getParent().getParent(); + if (LambdaUtil.isValidLambdaContext(lambdaContext) || !(lambdaContext instanceof PsiExpressionStatement)) { + final PsiMethod[] methods = aClass.getMethods(); + if (methods.length == 1 && aClass.getFields().length == 0) { + final PsiCodeBlock body = methods[0].getBody(); + if (body != null) { + final ForbiddenRefsChecker checker = new ForbiddenRefsChecker(methods[0], aClass); + body.accept(checker); + if (!checker.hasForbiddenRefs()) { + PsiResolveHelper helper = PsiResolveHelper.SERVICE.getInstance(body.getProject()); + for (PsiLocalVariable local : checker.getLocals()) { + final String localName = local.getName(); + if (localName != null && helper.resolveReferencedVariable(localName, aClass) != null) return; + } + holder.registerProblem(aClass.getBaseClassReference(), "Anonymous #ref #loc can be replaced with lambda", + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, new ReplaceWithLambdaFix()); } - holder.registerProblem(aClass.getBaseClassReference(), "Anonymous #ref #loc can be replaced with lambda", - ProblemHighlightType.GENERIC_ERROR_OR_WARNING, new ReplaceWithLambdaFix()); } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeNotAStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeNotAStatement.java new file mode 100644 index 000000000000..6debe4d80c50 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeNotAStatement.java @@ -0,0 +1,17 @@ +// "Replace with lambda" "false" +class Test { + interface I { + + } + interface Bar extends I { + int compare(String o1, String o2); + } + { + new Bar() { + @Override + public int compare(String o1, String o2) { + return 0; + } + }; + } +} \ No newline at end of file