You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/02/23 06:07:42 UTC

[groovy] 01/02: Tweak the logic of finding default imports and remove the redundant test code

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

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

commit 63619072c5284dd6b1bc72e9eab29ab52a625f42
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Feb 23 12:45:52 2020 +0800

    Tweak the logic of finding default imports and remove the redundant test code
    
    (cherry picked from commit 98b436016f31e9c47f3a6dc88ac834634761cffb)
---
 .../org/codehaus/groovy/vmplugin/v9/Java9.java     | 29 +++++++++++-----
 .../groovy/vmplugin/v9/ClassFinderTest.groovy      | 40 ----------------------
 2 files changed, 21 insertions(+), 48 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
index 60b354d..27c8ad6 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
@@ -18,8 +18,8 @@
  */
 package org.codehaus.groovy.vmplugin.v9;
 
+import groovy.lang.GroovyClassLoader;
 import groovy.lang.GroovyRuntimeException;
-import groovy.lang.GroovySystem;
 import groovy.lang.MetaClass;
 import groovy.lang.MetaMethod;
 import groovy.lang.Tuple;
@@ -54,16 +54,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 /**
  * Additional Java 9 based functions will be added here as needed.
  */
 public class Java9 extends Java8 {
+    private static final Logger LOGGER = Logger.getLogger(Java9.class.getName());
+
     @Override
     public Map<String, Set<String>> getDefaultImportClasses(String[] packageNames) {
-        Map<String, Set<String>> result = new LinkedHashMap<>();
-
         List<String> javaPns = new ArrayList<>(4);
         List<String> groovyPns = new ArrayList<>(4);
         for (String prefix : packageNames) {
@@ -78,13 +80,24 @@ public class Java9 extends Java8 {
             }
         }
 
-        result.putAll(doFindClasses(URI.create("jrt:/modules/java.base/"), "java", javaPns));
-
+        Map<String, Set<String>> result = new LinkedHashMap<>(2048);
         try {
-            URI gsLocation = DefaultGroovyMethods.getLocation(GroovySystem.class).toURI();
+            result.putAll(doFindClasses(URI.create("jrt:/modules/java.base/"), "java", javaPns));
+
+            GroovyClassLoader gcl = new GroovyClassLoader();
+            URI gsLocation = DefaultGroovyMethods.getLocation(gcl.loadClass("groovy.lang.GroovySystem")).toURI();
             result.putAll(doFindClasses(gsLocation, "groovy", groovyPns));
-        } catch (Exception e) {
-            System.err.println("[WARNING] Failed to get default imported groovy classes: " + e.getMessage());
+
+            // in production environment, groovy-core classes, e.g. `GroovySystem`(java class) and `GrapeIvy`(groovy class) are all packaged in the groovy-core jar file,
+            // but in Groovy development environment, groovy-core classes are distributed in different directories
+            URI giLocation = DefaultGroovyMethods.getLocation(gcl.loadClass("groovy.grape.GrapeIvy")).toURI();
+            if (!gsLocation.equals(giLocation)) {
+                result.putAll(doFindClasses(giLocation, "groovy", groovyPns));
+            }
+        } catch (Exception ignore) {
+            if (LOGGER.isLoggable(Level.FINEST)) {
+                LOGGER.finest("Failed to find default imported classes:\n" + DefaultGroovyMethods.asString(ignore));
+            }
         }
 
         return result;
diff --git a/src/test/org/codehaus/groovy/vmplugin/v9/ClassFinderTest.groovy b/src/test/org/codehaus/groovy/vmplugin/v9/ClassFinderTest.groovy
index 37ee4b0..953bd1a 100644
--- a/src/test/org/codehaus/groovy/vmplugin/v9/ClassFinderTest.groovy
+++ b/src/test/org/codehaus/groovy/vmplugin/v9/ClassFinderTest.groovy
@@ -19,7 +19,6 @@
 package org.codehaus.groovy.vmplugin.v9
 
 import org.codehaus.groovy.control.ResolveVisitor
-import org.codehaus.groovy.runtime.DefaultGroovyMethods
 import org.codehaus.groovy.vmplugin.VMPluginFactory
 import org.junit.Test
 
@@ -102,44 +101,5 @@ class ClassFinderTest {
         Map<String, Set<String>> r1 = VMPluginFactory.getPlugin().getDefaultImportClasses(ResolveVisitor.DEFAULT_IMPORTS) as TreeMap<String, Set<String>>
 
         assert (ResolveVisitor.DEFAULT_IMPORTS as List).sort() == r1.values().stream().flatMap(e -> e.stream()).collect(Collectors.toSet()).sort()
-
-        def r2 = [:] as TreeMap
-        URI gsLocation = null;
-        try {
-            gsLocation = DefaultGroovyMethods.getLocation(GroovySystem.class).toURI();
-        } catch (URISyntaxException e) {
-            e.printStackTrace();
-        }
-
-        for (String prefix : ResolveVisitor.DEFAULT_IMPORTS) {
-            String pn = prefix.substring(0, prefix.length() - 1).replace('.', '/');
-
-            Map<String, Set<String>> map = Collections.emptyMap();
-            if (pn.startsWith("java/")) {
-                map = ClassFinder.find(URI.create("jrt:/modules/java.base/"), pn);
-            } else if (pn.startsWith("groovy/")) {
-                if (null != gsLocation) {
-                    map = ClassFinder.find(gsLocation, pn);
-                }
-            }
-
-            map = map.entrySet().stream()
-                    .collect(
-                            Collectors.toMap(
-                                    (Map.Entry entry) -> entry.getKey(),
-                                    (Map.Entry entry) -> entry.getValue().stream()
-                                            .map(e -> e.replace('/', '.') + ".")
-                                            .collect(Collectors.toSet())
-                            )
-                    );
-
-            r2.putAll(map);
-        }
-
-        assert r1.size() == r2.size()
-        assert r1.keySet() == r2.keySet()
-        r1.keySet().each { c1 ->
-            assert (r1.get(c1) as TreeSet) == (r2.get(c1) as TreeSet)
-        }
     }
 }