From 54372474ccaa147baf4cbe93dee3f670054af2da Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 26 Sep 2012 19:09:44 +0200 Subject: [PATCH] lambda: treat fields used for write inside lambda same way as anonymous classes (IDEA-92085) --- .../FieldCanBeLocalInspection.java | 11 ++++++++++- .../fieldUsedForWritingInLambda/expected.xml | 3 +++ .../fieldUsedForWritingInLambda/src/Test.java | 13 +++++++++++++ .../fieldCanBeLocal/twoMethods/src/Test.java | 15 ++++++--------- .../codeInspection/FieldCanBeLocalTest.java | 1 + 5 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/expected.xml create mode 100644 java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/src/Test.java diff --git a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java index f9e84420a033..365dce24995f 100644 --- a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java @@ -152,6 +152,15 @@ public class FieldCanBeLocalInspection extends BaseLocalInspectionTool { } } + @Override + public void visitLambdaExpression(PsiLambdaExpression expression) { + super.visitLambdaExpression(expression); + final PsiElement body = expression.getBody(); + if (body != null) { + checkCodeBlock(body, candidates, usedFields); + } + } + @Override public void visitClassInitializer(PsiClassInitializer initializer) { super.visitClassInitializer(initializer); @@ -160,7 +169,7 @@ public class FieldCanBeLocalInspection extends BaseLocalInspectionTool { }); } - private static void checkCodeBlock(final PsiCodeBlock body, final Set candidates, Set usedFields) { + private static void checkCodeBlock(final PsiElement body, final Set candidates, Set usedFields) { try { final ControlFlow controlFlow = ControlFlowFactory.getInstance(body.getProject()).getControlFlow(body, AllVariablesControlFlowPolicy.getInstance()); final List usedVars = ControlFlowUtil.getUsedVariables(controlFlow, 0, controlFlow.getSize()); diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/expected.xml b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/expected.xml new file mode 100644 index 000000000000..580a889dbfd6 --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/expected.xml @@ -0,0 +1,3 @@ + + + diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/src/Test.java b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/src/Test.java new file mode 100644 index 000000000000..30467475a42b --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedForWritingInLambda/src/Test.java @@ -0,0 +1,13 @@ +class Test { + private int f; + + void foo () { + f = 0; + int k = f; + } + + int bar () { + f = 5; + return f; + } +} diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/twoMethods/src/Test.java b/java/java-tests/testData/inspection/fieldCanBeLocal/twoMethods/src/Test.java index 30467475a42b..94df44e854ea 100644 --- a/java/java-tests/testData/inspection/fieldCanBeLocal/twoMethods/src/Test.java +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/twoMethods/src/Test.java @@ -1,13 +1,10 @@ class Test { - private int f; + private int f; - void foo () { - f = 0; - int k = f; - } + public void bar() { + foo(() -> {f++;}); + } - int bar () { - f = 5; - return f; - } + private void foo(Runnable r) { + } } diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java index 0a3039b5a4c1..3cef83133c78 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java @@ -32,6 +32,7 @@ public class FieldCanBeLocalTest extends InspectionTestCase { public void testInnerClassFieldInitializer() throws Exception {doTest();} public void testFieldUsedInConstantInitialization() throws Exception {doTest();} public void testFieldWithImmutableType() throws Exception {doTest();} + public void testFieldUsedForWritingInLambda() throws Exception {doTest();} public void testIgnoreAnnotated() throws Exception { final FieldCanBeLocalInspection inspection = new FieldCanBeLocalInspection(); inspection.EXCLUDE_ANNOS.add(Deprecated.class.getName());