8254052: improve type specificity of TagletWriter and friends

Reviewed-by: hannesw
This commit is contained in:
Jonathan Gibbons 2020-10-30 17:23:39 +00:00
parent 8600d0d982
commit d086757834
22 changed files with 141 additions and 104 deletions

@ -30,7 +30,7 @@ import java.util.List;
import javax.lang.model.element.TypeElement;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.DeprecatedTree;
import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
@ -165,7 +165,7 @@ public class AllClassesIndexWriter extends HtmlDocletWriter {
ContentBuilder description = new ContentBuilder();
if (utils.isDeprecated(klass)) {
description.add(getDeprecatedPhrase(klass));
List<? extends DocTree> tags = utils.getDeprecatedTrees(klass);
List<? extends DeprecatedTree> tags = utils.getDeprecatedTrees(klass);
if (!tags.isEmpty()) {
addSummaryDeprecatedComment(klass, tags.get(0), description);
}

@ -41,6 +41,7 @@ import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.SimpleElementVisitor8;
import com.sun.source.doctree.DeprecatedTree;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
@ -507,7 +508,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite
@Override
public void addClassDeprecationInfo(Content classInfoTree) {
List<? extends DocTree> deprs = utils.getBlockTags(typeElement, DocTree.Kind.DEPRECATED);
List<? extends DeprecatedTree> deprs = utils.getDeprecatedTrees(typeElement);
if (utils.isDeprecated(typeElement)) {
Content deprLabel = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(typeElement));
Content div = HtmlTree.DIV(HtmlStyle.deprecationBlock, deprLabel);

@ -25,6 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html;
import com.sun.source.doctree.DeprecatedTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
@ -397,7 +398,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
link = getDeprecatedLink(e);
}
Content desc = new ContentBuilder();
List<? extends DocTree> tags = utils.getDeprecatedTrees(e);
List<? extends DeprecatedTree> tags = utils.getDeprecatedTrees(e);
if (!tags.isEmpty()) {
addInlineDeprecatedComment(e, tags.get(0), desc);
} else {

@ -57,6 +57,7 @@ import javax.lang.model.util.SimpleTypeVisitor9;
import com.sun.source.doctree.AttributeTree;
import com.sun.source.doctree.AttributeTree.ValueKind;
import com.sun.source.doctree.CommentTree;
import com.sun.source.doctree.DeprecatedTree;
import com.sun.source.doctree.DocRootTree;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.DocTree.Kind;
@ -1167,7 +1168,7 @@ public class HtmlDocletWriter {
* @param tag the inline tag to be added
* @param htmltree the content tree to which the comment will be added
*/
public void addInlineDeprecatedComment(Element e, DocTree tag, Content htmltree) {
public void addInlineDeprecatedComment(Element e, DeprecatedTree tag, Content htmltree) {
CommentHelper ch = utils.getCommentHelper(e);
addCommentTags(e, ch.getBody(tag), true, false, false, htmltree);
}
@ -1193,7 +1194,7 @@ public class HtmlDocletWriter {
addCommentTags(element, firstSentenceTags, false, true, true, htmltree);
}
public void addSummaryDeprecatedComment(Element element, DocTree tag, Content htmltree) {
public void addSummaryDeprecatedComment(Element element, DeprecatedTree tag, Content htmltree) {
CommentHelper ch = utils.getCommentHelper(element);
List<? extends DocTree> body = ch.getBody(tag);
addCommentTags(element, ch.getFirstSentenceTrees(body), true, true, true, htmltree);

@ -33,6 +33,7 @@ import javax.lang.model.type.TypeMirror;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.SerialTree;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
@ -165,7 +166,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
if (!utils.getFullBody(field).isEmpty()) {
writer.addInlineComment(field, contentTree);
}
List<? extends DocTree> tags = utils.getBlockTags(field, DocTree.Kind.SERIAL);
List<? extends SerialTree> tags = utils.getSerialTrees(field);
if (!tags.isEmpty()) {
writer.addInlineComment(field, tags.get(0), contentTree);
}

@ -37,7 +37,7 @@ import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.DeprecatedTree;
import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
@ -300,13 +300,12 @@ public class IndexWriter extends HtmlDocletWriter {
* @param contentTree the content tree to which the comment will be added
*/
protected void addComment(Element element, Content contentTree) {
List<? extends DocTree> tags;
Content span = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(element));
HtmlTree div = new HtmlTree(TagName.DIV);
div.setStyle(HtmlStyle.deprecationBlock);
if (utils.isDeprecated(element)) {
div.add(span);
tags = utils.getBlockTags(element, DocTree.Kind.DEPRECATED);
List<? extends DeprecatedTree> tags = utils.getDeprecatedTrees(element);
if (!tags.isEmpty())
addInlineDeprecatedComment(element, tags.get(0), div);
contentTree.add(div);

@ -40,6 +40,7 @@ import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.ElementFilter;
import com.sun.source.doctree.DeprecatedTree;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.doclet.DocletEnvironment.ModuleMode;
import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents;
@ -369,14 +370,14 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
}
});
// Generate the map of all services listed using @provides, and the description.
utils.getBlockTags(mdle, DocTree.Kind.PROVIDES).forEach(tree -> {
utils.getProvidesTrees(mdle).forEach(tree -> {
TypeElement t = ch.getServiceType(tree);
if (t != null) {
providesTrees.put(t, commentTagsToContent(tree, mdle, ch.getDescription(tree), false, true));
}
});
// Generate the map of all services listed using @uses, and the description.
utils.getBlockTags(mdle, DocTree.Kind.USES).forEach(tree -> {
utils.getUsesTrees(mdle).forEach(tree -> {
TypeElement t = ch.getServiceType(tree);
if (t != null) {
usesTrees.put(t, commentTagsToContent(tree, mdle, ch.getDescription(tree), false, true));
@ -802,7 +803,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
* @param div the content tree to which the deprecation information will be added
*/
public void addDeprecationInfo(Content div) {
List<? extends DocTree> deprs = utils.getBlockTags(mdle, DocTree.Kind.DEPRECATED);
List<? extends DeprecatedTree> deprs = utils.getDeprecatedTrees(mdle);
if (utils.isDeprecated(mdle)) {
CommentHelper ch = utils.getCommentHelper(mdle);
HtmlTree deprDiv = new HtmlTree(TagName.DIV);
@ -860,9 +861,8 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
* @param pkg the PackageDoc that is added
*/
public void addPackageDeprecationInfo(Content li, PackageElement pkg) {
List<? extends DocTree> deprs;
if (utils.isDeprecated(pkg)) {
deprs = utils.getDeprecatedTrees(pkg);
List<? extends DeprecatedTree> deprs = utils.getDeprecatedTrees(pkg);
HtmlTree deprDiv = new HtmlTree(TagName.DIV);
deprDiv.setStyle(HtmlStyle.deprecationBlock);
Content deprPhrase = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(pkg));

@ -32,6 +32,7 @@ import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import com.sun.source.doctree.DeprecatedTree;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
@ -142,7 +143,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
* @param div the content tree to which the deprecation information will be added
*/
public void addDeprecationInfo(Content div) {
List<? extends DocTree> deprs = utils.getBlockTags(packageElement, DocTree.Kind.DEPRECATED);
List<? extends DeprecatedTree> deprs = utils.getDeprecatedTrees(packageElement);
if (utils.isDeprecated(packageElement)) {
CommentHelper ch = utils.getCommentHelper(packageElement);
HtmlTree deprDiv = new HtmlTree(TagName.DIV);
@ -223,7 +224,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
ContentBuilder description = new ContentBuilder();
if (utils.isDeprecated(klass)) {
description.add(getDeprecatedPhrase(klass));
List<? extends DocTree> tags = utils.getDeprecatedTrees(klass);
List<? extends DeprecatedTree> tags = utils.getDeprecatedTrees(klass);
if (!tags.isEmpty()) {
addSummaryDeprecatedComment(klass, tags.get(0), description);
}

@ -30,6 +30,7 @@ import java.util.*;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import com.sun.source.doctree.DeprecatedTree;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
@ -108,7 +109,7 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
*/
protected void addIndexComment(Element member, List<? extends DocTree> firstSentenceTags,
Content tdSummary) {
List<? extends DocTree> deprs = utils.getBlockTags(member, DocTree.Kind.DEPRECATED);
List<? extends DeprecatedTree> deprs = utils.getDeprecatedTrees(member);
Content div;
if (utils.isDeprecated(member)) {
Content deprLabel = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(member));

@ -37,10 +37,15 @@ import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.SimpleElementVisitor14;
import com.sun.source.doctree.DeprecatedTree;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.IndexTree;
import com.sun.source.doctree.LiteralTree;
import com.sun.source.doctree.ParamTree;
import com.sun.source.doctree.ReturnTree;
import com.sun.source.doctree.SeeTree;
import com.sun.source.doctree.SystemPropertyTree;
import com.sun.source.doctree.ThrowsTree;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
@ -109,16 +114,15 @@ public class TagletWriterImpl extends TagletWriter {
}
@Override
protected Content indexTagOutput(Element element, DocTree tag) {
protected Content indexTagOutput(Element element, IndexTree tag) {
CommentHelper ch = utils.getCommentHelper(element);
IndexTree itt = (IndexTree) tag;
String tagText = ch.getText(itt.getSearchTerm());
String tagText = ch.getText(tag.getSearchTerm());
if (tagText.charAt(0) == '"' && tagText.charAt(tagText.length() - 1) == '"') {
tagText = tagText.substring(1, tagText.length() - 1)
.replaceAll("\\s+", " ");
}
String desc = ch.getText(itt.getDescription());
String desc = ch.getText(tag.getDescription());
return createAnchorAndSearchIndex(element, tagText, desc, tag);
}
@ -137,7 +141,7 @@ public class TagletWriterImpl extends TagletWriter {
public Content deprecatedTagOutput(Element element) {
ContentBuilder result = new ContentBuilder();
CommentHelper ch = utils.getCommentHelper(element);
List<? extends DocTree> deprs = utils.getBlockTags(element, DocTree.Kind.DEPRECATED);
List<? extends DeprecatedTree> deprs = utils.getDeprecatedTrees(element);
if (utils.isTypeElement(element)) {
if (utils.isDeprecated(element)) {
result.add(HtmlTree.SPAN(HtmlStyle.deprecatedLabel,
@ -171,7 +175,7 @@ public class TagletWriterImpl extends TagletWriter {
}
@Override
protected Content literalTagOutput(Element element, DocTree tag) {
protected Content literalTagOutput(Element element, LiteralTree tag) {
CommentHelper ch = utils.getCommentHelper(element);
Content result = new StringContent(utils.normalizeNewlines(ch.getText(tag)));
return result;
@ -191,12 +195,12 @@ public class TagletWriterImpl extends TagletWriter {
@Override
@SuppressWarnings("preview")
public Content paramTagOutput(Element element, DocTree paramTag, String paramName) {
public Content paramTagOutput(Element element, ParamTree paramTag, String paramName) {
ContentBuilder body = new ContentBuilder();
CommentHelper ch = utils.getCommentHelper(element);
// define id attributes for state components so that generated descriptions may refer to them
boolean defineID = (element.getKind() == ElementKind.RECORD)
&& (paramTag instanceof ParamTree) && !((ParamTree) paramTag).isTypeParameter();
&& !paramTag.isTypeParameter();
Content nameTree = new StringContent(paramName);
body.add(HtmlTree.CODE(defineID ? HtmlTree.SPAN_ID("param-" + paramName, nameTree) : nameTree));
body.add(" - ");
@ -206,7 +210,7 @@ public class TagletWriterImpl extends TagletWriter {
}
@Override
public Content returnTagOutput(Element element, DocTree returnTag) {
public Content returnTagOutput(Element element, ReturnTree returnTag) {
CommentHelper ch = utils.getCommentHelper(element);
return new ContentBuilder(
HtmlTree.DT(contents.returns),
@ -215,7 +219,7 @@ public class TagletWriterImpl extends TagletWriter {
}
@Override
public Content seeTagOutput(Element holder, List<? extends DocTree> seeTags) {
public Content seeTagOutput(Element holder, List<? extends SeeTree> seeTags) {
ContentBuilder body = new ContentBuilder();
for (DocTree dt : seeTags) {
appendSeparatorIfNotEmpty(body);
@ -279,9 +283,8 @@ public class TagletWriterImpl extends TagletWriter {
}
@Override
protected Content systemPropertyTagOutput(Element element, DocTree tag) {
SystemPropertyTree itt = (SystemPropertyTree) tag;
String tagText = itt.getPropertyName().toString();
protected Content systemPropertyTagOutput(Element element, SystemPropertyTree tag) {
String tagText = tag.getPropertyName().toString();
return HtmlTree.CODE(createAnchorAndSearchIndex(element, tagText,
resources.getText("doclet.System_Property"), tag));
}
@ -292,7 +295,7 @@ public class TagletWriterImpl extends TagletWriter {
}
@Override
public Content throwsTagOutput(Element element, DocTree throwsTag, TypeMirror substituteType) {
public Content throwsTagOutput(Element element, ThrowsTree throwsTag, TypeMirror substituteType) {
ContentBuilder body = new ContentBuilder();
CommentHelper ch = utils.getCommentHelper(element);
Element exception = ch.getException(throwsTag);

@ -38,6 +38,7 @@ import javax.lang.model.util.ElementFilter;
import com.sun.source.doctree.DocCommentTree;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.DocTree.Kind;
import com.sun.source.doctree.SinceTree;
import com.sun.source.doctree.UnknownBlockTagTree;
import jdk.javadoc.internal.doclets.toolkit.ClassWriter;
import jdk.javadoc.internal.doclets.toolkit.Content;
@ -335,7 +336,7 @@ public abstract class MemberSummaryBuilder extends AbstractMemberBuilder {
}
// copy certain tags
List<? extends DocTree> tags = utils.getBlockTags(property, Kind.SINCE);
List<? extends SinceTree> tags = utils.getBlockTags(property, Kind.SINCE, SinceTree.class);
blockTags.addAll(tags);
List<? extends DocTree> bTags = utils.getBlockTags(property,

@ -36,8 +36,8 @@ import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.SerialFieldTree;
import com.sun.source.doctree.SerialTree;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.SerializedFormWriter;
@ -472,10 +472,7 @@ public class SerializedFormBuilder extends AbstractBuilder {
// element.)
SortedSet<SerialFieldTree> tags = new TreeSet<>(utils.comparators.makeSerialFieldTreeComparator());
// sort the elements
for (DocTree dt : utils.getSerialFieldTrees(field)) {
SerialFieldTree st = (SerialFieldTree) dt;
tags.add(st);
}
tags.addAll(utils.getSerialFieldTrees(field));
CommentHelper ch = utils.getCommentHelper(field);
for (SerialFieldTree tag : tags) {
@ -574,7 +571,7 @@ public class SerializedFormBuilder extends AbstractBuilder {
if (utils.isEnum(element)) {
return false;
}
List<? extends DocTree> serial = utils.getSerialTrees(element);
List<? extends SerialTree> serial = utils.getSerialTrees(element);
if (!serial.isEmpty()) {
CommentHelper ch = utils.getCommentHelper(element);
String serialtext = Utils.toLowerCase(ch.getText(serial.get(0)));

@ -29,6 +29,7 @@ import java.util.EnumSet;
import javax.lang.model.element.Element;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.IndexTree;
import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.toolkit.Content;
@ -46,6 +47,6 @@ public class IndexTaglet extends BaseTaglet {
@Override
public Content getInlineTagOutput(Element element, DocTree tag, TagletWriter writer) {
return writer.indexTagOutput(element, tag);
return writer.indexTagOutput(element, (IndexTree) tag);
}
}

@ -29,6 +29,7 @@ import java.util.EnumSet;
import javax.lang.model.element.Element;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.LiteralTree;
import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.toolkit.Content;
/**
@ -52,6 +53,6 @@ public class LiteralTaglet extends BaseTaglet {
@Override
public Content getInlineTagOutput(Element e, DocTree tag, TagletWriter writer) {
return writer.literalTagOutput(e, tag);
return writer.literalTagOutput(e, (LiteralTree) tag);
}
}

@ -165,7 +165,7 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet {
* @return the content representation of these {@code @param DocTree}s.
*/
private Content getTagletOutput(ParamKind kind, Element holder,
TagletWriter writer, List<? extends Element> formalParameters, List<? extends DocTree> paramTags) {
TagletWriter writer, List<? extends Element> formalParameters, List<? extends ParamTree> paramTags) {
Content result = writer.getOutputInstance();
Set<String> alreadyDocumented = new HashSet<>();
if (!paramTags.isEmpty()) {
@ -210,7 +210,7 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet {
CommentHelper ch = utils.getCommentHelper(holder);
ch.setOverrideElement(inheritedDoc.holder);
Content content = processParamTag(holder, kind, writer,
inheritedDoc.holderTag,
(ParamTree) inheritedDoc.holderTag,
lname,
alreadyDocumented.isEmpty());
result.add(content);
@ -240,13 +240,13 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet {
* @return the Content representation of this {@code @param DocTree}.
*/
private Content processParamTags(Element e, ParamKind kind,
List<? extends DocTree> paramTags, Map<String, String> rankMap, TagletWriter writer,
List<? extends ParamTree> paramTags, Map<String, String> rankMap, TagletWriter writer,
Set<String> alreadyDocumented) {
Messages messages = writer.configuration().getMessages();
Content result = writer.getOutputInstance();
if (!paramTags.isEmpty()) {
CommentHelper ch = writer.configuration().utils.getCommentHelper(e);
for (DocTree dt : paramTags) {
for (ParamTree dt : paramTags) {
String name = ch.getParameterName(dt);
String paramName = kind != ParamKind.TYPE_PARAMETER
? name.toString()
@ -294,7 +294,7 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet {
*
*/
private Content processParamTag(Element e, ParamKind kind,
TagletWriter writer, DocTree paramTag, String name,
TagletWriter writer, ParamTree paramTag, String name,
boolean isFirstParam) {
Content result = writer.getOutputInstance();
if (isFirstParam) {

@ -34,6 +34,7 @@ import javax.lang.model.element.ExecutableElement;
import javax.lang.model.type.TypeMirror;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.ReturnTree;
import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.Messages;
@ -58,7 +59,7 @@ public class ReturnTaglet extends BaseTaglet implements InheritableTaglet {
@Override
public void inherit(DocFinder.Input input, DocFinder.Output output) {
List<? extends DocTree> tags = input.utils.getBlockTags(input.element, DocTree.Kind.RETURN);
List<? extends ReturnTree> tags = input.utils.getReturnTrees(input.element);
CommentHelper ch = input.utils.getCommentHelper(input.element);
if (!tags.isEmpty()) {
output.holder = input.element;
@ -74,7 +75,7 @@ public class ReturnTaglet extends BaseTaglet implements InheritableTaglet {
Messages messages = writer.configuration().getMessages();
Utils utils = writer.configuration().utils;
TypeMirror returnType = utils.getReturnType(writer.getCurrentPageElement(), (ExecutableElement)holder);
List<? extends DocTree> tags = utils.getBlockTags(holder, DocTree.Kind.RETURN);
List<? extends ReturnTree> tags = utils.getReturnTrees(holder);
//Make sure we are not using @return tag on method with void return type.
if (returnType != null && utils.isVoid(returnType)) {
@ -94,6 +95,6 @@ public class ReturnTaglet extends BaseTaglet implements InheritableTaglet {
ch.setOverrideElement(inheritedDoc.holder);
ntags.add(inheritedDoc.holderTag);
}
return !ntags.isEmpty() ? writer.returnTagOutput(holder, ntags.get(0)) : null;
return !ntags.isEmpty() ? writer.returnTagOutput(holder, (ReturnTree) ntags.get(0)) : null;
}
}

@ -31,6 +31,7 @@ import java.util.List;
import javax.lang.model.element.Element;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.SeeTree;
import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
@ -54,7 +55,7 @@ public class SeeTaglet extends BaseTaglet implements InheritableTaglet {
@Override
public void inherit(DocFinder.Input input, DocFinder.Output output) {
List<? extends DocTree> tags = input.utils.getSeeTrees(input.element);
List<? extends SeeTree> tags = input.utils.getSeeTrees(input.element);
if (!tags.isEmpty()) {
CommentHelper ch = input.utils.getCommentHelper(input.element);
output.holder = input.element;
@ -68,7 +69,7 @@ public class SeeTaglet extends BaseTaglet implements InheritableTaglet {
@Override
public Content getAllBlockTagOutput(Element holder, TagletWriter writer) {
Utils utils = writer.configuration().utils;
List<? extends DocTree> tags = utils.getSeeTrees(holder);
List<? extends SeeTree> tags = utils.getSeeTrees(holder);
Element e = holder;
if (tags.isEmpty() && utils.isExecutableElement(holder)) {
Input input = new DocFinder.Input(utils, holder, this);

@ -26,6 +26,7 @@
package jdk.javadoc.internal.doclets.toolkit.taglets;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.SystemPropertyTree;
import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.toolkit.Content;
@ -50,6 +51,6 @@ public class SystemPropertyTaglet extends BaseTaglet {
@Override
public Content getInlineTagOutput(Element element, DocTree tag, TagletWriter writer) {
return writer.systemPropertyTagOutput(element, tag);
return writer.systemPropertyTagOutput(element, (SystemPropertyTree) tag);
}
}

@ -34,6 +34,13 @@ import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.IndexTree;
import com.sun.source.doctree.LiteralTree;
import com.sun.source.doctree.ParamTree;
import com.sun.source.doctree.ReturnTree;
import com.sun.source.doctree.SeeTree;
import com.sun.source.doctree.SystemPropertyTree;
import com.sun.source.doctree.ThrowsTree;
import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.taglets.Taglet.UnsupportedTagletOperationException;
@ -85,7 +92,7 @@ public abstract class TagletWriter {
*
* @return the output
*/
protected abstract Content indexTagOutput(Element element, DocTree tag);
protected abstract Content indexTagOutput(Element element, IndexTree tag);
/**
* Returns the output for a {@code {@docRoot}} tag.
@ -111,7 +118,7 @@ public abstract class TagletWriter {
*
* @return the output
*/
protected abstract Content literalTagOutput(Element element, DocTree tag);
protected abstract Content literalTagOutput(Element element, LiteralTree tag);
/**
* Returns the header for the {@code @param} tags.
@ -133,7 +140,7 @@ public abstract class TagletWriter {
*
* @return the output
*/
protected abstract Content paramTagOutput(Element element, DocTree paramTag, String paramName);
protected abstract Content paramTagOutput(Element element, ParamTree paramTag, String paramName);
/**
* Returns the output for a {@code @return} tag.
@ -143,7 +150,7 @@ public abstract class TagletWriter {
*
* @return the output
*/
protected abstract Content returnTagOutput(Element element, DocTree returnTag);
protected abstract Content returnTagOutput(Element element, ReturnTree returnTag);
/**
* Returns the output for {@code @see} tags.
@ -153,7 +160,7 @@ public abstract class TagletWriter {
*
* @return the output
*/
protected abstract Content seeTagOutput(Element element, List<? extends DocTree> seeTags);
protected abstract Content seeTagOutput(Element element, List<? extends SeeTree> seeTags);
/**
* Returns the output for a series of simple tags.
@ -174,7 +181,7 @@ public abstract class TagletWriter {
*
* @return the output
*/
protected abstract Content systemPropertyTagOutput(Element element, DocTree systemPropertyTag);
protected abstract Content systemPropertyTagOutput(Element element, SystemPropertyTree systemPropertyTag);
/**
* Returns the header for the {@code @throws} tag.
@ -192,7 +199,7 @@ public abstract class TagletWriter {
*
* @return the output
*/
protected abstract Content throwsTagOutput(Element element, DocTree throwsTag, TypeMirror substituteType);
protected abstract Content throwsTagOutput(Element element, ThrowsTree throwsTag, TypeMirror substituteType);
/**
* Returns the output for a default {@code @throws} tag.

@ -35,6 +35,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
@ -43,6 +44,7 @@ import javax.lang.model.type.ExecutableType;
import javax.lang.model.type.TypeMirror;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.ThrowsTree;
import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.toolkit.Content;
@ -72,7 +74,8 @@ public class ThrowsTaglet extends BaseTaglet
Element exception;
CommentHelper ch = utils.getCommentHelper(input.element);
if (input.tagId == null) {
exception = ch.getException(input.docTreeInfo.docTree);
exception = input.docTreeInfo.docTree instanceof ThrowsTree
? ch.getException((ThrowsTree) input.docTreeInfo.docTree) : null;
input.tagId = exception == null
? ch.getExceptionName(input.docTreeInfo.docTree).getSignature()
: utils.getFullyQualifiedName(exception);
@ -80,18 +83,18 @@ public class ThrowsTaglet extends BaseTaglet
exception = input.utils.findClass(input.element, input.tagId);
}
for (DocTree dt : input.utils.getThrowsTrees(input.element)) {
Element exc = ch.getException(dt);
for (ThrowsTree tt : input.utils.getThrowsTrees(input.element)) {
Element exc = ch.getException(tt);
if (exc != null && (input.tagId.equals(utils.getSimpleName(exc)) ||
(input.tagId.equals(utils.getFullyQualifiedName(exc))))) {
output.holder = input.element;
output.holderTag = dt;
output.holderTag = tt;
output.inlineTags = ch.getBody(output.holderTag);
output.tagList.add(dt);
output.tagList.add(tt);
} else if (exception != null && exc != null &&
utils.isTypeElement(exc) && utils.isTypeElement(exception) &&
utils.isSubclassOf((TypeElement)exc, (TypeElement)exception)) {
output.tagList.add(dt);
output.tagList.add(tt);
}
}
}
@ -129,7 +132,7 @@ public class ThrowsTaglet extends BaseTaglet
Utils utils = writer.configuration().utils;
Content result = writer.getOutputInstance();
if (utils.isExecutableElement(holder)) {
Map<List<? extends DocTree>, ExecutableElement> declaredExceptionTags = new LinkedHashMap<>();
Map<List<? extends ThrowsTree>, ExecutableElement> declaredExceptionTags = new LinkedHashMap<>();
for (TypeMirror declaredExceptionType : declaredExceptionTypes) {
Input input = new DocFinder.Input(utils, holder, this,
utils.getTypeName(declaredExceptionType, false));
@ -143,7 +146,10 @@ public class ThrowsTaglet extends BaseTaglet
if (inheritedDoc.holder == null) {
inheritedDoc.holder = holder;
}
declaredExceptionTags.put(inheritedDoc.tagList, (ExecutableElement)inheritedDoc.holder);
List<? extends ThrowsTree> inheritedTags = inheritedDoc.tagList.stream()
.map(t -> (ThrowsTree) t)
.collect(Collectors.toList());
declaredExceptionTags.put(inheritedTags, (ExecutableElement) inheritedDoc.holder);
}
}
result.add(throwsTagsOutput(declaredExceptionTags, writer, alreadyDocumented,
@ -161,7 +167,7 @@ public class ThrowsTaglet extends BaseTaglet
List<? extends TypeMirror> thrownTypes = instantiatedType.getThrownTypes();
Map<String, TypeMirror> typeSubstitutions = getSubstitutedThrownTypes(
((ExecutableElement) holder).getThrownTypes(), thrownTypes);
Map<List<? extends DocTree>, ExecutableElement> tagsMap = new LinkedHashMap<>();
Map<List<? extends ThrowsTree>, ExecutableElement> tagsMap = new LinkedHashMap<>();
tagsMap.put(utils.getThrowsTrees(execHolder), execHolder);
Content result = writer.getOutputInstance();
HashSet<String> alreadyDocumented = new HashSet<>();
@ -183,16 +189,16 @@ public class ThrowsTaglet extends BaseTaglet
* @param allowDuplicates {@code true} if we allow duplicate tags to be documented
* @return the generated content for the tags
*/
protected Content throwsTagsOutput(Map<List<? extends DocTree>, ExecutableElement> throwTags,
protected Content throwsTagsOutput(Map<List<? extends ThrowsTree>, ExecutableElement> throwTags,
TagletWriter writer, Set<String> alreadyDocumented,
Map<String,TypeMirror> typeSubstitutions, boolean allowDuplicates) {
Utils utils = writer.configuration().utils;
Content result = writer.getOutputInstance();
if (!throwTags.isEmpty()) {
for (Entry<List<? extends DocTree>, ExecutableElement> entry : throwTags.entrySet()) {
for (Entry<List<? extends ThrowsTree>, ExecutableElement> entry : throwTags.entrySet()) {
CommentHelper ch = utils.getCommentHelper(entry.getValue());
Element e = entry.getValue();
for (DocTree dt : entry.getKey()) {
for (ThrowsTree dt : entry.getKey()) {
Element te = ch.getException(dt);
String excName = ch.getExceptionName(dt).toString();
TypeMirror substituteType = typeSubstitutions.get(excName);

@ -200,13 +200,8 @@ public class CommentHelper {
return null;
}
public Element getException(DocTree dtree) {
if (dtree.getKind() == THROWS || dtree.getKind() == EXCEPTION) {
ThrowsTree tt = (ThrowsTree)dtree;
ReferenceTree exceptionName = tt.getExceptionName();
return getElement(exceptionName);
}
return null;
public Element getException(ThrowsTree tt) {
return getElement(tt.getExceptionName());
}
public List<? extends DocTree> getDescription(DocTree dtree) {

@ -91,14 +91,23 @@ import javax.tools.JavaFileManager;
import javax.tools.JavaFileManager.Location;
import javax.tools.StandardLocation;
import com.sun.source.doctree.DeprecatedTree;
import com.sun.source.doctree.DocCommentTree;
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.DocTree.Kind;
import com.sun.source.doctree.EndElementTree;
import com.sun.source.doctree.ParamTree;
import com.sun.source.doctree.ProvidesTree;
import com.sun.source.doctree.ReturnTree;
import com.sun.source.doctree.SeeTree;
import com.sun.source.doctree.SerialDataTree;
import com.sun.source.doctree.SerialFieldTree;
import com.sun.source.doctree.SerialTree;
import com.sun.source.doctree.StartElementTree;
import com.sun.source.doctree.TextTree;
import com.sun.source.doctree.ThrowsTree;
import com.sun.source.doctree.UnknownBlockTagTree;
import com.sun.source.doctree.UsesTree;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.LineMap;
import com.sun.source.util.DocSourcePositions;
@ -945,8 +954,8 @@ public class Utils {
return set;
}
public List<? extends DocTree> getSerialDataTrees(ExecutableElement member) {
return getBlockTags(member, SERIAL_DATA);
public List<? extends SerialDataTree> getSerialDataTrees(ExecutableElement member) {
return getBlockTags(member, SERIAL_DATA, SerialDataTree.class);
}
public FileObject getFileObject(TypeElement te) {
@ -2591,10 +2600,22 @@ public class Utils {
.collect(Collectors.toList());
}
public <T extends DocTree> List<? extends T> getBlockTags(Element element, Predicate<DocTree> filter, Class<T> tClass) {
return getBlockTags(element).stream()
.filter(t -> t.getKind() != ERRONEOUS)
.filter(filter)
.map(t -> tClass.cast(t))
.collect(Collectors.toList());
}
public List<? extends DocTree> getBlockTags(Element element, DocTree.Kind kind) {
return getBlockTags(element, t -> t.getKind() == kind);
}
public <T extends DocTree> List<? extends T> getBlockTags(Element element, DocTree.Kind kind, Class<T> tClass) {
return getBlockTags(element, t -> t.getKind() == kind, tClass);
}
public List<? extends DocTree> getBlockTags(Element element, DocTree.Kind kind, DocTree.Kind altKind) {
return getBlockTags(element, t -> t.getKind() == kind || t.getKind() == altKind);
}
@ -2780,28 +2801,30 @@ public class Utils {
: docCommentTree.getFullBody();
}
public List<? extends DocTree> getDeprecatedTrees(Element element) {
return getBlockTags(element, DEPRECATED);
public List<? extends DeprecatedTree> getDeprecatedTrees(Element element) {
return getBlockTags(element, DEPRECATED, DeprecatedTree.class);
}
public List<? extends DocTree> getProvidesTrees(Element element) {
return getBlockTags(element, PROVIDES);
public List<? extends ProvidesTree> getProvidesTrees(Element element) {
return getBlockTags(element, PROVIDES, ProvidesTree.class);
}
public List<? extends DocTree> getSeeTrees(Element element) {
return getBlockTags(element, SEE);
public List<? extends SeeTree> getSeeTrees(Element element) {
return getBlockTags(element, SEE, SeeTree.class);
}
public List<? extends DocTree> getSerialTrees(Element element) {
return getBlockTags(element, SERIAL);
public List<? extends SerialTree> getSerialTrees(Element element) {
return getBlockTags(element, SERIAL, SerialTree.class);
}
public List<? extends DocTree> getSerialFieldTrees(VariableElement field) {
return getBlockTags(field, DocTree.Kind.SERIAL_FIELD);
public List<? extends SerialFieldTree> getSerialFieldTrees(VariableElement field) {
return getBlockTags(field, DocTree.Kind.SERIAL_FIELD, SerialFieldTree.class);
}
public List<? extends DocTree> getThrowsTrees(Element element) {
return getBlockTags(element, DocTree.Kind.EXCEPTION, DocTree.Kind.THROWS);
public List<? extends ThrowsTree> getThrowsTrees(Element element) {
return getBlockTags(element,
t -> switch (t.getKind()) { case EXCEPTION, THROWS -> true; default -> false; },
ThrowsTree.class);
}
public List<? extends ParamTree> getTypeParamTrees(Element element) {
@ -2813,22 +2836,17 @@ public class Utils {
}
private List<? extends ParamTree> getParamTrees(Element element, boolean isTypeParameters) {
List<ParamTree> out = new ArrayList<>();
for (DocTree dt : getBlockTags(element, PARAM)) {
ParamTree pt = (ParamTree) dt;
if (pt.isTypeParameter() == isTypeParameters) {
out.add(pt);
}
}
return out;
return getBlockTags(element,
t -> t.getKind() == PARAM && ((ParamTree) t).isTypeParameter() == isTypeParameters,
ParamTree.class);
}
public List<? extends DocTree> getReturnTrees(Element element) {
return new ArrayList<>(getBlockTags(element, RETURN));
public List<? extends ReturnTree> getReturnTrees(Element element) {
return new ArrayList<>(getBlockTags(element, RETURN, ReturnTree.class));
}
public List<? extends DocTree> getUsesTrees(Element element) {
return getBlockTags(element, USES);
public List<? extends UsesTree> getUsesTrees(Element element) {
return getBlockTags(element, USES, UsesTree.class);
}
public List<? extends DocTree> getFirstSentenceTrees(Element element) {