You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/01/03 03:08:14 UTC

[groovy] branch GROOVY-4266 created (now b6f8669)

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

emilles pushed a change to branch GROOVY-4266
in repository https://gitbox.apache.org/repos/asf/groovy.git.


      at b6f8669  GROOVY-4266: stubgen: only write static imports

This branch includes the following new commits:

     new b6f8669  GROOVY-4266: stubgen: only write static imports

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[groovy] 01/01: GROOVY-4266: stubgen: only write static imports

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY-4266
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit b6f8669c4ad4a88d87fddf09473a0e7428af5385
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Jan 2 21:05:15 2022 -0600

    GROOVY-4266: stubgen: only write static imports
---
 .../groovy/tools/javac/JavaStubGenerator.java      | 44 +++++++---------------
 .../CircularLanguageReferenceTest.groovy           | 12 +++---
 2 files changed, 20 insertions(+), 36 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/tools/javac/JavaStubGenerator.java b/src/main/java/org/codehaus/groovy/tools/javac/JavaStubGenerator.java
index 80c8e10..e638fea 100644
--- a/src/main/java/org/codehaus/groovy/tools/javac/JavaStubGenerator.java
+++ b/src/main/java/org/codehaus/groovy/tools/javac/JavaStubGenerator.java
@@ -49,7 +49,6 @@ import org.codehaus.groovy.ast.stmt.Statement;
 import org.codehaus.groovy.classgen.FinalVariableAnalyzer;
 import org.codehaus.groovy.classgen.Verifier;
 import org.codehaus.groovy.classgen.VerifierCodeVisitor;
-import org.codehaus.groovy.control.ResolveVisitor;
 import org.codehaus.groovy.runtime.FormatHelper;
 import org.codehaus.groovy.tools.Utilities;
 import org.codehaus.groovy.transform.trait.Traits;
@@ -174,14 +173,13 @@ public class JavaStubGenerator {
         javaStubCompilationUnitSet.add(new RawJavaFileObject(createJavaStubFile(fileName).toPath().toUri()));
     }
 
