You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ne...@apache.org on 2021/01/23 15:40:41 UTC

[netbeans] branch master updated: Fixing Java code generator to properly handle manipulations with annotations on enum constants.

This is an automated email from the ASF dual-hosted git repository.

neilcsmith pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new d23e817  Fixing Java code generator to properly handle manipulations with annotations on enum constants.
     new ea4ed6a  Merge pull request #2620 from jlahoda/fix-annotation-modifications-on-enum-constants
d23e817 is described below

commit d23e8173449625dc8969e5395f17a4f3ffa4981b
Author: Jan Lahoda <jl...@netbeans.org>
AuthorDate: Wed Dec 30 08:52:17 2020 +0100

    Fixing Java code generator to properly handle manipulations with annotations on enum constants.
---
 .../java/hints/declarative/remove-from-parent.hint |   3 +
 .../java/hints/declarative/remove-from-parent.test |  22 ++++
 .../modules/java/source/save/CasualDiff.java       |   5 +
 .../api/java/source/gen/AnnotationTest.java        | 127 ++++++++++++++++++++-
 .../api/java/source/gen/GeneratorTestBase.java     |  20 ++++
 5 files changed, 176 insertions(+), 1 deletion(-)

diff --git a/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.hint b/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.hint
index c9cc2b9..018b1dc 100644
--- a/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.hint
+++ b/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.hint
@@ -25,3 +25,6 @@
    double d
 => <!error="err",remove-from-parent=true>
 ;;
+    @Deprecated
+=> /*remove-from-parent*/
+;;
diff --git a/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.test b/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.test
index 7968c5e..eede1f0 100644
--- a/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.test
+++ b/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/remove-from-parent.test
@@ -43,3 +43,25 @@ public class Test {
 }
 %%=>
 remove-from-parent:f
