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/19 00:36:07 UTC

[groovy] branch danielsun/tweak-resolving updated: Fix the failing JDK8 build

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

sunlan pushed a commit to branch danielsun/tweak-resolving
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/danielsun/tweak-resolving by this push:
     new 9fdfb92  Fix the failing JDK8 build
9fdfb92 is described below

commit 9fdfb92bc96dc528a78e2b12b0cd20983d4185d7
Author: Daniel Sun <su...@apache.org>
AuthorDate: Wed Feb 19 08:35:46 2020 +0800

    Fix the failing JDK8 build
---
 .../codehaus/groovy/control/ResolveVisitor.java    | 42 +--------------------
 .../org/codehaus/groovy/vmplugin/VMPlugin.java     |  7 ++++
 .../codehaus/groovy/vmplugin/v9/ClassFinder.java   |  2 +-
 .../org/codehaus/groovy/vmplugin/v9/Java9.java     | 44 ++++++++++++++++++++++
 4 files changed, 53 insertions(+), 42 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index 0eda13a..a3d9efc 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -645,47 +645,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
 
     private static final EvictableCache<String, Set<String>> DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE = new UnlimitedConcurrentCache<>();
     static {
-        if (VMPluginFactory.getPlugin().getVersion() >= 9) {
-            try {
-                initCache();
-            } catch (Exception e) {
-                System.err.println("[WARNING] The default import cache of resolve visitor failed to be initialized");
-            }
-        }
-    }
-
-    private static void initCache() {
-        URI gsLocation = null;
-        try {
-            gsLocation = DefaultGroovyMethods.getLocation(GroovySystem.class).toURI();
-        } catch (URISyntaxException e) {
-            e.printStackTrace();
-        }
-
-        for (String prefix : 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::getKey,
-                                    entry -> entry.getValue().stream()
-                                                .map(e -> e.replace('/', '.') + ".")
-                                                .collect(Collectors.toSet())
-                            )
-                    );
-
-            DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE.putAll(map);
-        }
+        DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE.putAll(VMPluginFactory.getPlugin().getDefaultImportClasses(DEFAULT_IMPORTS));
     }
 
     protected boolean resolveFromDefaultImports(final ClassNode type, final String[] packagePrefixes) {
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java b/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
index 40ba4fb..7478a5b 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
@@ -26,6 +26,9 @@ import org.codehaus.groovy.ast.CompileUnit;
 
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Interface to access VM version based actions.
@@ -111,4 +114,8 @@ public interface VMPlugin {
      * @return the transformed meta method
      */
     MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod);
+
+    default Map<String, Set<String>> getDefaultImportClasses(String[] packageNames) {
+        return Collections.emptyMap();
+    }
 }
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v9/ClassFinder.java b/src/main/java/org/codehaus/groovy/vmplugin/v9/ClassFinder.java
index 5fa6708..90d0c03 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v9/ClassFinder.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v9/ClassFinder.java
@@ -100,7 +100,7 @@ public class ClassFinder {
                     String packagePathStr = Arrays.stream(Arrays.copyOfRange(pathElems, prefixElemCnt + (!wfs && pathElems[0].isEmpty() ? 1 : 0), nameCount - 1)).collect(Collectors.joining("/"));
 
                     if (recursive || packageName.equals(packagePathStr)) {
-                        Set<String> packageNameSet = result.computeIfAbsent(filename.substring(0, filename.lastIndexOf(".")), f -> new HashSet<>());
+                        Set<String> packageNameSet = result.computeIfAbsent(filename.substring(0, filename.lastIndexOf(".")), f -> new HashSet<>(2));
                         packageNameSet.add(packagePathStr);
                     }
 
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 cfcb9d8..553d4fc 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.vmplugin.v9;
 
 import groovy.lang.GroovyRuntimeException;
+import groovy.lang.GroovySystem;
 import groovy.lang.MetaClass;
 import groovy.lang.MetaMethod;
 import groovy.lang.Tuple;
@@ -27,6 +28,7 @@ import org.codehaus.groovy.GroovyBugError;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.CachedMethod;
 import org.codehaus.groovy.reflection.ReflectionUtils;
+import org.codehaus.groovy.runtime.DefaultGroovyMethods;
 import org.codehaus.groovy.vmplugin.v8.Java8;
 
 import java.lang.invoke.MethodHandle;
@@ -41,9 +43,13 @@ import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.math.BigInteger;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -55,6 +61,44 @@ import java.util.stream.Collectors;
  * Additional Java 9 based functions will be added here as needed.
  */
 public class Java9 extends Java8 {
+    @Override
+    public Map<String, Set<String>> getDefaultImportClasses(String[] packageNames) {
+        Map<String, Set<String>> result = new LinkedHashMap<>();
+
+        URI gsLocation = null;
+        try {
+            gsLocation = DefaultGroovyMethods.getLocation(GroovySystem.class).toURI();
+        } catch (URISyntaxException e) {
+            e.printStackTrace();
+        }
+
+        for (String prefix : packageNames) {
+            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::getKey,
+                                    entry -> entry.getValue().stream()
+                                            .map(e -> e.replace('/', '.') + ".")
+                                            .collect(Collectors.toSet())
+                            )
+                    );
+
+            result.putAll(map);
+        }
+
+        return result;
+    }
 
     private static class LookupHolder {
         private static final Method PRIVATE_LOOKUP;