From f4e9d475a3df5bf4f8e97cecbb6e6e32389567f8 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 15 Mar 2012 19:12:11 +0400 Subject: [PATCH] IDEA-77484 + tests --- .../dataFlow/ControlFlowAnalyzer.java | 10 +++++++++- .../fixture/CanBeNullDoesntImplyIsNull.java | 14 ++++++++++++++ .../inspection/dataFlow/fixture/NullableField.java | 9 +++++++++ .../DataFlowInspectionFixtureTest.java | 3 ++- 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/CanBeNullDoesntImplyIsNull.java create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/NullableField.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 3e0381d52e60..e99d06cbf2ad 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -16,6 +16,7 @@ package com.intellij.codeInspection.dataFlow; import com.intellij.codeInsight.ExceptionUtil; +import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInspection.dataFlow.instructions.*; import com.intellij.codeInspection.dataFlow.value.DfaUnknownValue; import com.intellij.codeInspection.dataFlow.value.DfaValue; @@ -1431,6 +1432,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor { startElement(expression); DfaValue dfaValue = myFactory.create(expression); + PsiElement resolved = expression.resolve(); if (dfaValue instanceof DfaVariableValue) { DfaVariableValue dfaVariable = (DfaVariableValue)dfaValue; PsiVariable psiVariable = dfaVariable.getPsiVariable(); @@ -1442,7 +1444,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor { final PsiExpression qualifierExpression = expression.getQualifierExpression(); if (qualifierExpression != null) { qualifierExpression.accept(this); - if (expression.resolve() instanceof PsiField) { + if (resolved instanceof PsiField) { addInstruction(new FieldReferenceInstruction(expression, null)); } else { @@ -1450,6 +1452,12 @@ class ControlFlowAnalyzer extends JavaElementVisitor { } } + if (dfaValue == null && resolved instanceof PsiField) { + // Accessing a field from another instance + dfaValue = myFactory.getTypeFactory().create(((PsiField)resolved).getType(), + NullableNotNullManager.isNullable((PsiModifierListOwner)resolved)); + } + addInstruction(new PushInstruction(dfaValue, expression)); finishElement(expression); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/CanBeNullDoesntImplyIsNull.java b/java/java-tests/testData/inspection/dataFlow/fixture/CanBeNullDoesntImplyIsNull.java new file mode 100644 index 000000000000..56f577112808 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/CanBeNullDoesntImplyIsNull.java @@ -0,0 +1,14 @@ +import org.jetbrains.annotations.Nullable; + +public class DDD { + int test(boolean t) { + if (t && fff().length == 1) { + return 0; + } + return 1; + } + + public @Nullable DDD[] fff() { + return new DDD[8]; + } +} diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableField.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableField.java new file mode 100644 index 000000000000..0a341d37e4e9 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableField.java @@ -0,0 +1,9 @@ +import org.jetbrains.annotations.Nullable; + +public class DDD { + @Nullable + String field; + int test() { + return new DDD().field.hashCode(); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index af8d11f9b962..9b6bd4cf2ce7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -33,5 +33,6 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas public void testNullableAnonymousVolatileNotNull() throws Throwable { doTest(); } public void testFieldInAnonymous() throws Throwable { doTest(); } - + public void testNullableField() throws Throwable { doTest(); } + public void testCanBeNullDoesntImplyIsNull() throws Throwable { doTest(); } }