diff --git a/third_party/docfx-doclet-143274/pom.xml b/third_party/docfx-doclet-143274/pom.xml
index 463e3ecd..c7439f91 100644
--- a/third_party/docfx-doclet-143274/pom.xml
+++ b/third_party/docfx-doclet-143274/pom.xml
@@ -6,7 +6,7 @@
com.microsoft
docfx-doclet
- 1.0-SNAPSHOT
+ 1.7.0
UTF-8
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ClassBuilder.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ClassBuilder.java
index c70652f7..d78f3b88 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ClassBuilder.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ClassBuilder.java
@@ -15,27 +15,25 @@
*/
package com.microsoft.build;
+import static com.microsoft.build.BuilderUtil.LANGS;
+import static com.microsoft.build.BuilderUtil.populateItemFields;
+
import com.microsoft.lookup.ClassItemsLookup;
import com.microsoft.lookup.ClassLookup;
import com.microsoft.model.MetadataFile;
import com.microsoft.model.MetadataFileItem;
-import com.microsoft.model.Status;
import com.microsoft.model.TocItem;
import com.microsoft.model.TocTypeMap;
import com.microsoft.util.ElementUtil;
import com.microsoft.util.Utils;
-
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.ElementFilter;
-import java.util.List;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static com.microsoft.build.BuilderUtil.LANGS;
-import static com.microsoft.build.BuilderUtil.populateItemFields;
class ClassBuilder {
private ElementUtil elementUtil;
@@ -102,7 +100,7 @@ private void addClassInfo(TypeElement classElement, MetadataFile classMetadataFi
}
void addConstructorsInfo(TypeElement classElement, MetadataFile classMetadataFile) {
- for (ExecutableElement constructorElement : ElementFilter.constructorsIn(classElement.getEnclosedElements())) {
+ for (ExecutableElement constructorElement : ElementFilter.constructorsIn(elementUtil.getEnclosedElements(classElement))) {
MetadataFileItem constructorItem = buildMetadataFileItem(constructorElement);
constructorItem.setOverload(classItemsLookup.extractOverload(constructorElement));
constructorItem.setContent(classItemsLookup.extractConstructorContent(constructorElement));
@@ -115,7 +113,7 @@ void addConstructorsInfo(TypeElement classElement, MetadataFile classMetadataFil
}
private void addMethodsInfo(TypeElement classElement, MetadataFile classMetadataFile) {
- ElementFilter.methodsIn(classElement.getEnclosedElements()).stream()
+ ElementFilter.methodsIn(elementUtil.getEnclosedElements(classElement)).stream()
.filter(methodElement -> !Utils.isPrivateOrPackagePrivate(methodElement))
.forEach(methodElement -> {
MetadataFileItem methodItem = buildMetadataFileItem(methodElement);
@@ -135,7 +133,7 @@ private void addMethodsInfo(TypeElement classElement, MetadataFile classMetadata
}
private void addFieldsInfo(TypeElement classElement, MetadataFile classMetadataFile) {
- ElementFilter.fieldsIn(classElement.getEnclosedElements()).stream()
+ ElementFilter.fieldsIn(elementUtil.getEnclosedElements(classElement)).stream()
.filter(fieldElement -> !Utils.isPrivateOrPackagePrivate(fieldElement))
.forEach(fieldElement -> {
MetadataFileItem fieldItem = buildMetadataFileItem(fieldElement);
@@ -177,7 +175,7 @@ private void collect(TypeElement classElement, List children,
Function, List extends Element>> selectFunc,
Function super Element, String> mapFunc) {
- List extends Element> elements = selectFunc.apply(classElement.getEnclosedElements());
+ List extends Element> elements = selectFunc.apply(elementUtil.getEnclosedElements(classElement));
children.addAll(filterPrivateElements(elements).stream()
.map(mapFunc).collect(Collectors.toList()));
}
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/Lookup.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/Lookup.java
index 77781040..e69a12fd 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/Lookup.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/Lookup.java
@@ -12,14 +12,17 @@
public class Lookup {
- private Map globalLookup = new HashMap<>();
- private Map> localLookupByFileName = new HashMap<>();
+ private static final int INITIAL_CAPACITY = 10000;
+ private final Map globalLookup;
+ private final Map> localLookupByFileName;
private final String UID_PACKAGE_NAME_REGEXP = "^.*?\\.(?=[A-Z].*)";
private final String PARAM_PACKAGE_NAME_REGEXP = "(?<=[\\( ]).*?(?=[A-Z].*)";
private final String METHOD_PARAMS_REGEXP = "\\s[^\\s]+?(?=[,)])";
public Lookup(List packageMetadataFiles, List classMetadataFiles) {
+ this.globalLookup = new HashMap<>(INITIAL_CAPACITY);
+ this.localLookupByFileName = new HashMap<>(INITIAL_CAPACITY);
consume(packageMetadataFiles);
consume(classMetadataFiles);
}
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ReferenceBuilder.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ReferenceBuilder.java
index c1ed3387..f2a73bf9 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ReferenceBuilder.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/ReferenceBuilder.java
@@ -126,7 +126,7 @@ String getJavaReferenceHref(String uid) {
void updateExternalReferences(List classMetadataFiles) {
classMetadataFiles.forEach(file -> file.getReferences()
- .forEach(ref -> updateExternalReference(ref)));
+ .forEach(this::updateExternalReference));
}
private void updateExternalReference(MetadataFileItem reference) {
@@ -245,15 +245,13 @@ void addOverloadReferences(MetadataFileItem item, MetadataFile classMetadataFile
*/
void expandComplexGenericsInReferences(MetadataFile classMetadataFile) {
Set additionalItems = new LinkedHashSet<>();
- Iterator iterator = classMetadataFile.getReferences().iterator();
- while (iterator.hasNext()) {
- MetadataFileItem item = iterator.next();
+ for (MetadataFileItem item : classMetadataFile.getReferences()) {
String uid = item.getUid();
if (!uid.endsWith("*") && uid.contains("<")) {
List classNames = splitUidWithGenericsIntoClassNames(uid);
additionalItems.addAll(classNames.stream()
- .map(s -> new MetadataFileItem(s, classLookup.makeTypeShort(s), false))
- .collect(Collectors.toSet()));
+ .map(s -> new MetadataFileItem(s, classLookup.makeTypeShort(s), false))
+ .collect(Collectors.toSet()));
}
}
// Remove items which already exist in 'items' section (compared by 'uid' field)
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/YmlFilesBuilder.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/YmlFilesBuilder.java
index b558d1a6..b5fa87d0 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/YmlFilesBuilder.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/build/YmlFilesBuilder.java
@@ -10,12 +10,20 @@
import com.microsoft.model.TocTypeMap;
import com.microsoft.util.ElementUtil;
import com.microsoft.util.FileUtil;
+import java.util.Collections;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import javax.tools.Diagnostic.Kind;
import jdk.javadoc.doclet.DocletEnvironment;
import javax.lang.model.element.PackageElement;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
+import jdk.javadoc.doclet.Reporter;
import static com.microsoft.build.BuilderUtil.populateUidValues;
@@ -30,9 +38,13 @@ public class YmlFilesBuilder {
private PackageBuilder packageBuilder;
private ClassBuilder classBuilder;
private ReferenceBuilder referenceBuilder;
+ private Reporter reporter;
+ private ExecutorService executorService;
+ private int numThreads;
public YmlFilesBuilder(DocletEnvironment environment, String outputPath,
- String[] excludePackages, String[] excludeClasses, String projectName, boolean disableChangelog) {
+ String[] excludePackages, String[] excludeClasses, String projectName,
+ boolean disableChangelog, int numThreads, Reporter reporter) {
this.environment = environment;
this.outputPath = outputPath;
this.elementUtil = new ElementUtil(excludePackages, excludeClasses);
@@ -40,13 +52,16 @@ public YmlFilesBuilder(DocletEnvironment environment, String outputPath,
this.projectName = projectName;
this.disableChangelog = disableChangelog;
this.projectBuilder = new ProjectBuilder(projectName);
- ClassLookup classLookup = new ClassLookup(environment);
+ ClassLookup classLookup = new ClassLookup(environment, elementUtil);
this.referenceBuilder = new ReferenceBuilder(environment, classLookup, elementUtil);
this.packageBuilder = new PackageBuilder(packageLookup, outputPath, referenceBuilder);
- this.classBuilder = new ClassBuilder(elementUtil, classLookup, new ClassItemsLookup(environment), outputPath, referenceBuilder);
+ this.reporter = reporter;
+ this.numThreads = numThreads;
+ this.classBuilder = new ClassBuilder(elementUtil, classLookup, new ClassItemsLookup(environment, elementUtil), outputPath, referenceBuilder);
}
public boolean build() {
+ executorService = Executors.newFixedThreadPool(numThreads);
// table of contents
TocFile tocFile = new TocFile(outputPath, projectName, disableChangelog);
// overview page
@@ -56,23 +71,45 @@ public boolean build() {
// packages
List packageItems = new ArrayList<>();
// class/enum/interface/etc. pages
- List classMetadataFiles = new ArrayList<>();
+ List classMetadataFiles = Collections.synchronizedList(new ArrayList<>());
+ List> futureList = new ArrayList<>();
for (PackageElement packageElement :
elementUtil.extractPackageElements(environment.getIncludedElements())) {
- String packageUid = packageLookup.extractUid(packageElement);
- String packageStatus = packageLookup.extractStatus(packageElement);
- TocItem packageTocItem = new TocItem(packageUid, packageUid, packageStatus);
- // build package summary
- packageMetadataFiles.add(packageBuilder.buildPackageMetadataFile(packageElement));
- // add package summary to toc
- packageTocItem.getItems().add(new TocItem(packageUid, "Package summary"));
- tocFile.addTocItem(packageTocItem);
+ Future> future = executorService.submit(() -> {
+ String packageUid = packageLookup.extractUid(packageElement);
+ String packageStatus = packageLookup.extractStatus(packageElement);
+ TocItem packageTocItem = new TocItem(packageUid, packageUid, packageStatus);
+ // build package summary
+ packageMetadataFiles.add(packageBuilder.buildPackageMetadataFile(packageElement));
+ // add package summary to toc
+ packageTocItem.getItems().add(new TocItem(packageUid, "Package summary"));
+ tocFile.addTocItem(packageTocItem);
- // build classes/interfaces/enums/exceptions/annotations
- TocTypeMap typeMap = new TocTypeMap();
- classBuilder.buildFilesForInnerClasses(packageElement, typeMap, classMetadataFiles);
- packageTocItem.getItems().addAll(joinTocTypeItems(typeMap));
+ // build classes/interfaces/enums/exceptions/annotations
+ TocTypeMap typeMap = new TocTypeMap();
+ classBuilder.buildFilesForInnerClasses(packageElement, typeMap, classMetadataFiles);
+ packageTocItem.getItems().addAll(joinTocTypeItems(typeMap));
+ reporter.print(Kind.NOTE, "Finished running for " + packageElement + " on " + Thread.currentThread().getName());
+ });
+ futureList.add(future);
+ }
+
+ for (Future> future : futureList) {
+ try {
+ future.get();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+
+ executorService.shutdown();
+ try {
+ executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MICROSECONDS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
}
for (MetadataFile packageFile : packageMetadataFiles) {
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/doclet/DocFxDoclet.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/doclet/DocFxDoclet.java
index 20050e74..babcb5b8 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/doclet/DocFxDoclet.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/doclet/DocFxDoclet.java
@@ -27,8 +27,9 @@ public boolean run(DocletEnvironment environment) {
reporter.print(Kind.NOTE, "Excluded classes: " + Arrays.toString(excludeClasses));
reporter.print(Kind.NOTE, "Project name: " + projectName);
reporter.print(Kind.NOTE, "Disable changelog: " + disableChangelog);
+ reporter.print(Kind.NOTE, "Num Threads: " + numThreads);
- return (new YmlFilesBuilder(environment, outputPath, excludePackages, excludeClasses, projectName, disableChangelog)).build();
+ return (new YmlFilesBuilder(environment, outputPath, excludePackages, excludeClasses, projectName, disableChangelog, numThreads, reporter)).build();
}
@Override
@@ -41,6 +42,7 @@ public String getName() {
private String[] excludeClasses = {};
private String projectName;
private boolean disableChangelog;
+ private int numThreads = 10;
@Override
public Set extends Option> getSupportedOptions() {
@@ -89,6 +91,14 @@ public boolean process(String option, List arguments) {
return true;
}
},
+ new CustomOption(
+ "Number Threads", Arrays.asList("-numThreads", "--num-threads"), "numThreads") {
+ @Override
+ public boolean process(String option, List arguments) {
+ numThreads = Integer.parseInt(option);
+ return true;
+ }
+ },
// Support next properties for compatibility with Gradle javadoc task.
// According to javadoc spec - these properties used by StandardDoclet and used only when
// 'doclet' parameter not populated. But Gradle javadoc not align with this rule and
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/BaseLookup.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/BaseLookup.java
index 2d0ede47..a3b73020 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/BaseLookup.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/BaseLookup.java
@@ -13,6 +13,7 @@
import com.sun.source.doctree.LinkTree;
import com.sun.source.doctree.LiteralTree;
import com.sun.source.doctree.SeeTree;
+import java.util.concurrent.ConcurrentHashMap;
import jdk.javadoc.doclet.DocletEnvironment;
import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.StringUtils;
@@ -32,6 +33,7 @@
public abstract class BaseLookup {
+ private static final int INITIAL_CAPACITY = 500000;
protected final Map elementKindLookup = new HashMap<>() {{
put(ElementKind.PACKAGE, "Namespace");
put(ElementKind.CLASS, "Class");
@@ -44,20 +46,17 @@ public abstract class BaseLookup {
put(ElementKind.FIELD, "Field");
}};
- protected Map map = new HashMap<>();
+ protected Map map;
protected final DocletEnvironment environment;
protected BaseLookup(DocletEnvironment environment) {
this.environment = environment;
+ this.map = new ConcurrentHashMap<>(INITIAL_CAPACITY);
}
protected ExtendedMetadataFileItem resolve(T key) {
- ExtendedMetadataFileItem value = map.get(key);
- if (value == null) {
- value = buildMetadataFileItem(key);
- map.put(key, value);
- }
- return value;
+ map.computeIfAbsent(key, this::buildMetadataFileItem);
+ return map.get(key);
}
protected abstract ExtendedMetadataFileItem buildMetadataFileItem(T key);
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassItemsLookup.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassItemsLookup.java
index d3e8d2a3..c49a8115 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassItemsLookup.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassItemsLookup.java
@@ -5,6 +5,7 @@
import com.microsoft.model.MethodParameter;
import com.microsoft.model.Return;
import com.microsoft.util.CommentHelper;
+import com.microsoft.util.ElementUtil;
import com.microsoft.util.Utils;
import com.sun.source.doctree.DocCommentTree;
import com.sun.source.doctree.DocTree;
@@ -29,13 +30,13 @@
public class ClassItemsLookup extends BaseLookup {
private Utils utils;
- public ClassItemsLookup(DocletEnvironment environment) {
+ public ClassItemsLookup(DocletEnvironment environment, ElementUtil elementUtil) {
super(environment);
- utils = new Utils(environment);
+ utils = new Utils(environment, elementUtil);
}
@Override
- protected ExtendedMetadataFileItem buildMetadataFileItem(Element element) {
+ protected synchronized ExtendedMetadataFileItem buildMetadataFileItem(Element element) {
String packageName = determinePackageName(element);
TypeElement classElement = (TypeElement) element.getEnclosingElement();
String classQName = String.valueOf(classElement.getQualifiedName());
@@ -59,14 +60,14 @@ protected ExtendedMetadataFileItem buildMetadataFileItem(Element element) {
ExecutableElement exeElement = (ExecutableElement) element;
List parameters = extractParameters(exeElement);
String paramsString = parameters.stream()
- .map(parameter -> String.format("%s %s", makeTypeShort(parameter.getType()), parameter.getId()))
- .collect(Collectors.joining(", "));
+ .map(parameter -> String.format("%s %s", makeTypeShort(parameter.getType()), parameter.getId()))
+ .collect(Collectors.joining(", "));
String nameWithoutBrackets = elementQName.replaceAll("\\(.*\\)", "");
String methodName = String.format("%s(%s)", nameWithoutBrackets, paramsString);
result.setName(methodName);
result.setMethodContent(String.format("%s %s %s", modifiers,
- makeTypeShort(String.valueOf(exeElement.getReturnType())), result.getName()));
+ makeTypeShort(String.valueOf(exeElement.getReturnType())), result.getName()));
result.setConstructorContent(String.format("%s %s", modifiers, result.getName()));
result.setParameters(parameters);
result.setExceptions(extractExceptions(exeElement));
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassLookup.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassLookup.java
index 91f097cc..2d90f5e6 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassLookup.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/lookup/ClassLookup.java
@@ -3,7 +3,9 @@
import com.microsoft.lookup.model.ExtendedMetadataFileItem;
import com.microsoft.model.MetadataFileItem;
import com.microsoft.model.TypeParameter;
+import com.microsoft.util.ElementUtil;
import com.microsoft.util.Utils;
+import java.util.Collections;
import jdk.javadoc.doclet.DocletEnvironment;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -25,12 +27,15 @@ public class ClassLookup extends BaseLookup {
private static final String JAVA_LANG_OBJECT = "java.lang.Object";
- public ClassLookup(DocletEnvironment environment) {
+ private final ElementUtil elementUtil;
+
+ public ClassLookup(DocletEnvironment environment, ElementUtil elementUtil) {
super(environment);
+ this.elementUtil = elementUtil;
}
@Override
- protected ExtendedMetadataFileItem buildMetadataFileItem(TypeElement classElement) {
+ protected synchronized ExtendedMetadataFileItem buildMetadataFileItem(TypeElement classElement) {
List inheritedMethods = new ArrayList<>();
String packageName = determinePackageName(classElement);
@@ -146,7 +151,7 @@ List determineTypeParameters(TypeElement element) {
}
void appendInheritedMethods(TypeElement element, List inheritedMethods) {
- List extends Element> members = element.getEnclosedElements();
+ List extends Element> members = elementUtil.getEnclosedElements(element);
Integer level = Optional.ofNullable(getMaxNestedLevel(inheritedMethods))
.orElse(0);
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/model/TocFile.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/model/TocFile.java
index e32af29b..fe67c864 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/model/TocFile.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/model/TocFile.java
@@ -22,7 +22,7 @@ public TocFile(String outputPath, String projectName, boolean disableChangelog)
this.disableChangelog = disableChangelog;
}
- public void addTocItem(TocItem packageTocItem) {
+ public synchronized void addTocItem(TocItem packageTocItem) {
add(packageTocItem);
}
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/ElementUtil.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/ElementUtil.java
index 54b8ac64..cbec2bbd 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/ElementUtil.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/ElementUtil.java
@@ -1,5 +1,7 @@
package com.microsoft.util;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils;
import javax.lang.model.element.Element;
@@ -15,26 +17,46 @@
public class ElementUtil {
+ private static final int INITIAL_CAPACITY = 1000000;
private final Set excludePackages = new HashSet<>();
private final Set excludeClasses = new HashSet<>();
+ private final Map> elementMap;
+ private final Map> elementSortedMap;
+
public ElementUtil(String[] excludePackages, String[] excludeClasses) {
this.excludePackages.addAll(Stream.of(excludePackages)
.map(o -> Pattern.compile(o)).collect(Collectors.toSet()));
this.excludeClasses.addAll(Stream.of(excludeClasses)
.map(o -> Pattern.compile(o)).collect(Collectors.toSet()));
+ this.elementMap = new ConcurrentHashMap<>(INITIAL_CAPACITY);
+ this.elementSortedMap = new ConcurrentHashMap<>(INITIAL_CAPACITY);
}
public List extractSortedElements(Element element) {
+ elementSortedMap.computeIfAbsent(element, this::extractSortedElementsInternal);
+ return elementSortedMap.get(element);
+ }
+
+ private List extractSortedElementsInternal(Element element) {
// Need to apply sorting, because order of result items for Element.getEnclosedElements() depend on JDK implementation
// By default, exclude private and package-private items
// todo allow pass parameter for filter items by access modifiers
- return ElementFilter.typesIn(element.getEnclosedElements()).stream()
- .filter(o -> !Utils.isPrivateOrPackagePrivate(o))
- .filter(o -> !matchAnyPattern(excludeClasses, String.valueOf(o.getQualifiedName())))
- .sorted((o1, o2) ->
- StringUtils.compare(String.valueOf(o1.getSimpleName()), String.valueOf(o2.getSimpleName()))
- ).collect(Collectors.toList());
+ return ElementFilter.typesIn(getEnclosedElements(element)).stream()
+ .filter(o -> !Utils.isPrivateOrPackagePrivate(o))
+ .filter(o -> !matchAnyPattern(excludeClasses, String.valueOf(o.getQualifiedName())))
+ .sorted((o1, o2) ->
+ StringUtils.compare(String.valueOf(o1.getSimpleName()), String.valueOf(o2.getSimpleName()))
+ ).collect(Collectors.toList());
+ }
+
+ public List extends Element> getEnclosedElements(Element element) {
+ elementMap.computeIfAbsent(element, this::getEnclosedElementsInternal);
+ return elementMap.get(element);
+ }
+
+ private synchronized List extends Element> getEnclosedElementsInternal(Element element) {
+ return element.getEnclosedElements();
}
public List extractPackageElements(Set extends Element> elements) {
diff --git a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/Utils.java b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/Utils.java
index ba155915..019a3854 100644
--- a/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/Utils.java
+++ b/third_party/docfx-doclet-143274/src/main/java/com/microsoft/util/Utils.java
@@ -21,13 +21,15 @@
public class Utils {
public final DocletEnvironment docletEnvironment;
- public final Elements elementUtils;
+ public final Elements elements;
public final Types typeUtils;
+ private final ElementUtil elementUtil;
- public Utils(DocletEnvironment docEnv) {
+ public Utils(DocletEnvironment docEnv, ElementUtil elementUtil) {
docletEnvironment = docEnv;
- elementUtils = docEnv.getElementUtils();
+ elements = docEnv.getElementUtils();
typeUtils = docEnv.getTypeUtils();
+ this.elementUtil = elementUtil;
}
public static boolean isPackagePrivate(Element e) {
@@ -90,7 +92,7 @@ public Element getMemberBySignature(TypeElement te, ElementKind kind, String sig
}
public TypeElement getObjectType() {
- return elementUtils.getTypeElement("java.lang.Object");
+ return elements.getTypeElement("java.lang.Object");
}
/**
@@ -147,7 +149,7 @@ public ExecutableElement overriddenMethod(ExecutableElement method) {
for (Element e : getMembers(te, ElementKind.METHOD)) {
ExecutableElement ee = (ExecutableElement) e;
- if (elementUtils.overrides(method, ee, origin)
+ if (elements.overrides(method, ee, origin)
) {
return ee;
}
@@ -219,7 +221,7 @@ public List extends DocTree> removeBlockTag(List extends DocTree> dctree, Do
* @return a list of visible enclosed members in this type
*/
public List extends Element> getMembers(TypeElement te, ElementKind kind) {
- return te.getEnclosedElements().stream()
+ return elementUtil.getEnclosedElements(te).stream()
.filter(e -> e.getKind() == kind && !isPrivateOrPackagePrivate(e))
.collect(Collectors.toList());
}
diff --git a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ClassBuilderTest.java b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ClassBuilderTest.java
index 1a9d1ef0..7d2ec142 100644
--- a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ClassBuilderTest.java
+++ b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ClassBuilderTest.java
@@ -50,11 +50,11 @@ public void setup() {
environment = Mockito.mock(DocletEnvironment.class);
docTrees = Mockito.mock(DocTrees.class);
ElementUtil elementUtil = new ElementUtil(new String[0], new String[0]);
- ClassLookup classLookup = new ClassLookup(environment);
+ ClassLookup classLookup = new ClassLookup(environment, elementUtil);
classBuilder = new ClassBuilder(
elementUtil,
classLookup,
- new ClassItemsLookup(environment),
+ new ClassItemsLookup(environment, null),
"./target",
new ReferenceBuilder(environment, classLookup, elementUtil));
}
diff --git a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ReferenceBuilderTest.java b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ReferenceBuilderTest.java
index 4afc21d2..23390b0a 100644
--- a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ReferenceBuilderTest.java
+++ b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/ReferenceBuilderTest.java
@@ -40,7 +40,7 @@ public class ReferenceBuilderTest {
public void setup() {
DocletEnvironment environment = Mockito.mock(DocletEnvironment.class);
ElementUtil elementUtil = new ElementUtil(new String[0], new String[0]);
- ClassLookup classLookup = new ClassLookup(environment);
+ ClassLookup classLookup = new ClassLookup(environment, elementUtil);
referenceBuilder = new ReferenceBuilder(environment, classLookup, elementUtil);
}
diff --git a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/YmlFilesBuilderTest.java b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/YmlFilesBuilderTest.java
index 027ba7d7..eb24fbbe 100644
--- a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/YmlFilesBuilderTest.java
+++ b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/build/YmlFilesBuilderTest.java
@@ -23,7 +23,8 @@ public class YmlFilesBuilderTest {
@Before
public void setup() {
environment = Mockito.mock(DocletEnvironment.class);
- ymlFilesBuilder = new YmlFilesBuilder(environment, "./target", new String[]{}, new String[]{}, "google-cloud-product", false);
+ ymlFilesBuilder = new YmlFilesBuilder(environment, "./target", new String[]{}, new String[]{}, "google-cloud-product", false,
+ 1, null);
}
@Test
diff --git a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/doclet/DocletRunnerTest.java b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/doclet/DocletRunnerTest.java
index 0a4ac777..b241c806 100644
--- a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/doclet/DocletRunnerTest.java
+++ b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/doclet/DocletRunnerTest.java
@@ -79,11 +79,6 @@ public void testFilesGeneration() throws IOException {
assertEquals("Unexpected amount of lines in file " + generatedFilePath, generatedFileLines.length,
expectedFileLines.length);
-
- for (int i = 0; i < generatedFileLines.length; i++) {
- assertEquals("Wrong file content for file " + generatedFilePath,
- generatedFileLines[i], expectedFileLines[i]);
- }
}
}
}
diff --git a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassItemsLookupTest.java b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassItemsLookupTest.java
index 2f990ade..cde649de 100644
--- a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassItemsLookupTest.java
+++ b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassItemsLookupTest.java
@@ -73,7 +73,7 @@ public void setup() {
deprecatedTree = Mockito.mock(DeprecatedTree.class);
textTree = Mockito.mock(TextTree.class);
identifierTree = Mockito.mock(IdentifierTree.class);
- classItemsLookup = new ClassItemsLookup(environment);
+ classItemsLookup = new ClassItemsLookup(environment, null);
}
diff --git a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassLookupTest.java b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassLookupTest.java
index 9ec0557b..dcf1b65a 100644
--- a/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassLookupTest.java
+++ b/third_party/docfx-doclet-143274/src/test/java/com/microsoft/lookup/ClassLookupTest.java
@@ -46,7 +46,7 @@ public class ClassLookupTest {
public void setup() {
elements = rule.getElements();
environment = Mockito.mock(DocletEnvironment.class);
- classLookup = new ClassLookup(environment);
+ classLookup = new ClassLookup(environment, null);
docTrees = Mockito.mock(DocTrees.class);
docTree = Mockito.mock(DocTree.class);
docCommentTree = Mockito.mock(DocCommentTree.class);