-    private static final int DEFAULT_BUFFER_SIZE = 8 * 1024; // 8K
-
     private String generateStubContent(ClassNode classNode) {
-        Writer writer = new StringBuilderWriter(DEFAULT_BUFFER_SIZE);
-
+        Writer writer = new StringBuilderWriter(8192);
         try (PrintWriter out = new PrintWriter(writer)) {
             boolean packageInfo = "package-info".equals(classNode.getNameWithoutPackage());
             String packageName = classNode.getPackageName();
+            currentModule = classNode.getModule();
+
             if (packageName != null) {
                 if (packageInfo) {
                     printAnnotations(out, classNode.getPackage());
@@ -191,11 +189,12 @@ public class JavaStubGenerator {
 
             // should just output the package statement for `package-info` class node
             if (!packageInfo) {
-                printImports(out, classNode);
+                printImports(out);
                 printClassContents(out, classNode);
             }
+        } finally {
+            currentModule = null;
         }
-
         return writer.toString();
     }
 
@@ -323,7 +322,6 @@ public class JavaStubGenerator {
             if (origNumConstructors == 0 && classNode.getDeclaredConstructors().size() == 1) {
                 classNode.getDeclaredConstructors().clear();
             }
-            currentModule = classNode.getModule();
 
             boolean isInterface = isInterfaceOrTrait(classNode);
             boolean isEnum = classNode.isEnum();
@@ -390,7 +388,6 @@ public class JavaStubGenerator {
             propertyMethods.clear();
             propertyMethodsWithSigs.clear();
             constructors.clear();
-            currentModule = null;
         }
     }
 
@@ -983,7 +980,7 @@ public class JavaStubGenerator {
             val = ((Expression) memberValue).getText();
         } else if (memberValue instanceof VariableExpression) {
             val = ((Expression) memberValue).getText();
-            //check for an alias
+            // check for an alias
             ImportNode alias = currentModule.getStaticImports().get(val);
             if (alias != null)
                 val = alias.getClassName() + "." + alias.getFieldName();
@@ -1020,34 +1017,21 @@ public class JavaStubGenerator {
             out.print("abstract ");
     }
 
-    private static void printImports(PrintWriter out, ClassNode classNode) {
-        List<String> imports = new ArrayList<>();
-        ModuleNode module = classNode.getModule();
-
-        for (ImportNode imp : module.getImports()) {
-            if (imp.getAlias() == null) imports.add(imp.getType().getName());
-        }
-
-        for (ImportNode imp : module.getStarImports()) {
-            imports.add(imp.getPackageName());
-        }
-
-        Collections.addAll(imports, ResolveVisitor.DEFAULT_IMPORTS);
+    private void printImports(final PrintWriter out) {
+        Map<String, ImportNode> staticImports = currentModule.getStaticImports();
+        Map<String, ImportNode> staticStarImports = currentModule.getStaticStarImports();
 
-        for (Map.Entry<String, ImportNode> entry : module.getStaticImports().entrySet()) {
+        for (Map.Entry<String, ImportNode> entry : staticImports.entrySet()) {
             String memberName = entry.getKey();
             if (memberName.equals(entry.getValue().getFieldName())
                     && !Character.isLowerCase(memberName.charAt(0))) // GROOVY-7510
-                imports.add("static " + entry.getValue().getType().getName() + "." + memberName);
+                out.println("import static " + entry.getValue().getType().getName().replace('$', '.') + "." + memberName + ";");
         }
 
-        for (Map.Entry<String, ImportNode> entry : module.getStaticStarImports().entrySet()) {
-            imports.add("static " + entry.getValue().getType().getName() + ".");
+        for (ImportNode ssi : staticStarImports.values()) {
+            out.println("import static " + ssi.getType().getName().replace('$', '.') + ".*;");
         }
 
-        for (String imp : imports) {
-            out.println("import " + imp.replace('$', '.') + (imp.endsWith(".") ? "*;" : ";"));
-        }
         out.println();
     }
 
diff --git a/src/test/org/codehaus/groovy/tools/stubgenerator/CircularLanguageReferenceTest.groovy b/src/test/org/codehaus/groovy/tools/stubgenerator/CircularLanguageReferenceTest.groovy
index c56f16f..b124bc2 100644
--- a/src/test/org/codehaus/groovy/tools/stubgenerator/CircularLanguageReferenceTest.groovy
+++ b/src/test/org/codehaus/groovy/tools/stubgenerator/CircularLanguageReferenceTest.groovy
@@ -25,17 +25,17 @@ package org.codehaus.groovy.tools.stubgenerator
  *
  * The test below looks at the characteristics of the stub generated in Java for the Rectangle class.
  */
-class CircularLanguageReferenceTest extends StubTestCase {
+final class CircularLanguageReferenceTest extends StubTestCase {
 
+    @Override
     void verifyStubs() {
         classes['stubgenerator.circularLanguageReference.Rectangle'].with {
-            assert methods['area'     ].signature == "public double area()"
-            assert methods['Rectangle'].signature == "public Rectangle(double x, double y)"
+            assert !imports
             assert !annotations
-            assert interfaces.toSet() == ['groovy.lang.GroovyObject', 'stubgenerator.circularLanguageReference.Shape'] as Set
             assert baseClass == 'java.lang.Object'
-            assert imports == ['java.lang.*', 'java.util.*', 'java.io.*', 'java.net.*', 'groovy.lang.*', 'groovy.util.*']
+            assert interfaces.toSet() == ['groovy.lang.GroovyObject', 'stubgenerator.circularLanguageReference.Shape'] as Set
+            assert methods['area'     ].signature == "public double area()"
+            assert methods['Rectangle'].signature == "public Rectangle(double x, double y)"
         }
     }
 }
-