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 6cae58f89a74..9af352809c3b 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -226,6 +226,14 @@ class ControlFlowAnalyzer extends JavaElementVisitor { finishElement(statement); } + @Override + public void visitField(PsiField field) { + PsiExpression initializer = field.getInitializer(); + if (initializer != null) { + initializeVariable(field, initializer); + } + } + private void initializeVariable(PsiVariable variable, PsiExpression initializer) { DfaVariableValue dfaVariable = myFactory.getVarFactory().createVariableValue(variable, false); addInstruction(new PushInstruction(dfaVariable, initializer)); diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java index abffef643418..4cc604c555b5 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java @@ -75,9 +75,7 @@ public class DataFlowInspection extends BaseLocalInspectionTool { return new JavaElementVisitor() { @Override public void visitField(PsiField field) { - if (isNullLiteralExpression(field.getInitializer()) && NullableNotNullManager.isNotNull(field)) { - holder.registerProblem(field.getInitializer(), InspectionsBundle.message("dataflow.message.initializing.field.with.null")); - } + analyzeCodeBlock(field, holder); } @Override @@ -92,19 +90,19 @@ public class DataFlowInspection extends BaseLocalInspectionTool { }; } - private void analyzeCodeBlock(final PsiCodeBlock body, ProblemsHolder holder) { - if (body == null) return; + private void analyzeCodeBlock(@Nullable final PsiElement scope, ProblemsHolder holder) { + if (scope == null) return; final StandardDataFlowRunner dfaRunner = new StandardDataFlowRunner(SUGGEST_NULLABLE_ANNOTATIONS); final StandardInstructionVisitor visitor = new DataFlowInstructionVisitor(); - final RunnerResult rc = dfaRunner.analyzeMethod(body, visitor); + final RunnerResult rc = dfaRunner.analyzeMethod(scope, visitor); if (rc == RunnerResult.OK) { if (dfaRunner.problemsDetected(visitor)) { createDescription(dfaRunner, holder, visitor); } } else if (rc == RunnerResult.TOO_COMPLEX) { - if (body.getParent() instanceof PsiMethod) { - PsiMethod method = (PsiMethod)body.getParent(); + if (scope.getParent() instanceof PsiMethod) { + PsiMethod method = (PsiMethod)scope.getParent(); final PsiIdentifier name = method.getNameIdentifier(); if (name != null) { // Might be null for synthetic methods like JSP page. holder.registerProblem(name, InspectionsBundle.message("dataflow.too.complex"), ProblemHighlightType.WEAK_WARNING); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/CheckFieldInitializers.java b/java/java-tests/testData/inspection/dataFlow/fixture/CheckFieldInitializers.java new file mode 100644 index 000000000000..e6a87ac88f76 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/CheckFieldInitializers.java @@ -0,0 +1,13 @@ +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + + +class Foo { + @Nullable static Object foo() { return null; } + static String bar(@NotNull Object arg) { return ""; } +} +class Bar { + public static final String s = Foo.bar(Foo.foo()); + @NotNull public static Object o = Foo.foo(); + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index 6d963c22e705..26b48acbcc94 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -126,4 +126,8 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas myFixture.testHighlighting(true, false, true, getTestName(false) + ".java"); } + public void testCheckFieldInitializers() { + doTest(); + } + }