You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ge...@apache.org on 2021/03/29 21:31:08 UTC

[netbeans] branch master updated: Fixing codegen handling of both rewrite of an import and an adding of an import due to qual ident.

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

geertjan 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 e8d85af  Fixing codegen handling of both rewrite of an import and an adding of an import due to qual ident.
     new 4482ad1  Merge pull request #2808 from jlahoda/import-rewrite-and-qual-ident
e8d85af is described below

commit e8d85afc5db8793016bde8980be5eeaac9e8845d
Author: Jan Lahoda <jl...@netbeans.org>
AuthorDate: Sat Mar 13 07:44:54 2021 +0100

    Fixing codegen handling of both rewrite of an import and an adding of an import due to qual ident.
---
 .../api/java/source/GeneratorUtilities.java        | 16 +++++-
 .../java/source/GeneratorUtilitiesAccessor.java    | 65 ++++++++++++++++++++++
 .../source/transform/ImmutableTreeTranslator.java  |  6 +-
 .../api/java/source/gen/ImportAnalysis2Test.java   | 36 ++++++++++++
 4 files changed, 121 insertions(+), 2 deletions(-)

diff --git a/java/java.source.base/src/org/netbeans/api/java/source/GeneratorUtilities.java b/java/java.source.base/src/org/netbeans/api/java/source/GeneratorUtilities.java
index 40a051c..b945f7e 100644
--- a/java/java.source.base/src/org/netbeans/api/java/source/GeneratorUtilities.java
+++ b/java/java.source.base/src/org/netbeans/api/java/source/GeneratorUtilities.java
@@ -121,6 +121,7 @@ import org.netbeans.api.lexer.TokenHierarchy;
 import org.netbeans.api.lexer.TokenSequence;
 import org.netbeans.api.queries.FileEncodingQuery;
 import org.netbeans.api.scripting.Scripting;
+import org.netbeans.modules.java.source.GeneratorUtilitiesAccessor;
 import org.netbeans.modules.java.source.TreeShims;
 import org.netbeans.modules.java.source.builder.CommentHandlerService;
 import org.netbeans.modules.java.source.builder.CommentSetImpl;
@@ -1068,6 +1069,10 @@ public final class GeneratorUtilities {
      * @since 0.86
      */
     public CompilationUnitTree addImports(CompilationUnitTree cut, Set<? extends Element> toImport) {
+        return addImports(cut, cut.getImports(), toImport);
+    }
+
+    private CompilationUnitTree addImports(CompilationUnitTree cut, List<? extends ImportTree> cutImports, Set<? extends Element> toImport) {
         assert cut != null && toImport != null && toImport.size() > 0;
 
         ArrayList<Element> elementsToImport = new ArrayList<Element>(toImport.size());
@@ -1175,7 +1180,7 @@ public final class GeneratorUtilities {
                 }
             }
         }
-        List<ImportTree> imports = new ArrayList<ImportTree>(cut.getImports());
+        List<ImportTree> imports = new ArrayList<ImportTree>(cutImports);
         for (ImportTree imp : imports) {
             Element e = getImportedElement(cut, imp);
             if (!elementsToImport.contains(e)) {
@@ -2247,4 +2252,13 @@ public final class GeneratorUtilities {
         }.scan(tree, false);
         return b != null ? b : false;
     }
+
+    static {
+        GeneratorUtilitiesAccessor.setInstance(new GeneratorUtilitiesAccessor() {
+            @Override
+            public CompilationUnitTree addImports(GeneratorUtilities gu, CompilationUnitTree cut, List<? extends ImportTree> cutImports, Set<? extends Element> toImport) {
+                return gu.addImports(cut, cutImports, toImport);
+            }
+        });
+    }
 }
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/GeneratorUtilitiesAccessor.java b/java/java.source.base/src/org/netbeans/modules/java/source/GeneratorUtilitiesAccessor.java
new file mode 100644
index 0000000..3e96b8d
--- /dev/null
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/GeneratorUtilitiesAccessor.java
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.source;
+
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.ImportTree;
+import java.util.List;
+import java.util.Set;
+import javax.lang.model.element.Element;
+import org.netbeans.api.java.source.GeneratorUtilities;
+
+public abstract class GeneratorUtilitiesAccessor {
+
+    private static volatile GeneratorUtilitiesAccessor INSTANCE;
+
+    public static GeneratorUtilitiesAccessor getInstance() {
+        GeneratorUtilitiesAccessor result = INSTANCE;
+
+        if (result == null) {
+            synchronized (GeneratorUtilitiesAccessor.class) {
+                if (INSTANCE == null) {
+                    Class c = GeneratorUtilities.class;
+                    try {
+                        Class.forName(c.getName(), true, c.getClassLoader());
+                    } catch (Exception ex) {
+                        ex.printStackTrace();
+                    }
+
+                    assert INSTANCE != null;
+                }
+
+                return INSTANCE;
+            }
+        }
+
+        return result;
+    }
+
+    public static void setInstance(GeneratorUtilitiesAccessor instance) {
+        assert instance != null;
+        INSTANCE = instance;
+    }
+
+    protected GeneratorUtilitiesAccessor() {
+    }
+
+    public abstract CompilationUnitTree addImports(GeneratorUtilities gu, CompilationUnitTree cut, List<? extends ImportTree> cutImports, Set<? extends Element> toImport);
+
+}
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java b/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java
index a4a93ce..3d6c6fc 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java
@@ -24,6 +24,7 @@ import com.sun.source.tree.*;
 import com.sun.source.tree.Tree.Kind;
 import com.sun.tools.javac.code.Flags;
 import com.sun.tools.javac.model.JavacElements;
