From 866498cc6fc75c71424ddf0f0b826678c26add35 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 9 Oct 2015 16:56:12 +0200 Subject: [PATCH] control flow: take qualifier of left part of assignment expression into account (IDEA-146221) --- .../psi/controlFlow/ControlFlowAnalyzer.java | 5 +++++ .../expected.xml | 2 ++ .../src/Test.java | 15 +++++++++++++++ .../codeInspection/FieldCanBeLocalTest.java | 4 ++++ 4 files changed, 26 insertions(+) create mode 100644 java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/expected.xml create mode 100644 java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/src/Test.java diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java index 2b566b18b45f..af1dd8c5176d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java @@ -1307,6 +1307,11 @@ class ControlFlowAnalyzer extends JavaElementVisitor { startElement(lExpr); } + PsiExpression qualifier = ((PsiReferenceExpression)lExpr).getQualifierExpression(); + if (qualifier != null) { + qualifier.accept(this); + } + if (expression.getOperationTokenType() != JavaTokenType.EQ) { generateReadInstruction(variable); } diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/expected.xml b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/expected.xml new file mode 100644 index 000000000000..4704d91e891d --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/expected.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/src/Test.java b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/src/Test.java new file mode 100644 index 000000000000..04cb4de75ba3 --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldUsedInAnotherMethodAsQualifier/src/Test.java @@ -0,0 +1,15 @@ +class D { + D first; +} + +class Test { + private D myDSettings; + + protected void setUp() { + myDSettings = null; + } + + public void testModuleCycle() { + myDSettings.first = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java index 29a0a831087f..66670ec1eef5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java @@ -46,6 +46,10 @@ public class FieldCanBeLocalTest extends InspectionTestCase { doTestConfigured(inspection); } + public void testFieldUsedInAnotherMethodAsQualifier() throws Exception { + doTest(); + } + private void doTestConfigured(FieldCanBeLocalInspection inspection) { inspection.EXCLUDE_ANNOS.add(Deprecated.class.getName()); doTest("fieldCanBeLocal/" + getTestName(true), inspection);