langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Fri Mar 31 10:46:37 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Fri Mar 31 07:38:34 2017 -0700
@@ -26,6 +26,7 @@
package jdk.javadoc.internal.doclets.toolkit;
import java.io.*;
+import java.lang.ref.*;
import java.util.*;
import javax.lang.model.element.Element;
@@ -54,7 +55,9 @@
import jdk.javadoc.internal.doclets.toolkit.util.SimpleDocletException;
import jdk.javadoc.internal.doclets.toolkit.util.TypeElementCatalog;
import jdk.javadoc.internal.doclets.toolkit.util.Utils;
+import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap.GetterSetter;
+import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap.Kind;
import static javax.tools.Diagnostic.Kind.*;
@@ -296,6 +299,8 @@
private List<GroupContainer> groups;
+ private final Map<TypeElement, EnumMap<Kind, Reference<VisibleMemberMap>>> typeElementMemberCache;
+
public abstract Messages getMessages();
public abstract Resources getResources();
@@ -355,6 +360,7 @@
setTabWidth(DocletConstants.DEFAULT_TAB_STOP_LENGTH);
metakeywords = new MetaKeywords(this);
groups = new ArrayList<>(0);
+ typeElementMemberCache = new HashMap<>();
}
private boolean initialized = false;
@@ -1259,4 +1265,18 @@
public boolean isAllowScriptInComments() {
return allowScriptInComments;
}
+
+ public VisibleMemberMap getVisibleMemberMap(TypeElement te, VisibleMemberMap.Kind kind) {
+ EnumMap<Kind, Reference<VisibleMemberMap>> cacheMap = typeElementMemberCache
+ .computeIfAbsent(te, k -> new EnumMap<>(VisibleMemberMap.Kind.class));
+
+ Reference<VisibleMemberMap> vmapRef = cacheMap.get(kind);
+ // recompute, if referent has been garbage collected
+ VisibleMemberMap vMap = vmapRef == null ? null : vmapRef.get();
+ if (vMap == null) {
+ vMap = new VisibleMemberMap(te, kind, this);
+ cacheMap.put(kind, new SoftReference<>(vMap));
+ }
+ return vMap;
+ }
}