+import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
 import com.sun.tools.javac.tree.JCTree.JCLambda;
 import com.sun.tools.javac.tree.JCTree.JCModifiers;
 import com.sun.tools.javac.util.Context;
@@ -39,6 +40,7 @@ import javax.lang.model.util.Elements;
 import org.netbeans.api.java.source.GeneratorUtilities;
 import org.netbeans.api.java.source.TreeMaker;
 import org.netbeans.api.java.source.WorkingCopy;
+import org.netbeans.modules.java.source.GeneratorUtilitiesAccessor;
 import org.netbeans.modules.java.source.TreeShims;
 import org.netbeans.modules.java.source.builder.ASTService;
 import org.netbeans.modules.java.source.builder.CommentHandlerService;
@@ -546,7 +548,9 @@ public class ImmutableTreeTranslator implements TreeVisitor<Tree,Object> {
         
         Set<? extends Element> newImports = importAnalysis.getImports();
         if (copy != null && newImports != null && !newImports.isEmpty()) {
-            imps = GeneratorUtilities.get(copy).addImports(tree, newImports).getImports();
+            imps = GeneratorUtilitiesAccessor.getInstance()
+                                             .addImports(GeneratorUtilities.get(copy), tree, imps, newImports)
+                                             .getImports();
         }
         
 	if (!annotations.equals(tree.getPackageAnnotations()) || pid!=tree.getPackageName() || !imps.equals(tree.getImports()) ||
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/ImportAnalysis2Test.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/ImportAnalysis2Test.java
index e9a65e6..5104e1d 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/ImportAnalysis2Test.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/ImportAnalysis2Test.java
@@ -911,6 +911,42 @@ public class ImportAnalysis2Test extends GeneratorTestMDRCompat {
         assertEquals(golden, res);
     }
  
+    public void testQualIdentAndImportChange() throws Exception {
+        testFile = new File(getWorkDir(), "hierbas/del/litoral/Test.java");
+        assertTrue(testFile.getParentFile().mkdirs());
+        TestUtilities.copyStringToFile(testFile,
+            "package hierbas.del.litoral;\n" +
+            "import java.lang.String;\n" +
+            "public class Test {\n" +
+            "}\n"
+            );
+        String golden =
+            "package hierbas.del.litoral;\n" +
+            "import java.lang.CharSequence;\n" +
+            "import java.util.List;\n" +
+            "public class Test {\n\n" +
+            "    List test;\n" +
+            "}\n";
+
+        JavaSource src = getJavaSource(testFile);
+        Task<WorkingCopy> task = new Task<WorkingCopy>() {
+
+            public void run(WorkingCopy workingCopy) throws IOException {
+                workingCopy.toPhase(Phase.RESOLVED);
+                TreeMaker make = workingCopy.getTreeMaker();
+                ImportTree imp = workingCopy.getCompilationUnit().getImports().get(0);
+                workingCopy.rewrite(imp.getQualifiedIdentifier(), make.MemberSelect(make.MemberSelect(make.Identifier("java"), "lang"), "CharSequence"));
+                ClassTree clazz = (ClassTree) workingCopy.getCompilationUnit().getTypeDecls().get(0);
+                workingCopy.rewrite(clazz, make.addClassMember(clazz, make.Variable(make.Modifiers(EnumSet.noneOf(Modifier.class)), "test", make.QualIdent("java.util.List"), null)));
+            }
+
+        };
+        src.runModificationTask(task).commit();
+        String res = TestUtilities.copyFileToString(testFile);
+        //System.err.println(res);
+        assertEquals(golden, res);
+    }
+
     String getGoldenPckg() {
         return "";
     }

---------------------------------------------------------------------
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