From 872e3b5153cfe7b41e40ca7ce92a1f87b220b7a7 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 3 May 2013 21:52:11 +0200 Subject: [PATCH] enum initializer rules http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2 (IDEA-56239) --- .../impl/analysis/GenericsHighlightUtil.java | 16 +++++---- .../genericsHighlighting/Enum56239.java | 34 +++++++++++++++++++ .../daemon/GenericsHighlightingTest.java | 5 ++- 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Enum56239.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 1e5d68fb2eca..3f9bf87694f3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -893,6 +893,7 @@ public class GenericsHighlightUtil { return typeParameters[0]; } + //http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2 @Nullable public static HighlightInfo checkAccessStaticFieldFromEnumConstructor(PsiReferenceExpression expr, JavaResolveResult result) { final PsiElement resolved = result.getElement(); @@ -903,14 +904,17 @@ public class GenericsHighlightUtil { if (constructorOrInitializer == null) return null; if (constructorOrInitializer.hasModifierProperty(PsiModifier.STATIC)) return null; final PsiClass aClass = constructorOrInitializer.getContainingClass(); - if (aClass == null) return null; - if (!aClass.isEnum()) return null; + if (aClass == null || !(aClass.isEnum() || aClass instanceof PsiEnumConstantInitializer)) return null; final PsiField field = (PsiField)resolved; - if (field.getContainingClass() != aClass) return null; - final PsiType type = field.getType(); + if (aClass instanceof PsiEnumConstantInitializer) { + if (field.getContainingClass() != aClass.getSuperClass()) return null; + } else if (field.getContainingClass() != aClass) return null; - //TODO is access to enum constant is allowed ? - if (type instanceof PsiClassType && ((PsiClassType)type).resolve() == aClass) return null; + + if (!JavaVersionService.getInstance().isAtLeast(field, JavaSdkVersion.JDK_1_6)) { + final PsiType type = field.getType(); + if (type instanceof PsiClassType && ((PsiClassType)type).resolve() == aClass) return null; + } if (PsiUtil.isCompileTimeConstant(field)) return null; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Enum56239.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Enum56239.java new file mode 100644 index 000000000000..9f7d0b8f195e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Enum56239.java @@ -0,0 +1,34 @@ +enum IDEA56239 { + A, B() { + { + System.out.println(A); + System.out.println(FOO); + System.out.println(FOO1); + System.out.println(C); + } + }, C(D), D; + + public static String FOO = ""; + public static final String FOO1 = ""; + + IDEA56239() { + } + + IDEA56239(IDEA56239 t) { + System.out.println(A); + System.out.println(FOO); + System.out.println(FOO1); + } + + { + System.out.println(A); + System.out.println(FOO); + System.out.println(FOO1); + } + + void foo() { + System.out.println(A); + System.out.println(FOO); + System.out.println(FOO1); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index e6b5c096efeb..37163f203e22 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -73,7 +73,10 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testAutoboxingMethods() { doTest5(false); } public void testAutoboxingConstructors() { doTest5(false); } public void testEnumWithAbstractMethods() { doTest5(false); } - public void testEnum() { doTest5(false); } + public void testEnum() { + doTest(LanguageLevel.JDK_1_5, JavaSdkVersion.JDK_1_5, false); + } + public void testEnum56239() { doTest(LanguageLevel.JDK_1_6, JavaSdkVersion.JDK_1_6, false); } public void testSameErasure() { doTest5(false); } public void testMethods() { doTest5(false); } public void testFields() { doTest5(false); }