From 662ce2eb4be580036f5b069d1bf8e688ee1e0bf3 Mon Sep 17 00:00:00 2001 From: Egor18 Date: Fri, 5 Oct 2018 14:07:52 +0300 Subject: [PATCH 1/3] add failing test --- src/test/java/spoon/test/enums/EnumsTest.java | 19 +++++++++++++++++++ .../enums/testclasses/EnumWithMembers.java | 13 +++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/test/java/spoon/test/enums/testclasses/EnumWithMembers.java diff --git a/src/test/java/spoon/test/enums/EnumsTest.java b/src/test/java/spoon/test/enums/EnumsTest.java index 396d0691b29..14851de32e2 100644 --- a/src/test/java/spoon/test/enums/EnumsTest.java +++ b/src/test/java/spoon/test/enums/EnumsTest.java @@ -9,6 +9,7 @@ import spoon.reflect.declaration.CtEnumValue; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.ModifierKind; import spoon.reflect.factory.Factory; import spoon.reflect.visitor.DefaultJavaPrettyPrinter; @@ -18,6 +19,7 @@ import spoon.test.enums.testclasses.Foo; import spoon.test.enums.testclasses.NestedEnums; import spoon.test.enums.testclasses.Regular; +import spoon.test.enums.testclasses.EnumWithMembers; import spoon.testing.utils.ModelUtils; import static org.junit.Assert.assertEquals; @@ -170,4 +172,21 @@ public void testEnumValue() { } } } + + @Test + public void testEnumMembersModifiers() throws Exception { + // contract: enum members should have correct modifiers + final Factory factory = build(EnumWithMembers.class); + CtModel model = factory.getModel(); + + CtField lenField = model.getElements(new TypeFilter<>(CtField.class)).stream() + .filter(p -> p.getSimpleName().equals("len")) + .findFirst().get(); + + assertTrue(lenField.isPrivate()); + assertTrue(lenField.isStatic()); + assertFalse(lenField.isFinal()); + assertFalse(lenField.isPublic()); + assertFalse(lenField.isProtected()); + } } diff --git a/src/test/java/spoon/test/enums/testclasses/EnumWithMembers.java b/src/test/java/spoon/test/enums/testclasses/EnumWithMembers.java new file mode 100644 index 00000000000..56c751e5043 --- /dev/null +++ b/src/test/java/spoon/test/enums/testclasses/EnumWithMembers.java @@ -0,0 +1,13 @@ +package spoon.test.enums.testclasses; + +public enum EnumWithMembers { + ONE, + TWO, + THREE; + + private static int len = -1; + + public static void f() { + len = 44; + } +} From 2b28cbeba8d67dc436493d04b091558726bddf9d Mon Sep 17 00:00:00 2001 From: Egor18 Date: Wed, 10 Oct 2018 12:21:32 +0300 Subject: [PATCH 2/3] add possible fix --- src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java index 3ff0e0fd209..eeb1e2fe617 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java @@ -1140,7 +1140,9 @@ public boolean visit(FieldDeclaration fieldDeclaration, MethodScope scope) { } field.setSimpleName(CharOperation.charToString(fieldDeclaration.name)); if (fieldDeclaration.binding != null) { - if (fieldDeclaration.binding.declaringClass != null && fieldDeclaration.binding.declaringClass.isEnum()) { + if (fieldDeclaration.binding.declaringClass != null && + fieldDeclaration.binding.declaringClass.isEnum() && + field instanceof CtEnumValue) { //enum values take over visibility from enum type //JDT compiler has a bug that enum values are always public static final, even for private enum field.setExtendedModifiers(getModifiers(fieldDeclaration.binding.declaringClass.modifiers, true, false)); From fd90872f6181b7f501bf71df4c7039c862bb5338 Mon Sep 17 00:00:00 2001 From: Egor18 Date: Wed, 10 Oct 2018 12:53:18 +0300 Subject: [PATCH 3/3] fix checkstyle --- .../java/spoon/support/compiler/jdt/JDTTreeBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java index eeb1e2fe617..99b02409d7c 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java @@ -1140,9 +1140,9 @@ public boolean visit(FieldDeclaration fieldDeclaration, MethodScope scope) { } field.setSimpleName(CharOperation.charToString(fieldDeclaration.name)); if (fieldDeclaration.binding != null) { - if (fieldDeclaration.binding.declaringClass != null && - fieldDeclaration.binding.declaringClass.isEnum() && - field instanceof CtEnumValue) { + if (fieldDeclaration.binding.declaringClass != null + && fieldDeclaration.binding.declaringClass.isEnum() + && field instanceof CtEnumValue) { //enum values take over visibility from enum type //JDT compiler has a bug that enum values are always public static final, even for private enum field.setExtendedModifiers(getModifiers(fieldDeclaration.binding.declaringClass.modifiers, true, false));