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*/}