From 99f343707f2e0a37951e0c09f4b1e4814ad80b55 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 10 Jul 2015 19:32:11 +0200 Subject: [PATCH] dfa: inspect enum constant methods (IDEA-142299) --- .../dataFlow/DataFlowInspectionBase.java | 2 +- .../fixture/CustomDefaultInEnums.java | 37 +++++++++++++++++++ .../DataFlowInspectionTest.java | 15 ++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/CustomDefaultInEnums.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java index 2ac602d69d54..4e7d44f40af0 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java @@ -140,7 +140,7 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool { if (scope == null) return; PsiClass containingClass = PsiTreeUtil.getParentOfType(scope, PsiClass.class); - if (containingClass != null && PsiUtil.isLocalOrAnonymousClass(containingClass)) return; + if (containingClass != null && PsiUtil.isLocalOrAnonymousClass(containingClass) && !(containingClass instanceof PsiEnumConstantInitializer)) return; final StandardDataFlowRunner dfaRunner = new StandardDataFlowRunner(TREAT_UNKNOWN_MEMBERS_AS_NULLABLE, !isInsideConstructorOrInitializer( scope)) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/CustomDefaultInEnums.java b/java/java-tests/testData/inspection/dataFlow/fixture/CustomDefaultInEnums.java new file mode 100644 index 000000000000..2c9bbfc80592 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/CustomDefaultInEnums.java @@ -0,0 +1,37 @@ +package foo; + +import javax.annotation.*; + +enum TestNonnull { + TEST { + @Nonnull + @Override + public Object testWithAnnotation(@Nonnull Object aObject) { + if (aObject == null) { + return new Object(); + } + return null; + } + + @Override + public Object testWithoutAnnotation(Object aObject) { + return null; + } + }; + + public boolean testParameter(TestNonnull aTest) { + if (aTest == null) { + return true; + } + return false; + } + + public Object testReturn() { + return null; + } + + @Nonnull + public abstract Object testWithAnnotation(@Nonnull Object aObject); + + public abstract Object testWithoutAnnotation(Object aObject); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 3e8b46f428a4..e5b714799fc3 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -336,6 +336,21 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { myFixture.testHighlighting(true, false, true, getTestName(false) + ".java"); } + public void testCustomDefaultInEnums() { + DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); + myFixture.addClass("package foo;" + + "import static java.lang.annotation.ElementType.*;" + + "@javax.annotation.meta.TypeQualifierDefault({PARAMETER, FIELD, METHOD, LOCAL_VARIABLE}) " + + "@javax.annotation.Nonnull " + + "public @interface NonnullByDefault {}"); + + myFixture.addFileToProject("foo/package-info.java", "@NonnullByDefault package foo;"); + + myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject(getTestName(false) + ".java", "foo/Classes.java")); + myFixture.enableInspections(new DataFlowInspection()); + myFixture.checkHighlighting(true, false, true); + } + public void testTrueOrEqualsSomething() { doTest(); myFixture.launchAction(myFixture.findSingleIntention("Remove redundant assignment"));