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/10 15:06:25 UTC

[groovy] branch master updated: GROOVY-4266: stubgen: only write static imports

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 36d2c3b  GROOVY-4266: stubgen: only write static imports
36d2c3b is described below

commit 36d2c3baccfcd7635806db820f7857c42175d6ab
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)"
         }
     }
 }
-