You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by cc...@apache.org on 2018/05/23 19:30:39 UTC

[4/9] groovy git commit: Cache class resolution

Cache class resolution

As soon as we have a project with a reasonable size, we spend a large
amount of time resolving the same classes again and again. This commit
introduces a (poor man's) cache to avoid the same lookups. It's not an
attempt to make Groovydoc better, it's just a patch to make it not so
slow.


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/85a4c5a9
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/85a4c5a9
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/85a4c5a9

Branch: refs/heads/GROOVY_2_6_X
Commit: 85a4c5a9169c0c4fbaaa77905dbad8981d09b632
Parents: 1310dad
Author: Cedric Champeau <cc...@apache.org>
Authored: Wed May 23 08:34:10 2018 +0200
Committer: Cedric Champeau <cc...@apache.org>
Committed: Wed May 23 21:30:26 2018 +0200

----------------------------------------------------------------------
 .../groovy/groovydoc/GroovyRootDoc.java         |  2 ++
 .../tools/groovydoc/SimpleGroovyClassDoc.java   | 11 +++++++++
 .../tools/groovydoc/SimpleGroovyRootDoc.java    | 24 +++++++++++++++++++-
 3 files changed, 36 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/85a4c5a9/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/groovydoc/GroovyRootDoc.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/groovydoc/GroovyRootDoc.java b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/groovydoc/GroovyRootDoc.java
index f18fd53..1e34c10 100644
--- a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/groovydoc/GroovyRootDoc.java
+++ b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/groovydoc/GroovyRootDoc.java
@@ -35,4 +35,6 @@ public interface GroovyRootDoc extends GroovyDoc, GroovyDocErrorReporter {
     GroovyPackageDoc[] specifiedPackages();
 
     Map<String, GroovyClassDoc> getVisibleClasses(List importedClassesAndPackages);
+
+    Map<String, GroovyClassDoc> getResolvedClasses();
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/85a4c5a9/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java
index b5be4d7..3522fa1 100644
--- a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java
+++ b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java
@@ -547,6 +547,17 @@ public class SimpleGroovyClassDoc extends SimpleGroovyAbstractableElementDoc imp
 
     private GroovyClassDoc resolveClass(GroovyRootDoc rootDoc, String name) {
         if (isPrimitiveType(name)) return null;
+        Map<String, GroovyClassDoc> resolvedClasses = rootDoc.getResolvedClasses();
+        GroovyClassDoc groovyClassDoc = resolvedClasses.get(name);
+        if (groovyClassDoc != null) {
+            return groovyClassDoc;
+        }
+        groovyClassDoc = doResolveClass(rootDoc, name);
+        resolvedClasses.put(name, groovyClassDoc);
+        return groovyClassDoc;
+    }
+
+    private GroovyClassDoc doResolveClass(final GroovyRootDoc rootDoc, final String name) {
         if (name.endsWith("[]")) {
             GroovyClassDoc componentClass = resolveClass(rootDoc, name.substring(0, name.length() - 2));
             if (componentClass != null) return new ArrayClassDocWrapper(componentClass);

http://git-wip-us.apache.org/repos/asf/groovy/blob/85a4c5a9/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyRootDoc.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyRootDoc.java b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyRootDoc.java
index eeffd16..6bb4940 100644
--- a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyRootDoc.java
+++ b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyRootDoc.java
@@ -24,21 +24,29 @@ import org.codehaus.groovy.groovydoc.GroovyRootDoc;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 public class SimpleGroovyRootDoc extends SimpleGroovyDoc implements GroovyRootDoc {
+    private final static Pattern EQUIVALENT_PACKAGE_IMPORT = Pattern.compile("[^/]+$");
+
     private final Map<String, GroovyPackageDoc> packageDocs;
     private List<GroovyPackageDoc> packageDocValues = null;
     private final Map<String, GroovyClassDoc> classDocs;
+    private final Map<String, String> equivalentPackageImports;
     private List<GroovyClassDoc> classDocValues = null;
+    private final Map<String, GroovyClassDoc> cachedResolvedClasses = new HashMap<String, GroovyClassDoc>();
+
     private String description = "";
 
     public SimpleGroovyRootDoc(String name) {
         super(name);
         packageDocs = new LinkedHashMap<String, GroovyPackageDoc>();
         classDocs = new LinkedHashMap<String, GroovyClassDoc>();
+        equivalentPackageImports = new HashMap<String, String>();
     }
 
     public GroovyClassDoc classNamed(GroovyClassDoc groovyClassDoc, String name) {
@@ -124,7 +132,7 @@ public class SimpleGroovyRootDoc extends SimpleGroovyDoc implements GroovyRootDo
         Map<String, GroovyClassDoc> visibleClasses = new LinkedHashMap<String, GroovyClassDoc>();
         for (Map.Entry<String, GroovyClassDoc> entry : classDocs.entrySet()) {
             String fullClassName = entry.getKey();
-            String equivalentPackageImport = fullClassName.replaceAll("[^/]+$", "*");
+            String equivalentPackageImport = findEquivalentPackageImport(fullClassName);
             if (importedClassesAndPackages.contains(fullClassName) ||
                     importedClassesAndPackages.contains(equivalentPackageImport)) {
                 GroovyClassDoc classDoc = entry.getValue();
@@ -134,6 +142,20 @@ public class SimpleGroovyRootDoc extends SimpleGroovyDoc implements GroovyRootDo
         return visibleClasses;
     }
 
+    private String findEquivalentPackageImport(String fullClassName) {
+        String eq = equivalentPackageImports.get(fullClassName);
+        if (eq == null) {
+            eq = EQUIVALENT_PACKAGE_IMPORT.matcher(fullClassName).replaceAll("*");
+            equivalentPackageImports.put(fullClassName, eq);
+        }
+        return eq;
+    }
+
+    @Override
+    public Map<String, GroovyClassDoc> getResolvedClasses() {
+        return cachedResolvedClasses;
+    }
+
     // GroovyDocErrorReporter interface
     public void printError(String arg0) {/*todo*/}