langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Fri Dec 16 18:54:09 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Fri Dec 16 09:07:57 2016 -0800
@@ -42,6 +42,7 @@
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.ModuleElement;
+import javax.lang.model.element.ModuleElement.RequiresDirective;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.TypeParameterElement;
@@ -1678,7 +1679,7 @@
return new Utils.ElementComparator<Element>() {
@Override
public int compare(Element mod1, Element mod2) {
- return compareFullyQualifiedNames(mod1, mod2);
+ return compareNames(mod1, mod2);
}
};
}
@@ -2193,6 +2194,64 @@
return member.getEnclosingElement().getEnclosedElements().indexOf(member);
}
+ private Map<ModuleElement, Set<PackageElement>> modulePackageMap = null;
+ public Map<ModuleElement, Set<PackageElement>> getModulePackageMap() {
+ if (modulePackageMap == null) {
+ modulePackageMap = new HashMap<>();
+ Set<PackageElement> pkgs = configuration.getIncludedPackageElements();
+ pkgs.forEach((pkg) -> {
+ ModuleElement mod = elementUtils.getModuleOf(pkg);
+ modulePackageMap.computeIfAbsent(mod, m -> new HashSet<>()).add(pkg);
+ });
+ }
+ return modulePackageMap;
+ }
+
+ public Map<ModuleElement, String> getDependentModules(ModuleElement mdle) {
+ Map<ModuleElement, String> result = new TreeMap<>(makeModuleComparator());
+ Deque<ModuleElement> queue = new ArrayDeque<>();
+ // get all the requires for the element in question
+ for (RequiresDirective rd : ElementFilter.requiresIn(mdle.getDirectives())) {
+ ModuleElement dep = rd.getDependency();
+ // add the dependency to work queue
+ if (!result.containsKey(dep)) {
+ if (rd.isTransitive()) {
+ queue.addLast(dep);
+ }
+ }
+ // add all exports for the primary module
+ result.put(rd.getDependency(), getModifiers(rd));
+ }
+
+ // add only requires public for subsequent module dependencies
+ for (ModuleElement m = queue.poll(); m != null; m = queue.poll()) {
+ for (RequiresDirective rd : ElementFilter.requiresIn(m.getDirectives())) {
+ ModuleElement dep = rd.getDependency();
+ if (!result.containsKey(dep)) {
+ if (rd.isTransitive()) {
+ result.put(dep, getModifiers(rd));
+ queue.addLast(dep);
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public String getModifiers(RequiresDirective rd) {
+ StringBuilder modifiers = new StringBuilder();
+ String sep="";
+ if (rd.isTransitive()) {
+ modifiers.append("transitive");
+ sep = " ";
+ }
+ if (rd.isStatic()) {
+ modifiers.append(sep);
+ modifiers.append("static");
+ }
+ return (modifiers.length() == 0) ? " " : modifiers.toString();
+ }
+
public long getLineNumber(Element e) {
TreePath path = getTreePath(e);
if (path == null) { // maybe null if synthesized
@@ -3019,6 +3078,10 @@
return getBlockTags(element, DEPRECATED);
}
+ public List<? extends DocTree> getProvidesTrees(Element element) {
+ return getBlockTags(element, PROVIDES);
+ }
+
public List<? extends DocTree> getSeeTrees(Element element) {
return getBlockTags(element, SEE);
}
@@ -3062,6 +3125,10 @@
return out;
}
+ public List<? extends DocTree> getUsesTrees(Element element) {
+ return getBlockTags(element, USES);
+ }
+
public List<? extends DocTree> getFirstSentenceTrees(Element element) {
DocCommentTree dcTree = getDocCommentTree(element);
if (dcTree == null) {