8164408: Add module support for @see, @link and @linkplain javadoc tags

Reviewed-by: jjg
This commit is contained in:
Hannes Wallnöfer 2020-06-09 18:18:22 +02:00
parent 9a8ace2c0a
commit ac2828ddf1
9 changed files with 649 additions and 123 deletions

View file

@ -998,7 +998,7 @@ public class HtmlDocletWriter {
CommentHelper ch = utils.getCommentHelper(element);
String tagName = ch.getTagName(see);
String seetext = replaceDocRootDir(utils.normalizeNewlines(ch.getText(see)).toString());
String seetext = replaceDocRootDir(removeTrailingSlash(utils.normalizeNewlines(ch.getText(see)).toString()));
// Check if @see is an href or "string"
if (seetext.startsWith("<") || seetext.startsWith("\"")) {
return new RawHtml(seetext);
@ -1010,7 +1010,6 @@ public class HtmlDocletWriter {
Content text = plainOrCode(kind == LINK_PLAIN, new RawHtml(seetext));
TypeElement refClass = ch.getReferencedClass(see);
String refClassName = ch.getReferencedClassName(see);
Element refMem = ch.getReferencedMember(see);
String refMemName = ch.getReferencedMemberName(see);
@ -1018,6 +1017,10 @@ public class HtmlDocletWriter {
refMemName = refMem.toString();
}
if (refClass == null) {
ModuleElement refModule = ch.getReferencedModule(see);
if (refModule != null && utils.isIncluded(refModule)) {
return getModuleLink(refModule, label.isEmpty() ? text : label);
}
//@see is not referencing an included class
PackageElement refPackage = ch.getReferencedPackage(see);
if (refPackage != null && utils.isIncluded(refPackage)) {
@ -1028,9 +1031,11 @@ public class HtmlDocletWriter {
return getPackageLink(refPackage, label);
} else {
// @see is not referencing an included class, module or package. Check for cross links.
DocLink elementCrossLink = (configuration.extern.isModule(refClassName))
? getCrossModuleLink(utils.elementUtils.getModuleElement(refClassName)) :
(refPackage != null) ? getCrossPackageLink(refPackage) : null;
String refModuleName = ch.getReferencedModuleName(see);
DocLink elementCrossLink = (refPackage != null) ? getCrossPackageLink(refPackage) :
(configuration.extern.isModule(refModuleName))
? getCrossModuleLink(utils.elementUtils.getModuleElement(refModuleName))
: null;
if (elementCrossLink != null) {
// Element cross link found
return links.createLink(elementCrossLink,
@ -1118,6 +1123,10 @@ public class HtmlDocletWriter {
}
}
private String removeTrailingSlash(String s) {
return s.endsWith("/") ? s.substring(0, s.length() -1) : s;
}
private Content plainOrCode(boolean plain, Content body) {
return (plain || body.isEmpty()) ? body : HtmlTree.CODE(body);
}

View file

@ -31,7 +31,7 @@ import java.util.List;
import java.util.stream.Collectors;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
@ -376,23 +376,18 @@ public class CommentHelper {
return null;
} else if (utils.isTypeElement(e)) {
return (TypeElement) e;
} else if (!utils.isPackage(e)) {
} else if (!utils.isPackage(e) && !utils.isModule(e)) {
return utils.getEnclosingTypeElement(e);
}
return null;
}
public String getReferencedClassName(DocTree dtree) {
Utils utils = configuration.utils;
Element e = getReferencedClass(dtree);
if (e != null) {
return utils.isTypeElement(e) ? utils.getSimpleName(e) : null;
}
public String getReferencedModuleName(DocTree dtree) {
String s = getReferencedSignature(dtree);
if (s == null) {
if (s == null || s.contains("#") || s.contains("(")) {
return null;
}
int n = s.indexOf("#");
int n = s.indexOf("/");
return (n == -1) ? s : s.substring(0, n);
}
@ -423,6 +418,15 @@ public class CommentHelper {
return null;
}
public ModuleElement getReferencedModule(DocTree dtree) {
Element e = getReferencedElement(dtree);
if (e != null && configuration.utils.isModule(e)) {
return (ModuleElement) e;
}
return null;
}
public List<? extends DocTree> getFirstSentenceTrees(List<? extends DocTree> body) {
return configuration.docEnv.getDocTrees().getFirstSentence(body);
}