From 4e813690f7483bba549264e59f8fc9651036e0f1 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 6 Jul 2016 16:56:38 +0200 Subject: [PATCH] anonymous -> lambda: allow field shadowing when suggesting new local names (IDEA-157288) --- .../AnonymousCanBeLambdaInspection.java | 7 ++++++- .../anonymous2lambda/afterFieldShadowing.java | 10 ++++++++++ .../anonymous2lambda/beforeFieldShadowing.java | 13 +++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFieldShadowing.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeFieldShadowing.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 285593a66ee4..0d9b022ec331 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java @@ -344,7 +344,7 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection PsiVariable local = iterator.next(); final String localName = local.getName(); if (localName == null || - helper.resolveReferencedVariable(localName, lambdaExpression) == null || + shadowingResolve(localName, lambdaExpression, helper) || !PsiTreeUtil.isAncestor(lambdaExpression, local, false)) { iterator.remove(); namesOfVariablesInTheBlock.add(localName); @@ -352,6 +352,11 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection } } + private static boolean shadowingResolve(String localName, PsiLambdaExpression lambdaExpression, PsiResolveHelper helper) { + final PsiVariable variable = helper.resolveReferencedVariable(localName, lambdaExpression); + return variable == null || variable instanceof PsiField; + } + private static class ReplaceWithLambdaFix implements LocalQuickFix, HighPriorityAction { @NotNull @Override diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFieldShadowing.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFieldShadowing.java new file mode 100644 index 000000000000..380e71d63659 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFieldShadowing.java @@ -0,0 +1,10 @@ +// "Replace with lambda" "true" +class Test { + Integer s; + private void m() { + Runnable r = () -> { + System.out.println(s); + Integer s = Test.this.s; + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeFieldShadowing.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeFieldShadowing.java new file mode 100644 index 000000000000..676ce3ad8588 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeFieldShadowing.java @@ -0,0 +1,13 @@ +// "Replace with lambda" "true" +class Test { + Integer s; + private void m() { + Runnable r = new Runnable() { + @Override + public void run() { + System.out.println(s); + Integer s = Test.this.s; + } + }; + } +} \ No newline at end of file