+%%TestCase pos-annotation
+package test;
+public class Test {
+     @Deprecated
+     private void g() {}
+}
+%%=>
+package test;
+public class Test {
+     private void g() {}
+}
+%%TestCase pos-annotation-enum-constant
+package test;
+public enum Test {
+    @Deprecated
+    A();
+}
+%%=>
+package test;
+public enum Test {
+    A();
+}
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java b/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
index b26570f..edbce4c 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
@@ -1421,6 +1421,11 @@ public class CasualDiff {
         int localPointer = bounds[0];
         // check that it is not enum constant. If so, match it in special way
         if ((oldT.mods.flags & Flags.ENUM) != 0) {
+            JCModifiers mods = oldT.getModifiers();
+            int startPos = mods.pos != Position.NOPOS ? getOldPos(mods) : getOldPos(parent);
+
+            localPointer = diffAnnotationsLists(mods.getAnnotations(), newT.getModifiers().getAnnotations(), startPos, localPointer);
+
             if (nameChanged(oldT.name, newT.name)) {
                 copyTo(localPointer, oldT.pos);
                 printer.print(newT.name);
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/AnnotationTest.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/AnnotationTest.java
index 1f79fa0..abbcf6e 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/AnnotationTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/AnnotationTest.java
@@ -65,7 +65,7 @@ public class AnnotationTest extends GeneratorTestBase {
     public static NbTestSuite suite() {
         NbTestSuite suite = new NbTestSuite();
         suite.addTestSuite(AnnotationTest.class);
-//        suite.addTest(new ConstructorRenameTest("testAnnotationRename1"));
+//        suite.addTest(new AnnotationTest("testRemoveAnnotationEnumConstant"));
 //        suite.addTest(new ConstructorRenameTest("testAnnotationRename2"));
 //        suite.addTest(new ConstructorRenameTest("testClassToAnnotation"));
 //        suite.addTest(new ConstructorRenameTest("testAddDefaultValue"));
@@ -1009,6 +1009,131 @@ public class AnnotationTest extends GeneratorTestBase {
         assertEquals(golden, res);
     }
     
+    public void testRemoveAnnotationEnumConstant() throws Exception {
+        fileModificationTest("package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    A();\n" +
+                             "}\n",
+                             workingCopy -> {
+                                 ClassTree clazz = (ClassTree) workingCopy.getCompilationUnit().getTypeDecls().get(0);
+                                 VariableTree constant = (VariableTree) clazz.getMembers().get(1);
+                                 ModifiersTree mods = constant.getModifiers();
+                                 TreeMaker make = workingCopy.getTreeMaker();
+                                 workingCopy.rewrite(mods,
+                                                     make.addModifiersAnnotation(mods, make.Annotation(make.Identifier("Deprecated"), Collections.emptyList())));
+                             },
+                             "package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n");
+        fileModificationTest("package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n",
+                             workingCopy -> {
+                                 ClassTree clazz = (ClassTree) workingCopy.getCompilationUnit().getTypeDecls().get(0);
+                                 VariableTree constant = (VariableTree) clazz.getMembers().get(1);
+                                 ModifiersTree mods = constant.getModifiers();
+                                 TreeMaker make = workingCopy.getTreeMaker();
+                                 workingCopy.rewrite(mods,
+                                                     make.insertModifiersAnnotation(mods, 0, make.Annotation(make.Identifier("A"), Collections.emptyList())));
+                             },
+                             "package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @A\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n");
+        fileModificationTest("package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n",
+                             workingCopy -> {
+                                 ClassTree clazz = (ClassTree) workingCopy.getCompilationUnit().getTypeDecls().get(0);
+                                 VariableTree constant = (VariableTree) clazz.getMembers().get(1);
+                                 ModifiersTree mods = constant.getModifiers();
+                                 TreeMaker make = workingCopy.getTreeMaker();
+                                 workingCopy.rewrite(mods,
+                                                     make.insertModifiersAnnotation(mods, 1, make.Annotation(make.Identifier("A"), Collections.emptyList())));
+                             },
+                             "package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    @A\n" +
+                             "    A();\n" +
+                             "}\n");
+        fileModificationTest("package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @A\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n",
+                             workingCopy -> {
+                                 ClassTree clazz = (ClassTree) workingCopy.getCompilationUnit().getTypeDecls().get(0);
+                                 VariableTree constant = (VariableTree) clazz.getMembers().get(1);
+                                 ModifiersTree mods = constant.getModifiers();
+                                 TreeMaker make = workingCopy.getTreeMaker();
+                                 workingCopy.rewrite(mods,
+                                                     make.removeModifiersAnnotation(mods, 0));
+                             },
+                             "package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n");
+        fileModificationTest("package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    @A\n" +
+                             "    A();\n" +
+                             "}\n",
+                             workingCopy -> {
+                                 ClassTree clazz = (ClassTree) workingCopy.getCompilationUnit().getTypeDecls().get(0);
+                                 VariableTree constant = (VariableTree) clazz.getMembers().get(1);
+                                 ModifiersTree mods = constant.getModifiers();
+                                 TreeMaker make = workingCopy.getTreeMaker();
+                                 workingCopy.rewrite(mods,
+                                                     make.removeModifiersAnnotation(mods, 1));
+                             },
+                             "package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n");
+        fileModificationTest("package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    @Deprecated\n" +
+                             "    A();\n" +
+                             "}\n",
+                             workingCopy -> {
+                                 ClassTree clazz = (ClassTree) workingCopy.getCompilationUnit().getTypeDecls().get(0);
+                                 VariableTree constant = (VariableTree) clazz.getMembers().get(1);
+                                 ModifiersTree mods = constant.getModifiers();
+                                 TreeMaker make = workingCopy.getTreeMaker();
+                                 workingCopy.rewrite(mods,
+                                                     make.removeModifiersAnnotation(mods, 0));
+                             },
+                             "package hierbas.del.litoral;\n" +
+                             "\n" +
+                             "public enum Test {\n" +
+                             "    A();\n" +
+                             "}\n");
+    }
+
     String getGoldenPckg() {
         return "";
     }
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/GeneratorTestBase.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/GeneratorTestBase.java
index a2d1fa5..fa3d840 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/GeneratorTestBase.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/GeneratorTestBase.java
@@ -29,6 +29,7 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.StringTokenizer;
+import java.util.function.Consumer;
 import javax.swing.JEditorPane;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
@@ -206,6 +207,25 @@ public abstract class GeneratorTestBase extends ClassIndexTestCase {
         in.close();
     }
 
+    protected void fileModificationTest(String code, Consumer<WorkingCopy> modification, String expected) throws Exception {
+        testFile = new File(getWorkDir(), "Test.java");
+
+        TestUtilities.copyStringToFile(testFile, code);
+
+        JavaSource src = getJavaSource(testFile);
+        Task task = new Task<WorkingCopy>() {
+            public void run(final WorkingCopy workingCopy) throws IOException {
+                workingCopy.toPhase(Phase.RESOLVED);
+
+                modification.accept(workingCopy);
+            }
+        };
+        src.runModificationTask(task).commit();
+        String res = TestUtilities.copyFileToString(testFile);
+        //System.err.println(res);
+        assertEquals(expected, res);
+    }
+
     abstract String getGoldenPckg();
 
     abstract String getSourcePckg();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists