8312044: Simplify toolkit Builder/Writer world

Reviewed-by: prappo
This commit is contained in:
Jonathan Gibbons 2023-07-21 18:51:06 +00:00
parent f4ba7b2198
commit 3c644dc586
123 changed files with 3226 additions and 6923 deletions
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets
formats/html
AbstractExecutableMemberWriter.javaAbstractMemberWriter.javaAbstractOverviewIndexWriter.javaAbstractTreeWriter.javaAllClassesIndexWriter.javaAllPackagesIndexWriter.javaAnnotationTypeMemberWriter.javaClassUseWriter.javaClassWriter.javaClassWriterImpl.javaConstantsSummaryWriter.javaConstantsSummaryWriterImpl.javaConstructorWriter.javaContent.javaContents.javaDeprecatedListWriter.javaDocFilesHandler.javaEnumConstantWriter.javaExternalSpecsWriter.javaFieldWriter.javaHelpWriter.javaHtmlConfiguration.javaHtmlDoclet.javaHtmlDocletWriter.javaHtmlLinkFactory.javaHtmlLinkInfo.javaIndexRedirectWriter.javaIndexWriter.javaMethodWriter.javaModuleIndexWriter.javaModuleWriter.javaNavigation.javaNestedClassWriter.javaNewAPIListWriter.javaPackageIndexWriter.javaPackageTreeWriter.javaPackageUseWriter.javaPackageWriter.javaPreviewListWriter.javaPropertyWriter.javaSearchWriter.javaSerialFieldWriter.javaSerialMethodWriter.javaSerializedFormWriter.javaSerializedFormWriterImpl.javaSignatures.javaSourceToHTMLConverter.javaSubWriterHolderWriter.javaSummaryListWriter.javaSystemPropertiesWriter.javaTable.javaTableHeader.javaTreeWriter.javaWriterFactory.javaWriterFactoryImpl.java
markup
taglets
toolkit

@ -43,7 +43,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import static jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo.Kind.LINK_TYPE_PARAMS; import static jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo.Kind.LINK_TYPE_PARAMS;
import static jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS; import static jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS;

@ -42,16 +42,14 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.Links;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.MemberWriter;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/** /**
* The base class for member writers. * The base class for member writers.
*/ */
public abstract class AbstractMemberWriter implements MemberSummaryWriter, MemberWriter { public abstract class AbstractMemberWriter {
protected final HtmlConfiguration configuration; protected final HtmlConfiguration configuration;
protected final HtmlOptions options; protected final HtmlOptions options;
@ -80,6 +78,33 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter, Membe
this(writer, null); this(writer, null);
} }
/**
* Returns the member summary header for the given class.
*
* @param typeElement the class the summary belongs to
* @param content the content to which the member summary will be added
*
* @return the member summary header
*/
public abstract Content getMemberSummaryHeader(TypeElement typeElement, Content content);
/**
* Adds the given summary to the list of summaries.
*
* @param summariesList the list of summaries
* @param content the summary
*/
public abstract void addSummary(Content summariesList, Content content);
/**
* Returns a list of visible elements of the specified kind in this
* type element.
* @param kind of members
* @return a list of members
*/
protected List<Element> getVisibleMembers(VisibleMemberTable.Kind kind) {
return configuration.getVisibleMemberTable(typeElement).getVisibleMembers(kind);
}
/* ----- abstracts ----- */ /* ----- abstracts ----- */
/** /**
@ -340,11 +365,17 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter, Membe
} }
} }
@Override /**
* Adds the member summary for the given class and member.
*
* @param tElement the class the summary belongs to
* @param member the member that is documented
* @param firstSentenceTrees the tags for the sentence being documented
*/
public void addMemberSummary(TypeElement tElement, Element member, public void addMemberSummary(TypeElement tElement, Element member,
List<? extends DocTree> firstSentenceTrees) { List<? extends DocTree> firstSentenceTrees) {
if (tElement != typeElement) { if (tElement != typeElement) {
throw new IllegalStateException(); throw new IllegalStateException(tElement + ", " + typeElement);
} }
var table = getSummaryTable(); var table = getSummaryTable();
List<Content> rowContents = new ArrayList<>(); List<Content> rowContents = new ArrayList<>();
@ -361,26 +392,50 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter, Membe
table.addRow(member, rowContents); table.addRow(member, rowContents);
} }
@Override /**
* Adds the inherited member summary for the given class and member.
*
* @param tElement the class the inherited member belongs to
* @param member the inherited member that is being documented
* @param isFirst true if this is the first member in the list
* @param isLast true if this is the last member in the list
* @param content the content to which the links will be added
*/
public void addInheritedMemberSummary(TypeElement tElement, public void addInheritedMemberSummary(TypeElement tElement,
Element nestedClass, boolean isFirst, boolean isLast, Element member, boolean isFirst, boolean isLast,
Content content) { Content content) {
writer.addInheritedMemberSummary(this, tElement, nestedClass, isFirst, content); writer.addInheritedMemberSummary(this, tElement, member, isFirst, content);
} }
@Override /**
* Returns the inherited member summary header for the given class.
*
* @param tElement the class the summary belongs to
*
* @return the inherited member summary header
*/
public Content getInheritedSummaryHeader(TypeElement tElement) { public Content getInheritedSummaryHeader(TypeElement tElement) {
Content c = writer.getMemberInherited(); Content c = writer.getMemberInherited();
writer.addInheritedSummaryHeader(this, tElement, c); writer.addInheritedSummaryHeader(this, tElement, c);
return c; return c;
} }
@Override /**
* Returns the inherited summary links.
*
* @return the inherited summary links
*/
public Content getInheritedSummaryLinks() { public Content getInheritedSummaryLinks() {
return new HtmlTree(TagName.CODE); return new HtmlTree(TagName.CODE);
} }
@Override /**
* Returns the summary table for the given class.
*
* @param tElement the class the summary table belongs to
*
* @return the summary table
*/
public Content getSummaryTable(TypeElement tElement) { public Content getSummaryTable(TypeElement tElement) {
if (tElement != typeElement) { if (tElement != typeElement) {
throw new IllegalStateException(); throw new IllegalStateException();
@ -388,18 +443,33 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter, Membe
return getSummaryTable(); return getSummaryTable();
} }
@Override /**
* Returns the member content.
*
* @param memberContent the content representing the member
*
* @return the member content
*/
public Content getMember(Content memberContent) { public Content getMember(Content memberContent) {
return writer.getMember(memberContent); return writer.getMember(memberContent);
} }
@Override /**
public Content getMemberList() { * {@return a list to add member items to}
*
* @see #getMemberListItem(Content)
*/
protected Content getMemberList() {
return writer.getMemberList(); return writer.getMemberList();
} }
@Override /**
public Content getMemberListItem(Content memberContent) { * {@return a member item}
*
* @param memberContent the member to represent as an item
* @see #getMemberList()
*/
protected Content getMemberListItem(Content memberContent) {
return writer.getMemberListItem(memberContent); return writer.getMemberListItem(memberContent);
} }

@ -31,7 +31,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -28,7 +28,6 @@ package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree.Hierarchy; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree.Hierarchy;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -37,7 +37,6 @@ 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
@ -117,10 +116,10 @@ public class AllClassesIndexWriter extends HtmlDocletWriter {
.setId(HtmlIds.ALL_CLASSES_TABLE) .setId(HtmlIds.ALL_CLASSES_TABLE)
.setDefaultTab(contents.allClassesAndInterfacesLabel) .setDefaultTab(contents.allClassesAndInterfacesLabel)
.addTab(contents.interfaces, utils::isPlainInterface) .addTab(contents.interfaces, utils::isPlainInterface)
.addTab(contents.classes, e -> utils.isNonThrowableClass(e)) .addTab(contents.classes, utils::isNonThrowableClass)
.addTab(contents.enums, utils::isEnum) .addTab(contents.enums, utils::isEnum)
.addTab(contents.records, e -> utils.isRecord(e)) .addTab(contents.records, utils::isRecord)
.addTab(contents.exceptionClasses, e -> utils.isThrowable(e)) .addTab(contents.exceptionClasses, utils::isThrowable)
.addTab(contents.annotationTypes, utils::isAnnotationInterface); .addTab(contents.annotationTypes, utils::isAnnotationInterface);
for (Character unicode : indexBuilder.getFirstCharacters()) { for (Character unicode : indexBuilder.getFirstCharacters()) {
for (IndexItem indexItem : indexBuilder.getItems(unicode)) { for (IndexItem indexItem : indexBuilder.getItems(unicode)) {

@ -33,7 +33,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -37,16 +37,15 @@ 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/** /**
* Writes annotation interface member documentation in HTML format. * Writes annotation interface member documentation in HTML format.
*/ */
public class AnnotationTypeMemberWriterImpl extends AbstractMemberWriter public class AnnotationTypeMemberWriter extends AbstractMemberWriter {
implements AnnotationTypeMemberWriter, MemberSummaryWriter {
/** /**
* We generate separate summaries for required and optional annotation interface members, * We generate separate summaries for required and optional annotation interface members,
@ -61,12 +60,18 @@ public class AnnotationTypeMemberWriterImpl extends AbstractMemberWriter
private final Kind kind; private final Kind kind;
/**
* The index of the current member that is being documented at this point
* in time.
*/
protected Element currentMember;
/** /**
* Constructs a new AnnotationTypeMemberWriterImpl for any kind of member. * Constructs a new AnnotationTypeMemberWriterImpl for any kind of member.
* *
* @param writer The writer for the class that the member belongs to. * @param writer The writer for the class that the member belongs to.
*/ */
public AnnotationTypeMemberWriterImpl(SubWriterHolderWriter writer) { public AnnotationTypeMemberWriter(SubWriterHolderWriter writer) {
super(writer); super(writer);
this.kind = Kind.ANY; this.kind = Kind.ANY;
} }
@ -78,13 +83,110 @@ public class AnnotationTypeMemberWriterImpl extends AbstractMemberWriter
* @param annotationType the AnnotationType that holds this member. * @param annotationType the AnnotationType that holds this member.
* @param kind the kind of annotation interface members to handle. * @param kind the kind of annotation interface members to handle.
*/ */
public AnnotationTypeMemberWriterImpl(SubWriterHolderWriter writer, public AnnotationTypeMemberWriter(SubWriterHolderWriter writer,
TypeElement annotationType, TypeElement annotationType,
Kind kind) { Kind kind) {
super(writer, annotationType); super(writer, annotationType);
this.kind = kind; this.kind = kind;
} }
public void build(Content target) throws DocletException {
buildAnnotationTypeMember(target);
}
/**
* Build the member documentation.
*
* @param target the content to which the documentation will be added
*/
protected void buildAnnotationTypeMember(Content target) {
// In contrast to the annotation interface member summaries the details generated
// by this builder share a single list for both required and optional members.
var members = getVisibleMembers(VisibleMemberTable.Kind.ANNOTATION_TYPE_MEMBER);
if (!members.isEmpty()) {
addAnnotationDetailsMarker(target);
Content annotationDetailsHeader = getAnnotationDetailsHeader();
Content memberList = getMemberList();
for (Element member : members) {
currentMember = member;
Content annotationContent = getAnnotationHeaderContent(currentMember);
buildAnnotationTypeMemberChildren(annotationContent);
memberList.add(writer.getMemberListItem(annotationContent));
}
Content annotationDetails = getAnnotationDetails(annotationDetailsHeader, memberList);
target.add(annotationDetails);
}
}
protected void buildAnnotationTypeMemberChildren(Content annotationContent) {
buildSignature(annotationContent);
buildDeprecationInfo(annotationContent);
buildPreviewInfo(annotationContent);
buildMemberComments(annotationContent);
buildTagInfo(annotationContent);
buildDefaultValueInfo(annotationContent);
}
/**
* Build the signature.
*
* @param target the content to which the documentation will be added
*/
protected void buildSignature(Content target) {
target.add(getSignature(currentMember));
}
/**
* Build the deprecation information.
*
* @param annotationContent the content to which the documentation will be added
*/
protected void buildDeprecationInfo(Content annotationContent) {
addDeprecated(currentMember, annotationContent);
}
/**
* Build the preview information.
*
* @param annotationContent the content to which the documentation will be added
*/
protected void buildPreviewInfo(Content annotationContent) {
addPreview(currentMember, annotationContent);
}
/**
* Build the comments for the member. Do nothing if
* {@link BaseOptions#noComment()} is set to true.
*
* @param annotationContent the content to which the documentation will be added
*/
protected void buildMemberComments(Content annotationContent) {
if (!options.noComment()) {
addComments(currentMember, annotationContent);
}
}
/**
* Build the tag information.
*
* @param annotationContent the content to which the documentation will be added
*/
protected void buildTagInfo(Content annotationContent) {
addTags(currentMember, annotationContent);
}
/**
* Build the default value for this optional member.
*
* @param annotationContent the content to which the documentation will be added
*/
protected void buildDefaultValueInfo(Content annotationContent) {
addDefaultValueInfo(currentMember, annotationContent);
}
@Override @Override
public Content getMemberSummaryHeader(TypeElement typeElement, public Content getMemberSummaryHeader(TypeElement typeElement,
Content content) { Content content) {
@ -102,8 +204,7 @@ public class AnnotationTypeMemberWriterImpl extends AbstractMemberWriter
return c; return c;
} }
@Override protected Content getMemberHeader() {
public Content getMemberHeader() {
return writer.getMemberHeader(); return writer.getMemberHeader();
} }
@ -118,15 +219,13 @@ public class AnnotationTypeMemberWriterImpl extends AbstractMemberWriter
summariesList, content); summariesList, content);
} }
@Override protected void addAnnotationDetailsMarker(Content memberDetails) {
public void addAnnotationDetailsMarker(Content memberDetails) {
memberDetails.add(selectComment( memberDetails.add(selectComment(
MarkerComments.START_OF_ANNOTATION_TYPE_DETAILS, MarkerComments.START_OF_ANNOTATION_TYPE_DETAILS,
MarkerComments.START_OF_ANNOTATION_INTERFACE_DETAILS)); MarkerComments.START_OF_ANNOTATION_INTERFACE_DETAILS));
} }
@Override protected Content getAnnotationDetailsHeader() {
public Content getAnnotationDetailsHeader() {
Content memberDetails = new ContentBuilder(); Content memberDetails = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING,
contents.annotationTypeDetailsLabel); contents.annotationTypeDetailsLabel);
@ -134,8 +233,7 @@ public class AnnotationTypeMemberWriterImpl extends AbstractMemberWriter
return memberDetails; return memberDetails;
} }
@Override protected Content getAnnotationHeaderContent(Element member) {
public Content getAnnotationHeaderContent(Element member) {
Content content = new ContentBuilder(); Content content = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING,
Text.of(name(member))); Text.of(name(member)));
@ -144,36 +242,30 @@ public class AnnotationTypeMemberWriterImpl extends AbstractMemberWriter
.setId(htmlIds.forMember(typeElement, (ExecutableElement) member)); .setId(htmlIds.forMember(typeElement, (ExecutableElement) member));
} }
@Override protected Content getSignature(Element member) {
public Content getSignature(Element member) {
return new Signatures.MemberSignature(member, this) return new Signatures.MemberSignature(member, this)
.setType(getType(member)) .setType(getType(member))
.setAnnotations(writer.getAnnotationInfo(member, true)) .setAnnotations(writer.getAnnotationInfo(member, true))
.toContent(); .toContent();
} }
@Override protected void addDeprecated(Element member, Content target) {
public void addDeprecated(Element member, Content target) {
addDeprecatedInfo(member, target); addDeprecatedInfo(member, target);
} }
@Override protected void addPreview(Element member, Content content) {
public void addPreview(Element member, Content content) {
addPreviewInfo(member, content); addPreviewInfo(member, content);
} }
@Override protected void addComments(Element member, Content annotationContent) {
public void addComments(Element member, Content annotationContent) {
addComment(member, annotationContent); addComment(member, annotationContent);
} }
@Override protected void addTags(Element member, Content annotationContent) {
public void addTags(Element member, Content annotationContent) {
writer.addTagsInfo(member, annotationContent); writer.addTagsInfo(member, annotationContent);
} }
@Override protected Content getAnnotationDetails(Content annotationDetailsHeader, Content annotationDetails) {
public Content getAnnotationDetails(Content annotationDetailsHeader, Content annotationDetails) {
Content c = new ContentBuilder(annotationDetailsHeader, annotationDetails); Content c = new ContentBuilder(annotationDetailsHeader, annotationDetails);
return getMember(HtmlTree.SECTION(HtmlStyle.memberDetails, c)); return getMember(HtmlTree.SECTION(HtmlStyle.memberDetails, c));
} }

@ -43,7 +43,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.ClassUseMapper; import jdk.javadoc.internal.doclets.toolkit.util.ClassUseMapper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
@ -81,10 +80,10 @@ public class ClassUseWriter extends SubWriterHolderWriter {
final Map<PackageElement, List<Element>> pkgToConstructorArgTypeParameter; final Map<PackageElement, List<Element>> pkgToConstructorArgTypeParameter;
final Map<PackageElement, List<Element>> pkgToConstructorThrows; final Map<PackageElement, List<Element>> pkgToConstructorThrows;
final SortedSet<PackageElement> pkgSet; final SortedSet<PackageElement> pkgSet;
final MethodWriterImpl methodSubWriter; final MethodWriter methodSubWriter;
final ConstructorWriterImpl constrSubWriter; final ConstructorWriter constrSubWriter;
final FieldWriterImpl fieldSubWriter; final FieldWriter fieldSubWriter;
final NestedClassWriterImpl classSubWriter; final NestedClassWriter classSubWriter;
/** /**
* Constructor. * Constructor.
@ -132,11 +131,11 @@ public class ClassUseWriter extends SubWriterHolderWriter {
+ pkgSet + " with: " + mapper.classToPackage.get(this.typeElement)); + pkgSet + " with: " + mapper.classToPackage.get(this.typeElement));
} }
methodSubWriter = new MethodWriterImpl(this); methodSubWriter = new MethodWriter(this);
constrSubWriter = new ConstructorWriterImpl(this); constrSubWriter = new ConstructorWriter(this);
constrSubWriter.setFoundNonPubConstructor(true); constrSubWriter.setFoundNonPubConstructor(true);
fieldSubWriter = new FieldWriterImpl(this); fieldSubWriter = new FieldWriter(this);
classSubWriter = new NestedClassWriterImpl(this); classSubWriter = new NestedClassWriter(this);
} }
/** /**

File diff suppressed because it is too large Load Diff

@ -1,470 +0,0 @@
/*
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
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.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.ClassWriter;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/**
* Generate the Class Information Page.
*
* @see javax.lang.model.element.TypeElement
*/
public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWriter {
private static final Set<String> suppressSubtypesSet
= Set.of("java.lang.Object",
"org.omg.CORBA.Object");
private static final Set<String> suppressImplementingSet
= Set.of("java.lang.Cloneable",
"java.lang.constant.Constable",
"java.lang.constant.ConstantDesc",
"java.io.Serializable");
protected final TypeElement typeElement;
protected final ClassTree classTree;
/**
* @param configuration the configuration data for the doclet
* @param typeElement the class being documented.
* @param classTree the class tree for the given class.
*/
public ClassWriterImpl(HtmlConfiguration configuration, TypeElement typeElement,
ClassTree classTree) {
super(configuration, configuration.docPaths.forClass(typeElement));
this.typeElement = typeElement;
configuration.currentTypeElement = typeElement;
this.classTree = classTree;
}
@Override
public Content getOutputInstance() {
return new ContentBuilder();
}
@Override
public Content getHeader(String header) {
HtmlTree body = getBody(getWindowTitle(utils.getSimpleName(typeElement)));
var div = HtmlTree.DIV(HtmlStyle.header);
if (configuration.showModules) {
ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(typeElement);
var classModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInType, contents.moduleLabel);
var moduleNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, classModuleLabel);
moduleNameDiv.add(Entity.NO_BREAK_SPACE);
moduleNameDiv.add(getModuleLink(mdle,
Text.of(mdle.getQualifiedName())));
div.add(moduleNameDiv);
}
PackageElement pkg = utils.containingPackage(typeElement);
if (!pkg.isUnnamed()) {
var classPackageLabel = HtmlTree.SPAN(HtmlStyle.packageLabelInType, contents.packageLabel);
var pkgNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, classPackageLabel);
pkgNameDiv.add(Entity.NO_BREAK_SPACE);
Content pkgNameContent = getPackageLink(pkg, getLocalizedPackageName(pkg));
pkgNameDiv.add(pkgNameContent);
div.add(pkgNameDiv);
}
HtmlLinkInfo linkInfo = new HtmlLinkInfo(configuration,
HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS_AND_BOUNDS, typeElement)
.linkToSelf(false); // Let's not link to ourselves in the header
var heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING,
HtmlStyle.title, Text.of(header));
heading.add(getTypeParameterLinks(linkInfo));
div.add(heading);
bodyContents.setHeader(getHeader(PageMode.CLASS, typeElement))
.addMainContent(MarkerComments.START_OF_CLASS_DATA)
.addMainContent(div);
return body;
}
@Override
public Content getClassContentHeader() {
return getContentHeader();
}
@Override
protected Navigation getNavBar(PageMode pageMode, Element element) {
Content linkContent = getModuleLink(utils.elementUtils.getModuleOf(element),
contents.moduleLabel);
return super.getNavBar(pageMode, element)
.setNavLinkModule(linkContent)
.setSubNavLinks(() -> {
List<Content> list = new ArrayList<>();
VisibleMemberTable vmt = configuration.getVisibleMemberTable(typeElement);
Set<VisibleMemberTable.Kind> summarySet =
VisibleMemberTable.Kind.forSummariesOf(element.getKind());
for (VisibleMemberTable.Kind kind : summarySet) {
list.add(links.createLink(HtmlIds.forMemberSummary(kind),
contents.getNavLinkLabelContent(kind), vmt.hasVisibleMembers(kind)));
}
return list;
});
}
@Override
public void addFooter() {
bodyContents.addMainContent(MarkerComments.END_OF_CLASS_DATA);
bodyContents.setFooter(getFooter());
}
@Override
public void printDocument(Content content) throws DocFileIOException {
String description = getDescription("declaration", typeElement);
PackageElement pkg = utils.containingPackage(typeElement);
List<DocPath> localStylesheets = getLocalStylesheets(pkg);
content.add(bodyContents);
printHtmlDocument(configuration.metakeywords.getMetaKeywords(typeElement),
description, localStylesheets, content);
}
@Override
public Content getClassInfo(Content classInfo) {
return getMember(HtmlIds.CLASS_DESCRIPTION, HtmlStyle.classDescription, classInfo);
}
@Override
public TypeElement getCurrentPageElement() {
return typeElement;
}
@Override
public void addClassSignature(Content classInfo) {
classInfo.add(new HtmlTree(TagName.HR));
classInfo.add(new Signatures.TypeSignature(typeElement, this)
.toContent());
}
@Override
public void addClassDescription(Content classInfo) {
addPreviewInfo(classInfo);
if (!options.noComment()) {
// generate documentation for the class.
if (!utils.getFullBody(typeElement).isEmpty()) {
addInlineComment(typeElement, classInfo);
}
}
}
private void addPreviewInfo(Content content) {
addPreviewInfo(typeElement, content);
}
@Override
public void addClassTagInfo(Content classInfo) {
if (!options.noComment()) {
// Print Information about all the tags here
addTagsInfo(typeElement, classInfo);
}
}
/**
* Get the class inheritance tree for the given class.
*
* @param type the class to get the inheritance tree for
* @return the class inheritance tree
*/
private Content getClassInheritanceTreeContent(TypeMirror type) {
TypeMirror sup;
HtmlTree classTree = null;
do {
sup = utils.getFirstVisibleSuperClass(type);
var entry = HtmlTree.DIV(HtmlStyle.inheritance, getClassHelperContent(type));
if (classTree != null)
entry.add(classTree);
classTree = entry;
type = sup;
} while (sup != null);
classTree.put(HtmlAttr.TITLE, contents.getContent("doclet.Inheritance_Tree").toString());
return classTree;
}
/**
* Get the class helper for the given class.
*
* @param type the class to get the helper for
* @return the class helper
*/
private Content getClassHelperContent(TypeMirror type) {
Content result = new ContentBuilder();
if (utils.typeUtils.isSameType(type, typeElement.asType())) {
Content typeParameters = getTypeParameterLinks(
new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS,
typeElement));
if (configuration.shouldExcludeQualifier(utils.containingPackage(typeElement).toString())) {
result.add(utils.asTypeElement(type).getSimpleName());
result.add(typeParameters);
} else {
result.add(utils.asTypeElement(type).getQualifiedName());
result.add(typeParameters);
}
} else {
Content link = getLink(new HtmlLinkInfo(configuration,
HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS, type)
.label(configuration.getClassName(utils.asTypeElement(type))));
result.add(link);
}
return result;
}
@Override
public void addClassTree(Content target) {
if (!utils.isClass(typeElement)) {
return;
}
target.add(getClassInheritanceTreeContent(typeElement.asType()));
}
@Override
public void addParamInfo(Content target) {
if (utils.hasBlockTag(typeElement, DocTree.Kind.PARAM)) {
var t = configuration.tagletManager.getTaglet(DocTree.Kind.PARAM);
Content paramInfo = t.getAllBlockTagOutput(typeElement, getTagletWriterInstance(false));
if (!paramInfo.isEmpty()) {
target.add(HtmlTree.DL(HtmlStyle.notes, paramInfo));
}
}
}
@Override
public void addSubClassInfo(Content target) {
if (utils.isClass(typeElement)) {
for (String s : suppressSubtypesSet) {
if (typeElement.getQualifiedName().contentEquals(s)) {
return; // Don't generate the list, too huge
}
}
Set<TypeElement> subclasses = classTree.hierarchy(typeElement).subtypes(typeElement);
if (!subclasses.isEmpty()) {
var dl = HtmlTree.DL(HtmlStyle.notes);
dl.add(HtmlTree.DT(contents.subclassesLabel));
dl.add(HtmlTree.DD(getClassLinks(HtmlLinkInfo.Kind.PLAIN, subclasses)));
target.add(dl);
}
}
}
@Override
public void addSubInterfacesInfo(Content target) {
if (utils.isPlainInterface(typeElement)) {
Set<TypeElement> subInterfaces = classTree.hierarchy(typeElement).allSubtypes(typeElement);
if (!subInterfaces.isEmpty()) {
var dl = HtmlTree.DL(HtmlStyle.notes);
dl.add(HtmlTree.DT(contents.subinterfacesLabel));
dl.add(HtmlTree.DD(getClassLinks(HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS, subInterfaces)));
target.add(dl);
}
}
}
@Override
public void addInterfaceUsageInfo(Content target) {
if (!utils.isPlainInterface(typeElement)) {
return;
}
for (String s : suppressImplementingSet) {
if (typeElement.getQualifiedName().contentEquals(s)) {
return; // Don't generate the list, too huge
}
}
Set<TypeElement> implcl = classTree.implementingClasses(typeElement);
if (!implcl.isEmpty()) {
var dl = HtmlTree.DL(HtmlStyle.notes);
dl.add(HtmlTree.DT(contents.implementingClassesLabel));
dl.add(HtmlTree.DD(getClassLinks(HtmlLinkInfo.Kind.PLAIN, implcl)));
target.add(dl);
}
}
@Override
public void addImplementedInterfacesInfo(Content target) {
SortedSet<TypeMirror> interfaces = new TreeSet<>(comparators.makeTypeMirrorClassUseComparator());
interfaces.addAll(utils.getAllInterfaces(typeElement));
if (utils.isClass(typeElement) && !interfaces.isEmpty()) {
var dl = HtmlTree.DL(HtmlStyle.notes);
dl.add(HtmlTree.DT(contents.allImplementedInterfacesLabel));
dl.add(HtmlTree.DD(getClassLinks(HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS, interfaces)));
target.add(dl);
}
}
@Override
public void addSuperInterfacesInfo(Content target) {
SortedSet<TypeMirror> interfaces =
new TreeSet<>(comparators.makeTypeMirrorIndexUseComparator());
interfaces.addAll(utils.getAllInterfaces(typeElement));
if (utils.isPlainInterface(typeElement) && !interfaces.isEmpty()) {
var dl = HtmlTree.DL(HtmlStyle.notes);
dl.add(HtmlTree.DT(contents.allSuperinterfacesLabel));
dl.add(HtmlTree.DD(getClassLinks(HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS, interfaces)));
target.add(dl);
}
}
@Override
public void addNestedClassInfo(final Content target) {
Element outerClass = typeElement.getEnclosingElement();
if (outerClass == null)
return;
new SimpleElementVisitor8<Void, Void>() {
@Override
public Void visitType(TypeElement e, Void p) {
var dl = HtmlTree.DL(HtmlStyle.notes);
dl.add(HtmlTree.DT(utils.isPlainInterface(e)
? contents.enclosingInterfaceLabel
: contents.enclosingClassLabel));
dl.add(HtmlTree.DD(getClassLinks(HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS, List.of(e))));
target.add(dl);
return null;
}
}.visit(outerClass);
}
@Override
public void addFunctionalInterfaceInfo (Content target) {
if (isFunctionalInterface()) {
var dl = HtmlTree.DL(HtmlStyle.notes);
dl.add(HtmlTree.DT(contents.functionalInterface));
var dd = new HtmlTree(TagName.DD);
dd.add(contents.functionalInterfaceMessage);
dl.add(dd);
target.add(dl);
}
}
public boolean isFunctionalInterface() {
List<? extends AnnotationMirror> annotationMirrors = typeElement.getAnnotationMirrors();
for (AnnotationMirror anno : annotationMirrors) {
if (utils.isFunctionalInterface(anno)) {
return true;
}
}
return false;
}
@Override
public void addClassDeprecationInfo(Content classInfo) {
List<? extends DeprecatedTree> deprs = utils.getDeprecatedTrees(typeElement);
if (utils.isDeprecated(typeElement)) {
var deprLabel = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(typeElement));
var div = HtmlTree.DIV(HtmlStyle.deprecationBlock, deprLabel);
if (!deprs.isEmpty()) {
CommentHelper ch = utils.getCommentHelper(typeElement);
DocTree dt = deprs.get(0);
List<? extends DocTree> commentTags = ch.getBody(dt);
if (!commentTags.isEmpty()) {
addInlineDeprecatedComment(typeElement, deprs.get(0), div);
}
}
classInfo.add(div);
}
}
/**
* Get the links to the given classes.
*
* @param context the id of the context where the links will be added
* @param list the classes
* @return the links
*/
private Content getClassLinks(HtmlLinkInfo.Kind context, Collection<?> list) {
Content content = new ContentBuilder();
boolean isFirst = true;
for (Object type : list) {
if (!isFirst) {
content.add(Text.of(", "));
} else {
isFirst = false;
}
// TODO: should we simply split this method up to avoid instanceof ?
if (type instanceof TypeElement te) {
Content link = getLink(
new HtmlLinkInfo(configuration, context, te));
content.add(HtmlTree.CODE(link));
} else {
Content link = getLink(
new HtmlLinkInfo(configuration, context, ((TypeMirror)type)));
content.add(HtmlTree.CODE(link));
}
}
return content;
}
/**
* Return the TypeElement being documented.
*
* @return the TypeElement being documented.
*/
@Override
public TypeElement getTypeElement() {
return typeElement;
}
@Override
public Content getMemberDetails(Content content) {
var section = HtmlTree.SECTION(HtmlStyle.details, content);
// The following id is required by the Navigation bar
if (utils.isAnnotationInterface(typeElement)) {
section.setId(HtmlIds.ANNOTATION_TYPE_ELEMENT_DETAIL);
}
return section;
}
}

@ -0,0 +1,488 @@
/*
* Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
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.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
import jdk.javadoc.internal.doclets.toolkit.util.IndexItem;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/**
* Write the Constants Summary Page in HTML format.
*/
public class ConstantsSummaryWriter extends HtmlDocletWriter {
/**
* The maximum number of package directories shown in the headings of
* the constant values contents list and headings.
*/
private static final int MAX_CONSTANT_VALUE_INDEX_LENGTH = 2;
/**
* The current class being documented.
*/
private TypeElement currentTypeElement;
private final TableHeader constantsTableHeader;
/**
* The HTML tree for constant values summary currently being written.
*/
private HtmlTree summarySection;
private final BodyContents bodyContents = new BodyContents();
private boolean hasConstants = false;
/**
* The set of type elements that have constant fields.
*/
protected final Set<TypeElement> typeElementsWithConstFields;
/**
* The set of package-group headings.
*/
protected final Set<String> packageGroupHeadings;
private PackageElement currentPackage;
private TypeElement currentClass; // FIXME: dup of currentTypeElement
/**
* Construct a ConstantsSummaryWriter.
* @param configuration the configuration used in this run
* of the standard doclet.
*/
public ConstantsSummaryWriter(HtmlConfiguration configuration) {
super(configuration, DocPaths.CONSTANT_VALUES, false);
constantsTableHeader = new TableHeader(
contents.modifierAndTypeLabel, contents.constantFieldLabel, contents.valueLabel);
this.typeElementsWithConstFields = new HashSet<>();
this.packageGroupHeadings = new TreeSet<>(utils::compareStrings);
}
public void build() throws DocletException {
boolean anyConstants = configuration.packages.stream().anyMatch(this::hasConstantField);
if (!anyConstants) {
return;
}
configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.CONSTANT_VALUES);
writeGenerating();
buildConstantSummary();
}
/**
* Builds the constant summary page.
*
* @throws DocletException if there is a problem while building the documentation
*/
protected void buildConstantSummary() throws DocletException {
Content content = getHeader();
buildContents();
buildConstantSummaries();
addFooter();
printDocument(content);
}
/**
* Builds the list of contents for the groups of packages appearing in the constants summary page.
*/
protected void buildContents() {
Content contentList = getContentsHeader();
packageGroupHeadings.clear();
for (PackageElement pkg : configuration.packages) {
String abbrevPackageName = getAbbrevPackageName(pkg);
if (hasConstantField(pkg) && !packageGroupHeadings.contains(abbrevPackageName)) {
addLinkToPackageContent(abbrevPackageName, contentList);
packageGroupHeadings.add(abbrevPackageName);
}
}
addContentsList(contentList);
}
/**
* Builds the summary for each documented package.
*/
protected void buildConstantSummaries() {
packageGroupHeadings.clear();
Content summaries = getConstantSummaries();
for (PackageElement aPackage : configuration.packages) {
if (hasConstantField(aPackage)) {
currentPackage = aPackage;
//Build the documentation for the current package.
buildPackageHeader(summaries);
buildClassConstantSummary();
}
}
addConstantSummaries(summaries);
}
/**
* Builds the header for the given package.
*
* @param target the content to which the package header will be added
*/
protected void buildPackageHeader(Content target) {
String abbrevPkgName = getAbbrevPackageName(currentPackage);
if (!packageGroupHeadings.contains(abbrevPkgName)) {
addPackageGroup(abbrevPkgName, target);
packageGroupHeadings.add(abbrevPkgName);
}
}
/**
* Builds the summary for the current class.
*/
protected void buildClassConstantSummary() {
SortedSet<TypeElement> classes = !currentPackage.isUnnamed()
? utils.getAllClasses(currentPackage)
: configuration.typeElementCatalog.allUnnamedClasses();
Content classConstantHeader = getClassConstantHeader();
for (TypeElement te : classes) {
if (!typeElementsWithConstFields.contains(te) ||
!utils.isIncluded(te)) {
continue;
}
currentClass = te;
//Build the documentation for the current class.
buildConstantMembers(classConstantHeader);
}
addClassConstant(classConstantHeader);
}
/**
* Builds the summary of constant members in the class.
*
* @param target the content to which the table of constant members will be added
*/
protected void buildConstantMembers(Content target) {
new ConstantFieldBuilder(currentClass).buildMembersSummary(target);
}
/**
* {@return true if the given package has constant fields to document}
*
* @param pkg the package to be checked
*/
private boolean hasConstantField(PackageElement pkg) {
SortedSet<TypeElement> classes = !pkg.isUnnamed()
? utils.getAllClasses(pkg)
: configuration.typeElementCatalog.allUnnamedClasses();
boolean found = false;
for (TypeElement te : classes) {
if (utils.isIncluded(te) && hasConstantField(te)) {
found = true;
}
}
return found;
}
/**
* {@return true if the given class has constant fields to document}
*
* @param typeElement the class to be checked
*/
private boolean hasConstantField(TypeElement typeElement) {
VisibleMemberTable vmt = configuration.getVisibleMemberTable(typeElement);
List<? extends Element> fields = vmt.getVisibleMembers(VisibleMemberTable.Kind.FIELDS);
for (Element f : fields) {
VariableElement field = (VariableElement)f;
if (field.getConstantValue() != null) {
typeElementsWithConstFields.add(typeElement);
return true;
}
}
return false;
}
/**
* {@return the abbreviated name for a package, containing the leading segments of the name}
*
* @param pkg the package
*/
public String getAbbrevPackageName(PackageElement pkg) {
if (pkg.isUnnamed()) {
return "";
}
String packageName = utils.getPackageName(pkg);
int index = -1;
for (int j = 0; j < MAX_CONSTANT_VALUE_INDEX_LENGTH; j++) {
index = packageName.indexOf(".", index + 1);
}
return index == -1 ? packageName : packageName.substring(0, index);
}
/**
* Builder for the table of fields with constant values.
*/
private class ConstantFieldBuilder {
/**
* The type element that we are examining constants for.
*/
protected TypeElement typeElement;
/**
* Constructs a {@code ConstantFieldBuilder}.
* @param typeElement the type element that we are examining constants for
*/
public ConstantFieldBuilder(TypeElement typeElement) {
this.typeElement = typeElement;
}
/**
* Builds the table of constants for a given class.
*
* @param target the content to which the table of class constants will be added
*/
protected void buildMembersSummary(Content target) {
SortedSet<VariableElement> members = members();
if (!members.isEmpty()) {
addConstantMembers(typeElement, members, target);
}
}
/**
* {@return a set of visible constant fields for the given type}
*/
protected SortedSet<VariableElement> members() {
VisibleMemberTable vmt = configuration.getVisibleMemberTable(typeElement);
List<Element> members = new ArrayList<>();
members.addAll(vmt.getVisibleMembers(VisibleMemberTable.Kind.FIELDS));
members.addAll(vmt.getVisibleMembers(VisibleMemberTable.Kind.ENUM_CONSTANTS));
SortedSet<VariableElement> includes =
new TreeSet<>(utils.comparators.makeGeneralPurposeComparator());
for (Element element : members) {
VariableElement member = (VariableElement)element;
if (member.getConstantValue() != null) {
includes.add(member);
}
}
return includes;
}
}
Content getHeader() {
String label = resources.getText("doclet.Constants_Summary");
HtmlTree body = getBody(getWindowTitle(label));
bodyContents.setHeader(getHeader(PageMode.CONSTANT_VALUES));
return body;
}
Content getContentsHeader() {
return HtmlTree.UL(HtmlStyle.contentsList);
}
void addLinkToPackageContent(String abbrevPackageName, Content content) {
//add link to summary
Content link;
if (abbrevPackageName.isEmpty()) {
link = links.createLink(HtmlIds.UNNAMED_PACKAGE_ANCHOR,
contents.defaultPackageLabel, "");
} else {
Content packageNameContent = Text.of(abbrevPackageName + ".*");
link = links.createLink(DocLink.fragment(abbrevPackageName),
packageNameContent, "");
}
content.add(HtmlTree.LI(link));
}
void addContentsList(Content content) {
Content titleContent = contents.constantsSummaryTitle;
var pHeading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING,
HtmlStyle.title, titleContent);
var div = HtmlTree.DIV(HtmlStyle.header, pHeading);
bodyContents.addMainContent(div);
Content headingContent = contents.contentsHeading;
var heading = HtmlTree.HEADING_TITLE(Headings.CONTENT_HEADING,
headingContent);
var section = HtmlTree.SECTION(HtmlStyle.packages, heading);
section.add(content);
bodyContents.addMainContent(section);
}
//@Override
// TODO: inline?
public Content getConstantSummaries() {
return new ContentBuilder();
}
void addPackageGroup(String abbrevPackageName, Content toContent) {
Content headingContent;
HtmlId anchorName;
if (abbrevPackageName.isEmpty()) {
anchorName = HtmlIds.UNNAMED_PACKAGE_ANCHOR;
headingContent = contents.defaultPackageLabel;
} else {
anchorName = htmlIds.forPackageName(abbrevPackageName);
headingContent = new ContentBuilder(
getPackageLabel(abbrevPackageName),
Text.of(".*"));
}
var heading = HtmlTree.HEADING_TITLE(
Headings.ConstantsSummary.PACKAGE_HEADING,
headingContent);
summarySection = HtmlTree.SECTION(HtmlStyle.constantsSummary, heading)
.setId(anchorName);
toContent.add(summarySection);
}
Content getClassConstantHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
void addClassConstant(Content fromClassConstant) {
summarySection.add(fromClassConstant);
hasConstants = true;
}
void addConstantMembers(TypeElement typeElement, Collection<VariableElement> fields,
Content target) {
currentTypeElement = typeElement;
//generate links backward only to public classes.
Content classLink = (utils.isPublic(typeElement) || utils.isProtected(typeElement)) ?
getLink(new HtmlLinkInfo(configuration,
HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS_IN_LABEL, typeElement)) :
Text.of(utils.getFullyQualifiedName(typeElement));
PackageElement enclosingPackage = utils.containingPackage(typeElement);
Content caption = new ContentBuilder();
if (!enclosingPackage.isUnnamed()) {
caption.add(enclosingPackage.getQualifiedName());
caption.add(".");
}
caption.add(classLink);
var table = new Table<Void>(HtmlStyle.summaryTable)
.setCaption(caption)
.setHeader(constantsTableHeader)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast);
for (VariableElement field : fields) {
table.addRow(getTypeColumn(field), getNameColumn(field), getValue(field));
}
target.add(HtmlTree.LI(table));
}
/**
* Get the type column for the constant summary table row.
*
* @param member the field to be documented.
* @return the type column of the constant table row
*/
private Content getTypeColumn(VariableElement member) {
Content typeContent = new ContentBuilder();
var code = new HtmlTree(TagName.CODE)
.setId(htmlIds.forMember(currentTypeElement, member));
for (Modifier mod : member.getModifiers()) {
code.add(Text.of(mod.toString()))
.add(Entity.NO_BREAK_SPACE);
}
Content type = getLink(new HtmlLinkInfo(configuration,
HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS, member.asType()));
code.add(type);
typeContent.add(code);
return typeContent;
}
/**
* Get the name column for the constant summary table row.
*
* @param member the field to be documented.
* @return the name column of the constant table row
*/
private Content getNameColumn(VariableElement member) {
Content nameContent = getDocLink(HtmlLinkInfo.Kind.PLAIN,
member, member.getSimpleName());
return HtmlTree.CODE(nameContent);
}
/**
* Get the value column for the constant summary table row.
*
* @param member the field to be documented.
* @return the value column of the constant table row
*/
private Content getValue(VariableElement member) {
String value = utils.constantValueExpression(member);
return HtmlTree.CODE(Text.of(value));
}
void addConstantSummaries(Content content) {
bodyContents.addMainContent(content);
}
void addFooter() {
bodyContents.setFooter(getFooter());
}
void printDocument(Content content) throws DocFileIOException {
content.add(bodyContents);
printHtmlDocument(null, "summary of constants", content);
if (hasConstants && configuration.mainIndex != null) {
configuration.mainIndex.add(IndexItem.of(IndexItem.Category.TAGS,
resources.getText("doclet.Constants_Summary"), path));
}
}
}

@ -1,260 +0,0 @@
/*
* Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html;
import java.util.Collection;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
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.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.ConstantsSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
import jdk.javadoc.internal.doclets.toolkit.util.IndexItem;
/**
* Write the Constants Summary Page in HTML format.
*/
public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements ConstantsSummaryWriter {
/**
* The current class being documented.
*/
private TypeElement currentTypeElement;
private final TableHeader constantsTableHeader;
/**
* The HTML tree for constant values summary currently being written.
*/
private HtmlTree summarySection;
private final BodyContents bodyContents = new BodyContents();
private boolean hasConstants = false;
/**
* Construct a ConstantsSummaryWriter.
* @param configuration the configuration used in this run
* of the standard doclet.
*/
public ConstantsSummaryWriterImpl(HtmlConfiguration configuration) {
super(configuration, DocPaths.CONSTANT_VALUES);
constantsTableHeader = new TableHeader(
contents.modifierAndTypeLabel, contents.constantFieldLabel, contents.valueLabel);
configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.CONSTANT_VALUES);
}
@Override
public Content getHeader() {
String label = resources.getText("doclet.Constants_Summary");
HtmlTree body = getBody(getWindowTitle(label));
bodyContents.setHeader(getHeader(PageMode.CONSTANT_VALUES));
return body;
}
@Override
public Content getContentsHeader() {
return HtmlTree.UL(HtmlStyle.contentsList);
}
@Override
public void addLinkToPackageContent(String abbrevPackageName, Content content) {
//add link to summary
Content link;
if (abbrevPackageName.isEmpty()) {
link = links.createLink(HtmlIds.UNNAMED_PACKAGE_ANCHOR,
contents.defaultPackageLabel, "");
} else {
Content packageNameContent = Text.of(abbrevPackageName + ".*");
link = links.createLink(DocLink.fragment(abbrevPackageName),
packageNameContent, "");
}
content.add(HtmlTree.LI(link));
}
@Override
public void addContentsList(Content content) {
Content titleContent = contents.constantsSummaryTitle;
var pHeading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING,
HtmlStyle.title, titleContent);
var div = HtmlTree.DIV(HtmlStyle.header, pHeading);
bodyContents.addMainContent(div);
Content headingContent = contents.contentsHeading;
var heading = HtmlTree.HEADING_TITLE(Headings.CONTENT_HEADING,
headingContent);
var section = HtmlTree.SECTION(HtmlStyle.packages, heading);
section.add(content);
bodyContents.addMainContent(section);
}
@Override
public Content getConstantSummaries() {
return new ContentBuilder();
}
@Override
public void addPackageGroup(String abbrevPackageName, Content toContent) {
Content headingContent;
HtmlId anchorName;
if (abbrevPackageName.isEmpty()) {
anchorName = HtmlIds.UNNAMED_PACKAGE_ANCHOR;
headingContent = contents.defaultPackageLabel;
} else {
anchorName = htmlIds.forPackageName(abbrevPackageName);
headingContent = new ContentBuilder(
getPackageLabel(abbrevPackageName),
Text.of(".*"));
}
var heading = HtmlTree.HEADING_TITLE(
Headings.ConstantsSummary.PACKAGE_HEADING,
headingContent);
summarySection = HtmlTree.SECTION(HtmlStyle.constantsSummary, heading)
.setId(anchorName);
toContent.add(summarySection);
}
@Override
public Content getClassConstantHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
@Override
public void addClassConstant(Content fromClassConstant) {
summarySection.add(fromClassConstant);
hasConstants = true;
}
@Override
public void addConstantMembers(TypeElement typeElement, Collection<VariableElement> fields,
Content target) {
currentTypeElement = typeElement;
//generate links backward only to public classes.
Content classLink = (utils.isPublic(typeElement) || utils.isProtected(typeElement)) ?
getLink(new HtmlLinkInfo(configuration,
HtmlLinkInfo.Kind.SHOW_TYPE_PARAMS_IN_LABEL, typeElement)) :
Text.of(utils.getFullyQualifiedName(typeElement));
PackageElement enclosingPackage = utils.containingPackage(typeElement);
Content caption = new ContentBuilder();
if (!enclosingPackage.isUnnamed()) {
caption.add(enclosingPackage.getQualifiedName());
caption.add(".");
}
caption.add(classLink);
var table = new Table<Void>(HtmlStyle.summaryTable)
.setCaption(caption)
.setHeader(constantsTableHeader)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast);
for (VariableElement field : fields) {
table.addRow(getTypeColumn(field), getNameColumn(field), getValue(field));
}
target.add(HtmlTree.LI(table));
}
/**
* Get the type column for the constant summary table row.
*
* @param member the field to be documented.
* @return the type column of the constant table row
*/
private Content getTypeColumn(VariableElement member) {
Content typeContent = new ContentBuilder();
var code = new HtmlTree(TagName.CODE)
.setId(htmlIds.forMember(currentTypeElement, member));
for (Modifier mod : member.getModifiers()) {
code.add(Text.of(mod.toString()))
.add(Entity.NO_BREAK_SPACE);
}
Content type = getLink(new HtmlLinkInfo(configuration,
HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS, member.asType()));
code.add(type);
typeContent.add(code);
return typeContent;
}
/**
* Get the name column for the constant summary table row.
*
* @param member the field to be documented.
* @return the name column of the constant table row
*/
private Content getNameColumn(VariableElement member) {
Content nameContent = getDocLink(HtmlLinkInfo.Kind.PLAIN,
member, member.getSimpleName());
return HtmlTree.CODE(nameContent);
}
/**
* Get the value column for the constant summary table row.
*
* @param member the field to be documented.
* @return the value column of the constant table row
*/
private Content getValue(VariableElement member) {
String value = utils.constantValueExpression(member);
return HtmlTree.CODE(Text.of(value));
}
@Override
public void addConstantSummaries(Content content) {
bodyContents.addMainContent(content);
}
@Override
public void addFooter() {
bodyContents.setFooter(getFooter());
}
@Override
public void printDocument(Content content) throws DocFileIOException {
content.add(bodyContents);
printHtmlDocument(null, "summary of constants", content);
if (hasConstants && configuration.mainIndex != null) {
configuration.mainIndex.add(IndexItem.of(IndexItem.Category.TAGS,
resources.getText("doclet.Constants_Summary"), path));
}
}
}

@ -39,19 +39,20 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.ConstructorWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
import static jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable.Kind.CONSTRUCTORS;
/** /**
* Writes constructor documentation. * Writes constructor documentation.
*/ */
public class ConstructorWriterImpl extends AbstractExecutableMemberWriter public class ConstructorWriter extends AbstractExecutableMemberWriter {
implements ConstructorWriter, MemberSummaryWriter {
/**
* The current constructor that is being documented at this point in time.
*/
private ExecutableElement currentConstructor;
private boolean foundNonPubConstructor = false; private boolean foundNonPubConstructor = false;
@ -59,14 +60,12 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
* Construct a new ConstructorWriterImpl. * Construct a new ConstructorWriterImpl.
* *
* @param writer The writer for the class that the constructors belong to. * @param writer The writer for the class that the constructors belong to.
* @param typeElement the class being documented.
*/ */
public ConstructorWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { public ConstructorWriter(ClassWriter writer) {
super(writer, typeElement); super(writer, writer.getTypeElement());
VisibleMemberTable vmt = configuration.getVisibleMemberTable(typeElement);
List<? extends Element> constructors = vmt.getVisibleMembers(CONSTRUCTORS);
// the following must be done before the summary table is generated
var constructors = getVisibleMembers(VisibleMemberTable.Kind.CONSTRUCTORS);
for (Element constructor : constructors) { for (Element constructor : constructors) {
if (utils.isProtected(constructor) || utils.isPrivate(constructor)) { if (utils.isProtected(constructor) || utils.isPrivate(constructor)) {
setFoundNonPubConstructor(true); setFoundNonPubConstructor(true);
@ -79,10 +78,96 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
* *
* @param writer The writer for the class that the constructors belong to. * @param writer The writer for the class that the constructors belong to.
*/ */
public ConstructorWriterImpl(SubWriterHolderWriter writer) { public ConstructorWriter(SubWriterHolderWriter writer) {
super(writer); super(writer);
} }
public void build(Content target) throws DocletException {
buildConstructorDoc(target);
}
/**
* Build the constructor documentation.
*
* @param target the content to which the documentation will be added
*/
protected void buildConstructorDoc(Content target) {
var constructors = getVisibleMembers(VisibleMemberTable.Kind.CONSTRUCTORS);
if (!constructors.isEmpty()) {
for (Element constructor : constructors) {
if (utils.isProtected(constructor) || utils.isPrivate(constructor)) {
setFoundNonPubConstructor(true);
}
}
Content constructorDetailsHeader = getConstructorDetailsHeader(target);
Content memberList = getMemberList();
for (Element constructor : constructors) {
currentConstructor = (ExecutableElement)constructor;
Content constructorContent = getConstructorHeaderContent(currentConstructor);
buildSignature(constructorContent);
buildDeprecationInfo(constructorContent);
buildPreviewInfo(constructorContent);
buildConstructorComments(constructorContent);
buildTagInfo(constructorContent);
memberList.add(getMemberListItem(constructorContent));
}
Content constructorDetails = getConstructorDetails(constructorDetailsHeader, memberList);
target.add(constructorDetails);
}
}
/**
* Build the signature.
*
* @param constructorContent the content to which the documentation will be added
*/
protected void buildSignature(Content constructorContent) {
constructorContent.add(getSignature(currentConstructor));
}
/**
* Build the deprecation information.
*
* @param constructorContent the content to which the documentation will be added
*/
protected void buildDeprecationInfo(Content constructorContent) {
addDeprecated(currentConstructor, constructorContent);
}
/**
* Build the preview information.
*
* @param constructorContent the content to which the documentation will be added
*/
protected void buildPreviewInfo(Content constructorContent) {
addPreview(currentConstructor, constructorContent);
}
/**
* Build the comments for the constructor. Do nothing if
* {@link BaseOptions#noComment()} is set to true.
*
* @param constructorContent the content to which the documentation will be added
*/
protected void buildConstructorComments(Content constructorContent) {
if (!options.noComment()) {
addComments(currentConstructor, constructorContent);
}
}
/**
* Build the tag information.
*
* @param constructorContent the content to which the documentation will be added
*/
protected void buildTagInfo(Content constructorContent) {
addTags(currentConstructor, constructorContent);
}
@Override @Override
public Content getMemberSummaryHeader(TypeElement typeElement, public Content getMemberSummaryHeader(TypeElement typeElement,
Content content) { Content content) {
@ -98,8 +183,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
HtmlIds.CONSTRUCTOR_SUMMARY, summariesList, content); HtmlIds.CONSTRUCTOR_SUMMARY, summariesList, content);
} }
@Override protected Content getConstructorDetailsHeader(Content content) {
public Content getConstructorDetailsHeader(Content content) {
content.add(MarkerComments.START_OF_CONSTRUCTOR_DETAILS); content.add(MarkerComments.START_OF_CONSTRUCTOR_DETAILS);
Content constructorDetails = new ContentBuilder(); Content constructorDetails = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING,
@ -108,8 +192,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
return constructorDetails; return constructorDetails;
} }
@Override protected Content getConstructorHeaderContent(ExecutableElement constructor) {
public Content getConstructorHeaderContent(ExecutableElement constructor) {
Content content = new ContentBuilder(); Content content = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING,
Text.of(name(constructor))); Text.of(name(constructor)));
@ -122,8 +205,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
.setId(htmlIds.forMember(constructor)); .setId(htmlIds.forMember(constructor));
} }
@Override protected Content getSignature(ExecutableElement constructor) {
public Content getSignature(ExecutableElement constructor) {
return new Signatures.MemberSignature(constructor, this) return new Signatures.MemberSignature(constructor, this)
.setParameters(getParameters(constructor, true)) .setParameters(getParameters(constructor, true))
.setExceptions(getExceptions(constructor)) .setExceptions(getExceptions(constructor))
@ -131,28 +213,23 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
.toContent(); .toContent();
} }
@Override protected void addDeprecated(ExecutableElement constructor, Content constructorContent) {
public void addDeprecated(ExecutableElement constructor, Content constructorContent) {
addDeprecatedInfo(constructor, constructorContent); addDeprecatedInfo(constructor, constructorContent);
} }
@Override protected void addPreview(ExecutableElement constructor, Content content) {
public void addPreview(ExecutableElement constructor, Content content) {
addPreviewInfo(constructor, content); addPreviewInfo(constructor, content);
} }
@Override protected void addComments(ExecutableElement constructor, Content constructorContent) {
public void addComments(ExecutableElement constructor, Content constructorContent) {
addComment(constructor, constructorContent); addComment(constructor, constructorContent);
} }
@Override protected void addTags(ExecutableElement constructor, Content constructorContent) {
public void addTags(ExecutableElement constructor, Content constructorContent) {
writer.addTagsInfo(constructor, constructorContent); writer.addTagsInfo(constructor, constructorContent);
} }
@Override protected Content getConstructorDetails(Content memberDetailsHeader, Content memberDetails) {
public Content getConstructorDetails(Content memberDetailsHeader, Content memberDetails) {
return writer.getDetailsListItem( return writer.getDetailsListItem(
HtmlTree.SECTION(HtmlStyle.constructorDetails) HtmlTree.SECTION(HtmlStyle.constructorDetails)
.setId(HtmlIds.CONSTRUCTOR_DETAIL) .setId(HtmlIds.CONSTRUCTOR_DETAIL)
@ -160,8 +237,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
.add(memberDetails)); .add(memberDetails));
} }
@Override protected void setFoundNonPubConstructor(boolean foundNonPubConstructor) {
public void setFoundNonPubConstructor(boolean foundNonPubConstructor) {
this.foundNonPubConstructor = foundNonPubConstructor; this.foundNonPubConstructor = foundNonPubConstructor;
} }
@ -222,8 +298,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
} }
} }
@Override protected Content getMemberHeader(){
public Content getMemberHeader(){
return writer.getMemberHeader(); return writer.getMemberHeader();
} }
} }

@ -23,7 +23,7 @@
* questions. * questions.
*/ */
package jdk.javadoc.internal.doclets.toolkit; package jdk.javadoc.internal.doclets.formats.html;
import java.io.IOException; import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;

@ -34,7 +34,6 @@ import java.util.regex.Pattern;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.Entity; import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
@ -393,7 +392,7 @@ public class Contents {
*/ */
public Content getContent(String key, Object o0, Object o1, Object o2) { public Content getContent(String key, Object o0, Object o1, Object o2) {
Content c = new ContentBuilder(); Content c = new ContentBuilder();
Pattern p = Pattern.compile("\\{([012])\\}"); Pattern p = Pattern.compile("\\{([012])}");
String text = resources.getText(key); // TODO: cache String text = resources.getText(key); // TODO: cache
Matcher m = p.matcher(text); Matcher m = p.matcher(text);
int start = 0; int start = 0;

@ -36,7 +36,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder; import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -31,9 +31,7 @@ import com.sun.source.doctree.StartElementTree;
import com.sun.source.util.DocTreeFactory; import com.sun.source.util.DocTreeFactory;
import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents; import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.DocFileElement; import jdk.javadoc.internal.doclets.toolkit.DocFileElement;
import jdk.javadoc.internal.doclets.toolkit.DocFilesHandler;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
@ -54,7 +52,7 @@ import java.util.List;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
public class DocFilesHandlerImpl implements DocFilesHandler { public class DocFilesHandler {
public final Element element; public final Element element;
public final Location location; public final Location location;
@ -69,7 +67,7 @@ public class DocFilesHandlerImpl implements DocFilesHandler {
* @param element the containing element of the doc-files. * @param element the containing element of the doc-files.
* *
*/ */
public DocFilesHandlerImpl(HtmlConfiguration configuration, Element element) { public DocFilesHandler(HtmlConfiguration configuration, Element element) {
this.configuration = configuration; this.configuration = configuration;
this.options = configuration.getOptions(); this.options = configuration.getOptions();
this.element = element; this.element = element;
@ -102,7 +100,6 @@ public class DocFilesHandlerImpl implements DocFilesHandler {
* @throws DocFileIOException if there is a problem while copying * @throws DocFileIOException if there is a problem while copying
* the documentation files * the documentation files
*/ */
@Override
public void copyDocFiles() throws DocFileIOException { public void copyDocFiles() throws DocFileIOException {
boolean first = true; boolean first = true;
for (DocFile srcdir : DocFile.list(configuration, location, source)) { for (DocFile srcdir : DocFile.list(configuration, location, source)) {
@ -119,7 +116,6 @@ public class DocFilesHandlerImpl implements DocFilesHandler {
} }
} }
@Override
public List<DocPath> getStylesheets() throws DocFileIOException { public List<DocPath> getStylesheets() throws DocFileIOException {
var stylesheets = new ArrayList<DocPath>(); var stylesheets = new ArrayList<DocPath>();
for (DocFile srcdir : DocFile.list(configuration, location, source)) { for (DocFile srcdir : DocFile.list(configuration, location, source)) {

@ -25,7 +25,6 @@
package jdk.javadoc.internal.doclets.formats.html; package jdk.javadoc.internal.doclets.formats.html;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement; import javax.lang.model.element.VariableElement;
@ -34,24 +33,110 @@ 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
import jdk.javadoc.internal.doclets.toolkit.EnumConstantWriter; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
/** /**
* Writes enum constant documentation in HTML format. * Writes enum constant documentation in HTML format.
*/ */
public class EnumConstantWriterImpl extends AbstractMemberWriter public class EnumConstantWriter extends AbstractMemberWriter {
implements EnumConstantWriter, MemberSummaryWriter {
public EnumConstantWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { /**
super(writer, typeElement); * The current enum constant that is being documented.
*/
private VariableElement currentElement;
public EnumConstantWriter(ClassWriter classWriter) {
super(classWriter, classWriter.typeElement);
} }
public EnumConstantWriterImpl(SubWriterHolderWriter writer) { public EnumConstantWriter(SubWriterHolderWriter writer) {
super(writer); super(writer);
} }
public void build(Content target) {
buildEnumConstant(target);
}
/**
* Build the enum constant documentation.
*
* @param target the content to which the documentation will be added
*/
protected void buildEnumConstant(Content target) {
var enumConstants = getVisibleMembers(VisibleMemberTable.Kind.ENUM_CONSTANTS);
if (!enumConstants.isEmpty()) {
Content enumConstantsDetailsHeader = getEnumConstantsDetailsHeader(typeElement,
target);
Content memberList = getMemberList();
for (Element enumConstant : enumConstants) {
currentElement = (VariableElement)enumConstant;
Content enumConstantContent = getEnumConstantsHeader(currentElement,
memberList);
buildSignature(enumConstantContent);
buildDeprecationInfo(enumConstantContent);
buildPreviewInfo(enumConstantContent);
buildEnumConstantComments(enumConstantContent);
buildTagInfo(enumConstantContent);
memberList.add(getMemberListItem(enumConstantContent));
}
Content enumConstantDetails = getEnumConstantsDetails(
enumConstantsDetailsHeader, memberList);
target.add(enumConstantDetails);
}
}
/**
* Build the signature.
*
* @param target the content to which the documentation will be added
*/
protected void buildSignature(Content target) {
target.add(getSignature(currentElement));
}
/**
* Build the deprecation information.
*
* @param target the content to which the documentation will be added
*/
protected void buildDeprecationInfo(Content target) {
addDeprecated(currentElement, target);
}
/**
* Build the preview information.
*
* @param target the content to which the documentation will be added
*/
protected void buildPreviewInfo(Content target) {
addPreview(currentElement, target);
}
/**
* Build the comments for the enum constant. Do nothing if
* {@link BaseOptions#noComment()} is set to true.
*
* @param target the content to which the documentation will be added
*/
protected void buildEnumConstantComments(Content target) {
if (!options.noComment()) {
addComments(currentElement, target);
}
}
/**
* Build the tag information.
*
* @param target the content to which the documentation will be added
*/
protected void buildTagInfo(Content target) {
addTags(currentElement, target);
}
@Override @Override
public Content getMemberSummaryHeader(TypeElement typeElement, public Content getMemberSummaryHeader(TypeElement typeElement,
Content content) { Content content) {
@ -67,8 +152,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
HtmlIds.ENUM_CONSTANT_SUMMARY, summariesList, content); HtmlIds.ENUM_CONSTANT_SUMMARY, summariesList, content);
} }
@Override protected Content getEnumConstantsDetailsHeader(TypeElement typeElement,
public Content getEnumConstantsDetailsHeader(TypeElement typeElement,
Content memberDetails) { Content memberDetails) {
memberDetails.add(MarkerComments.START_OF_ENUM_CONSTANT_DETAILS); memberDetails.add(MarkerComments.START_OF_ENUM_CONSTANT_DETAILS);
var enumConstantsDetailsContent = new ContentBuilder(); var enumConstantsDetailsContent = new ContentBuilder();
@ -78,8 +162,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
return enumConstantsDetailsContent; return enumConstantsDetailsContent;
} }
@Override protected Content getEnumConstantsHeader(VariableElement enumConstant,
public Content getEnumConstantsHeader(VariableElement enumConstant,
Content enumConstantsDetails) { Content enumConstantsDetails) {
Content enumConstantsContent = new ContentBuilder(); Content enumConstantsContent = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING,
@ -89,36 +172,30 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
.setId(htmlIds.forMember(enumConstant)); .setId(htmlIds.forMember(enumConstant));
} }
@Override protected Content getSignature(VariableElement enumConstant) {
public Content getSignature(VariableElement enumConstant) {
return new Signatures.MemberSignature(enumConstant, this) return new Signatures.MemberSignature(enumConstant, this)
.setType(enumConstant.asType()) .setType(enumConstant.asType())
.setAnnotations(writer.getAnnotationInfo(enumConstant, true)) .setAnnotations(writer.getAnnotationInfo(enumConstant, true))
.toContent(); .toContent();
} }
@Override protected void addDeprecated(VariableElement enumConstant, Content content) {
public void addDeprecated(VariableElement enumConstant, Content content) {
addDeprecatedInfo(enumConstant, content); addDeprecatedInfo(enumConstant, content);
} }
@Override protected void addPreview(VariableElement enumConstant, Content content) {
public void addPreview(VariableElement enumConstant, Content content) {
addPreviewInfo(enumConstant, content); addPreviewInfo(enumConstant, content);
} }
@Override protected void addComments(VariableElement enumConstant, Content enumConstants) {
public void addComments(VariableElement enumConstant, Content enumConstants) {
addComment(enumConstant, enumConstants); addComment(enumConstant, enumConstants);
} }
@Override protected void addTags(VariableElement enumConstant, Content content) {
public void addTags(VariableElement enumConstant, Content content) {
writer.addTagsInfo(enumConstant, content); writer.addTagsInfo(enumConstant, content);
} }
@Override protected Content getEnumConstantsDetails(Content memberDetailsHeader,
public Content getEnumConstantsDetails(Content memberDetailsHeader,
Content content) { Content content) {
return writer.getDetailsListItem( return writer.getDetailsListItem(
HtmlTree.SECTION(HtmlStyle.constantDetails) HtmlTree.SECTION(HtmlStyle.constantDetails)
@ -175,8 +252,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
return writer.getDocLink(HtmlLinkInfo.Kind.SHOW_PREVIEW, member, name); return writer.getDocLink(HtmlLinkInfo.Kind.SHOW_PREVIEW, member, name);
} }
@Override protected Content getMemberHeader(){
public Content getMemberHeader(){
return writer.getMemberHeader(); return writer.getMemberHeader();
} }
} }

@ -53,7 +53,6 @@ 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.DocletElement; import jdk.javadoc.internal.doclets.toolkit.DocletElement;
import jdk.javadoc.internal.doclets.toolkit.OverviewElement; import jdk.javadoc.internal.doclets.toolkit.OverviewElement;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
@ -247,34 +246,31 @@ public class ExternalSpecsWriter extends HtmlDocletWriter {
Comparator<String> getTitleComparator() { Comparator<String> getTitleComparator() {
Collator collator = Collator.getInstance(); Collator collator = Collator.getInstance();
return new Comparator<>() { return (s1, s2) -> {
@Override int i1 = 0;
public int compare(String s1, String s2) { int i2 = 0;
int i1 = 0; while (i1 < s1.length() && i2 < s2.length()) {
int i2 = 0; int j1 = find(s1, i1, Character::isDigit);
while (i1 < s1.length() && i2 < s2.length()) { int j2 = find(s2, i2, Character::isDigit);
int j1 = find(s1, i1, Character::isDigit); int cmp = collator.compare(s1.substring(i1, j1), s2.substring(i2, j2));
int j2 = find(s2, i2, Character::isDigit); if (cmp != 0) {
int cmp = collator.compare(s1.substring(i1, j1), s2.substring(i2, j2)); return cmp;
if (cmp != 0) {
return cmp;
}
if (j1 == s1.length() || j2 == s2.length()) {
i1 = j1;
i2 = j2;
break;
}
int k1 = find(s1, j1, ch -> !Character.isDigit(ch));
int k2 = find(s2, j2, ch -> !Character.isDigit(ch));
cmp = Integer.compare(Integer.parseInt(s1.substring(j1, k1)), Integer.parseInt(s2.substring(j2, k2)));
if (cmp != 0) {
return cmp;
}
i1 = k1;
i2 = k2;
} }
return i1 < s1.length() ? 1 : i2 < s2.length() ? -1 : 0; if (j1 == s1.length() || j2 == s2.length()) {
i1 = j1;
i2 = j2;
break;
}
int k1 = find(s1, j1, ch -> !Character.isDigit(ch));
int k2 = find(s2, j2, ch -> !Character.isDigit(ch));
cmp = Integer.compare(Integer.parseInt(s1.substring(j1, k1)), Integer.parseInt(s2.substring(j2, k2)));
if (cmp != 0) {
return cmp;
}
i1 = k1;
i2 = k2;
} }
return i1 < s1.length() ? 1 : i2 < s2.length() ? -1 : 0;
}; };
} }
@ -292,8 +288,7 @@ public class ExternalSpecsWriter extends HtmlDocletWriter {
if (element instanceof OverviewElement) { if (element instanceof OverviewElement) {
return links.createLink(pathToRoot.resolve(i.getUrl()), return links.createLink(pathToRoot.resolve(i.getUrl()),
resources.getText("doclet.Overview")); resources.getText("doclet.Overview"));
} else if (element instanceof DocletElement) { } else if (element instanceof DocletElement e) {
DocletElement e = (DocletElement) element;
// Implementations of DocletElement do not override equals and // Implementations of DocletElement do not override equals and
// hashCode; putting instances of DocletElement in a map is not // hashCode; putting instances of DocletElement in a map is not
// incorrect, but might well be inefficient // incorrect, but might well be inefficient

@ -37,24 +37,115 @@ import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
import jdk.javadoc.internal.doclets.toolkit.FieldWriter; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/** /**
* Writes field documentation in HTML format. * Writes field documentation in HTML format.
*/ */
public class FieldWriterImpl extends AbstractMemberWriter public class FieldWriter extends AbstractMemberWriter {
implements FieldWriter, MemberSummaryWriter {
public FieldWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { /**
* The index of the current field that is being documented at this point
* in time.
*/
private VariableElement currentElement;
public FieldWriter(ClassWriter writer) {
super(writer, writer.typeElement);
}
public FieldWriter(SubWriterHolderWriter writer, TypeElement typeElement) {
super(writer, typeElement); super(writer, typeElement);
} }
public FieldWriterImpl(SubWriterHolderWriter writer) { // used in ClassUseWriter and SummaryUseWriter
public FieldWriter(SubWriterHolderWriter writer) {
super(writer); super(writer);
} }
public void build(Content target) throws DocletException {
buildFieldDoc(target);
}
/**
* Build the field documentation.
*
* @param target the content to which the documentation will be added
*/
protected void buildFieldDoc(Content target) {
var fields = getVisibleMembers(VisibleMemberTable.Kind.FIELDS);
if (!fields.isEmpty()) {
Content fieldDetailsHeader = getFieldDetailsHeader(target);
Content memberList = getMemberList();
for (Element element : fields) {
currentElement = (VariableElement)element;
Content fieldContent = getFieldHeaderContent(currentElement);
buildSignature(fieldContent);
buildDeprecationInfo(fieldContent);
buildPreviewInfo(fieldContent);
buildFieldComments(fieldContent);
buildTagInfo(fieldContent);
memberList.add(getMemberListItem(fieldContent));
}
Content fieldDetails = getFieldDetails(fieldDetailsHeader, memberList);
target.add(fieldDetails);
}
}
/**
* Build the signature.
*
* @param fieldContent the content to which the documentation will be added
*/
protected void buildSignature(Content fieldContent) {
fieldContent.add(getSignature(currentElement));
}
/**
* Build the deprecation information.
*
* @param fieldContent the content to which the documentation will be added
*/
protected void buildDeprecationInfo(Content fieldContent) {
addDeprecated(currentElement, fieldContent);
}
/**
* Build the preview information.
*
* @param fieldContent the content to which the documentation will be added
*/
protected void buildPreviewInfo(Content fieldContent) {
addPreview(currentElement, fieldContent);
}
/**
* Build the comments for the field. Do nothing if
* {@link BaseOptions#noComment()} is set to true.
*
* @param fieldContent the content to which the documentation will be added
*/
protected void buildFieldComments(Content fieldContent) {
if (!options.noComment()) {
addComments(currentElement, fieldContent);
}
}
/**
* Build the tag information.
*
* @param fieldContent the content to which the documentation will be added
*/
protected void buildTagInfo(Content fieldContent) {
addTags(currentElement, fieldContent);
}
@Override @Override
public Content getMemberSummaryHeader(TypeElement typeElement, public Content getMemberSummaryHeader(TypeElement typeElement,
Content content) { Content content) {
@ -70,8 +161,7 @@ public class FieldWriterImpl extends AbstractMemberWriter
HtmlIds.FIELD_SUMMARY, summariesList, content); HtmlIds.FIELD_SUMMARY, summariesList, content);
} }
@Override protected Content getFieldDetailsHeader(Content content) {
public Content getFieldDetailsHeader(Content content) {
content.add(MarkerComments.START_OF_FIELD_DETAILS); content.add(MarkerComments.START_OF_FIELD_DETAILS);
Content fieldDetailsContent = new ContentBuilder(); Content fieldDetailsContent = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING,
@ -80,8 +170,7 @@ public class FieldWriterImpl extends AbstractMemberWriter
return fieldDetailsContent; return fieldDetailsContent;
} }
@Override protected Content getFieldHeaderContent(VariableElement field) {
public Content getFieldHeaderContent(VariableElement field) {
Content content = new ContentBuilder(); Content content = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING,
Text.of(name(field))); Text.of(name(field)));
@ -90,38 +179,32 @@ public class FieldWriterImpl extends AbstractMemberWriter
.setId(htmlIds.forMember(field)); .setId(htmlIds.forMember(field));
} }
@Override protected Content getSignature(VariableElement field) {
public Content getSignature(VariableElement field) {
return new Signatures.MemberSignature(field, this) return new Signatures.MemberSignature(field, this)
.setType(utils.asInstantiatedFieldType(typeElement, field)) .setType(utils.asInstantiatedFieldType(typeElement, field))
.setAnnotations(writer.getAnnotationInfo(field, true)) .setAnnotations(writer.getAnnotationInfo(field, true))
.toContent(); .toContent();
} }
@Override protected void addDeprecated(VariableElement field, Content fieldContent) {
public void addDeprecated(VariableElement field, Content fieldContent) {
addDeprecatedInfo(field, fieldContent); addDeprecatedInfo(field, fieldContent);
} }
@Override protected void addPreview(VariableElement field, Content content) {
public void addPreview(VariableElement field, Content content) {
addPreviewInfo(field, content); addPreviewInfo(field, content);
} }
@Override protected void addComments(VariableElement field, Content fieldContent) {
public void addComments(VariableElement field, Content fieldContent) {
if (!utils.getFullBody(field).isEmpty()) { if (!utils.getFullBody(field).isEmpty()) {
writer.addInlineComment(field, fieldContent); writer.addInlineComment(field, fieldContent);
} }
} }
@Override protected void addTags(VariableElement field, Content fieldContent) {
public void addTags(VariableElement field, Content fieldContent) {
writer.addTagsInfo(field, fieldContent); writer.addTagsInfo(field, fieldContent);
} }
@Override protected Content getFieldDetails(Content memberDetailsHeaderContent, Content memberContent) {
public Content getFieldDetails(Content memberDetailsHeaderContent, Content memberContent) {
return writer.getDetailsListItem( return writer.getDetailsListItem(
HtmlTree.SECTION(HtmlStyle.fieldDetails) HtmlTree.SECTION(HtmlStyle.fieldDetails)
.setId(HtmlIds.FIELD_DETAIL) .setId(HtmlIds.FIELD_DETAIL)
@ -201,8 +284,7 @@ public class FieldWriterImpl extends AbstractMemberWriter
return writer.getDocLink(HtmlLinkInfo.Kind.SHOW_PREVIEW, member, name); return writer.getDocLink(HtmlLinkInfo.Kind.SHOW_PREVIEW, member, name);
} }
@Override protected Content getMemberHeader(){
public Content getMemberHeader(){
return writer.getMemberHeader(); return writer.getMemberHeader();
} }
} }

@ -36,7 +36,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocLink; import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -34,6 +34,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -61,7 +62,6 @@ import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
import jdk.javadoc.internal.doclets.toolkit.DocletException; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.Messages;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.WriterFactory;
import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder; import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
@ -183,6 +183,11 @@ public class HtmlConfiguration extends BaseConfiguration {
*/ */
private ZonedDateTime buildDate; private ZonedDateTime buildDate;
/**
* The set of packages for which we have copied the doc files.
*/
private Set<PackageElement> containingPackagesSeen;
/** /**
* Constructs the full configuration needed by the doclet, including * Constructs the full configuration needed by the doclet, including
* the format-specific part, defined in this class, and the format-independent * the format-specific part, defined in this class, and the format-independent
@ -220,6 +225,7 @@ public class HtmlConfiguration extends BaseConfiguration {
messages = new Messages(this, msgResources); messages = new Messages(this, msgResources);
options = new HtmlOptions(this); options = new HtmlOptions(this);
containingPackagesSeen = new HashSet<>();
Runtime.Version v; Runtime.Version v;
try { try {
@ -271,6 +277,15 @@ public class HtmlConfiguration extends BaseConfiguration {
return options; return options;
} }
/**
* {@return the packages for which we have copied the doc files}
*
* @see {@link ClassWriter#copyDocFiles()}
*/
public Set<PackageElement> getContainingPackagesSeen() {
return containingPackagesSeen;
}
@Override @Override
public boolean finishOptionSettings() { public boolean finishOptionSettings() {
if (!options.validateOptions()) { if (!options.validateOptions()) {
@ -365,9 +380,9 @@ public class HtmlConfiguration extends BaseConfiguration {
} }
} }
@Override
public WriterFactory getWriterFactory() { public WriterFactory getWriterFactory() {
return new WriterFactoryImpl(this); // TODO: this is called many times: why not create and use a single instance?
return new WriterFactory(this);
} }
@Override @Override

@ -51,8 +51,6 @@ import jdk.javadoc.doclet.Reporter;
import jdk.javadoc.internal.doclets.toolkit.AbstractDoclet; import jdk.javadoc.internal.doclets.toolkit.AbstractDoclet;
import jdk.javadoc.internal.doclets.toolkit.DocletException; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.Messages;
import jdk.javadoc.internal.doclets.toolkit.builders.AbstractBuilder;
import jdk.javadoc.internal.doclets.toolkit.builders.BuilderFactory;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder; import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
@ -213,7 +211,11 @@ public class HtmlDoclet extends AbstractDoclet {
protected void generateOtherFiles(ClassTree classTree) protected void generateOtherFiles(ClassTree classTree)
throws DocletException { throws DocletException {
super.generateOtherFiles(classTree); super.generateOtherFiles(classTree);
HtmlOptions options = configuration.getOptions();
new ConstantsSummaryWriter(configuration).build();
new SerializedFormWriter(configuration).build();
var options = configuration.getOptions();
if (options.linkSource()) { if (options.linkSource()) {
SourceToHTMLConverter.convertRoot(configuration, DocPaths.SOURCE_OUTPUT); SourceToHTMLConverter.convertRoot(configuration, DocPaths.SOURCE_OUTPUT);
} }
@ -323,7 +325,7 @@ public class HtmlDoclet extends AbstractDoclet {
protected void generateFiles() throws DocletException { protected void generateFiles() throws DocletException {
super.generateFiles(); super.generateFiles();
if (configuration.tagletManager != null) { // may be null, if no files generated, perhaps because of errros if (configuration.tagletManager != null) { // may be null, if no files generated, perhaps because of errors
configuration.tagletManager.printReport(); configuration.tagletManager.printReport();
} }
@ -388,13 +390,12 @@ public class HtmlDoclet extends AbstractDoclet {
@Override // defined by AbstractDoclet @Override // defined by AbstractDoclet
protected void generateClassFiles(SortedSet<TypeElement> typeElems, ClassTree classTree) protected void generateClassFiles(SortedSet<TypeElement> typeElems, ClassTree classTree)
throws DocletException { throws DocletException {
BuilderFactory f = configuration.getBuilderFactory();
for (TypeElement te : typeElems) { for (TypeElement te : typeElems) {
if (utils.hasHiddenTag(te) || if (utils.hasHiddenTag(te) ||
!(configuration.isGeneratedDoc(te) && utils.isIncluded(te))) { !(configuration.isGeneratedDoc(te) && utils.isIncluded(te))) {
continue; continue;
} }
f.getClassBuilder(te, classTree).build(); new ClassWriter(configuration, te, classTree).build();
} }
} }
@ -403,9 +404,7 @@ public class HtmlDoclet extends AbstractDoclet {
if (configuration.showModules) { if (configuration.showModules) {
List<ModuleElement> mdles = new ArrayList<>(configuration.modulePackages.keySet()); List<ModuleElement> mdles = new ArrayList<>(configuration.modulePackages.keySet());
for (ModuleElement mdle : mdles) { for (ModuleElement mdle : mdles) {
AbstractBuilder moduleSummaryBuilder = new ModuleWriter(configuration, mdle).build();
configuration.getBuilderFactory().getModuleSummaryBuilder(mdle);
moduleSummaryBuilder.build();
} }
} }
} }
@ -420,9 +419,7 @@ public class HtmlDoclet extends AbstractDoclet {
// deprecated, do not generate the package-summary.html, package-frame.html // deprecated, do not generate the package-summary.html, package-frame.html
// and package-tree.html pages for that package. // and package-tree.html pages for that package.
if (!(options.noDeprecated() && utils.isDeprecated(pkg))) { if (!(options.noDeprecated() && utils.isDeprecated(pkg))) {
AbstractBuilder packageSummaryBuilder = new PackageWriter(configuration, pkg).build();
configuration.getBuilderFactory().getPackageSummaryBuilder(pkg);
packageSummaryBuilder.build();
if (options.createTree()) { if (options.createTree()) {
PackageTreeWriter.generate(configuration, pkg, options.noDeprecated()); PackageTreeWriter.generate(configuration, pkg, options.noDeprecated());
} }

@ -92,7 +92,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.formats.html.taglets.Taglet; import jdk.javadoc.internal.doclets.formats.html.taglets.Taglet;
import jdk.javadoc.internal.doclets.formats.html.taglets.TagletWriter; import jdk.javadoc.internal.doclets.formats.html.taglets.TagletWriter;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.Messages;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
@ -199,6 +198,16 @@ public class HtmlDocletWriter {
* @param path the file to be generated. * @param path the file to be generated.
*/ */
public HtmlDocletWriter(HtmlConfiguration configuration, DocPath path) { public HtmlDocletWriter(HtmlConfiguration configuration, DocPath path) {
this(configuration, path, true);
}
/**
* Creates an {@code HtmlDocletWriter}.
*
* @param configuration the configuration for this doclet
* @param path the file to be generated.
* @param generating whether to write a "Geneterating ..." message to the console
*/
public HtmlDocletWriter(HtmlConfiguration configuration, DocPath path, boolean generating) {
this.configuration = configuration; this.configuration = configuration;
this.options = configuration.getOptions(); this.options = configuration.getOptions();
this.contents = configuration.getContents(); this.contents = configuration.getContents();
@ -214,8 +223,17 @@ public class HtmlDocletWriter {
this.docPaths = configuration.docPaths; this.docPaths = configuration.docPaths;
this.mainBodyScript = new Script(); this.mainBodyScript = new Script();
if (generating) {
writeGenerating();
}
}
/**
* Writes a "Generating _file_" message to the console
*/
protected final void writeGenerating() {
messages.notice("doclet.Generating_0", messages.notice("doclet.Generating_0",
DocFile.createFileForOutput(configuration, path).getPath()); DocFile.createFileForOutput(configuration, path).getPath());
} }
/** /**
@ -300,10 +318,10 @@ public class HtmlDocletWriter {
// for these methods: // for these methods:
// * ForkJoinPool.execute(java.lang.Runnable) // * ForkJoinPool.execute(java.lang.Runnable)
// This is a long-standing bug, which must be fixed separately: JDK-8302316 // This is a long-standing bug, which must be fixed separately: JDK-8302316
MethodWriterImpl.addImplementsInfo(this, method, implementedMethods, dl); MethodWriter.addImplementsInfo(this, method, implementedMethods, dl);
} }
if (overrideInfo != null) { if (overrideInfo != null) {
MethodWriterImpl.addOverridden(this, MethodWriter.addOverridden(this,
overrideInfo.overriddenMethodOwner(), overrideInfo.overriddenMethodOwner(),
overrideInfo.overriddenMethod(), overrideInfo.overriddenMethod(),
dl); dl);
@ -1476,9 +1494,9 @@ public class HtmlDocletWriter {
// in their respective writers, but other uses of the method are only interested in TypeElements. // in their respective writers, but other uses of the method are only interested in TypeElements.
Element currentPageElement = getCurrentPageElement(); Element currentPageElement = getCurrentPageElement();
if (currentPageElement == null) { if (currentPageElement == null) {
if (this instanceof PackageWriterImpl packageWriter) { if (this instanceof PackageWriter packageWriter) {
currentPageElement = packageWriter.packageElement; currentPageElement = packageWriter.packageElement;
} else if (this instanceof ModuleWriterImpl moduleWriter) { } else if (this instanceof ModuleWriter moduleWriter) {
currentPageElement = moduleWriter.mdle; currentPageElement = moduleWriter.mdle;
} }
} }
@ -1511,7 +1529,7 @@ public class HtmlDocletWriter {
* element of this writer. * element of this writer.
*/ */
private boolean inSamePackage(Element element) { private boolean inSamePackage(Element element) {
Element currentPageElement = (this instanceof PackageWriterImpl packageWriter) Element currentPageElement = (this instanceof PackageWriter packageWriter)
? packageWriter.packageElement : getCurrentPageElement(); ? packageWriter.packageElement : getCurrentPageElement();
return currentPageElement != null && !utils.isModule(element) return currentPageElement != null && !utils.isModule(element)
&& Objects.equals(utils.containingPackage(currentPageElement), && Objects.equals(utils.containingPackage(currentPageElement),
@ -2018,8 +2036,7 @@ public class HtmlDocletWriter {
private List<DocPath> getStylesheets(Element element) throws DocFileIOException { private List<DocPath> getStylesheets(Element element) throws DocFileIOException {
List<DocPath> localStylesheets = configuration.localStylesheetMap.get(element); List<DocPath> localStylesheets = configuration.localStylesheetMap.get(element);
if (localStylesheets == null) { if (localStylesheets == null) {
DocFilesHandlerImpl docFilesHandler = (DocFilesHandlerImpl)configuration DocFilesHandler docFilesHandler = configuration.getWriterFactory().getDocFilesHandler(element);
.getWriterFactory().getDocFilesHandler(element);
localStylesheets = docFilesHandler.getStylesheets(); localStylesheets = docFilesHandler.getStylesheets();
configuration.localStylesheetMap.put(element, localStylesheets); configuration.localStylesheetMap.put(element, localStylesheets);
} }

@ -46,7 +46,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -35,7 +35,6 @@ 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;
@ -77,7 +76,7 @@ public class HtmlLinkInfo {
/** /**
* Link with optional type parameters and bounds rendered as separate links. * Link with optional type parameters and bounds rendered as separate links.
*/ */
LINK_TYPE_PARAMS_AND_BOUNDS; LINK_TYPE_PARAMS_AND_BOUNDS
} }
private final HtmlConfiguration configuration; private final HtmlConfiguration configuration;

@ -36,7 +36,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Script; import jdk.javadoc.internal.doclets.formats.html.markup.Script;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -46,7 +46,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -26,6 +26,7 @@
package jdk.javadoc.internal.doclets.formats.html; package jdk.javadoc.internal.doclets.formats.html;
import java.util.Collection; import java.util.Collection;
import java.util.Optional;
import java.util.SortedSet; import java.util.SortedSet;
import java.util.TreeSet; import java.util.TreeSet;
@ -40,25 +41,39 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.MethodWriter; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/** /**
* Writes method documentation in HTML format. * Writes method documentation in HTML format.
*/ */
public class MethodWriterImpl extends AbstractExecutableMemberWriter public class MethodWriter extends AbstractExecutableMemberWriter {
implements MethodWriter, MemberSummaryWriter {
/**
* The index of the current field that is being documented at this point
* in time.
*/
private ExecutableElement currentMethod;
/**
* Construct a new MethodWriterImpl.
*
* @param writer the writer for the class that the methods belong to.\
*/
public MethodWriter(ClassWriter writer) {
super(writer, writer.typeElement);
}
/** /**
* Construct a new MethodWriterImpl. * Construct a new MethodWriterImpl.
* *
* @param writer the writer for the class that the methods belong to. * @param writer the writer for the class that the methods belong to.
* @param typeElement the class being documented. * @param typeElement the class
*/ */
public MethodWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { public MethodWriter(SubWriterHolderWriter writer, TypeElement typeElement) {
super(writer, typeElement); super(writer, typeElement);
} }
@ -67,10 +82,97 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
* *
* @param writer The writer for the class that the methods belong to. * @param writer The writer for the class that the methods belong to.
*/ */
public MethodWriterImpl(SubWriterHolderWriter writer) { // used in ClassUseWriter and SummaryUseWriter
public MethodWriter(SubWriterHolderWriter writer) {
super(writer); super(writer);
} }
public void build(Content target) throws DocletException {
buildMethodDoc(target);
}
/**
* Build the method documentation.
*
* @param detailsList the content to which the documentation will be added
*/
protected void buildMethodDoc(Content detailsList) {
var methods = getVisibleMembers(VisibleMemberTable.Kind.METHODS);
if (!methods.isEmpty()) {
Content methodDetailsHeader = getMethodDetailsHeader(detailsList);
Content memberList = writer.getMemberList();
for (Element method : methods) {
currentMethod = (ExecutableElement)method;
Content methodContent = getMethodHeader(currentMethod);
buildSignature(methodContent);
buildDeprecationInfo(methodContent);
buildPreviewInfo(methodContent);
buildMethodComments(methodContent);
buildTagInfo(methodContent);
memberList.add(writer.getMemberListItem(methodContent));
}
Content methodDetails = getMethodDetails(methodDetailsHeader, memberList);
detailsList.add(methodDetails);
}
}
/**
* Build the signature.
*
* @param methodContent the content to which the documentation will be added
*/
protected void buildSignature(Content methodContent) {
methodContent.add(getSignature(currentMethod));
}
/**
* Build the deprecation information.
*
* @param methodContent the content to which the documentation will be added
*/
protected void buildDeprecationInfo(Content methodContent) {
addDeprecated(currentMethod, methodContent);
}
/**
* Build the preview information.
*
* @param methodContent the content to which the documentation will be added
*/
protected void buildPreviewInfo(Content methodContent) {
addPreview(currentMethod, methodContent);
}
/**
* Build the comments for the method. Do nothing if
* {@link BaseOptions#noComment()} is set to true.
*
* @param methodContent the content to which the documentation will be added
*/
protected void buildMethodComments(Content methodContent) {
if (!options.noComment()) {
assert utils.isMethod(currentMethod); // not all executables are methods
var docFinder = utils.docFinder();
Optional<ExecutableElement> r = docFinder.search(currentMethod,
m -> DocFinder.Result.fromOptional(utils.getFullBody(m).isEmpty() ? Optional.empty() : Optional.of(m))).toOptional();
ExecutableElement method = r.orElse(currentMethod);
TypeMirror containingType = method.getEnclosingElement().asType();
addComments(containingType, method, methodContent);
}
}
/**
* Build the tag information.
*
* @param methodContent the content to which the documentation will be added
*/
protected void buildTagInfo(Content methodContent) {
addTags(currentMethod, methodContent);
}
@Override @Override
public Content getMemberSummaryHeader(TypeElement typeElement, Content target) { public Content getMemberSummaryHeader(TypeElement typeElement, Content target) {
target.add(MarkerComments.START_OF_METHOD_SUMMARY); target.add(MarkerComments.START_OF_METHOD_SUMMARY);
@ -85,8 +187,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
HtmlIds.METHOD_SUMMARY, summariesList, content); HtmlIds.METHOD_SUMMARY, summariesList, content);
} }
@Override protected Content getMethodDetailsHeader(Content content) {
public Content getMethodDetailsHeader(Content content) {
content.add(MarkerComments.START_OF_METHOD_DETAILS); content.add(MarkerComments.START_OF_METHOD_DETAILS);
Content methodDetailsContent = new ContentBuilder(); Content methodDetailsContent = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING,
@ -95,8 +196,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
return methodDetailsContent; return methodDetailsContent;
} }
@Override protected Content getMethodHeader(ExecutableElement method) {
public Content getMethodHeader(ExecutableElement method) {
Content content = new ContentBuilder(); Content content = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING,
Text.of(name(method))); Text.of(name(method)));
@ -109,8 +209,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
.setId(htmlIds.forMember(method)); .setId(htmlIds.forMember(method));
} }
@Override protected Content getSignature(ExecutableElement method) {
public Content getSignature(ExecutableElement method) {
return new Signatures.MemberSignature(method, this) return new Signatures.MemberSignature(method, this)
.setTypeParameters(getTypeParameters(method)) .setTypeParameters(getTypeParameters(method))
.setReturnType(getReturnType(method)) .setReturnType(getReturnType(method))
@ -120,18 +219,15 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
.toContent(); .toContent();
} }
@Override protected void addDeprecated(ExecutableElement method, Content methodContent) {
public void addDeprecated(ExecutableElement method, Content methodContent) {
addDeprecatedInfo(method, methodContent); addDeprecatedInfo(method, methodContent);
} }
@Override protected void addPreview(ExecutableElement method, Content content) {
public void addPreview(ExecutableElement method, Content content) {
addPreviewInfo(method, content); addPreviewInfo(method, content);
} }
@Override protected void addComments(TypeMirror holderType, ExecutableElement method, Content methodContent) {
public void addComments(TypeMirror holderType, ExecutableElement method, Content methodContent) {
TypeElement holder = utils.asTypeElement(holderType); TypeElement holder = utils.asTypeElement(holderType);
if (!utils.getFullBody(method).isEmpty()) { if (!utils.getFullBody(method).isEmpty()) {
if (holder.equals(typeElement) || if (holder.equals(typeElement) ||
@ -160,13 +256,11 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
} }
} }
@Override protected void addTags(ExecutableElement method, Content methodContent) {
public void addTags(ExecutableElement method, Content methodContent) {
writer.addTagsInfo(method, methodContent); writer.addTagsInfo(method, methodContent);
} }
@Override protected Content getMethodDetails(Content methodDetailsHeader, Content methodDetails) {
public Content getMethodDetails(Content methodDetailsHeader, Content methodDetails) {
Content c = new ContentBuilder(methodDetailsHeader, methodDetails); Content c = new ContentBuilder(methodDetailsHeader, methodDetails);
return getMember(HtmlTree.SECTION(HtmlStyle.methodDetails, c) return getMember(HtmlTree.SECTION(HtmlStyle.methodDetails, c)
.setId(HtmlIds.METHOD_DETAIL)); .setId(HtmlIds.METHOD_DETAIL));
@ -264,15 +358,9 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
Contents contents = writer.contents; Contents contents = writer.contents;
Content label; Content label;
HtmlLinkInfo.Kind context; HtmlLinkInfo.Kind context;
if (utils.isAbstract(holder) && utils.isAbstract(method)) { // Abstract method is implemented from abstract class, not overridden
//Abstract method is implemented from abstract class, label = utils.isAbstract(holder) && utils.isAbstract(method) ? contents.specifiedByLabel : contents.overridesLabel;
//not overridden context = HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS;
label = contents.specifiedByLabel;
context = HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS;
} else {
label = contents.overridesLabel;
context = HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS;
}
dl.add(HtmlTree.DT(label)); dl.add(HtmlTree.DT(label));
Content overriddenTypeLink = Content overriddenTypeLink =
writer.getLink(new HtmlLinkInfo(writer.configuration, context, overriddenType)); writer.getLink(new HtmlLinkInfo(writer.configuration, context, overriddenType));
@ -347,8 +435,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
return new ContentBuilder(); return new ContentBuilder();
} }
@Override protected Content getMemberHeader(){
public Content getMemberHeader(){
return writer.getMemberHeader(); return writer.getMemberHeader();
} }
} }

@ -34,7 +34,6 @@ import javax.lang.model.element.ModuleElement;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -50,8 +50,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.ModuleSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
@ -60,7 +59,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
* required modules, packages and service types for the module. A click on any of the links will update * required modules, packages and service types for the module. A click on any of the links will update
* the frame with the clicked element page. * the frame with the clicked element page.
*/ */
public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryWriter { public class ModuleWriter extends HtmlDocletWriter {
/** /**
* The module being documented. * The module being documented.
@ -91,7 +90,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
* A package that is neither exported or opened to any modules is a concealed package. * A package that is neither exported or opened to any modules is a concealed package.
* An open module opens all its packages to all modules. * An open module opens all its packages to all modules.
*/ */
class PackageEntry { static class PackageEntry {
/** /**
* Summary of package exports: * Summary of package exports:
* If null, the package is not exported to any modules; * If null, the package is not exported to any modules;
@ -159,15 +158,107 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
* @param configuration the configuration of the doclet. * @param configuration the configuration of the doclet.
* @param mdle Module under consideration. * @param mdle Module under consideration.
*/ */
public ModuleWriterImpl(HtmlConfiguration configuration, ModuleElement mdle) { public ModuleWriter(HtmlConfiguration configuration, ModuleElement mdle) {
super(configuration, configuration.docPaths.moduleSummary(mdle)); super(configuration, configuration.docPaths.moduleSummary(mdle));
this.mdle = mdle; this.mdle = mdle;
this.moduleMode = configuration.docEnv.getModuleMode(); this.moduleMode = configuration.docEnv.getModuleMode();
computeModulesData(); computeModulesData();
} }
@Override /**
public Content getModuleHeader(String heading) { * Build the module summary.
*
* @throws DocletException if there is a problem while building the documentation
*/
public void build() throws DocletException {
buildModuleDoc();
}
/**
* Build the module documentation.
*
* @throws DocletException if there is a problem while building the documentation
*/
protected void buildModuleDoc() throws DocletException {
Content content = getModuleHeader(mdle.getQualifiedName().toString());
buildContent();
addModuleFooter();
printDocument(content);
var docFilesHandler = configuration.getWriterFactory().getDocFilesHandler(mdle);
docFilesHandler.copyDocFiles();
}
/**
* Build the content for the module doc.
*/
protected void buildContent() {
Content moduleContent = getContentHeader();
addModuleSignature(moduleContent);
buildModuleDescription(moduleContent);
buildSummary(moduleContent);
addModuleContent(moduleContent);
}
/**
* Builds the list of summary sections for this module.
*
* @param target the module content to which the summaries will
* be added
*/
protected void buildSummary(Content target) {
Content summariesList = getSummariesList();
buildPackagesSummary(summariesList);
buildModulesSummary(summariesList);
buildServicesSummary(summariesList);
target.add(getSummary(summariesList));
}
/**
* Builds the summary of the module dependencies of this module.
*
* @param summariesList the list of summaries to which the summary will be added
*/
protected void buildModulesSummary(Content summariesList) {
addModulesSummary(summariesList);
}
/**
* Builds the summary of the packages exported or opened by this module.
*
* @param summariesList the list of summaries to which the summary will be added
*/
protected void buildPackagesSummary(Content summariesList) {
addPackagesSummary(summariesList);
}
/**
* Builds the summary of the services used or provided by this module.
*
* @param summariesList the list of summaries to which the summary will be added
*/
protected void buildServicesSummary(Content summariesList) {
addServicesSummary(summariesList);
}
/**
* Builds the description for this module.
*
* @param moduleContent the content to which the module description will
* be added
*/
protected void buildModuleDescription(Content moduleContent) {
if (!options.noComment()) {
addModuleDescription(moduleContent);
}
}
protected Content getModuleHeader(String heading) {
HtmlTree body = getBody(getWindowTitle(mdle.getQualifiedName().toString())); HtmlTree body = getBody(getWindowTitle(mdle.getQualifiedName().toString()));
var div = HtmlTree.DIV(HtmlStyle.header); var div = HtmlTree.DIV(HtmlStyle.header);
Content moduleHead = new ContentBuilder(); Content moduleHead = new ContentBuilder();
@ -197,18 +288,15 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
)); ));
} }
@Override protected Content getContentHeader() {
public Content getContentHeader() {
return new ContentBuilder(); return new ContentBuilder();
} }
@Override protected Content getSummariesList() {
public Content getSummariesList() {
return HtmlTree.UL(HtmlStyle.summaryList); return HtmlTree.UL(HtmlStyle.summaryList);
} }
@Override protected Content getSummary(Content source) {
public Content getSummary(Content source) {
return HtmlTree.SECTION(HtmlStyle.summary, source); return HtmlTree.SECTION(HtmlStyle.summary, source);
} }
@ -448,8 +536,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast); .setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast);
} }
@Override protected void addModulesSummary(Content summariesList) {
public void addModulesSummary(Content summariesList) {
if (display(requires) || display(indirectModules)) { if (display(requires) || display(indirectModules)) {
TableHeader requiresTableHeader = TableHeader requiresTableHeader =
new TableHeader(contents.modifierLabel, contents.moduleLabel, new TableHeader(contents.modifierLabel, contents.moduleLabel,
@ -492,8 +579,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
} }
} }
@Override protected void addPackagesSummary(Content summariesList) {
public void addPackagesSummary(Content summariesList) {
if (display(packages) if (display(packages)
|| display(indirectPackages) || display(indirectOpenPackages)) { || display(indirectPackages) || display(indirectOpenPackages)) {
var section = HtmlTree.SECTION(HtmlStyle.packagesSummary) var section = HtmlTree.SECTION(HtmlStyle.packagesSummary)
@ -659,8 +745,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
} }
} }
@Override protected void addServicesSummary(Content summariesList) {
public void addServicesSummary(Content summariesList) {
boolean haveUses = displayServices(uses, usesTrees); boolean haveUses = displayServices(uses, usesTrees);
boolean haveProvides = displayServices(provides.keySet(), providesTrees); boolean haveProvides = displayServices(provides.keySet(), providesTrees);
@ -786,8 +871,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
} }
} }
@Override protected void addModuleDescription(Content moduleContent) {
public void addModuleDescription(Content moduleContent) {
addPreviewInfo(mdle, moduleContent); addPreviewInfo(mdle, moduleContent);
if (!utils.getFullBody(mdle).isEmpty()) { if (!utils.getFullBody(mdle).isEmpty()) {
var tree = HtmlTree.SECTION(HtmlStyle.moduleDescription) var tree = HtmlTree.SECTION(HtmlStyle.moduleDescription)
@ -800,24 +884,20 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
} }
} }
@Override protected void addModuleSignature(Content moduleContent) {
public void addModuleSignature(Content moduleContent) {
moduleContent.add(new HtmlTree(TagName.HR)); moduleContent.add(new HtmlTree(TagName.HR));
moduleContent.add(Signatures.getModuleSignature(mdle, this)); moduleContent.add(Signatures.getModuleSignature(mdle, this));
} }
@Override protected void addModuleContent(Content source) {
public void addModuleContent(Content source) {
bodyContents.addMainContent(source); bodyContents.addMainContent(source);
} }
@Override protected void addModuleFooter() {
public void addModuleFooter() {
bodyContents.setFooter(getFooter()); bodyContents.setFooter(getFooter());
} }
@Override protected void printDocument(Content content) throws DocFileIOException {
public void printDocument(Content content) throws DocFileIOException {
content.add(bodyContents); content.add(bodyContents);
printHtmlDocument(configuration.metakeywords.getMetaKeywordsForModule(mdle), printHtmlDocument(configuration.metakeywords.getMetaKeywordsForModule(mdle),
getDescription("declaration", mdle), getLocalStylesheets(mdle), content); getDescription("declaration", mdle), getLocalStylesheets(mdle), content);

@ -42,15 +42,12 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.Links;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
import jdk.javadoc.internal.doclets.toolkit.util.DocLink; import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
import static jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable.Kind.*;
/** /**
* Factory for navigation bar. * Factory for navigation bar.
* *
@ -98,7 +95,7 @@ public class Navigation {
SEARCH, SEARCH,
SYSTEM_PROPERTIES, SYSTEM_PROPERTIES,
TREE, TREE,
USE; USE
} }
/** /**

@ -36,20 +36,17 @@ import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
/** /**
* Writes nested class documentation in HTML format. * Writes nested class documentation in HTML format.
*/ */
public class NestedClassWriterImpl extends AbstractMemberWriter public class NestedClassWriter extends AbstractMemberWriter {
implements MemberSummaryWriter {
public NestedClassWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { public NestedClassWriter(SubWriterHolderWriter writer, TypeElement typeElement) {
super(writer, typeElement); super(writer, typeElement);
} }
public NestedClassWriterImpl(SubWriterHolderWriter writer) { public NestedClassWriter(SubWriterHolderWriter writer) {
super(writer); super(writer);
} }

@ -34,7 +34,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -32,7 +32,6 @@ import javax.lang.model.element.PackageElement;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -33,7 +33,6 @@ 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -41,7 +41,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.ClassUseMapper; import jdk.javadoc.internal.doclets.toolkit.util.ClassUseMapper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -48,8 +48,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.PackageSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
@ -60,8 +59,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
* frame. This will list all the Class Kinds in the package. A click on any * frame. This will list all the Class Kinds in the package. A click on any
* class-kind will update the frame with the clicked class-kind page. * class-kind will update the frame with the clicked class-kind page.
*/ */
public class PackageWriterImpl extends HtmlDocletWriter public class PackageWriter extends HtmlDocletWriter {
implements PackageSummaryWriter {
/** /**
* The package being documented. * The package being documented.
@ -94,7 +92,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
* @param configuration the configuration of the doclet. * @param configuration the configuration of the doclet.
* @param packageElement PackageElement under consideration. * @param packageElement PackageElement under consideration.
*/ */
public PackageWriterImpl(HtmlConfiguration configuration, PackageElement packageElement) { public PackageWriter(HtmlConfiguration configuration, PackageElement packageElement) {
super(configuration, super(configuration,
configuration.docPaths.forPackage(packageElement) configuration.docPaths.forPackage(packageElement)
.resolve(DocPaths.PACKAGE_SUMMARY)); .resolve(DocPaths.PACKAGE_SUMMARY));
@ -102,8 +100,107 @@ public class PackageWriterImpl extends HtmlDocletWriter
computePackageData(); computePackageData();
} }
@Override /**
public Content getPackageHeader() { * Build the package summary.
*
* @throws DocletException if there is a problem while building the documentation
*/
public void build() throws DocletException {
buildPackageDoc();
}
/**
* Build the package documentation.
*
* @throws DocletException if there is a problem while building the documentation
*/
protected void buildPackageDoc() throws DocletException {
Content content = getPackageHeader();
buildContent();
addPackageFooter();
printDocument(content);
var docFilesHandler = configuration
.getWriterFactory()
.getDocFilesHandler(packageElement);
docFilesHandler.copyDocFiles();
}
/**
* Build the content for the package.
*/
protected void buildContent() {
Content packageContent = getContentHeader();
addPackageSignature(packageContent);
buildPackageDescription(packageContent);
buildPackageTags(packageContent);
buildSummary(packageContent);
addPackageContent(packageContent);
}
/**
* Builds the list of summaries for the different kinds of types in this package.
*
* @param packageContent the package content to which the summaries will
* be added
*/
protected void buildSummary(Content packageContent) {
Content summariesList = getSummariesList();
buildRelatedPackagesSummary(summariesList);
buildAllClassesAndInterfacesSummary(summariesList);
packageContent.add(getPackageSummary(summariesList));
}
/**
* Builds a list of "nearby" packages (subpackages, superpackages, and sibling packages).
*
* @param summariesList the list of summaries to which the summary will be added
*/
protected void buildRelatedPackagesSummary(Content summariesList) {
addRelatedPackagesSummary(summariesList);
}
/**
* Builds the summary for all classes and interfaces in this package.
*
* @param summariesList the list of summaries to which the summary will be added
*/
protected void buildAllClassesAndInterfacesSummary(Content summariesList) {
addAllClassesAndInterfacesSummary(summariesList);
}
/**
* Build the description of the summary.
*
* @param packageContent the content to which the package description will
* be added
*/
protected void buildPackageDescription(Content packageContent) {
if (options.noComment()) {
return;
}
addPackageDescription(packageContent);
}
/**
* Build the tags of the summary.
*
* @param packageContent the content to which the package tags will be added
*/
protected void buildPackageTags(Content packageContent) {
if (options.noComment()) {
return;
}
addPackageTags(packageContent);
}
protected Content getPackageHeader() {
String packageName = getLocalizedPackageName(packageElement).toString(); String packageName = getLocalizedPackageName(packageElement).toString();
HtmlTree body = getBody(getWindowTitle(packageName)); HtmlTree body = getBody(getWindowTitle(packageName));
var div = HtmlTree.DIV(HtmlStyle.header); var div = HtmlTree.DIV(HtmlStyle.header);
@ -129,8 +226,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
return body; return body;
} }
@Override protected Content getContentHeader() {
public Content getContentHeader() {
return new ContentBuilder(); return new ContentBuilder();
} }
@ -219,13 +315,11 @@ public class PackageWriterImpl extends HtmlDocletWriter
} }
} }
@Override protected Content getSummariesList() {
public Content getSummariesList() {
return HtmlTree.UL(HtmlStyle.summaryList); return HtmlTree.UL(HtmlStyle.summaryList);
} }
@Override protected void addRelatedPackagesSummary(Content summaryContent) {
public void addRelatedPackagesSummary(Content summaryContent) {
boolean showModules = configuration.showModules && hasRelatedPackagesInOtherModules(relatedPackages); boolean showModules = configuration.showModules && hasRelatedPackagesInOtherModules(relatedPackages);
TableHeader tableHeader= showModules TableHeader tableHeader= showModules
? new TableHeader(contents.moduleLabel, contents.packageLabel, contents.descriptionLabel) ? new TableHeader(contents.moduleLabel, contents.packageLabel, contents.descriptionLabel)
@ -247,10 +341,10 @@ public class PackageWriterImpl extends HtmlDocletWriter
.setId(HtmlIds.CLASS_SUMMARY) .setId(HtmlIds.CLASS_SUMMARY)
.setDefaultTab(contents.allClassesAndInterfacesLabel) .setDefaultTab(contents.allClassesAndInterfacesLabel)
.addTab(contents.interfaces, utils::isPlainInterface) .addTab(contents.interfaces, utils::isPlainInterface)
.addTab(contents.classes, e -> utils.isNonThrowableClass(e)) .addTab(contents.classes, utils::isNonThrowableClass)
.addTab(contents.enums, utils::isEnum) .addTab(contents.enums, utils::isEnum)
.addTab(contents.records, e -> utils.isRecord(e)) .addTab(contents.records, utils::isRecord)
.addTab(contents.exceptionClasses, e -> utils.isThrowable(e)) .addTab(contents.exceptionClasses, utils::isThrowable)
.addTab(contents.annotationTypes, utils::isAnnotationInterface); .addTab(contents.annotationTypes, utils::isAnnotationInterface);
for (TypeElement typeElement : allClasses) { for (TypeElement typeElement : allClasses) {
if (typeElement != null && utils.isCoreClass(typeElement)) { if (typeElement != null && utils.isCoreClass(typeElement)) {
@ -319,8 +413,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
} }
} }
@Override protected void addPackageDescription(Content packageContent) {
public void addPackageDescription(Content packageContent) {
addPreviewInfo(packageElement, packageContent); addPreviewInfo(packageElement, packageContent);
if (!utils.getBody(packageElement).isEmpty()) { if (!utils.getBody(packageElement).isEmpty()) {
section.setId(HtmlIds.PACKAGE_DESCRIPTION); section.setId(HtmlIds.PACKAGE_DESCRIPTION);
@ -329,30 +422,25 @@ public class PackageWriterImpl extends HtmlDocletWriter
} }
} }
@Override protected void addPackageTags(Content packageContent) {
public void addPackageTags(Content packageContent) {
addTagsInfo(packageElement, section); addTagsInfo(packageElement, section);
packageContent.add(section); packageContent.add(section);
} }
@Override protected void addPackageSignature(Content packageContent) {
public void addPackageSignature(Content packageContent) {
packageContent.add(new HtmlTree(TagName.HR)); packageContent.add(new HtmlTree(TagName.HR));
packageContent.add(Signatures.getPackageSignature(packageElement, this)); packageContent.add(Signatures.getPackageSignature(packageElement, this));
} }
@Override protected void addPackageContent(Content packageContent) {
public void addPackageContent(Content packageContent) {
bodyContents.addMainContent(packageContent); bodyContents.addMainContent(packageContent);
} }
@Override protected void addPackageFooter() {
public void addPackageFooter() {
bodyContents.setFooter(getFooter()); bodyContents.setFooter(getFooter());
} }
@Override protected void printDocument(Content content) throws DocFileIOException {
public void printDocument(Content content) throws DocFileIOException {
String description = getDescription("declaration", packageElement); String description = getDescription("declaration", packageElement);
List<DocPath> localStylesheets = getLocalStylesheets(packageElement); List<DocPath> localStylesheets = getLocalStylesheets(packageElement);
content.add(bodyContents); content.add(bodyContents);
@ -360,8 +448,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
description, localStylesheets, content); description, localStylesheets, content);
} }
@Override protected Content getPackageSummary(Content summaryContent) {
public Content getPackageSummary(Content summaryContent) {
return HtmlTree.SECTION(HtmlStyle.summary, summaryContent); return HtmlTree.SECTION(HtmlStyle.summary, summaryContent);
} }

@ -38,7 +38,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -25,29 +25,137 @@
package jdk.javadoc.internal.doclets.formats.html; package jdk.javadoc.internal.doclets.formats.html;
import java.util.ArrayList;
import java.util.stream.Collectors;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import com.sun.source.doctree.DocCommentTree;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.Entity; import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.CommentUtils;
import jdk.javadoc.internal.doclets.toolkit.PropertyWriter; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/** /**
* Writes property documentation in HTML format. * Writes property documentation in HTML format.
*/ */
public class PropertyWriterImpl extends AbstractMemberWriter public class PropertyWriter extends AbstractMemberWriter {
implements PropertyWriter, MemberSummaryWriter {
public PropertyWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { /**
super(writer, typeElement); * The index of the current property that is being documented at this point
* in time.
*/
private ExecutableElement currentProperty;
public PropertyWriter(ClassWriter writer) {
super(writer, writer.typeElement);
} }
public void build(Content target) {
buildPropertyDoc(target);
}
/**
* Build the property documentation.
*
* @param detailsList the content to which the documentation will be added
*/
protected void buildPropertyDoc(Content detailsList) {
var properties = getVisibleMembers(VisibleMemberTable.Kind.PROPERTIES);
if (!properties.isEmpty()) {
Content propertyDetailsHeader = getPropertyDetailsHeader(detailsList);
Content memberList = getMemberList();
for (Element property : properties) {
currentProperty = (ExecutableElement)property;
Content propertyContent = getPropertyHeaderContent(currentProperty);
buildSignature(propertyContent);
buildPropertyComments(propertyContent);
buildTagInfo(propertyContent);
memberList.add(getMemberListItem(propertyContent));
}
Content propertyDetails = getPropertyDetails(propertyDetailsHeader, memberList);
detailsList.add(propertyDetails);
}
}
/**
* Build the signature.
*
* @param propertyContent the content to which the documentation will be added
*/
protected void buildSignature(Content propertyContent) {
propertyContent.add(getSignature(currentProperty));
}
/**
* Build the deprecation information.
*
* @param propertyContent the content to which the documentation will be added
*/
protected void buildDeprecationInfo(Content propertyContent) {
addDeprecated(currentProperty, propertyContent);
}
/**
* Build the preview information.
*
* @param propertyContent the content to which the documentation will be added
*/
protected void buildPreviewInfo(Content propertyContent) {
addPreview(currentProperty, propertyContent);
}
/**
* Build the comments for the property. Do nothing if
* {@link BaseOptions#noComment()} is set to true.
*
* @param propertyContent the content to which the documentation will be added
*/
protected void buildPropertyComments(Content propertyContent) {
if (!options.noComment()) {
addComments(currentProperty, propertyContent);
}
}
/**
* Build the tag information.
*
* @param propertyContent the content to which the documentation will be added
*/
protected void buildTagInfo(Content propertyContent) {
CommentUtils cmtUtils = configuration.cmtUtils;
DocCommentTree dct = utils.getDocCommentTree(currentProperty);
var fullBody = dct.getFullBody();
ArrayList<DocTree> blockTags = dct.getBlockTags().stream()
.filter(t -> t.getKind() != DocTree.Kind.RETURN)
.collect(Collectors.toCollection(ArrayList::new));
String sig = "#" + currentProperty.getSimpleName() + "()";
blockTags.add(cmtUtils.makeSeeTree(sig, currentProperty));
// The property method is used as a proxy for the property
// (which does not have an explicit element of its own.)
// Temporarily override the doc comment for the property method
// by removing the `@return` tag, which should not be displayed for
// the property.
CommentUtils.DocCommentInfo prev = cmtUtils.setDocCommentTree(currentProperty, fullBody, blockTags);
try {
addTags(currentProperty, propertyContent);
} finally {
cmtUtils.setDocCommentInfo(currentProperty, prev);
}
}
@Override @Override
public Content getMemberSummaryHeader(TypeElement typeElement, Content content) { public Content getMemberSummaryHeader(TypeElement typeElement, Content content) {
content.add(MarkerComments.START_OF_PROPERTY_SUMMARY); content.add(MarkerComments.START_OF_PROPERTY_SUMMARY);
@ -62,8 +170,7 @@ public class PropertyWriterImpl extends AbstractMemberWriter
HtmlIds.PROPERTY_SUMMARY, summariesList, content); HtmlIds.PROPERTY_SUMMARY, summariesList, content);
} }
@Override protected Content getPropertyDetailsHeader(Content memberDetails) {
public Content getPropertyDetailsHeader(Content memberDetails) {
memberDetails.add(MarkerComments.START_OF_PROPERTY_DETAILS); memberDetails.add(MarkerComments.START_OF_PROPERTY_DETAILS);
Content propertyDetailsContent = new ContentBuilder(); Content propertyDetailsContent = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING,
@ -72,8 +179,7 @@ public class PropertyWriterImpl extends AbstractMemberWriter
return propertyDetailsContent; return propertyDetailsContent;
} }
@Override protected Content getPropertyHeaderContent(ExecutableElement property) {
public Content getPropertyHeaderContent(ExecutableElement property) {
Content content = new ContentBuilder(); Content content = new ContentBuilder();
var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING, var heading = HtmlTree.HEADING(Headings.TypeDeclaration.MEMBER_HEADING,
Text.of(utils.getPropertyLabel(name(property)))); Text.of(utils.getPropertyLabel(name(property))));
@ -82,24 +188,20 @@ public class PropertyWriterImpl extends AbstractMemberWriter
.setId(htmlIds.forProperty(property)); .setId(htmlIds.forProperty(property));
} }
@Override protected Content getSignature(ExecutableElement property) {
public Content getSignature(ExecutableElement property) {
return new Signatures.MemberSignature(property, this) return new Signatures.MemberSignature(property, this)
.setType(utils.getReturnType(typeElement, property)) .setType(utils.getReturnType(typeElement, property))
.setAnnotations(writer.getAnnotationInfo(property, true)) .setAnnotations(writer.getAnnotationInfo(property, true))
.toContent(); .toContent();
} }
@Override protected void addDeprecated(ExecutableElement property, Content propertyContent) {
public void addDeprecated(ExecutableElement property, Content propertyContent) {
} }
@Override protected void addPreview(ExecutableElement property, Content content) {
public void addPreview(ExecutableElement property, Content content) {
} }
@Override protected void addComments(ExecutableElement property, Content propertyContent) {
public void addComments(ExecutableElement property, Content propertyContent) {
TypeElement holder = (TypeElement)property.getEnclosingElement(); TypeElement holder = (TypeElement)property.getEnclosingElement();
if (!utils.getFullBody(property).isEmpty()) { if (!utils.getFullBody(property).isEmpty()) {
if (holder.equals(typeElement) || if (holder.equals(typeElement) ||
@ -126,13 +228,11 @@ public class PropertyWriterImpl extends AbstractMemberWriter
} }
} }
@Override protected void addTags(ExecutableElement property, Content propertyContent) {
public void addTags(ExecutableElement property, Content propertyContent) {
writer.addTagsInfo(property, propertyContent); writer.addTagsInfo(property, propertyContent);
} }
@Override protected Content getPropertyDetails(Content memberDetailsHeader, Content memberDetails) {
public Content getPropertyDetails(Content memberDetailsHeader, Content memberDetails) {
return writer.getDetailsListItem( return writer.getDetailsListItem(
HtmlTree.SECTION(HtmlStyle.propertyDetails) HtmlTree.SECTION(HtmlStyle.propertyDetails)
.setId(HtmlIds.PROPERTY_DETAIL) .setId(HtmlIds.PROPERTY_DETAIL)

@ -34,7 +34,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -41,18 +41,15 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.formats.html.taglets.TagletWriter; import jdk.javadoc.internal.doclets.formats.html.taglets.TagletWriter;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.SerializedFormWriter;
/** /**
* Generate serialized form for serializable fields. * Generate serialized form for serializable fields.
* Documentation denoted by the tags <code>serial</code> and * Documentation denoted by the tags <code>serial</code> and
* <code>serialField</code> is processed. * <code>serialField</code> is processed.
*/ */
public class HtmlSerialFieldWriter extends FieldWriterImpl public class SerialFieldWriter extends FieldWriter {
implements SerializedFormWriter.SerialFieldWriter {
public HtmlSerialFieldWriter(SubWriterHolderWriter writer, TypeElement typeElement) { public SerialFieldWriter(SubWriterHolderWriter writer, TypeElement typeElement) {
super(writer, typeElement); super(writer, typeElement);
} }
@ -60,18 +57,15 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
return utils.serializableFields(te); return utils.serializableFields(te);
} }
@Override protected Content getSerializableFieldsHeader() {
public Content getSerializableFieldsHeader() {
return HtmlTree.UL(HtmlStyle.blockList); return HtmlTree.UL(HtmlStyle.blockList);
} }
@Override protected Content getFieldsContentHeader(boolean isLastContent) {
public Content getFieldsContentHeader(boolean isLastContent) {
return new HtmlTree(TagName.LI).setStyle(HtmlStyle.blockList); return new HtmlTree(TagName.LI).setStyle(HtmlStyle.blockList);
} }
@Override protected Content getSerializableFields(String heading, Content source) {
public Content getSerializableFields(String heading, Content source) {
var section = HtmlTree.SECTION(HtmlStyle.detail); var section = HtmlTree.SECTION(HtmlStyle.detail);
if (!source.isEmpty()) { if (!source.isEmpty()) {
Content headingContent = Text.of(heading); Content headingContent = Text.of(heading);
@ -82,8 +76,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
return HtmlTree.LI(section); return HtmlTree.LI(section);
} }
@Override protected void addMemberHeader(TypeMirror fieldType, String fieldName, Content content) {
public void addMemberHeader(TypeMirror fieldType, String fieldName, Content content) {
Content nameContent = Text.of(fieldName); Content nameContent = Text.of(fieldName);
var heading = HtmlTree.HEADING(Headings.SerializedForm.MEMBER_HEADING, nameContent); var heading = HtmlTree.HEADING(Headings.SerializedForm.MEMBER_HEADING, nameContent);
content.add(heading); content.add(heading);
@ -102,8 +95,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
* @param field the field to document. * @param field the field to document.
* @param content the content to which the deprecated info will be added * @param content the content to which the deprecated info will be added
*/ */
@Override protected void addMemberDeprecatedInfo(VariableElement field, Content content) {
public void addMemberDeprecatedInfo(VariableElement field, Content content) {
addDeprecatedInfo(field, content); addDeprecatedInfo(field, content);
} }
@ -113,8 +105,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
* @param field the field to document. * @param field the field to document.
* @param content the content to which the deprecated info will be added * @param content the content to which the deprecated info will be added
*/ */
@Override protected void addMemberDescription(VariableElement field, Content content) {
public void addMemberDescription(VariableElement field, Content content) {
if (!utils.getFullBody(field).isEmpty()) { if (!utils.getFullBody(field).isEmpty()) {
writer.addInlineComment(field, content); writer.addInlineComment(field, content);
} }
@ -130,8 +121,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
* @param serialFieldTag the field to document (represented by tag) * @param serialFieldTag the field to document (represented by tag)
* @param content the content to which the deprecated info will be added * @param content the content to which the deprecated info will be added
*/ */
@Override protected void addMemberDescription(VariableElement field, SerialFieldTree serialFieldTag, Content content) {
public void addMemberDescription(VariableElement field, SerialFieldTree serialFieldTag, Content content) {
List<? extends DocTree> description = serialFieldTag.getDescription(); List<? extends DocTree> description = serialFieldTag.getDescription();
if (!description.isEmpty()) { if (!description.isEmpty()) {
Content serialFieldContent = writer.commentTagsToContent(field, Content serialFieldContent = writer.commentTagsToContent(field,
@ -148,8 +138,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
* @param field the field to document. * @param field the field to document.
* @param content the content to which the member tags info will be added * @param content the content to which the member tags info will be added
*/ */
@Override protected void addMemberTags(VariableElement field, Content content) {
public void addMemberTags(VariableElement field, Content content) {
Content tagContent = writer.getBlockTagOutput(field); Content tagContent = writer.getBlockTagOutput(field);
if (!tagContent.isEmpty()) { if (!tagContent.isEmpty()) {
var dl = HtmlTree.DL(HtmlStyle.notes); var dl = HtmlTree.DL(HtmlStyle.notes);
@ -166,8 +155,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
* @param field the field to check overview details for. * @param field the field to check overview details for.
* @return true if overview details need to be printed * @return true if overview details need to be printed
*/ */
@Override protected boolean shouldPrintOverview(VariableElement field) {
public boolean shouldPrintOverview(VariableElement field) {
if (!options.noComment()) { if (!options.noComment()) {
if(!utils.getFullBody(field).isEmpty() || if(!utils.getFullBody(field).isEmpty() ||
writer.hasSerializationOverviewTags(field)) writer.hasSerializationOverviewTags(field))

@ -29,11 +29,9 @@ import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.SerializedFormWriter;
import jdk.javadoc.internal.doclets.formats.html.taglets.TagletManager; import jdk.javadoc.internal.doclets.formats.html.taglets.TagletManager;
@ -41,20 +39,17 @@ import jdk.javadoc.internal.doclets.formats.html.taglets.TagletManager;
* Generate serialized form for Serializable/Externalizable methods. * Generate serialized form for Serializable/Externalizable methods.
* Documentation denoted by the <code>serialData</code> tag is processed. * Documentation denoted by the <code>serialData</code> tag is processed.
*/ */
public class HtmlSerialMethodWriter extends MethodWriterImpl implements public class SerialMethodWriter extends MethodWriter {
SerializedFormWriter.SerialMethodWriter {
public HtmlSerialMethodWriter(SubWriterHolderWriter writer, TypeElement typeElement) { public SerialMethodWriter(SubWriterHolderWriter writer, TypeElement typeElement) {
super(writer, typeElement); super(writer, typeElement);
} }
@Override protected Content getSerializableMethodsHeader() {
public Content getSerializableMethodsHeader() {
return HtmlTree.UL(HtmlStyle.blockList); return HtmlTree.UL(HtmlStyle.blockList);
} }
@Override protected Content getMethodsContentHeader(boolean isLastContent) {
public Content getMethodsContentHeader(boolean isLastContent) {
return new HtmlTree(TagName.LI); return new HtmlTree(TagName.LI);
} }
@ -66,8 +61,7 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
* content * content
* @return a content for the serializable methods content * @return a content for the serializable methods content
*/ */
@Override protected Content getSerializableMethods(String heading, Content source) {
public Content getSerializableMethods(String heading, Content source) {
Content headingContent = Text.of(heading); Content headingContent = Text.of(heading);
var serialHeading = HtmlTree.HEADING(Headings.SerializedForm.CLASS_SUBHEADING, headingContent); var serialHeading = HtmlTree.HEADING(Headings.SerializedForm.CLASS_SUBHEADING, headingContent);
var section = HtmlTree.SECTION(HtmlStyle.detail, serialHeading); var section = HtmlTree.SECTION(HtmlStyle.detail, serialHeading);
@ -81,8 +75,7 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
* @param msg the message to be displayed * @param msg the message to be displayed
* @return no customization message content * @return no customization message content
*/ */
@Override protected Content getNoCustomizationMsg(String msg) {
public Content getNoCustomizationMsg(String msg) {
return Text.of(msg); return Text.of(msg);
} }
@ -92,8 +85,7 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
* @param member the method document to be listed * @param member the method document to be listed
* @param methodsContent the content to which the member header will be added * @param methodsContent the content to which the member header will be added
*/ */
@Override protected void addMemberHeader(ExecutableElement member, Content methodsContent) {
public void addMemberHeader(ExecutableElement member, Content methodsContent) {
Content memberContent = Text.of(name(member)); Content memberContent = Text.of(name(member));
var heading = HtmlTree.HEADING(Headings.SerializedForm.MEMBER_HEADING, memberContent); var heading = HtmlTree.HEADING(Headings.SerializedForm.MEMBER_HEADING, memberContent);
methodsContent.add(heading); methodsContent.add(heading);
@ -106,8 +98,7 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
* @param member the method to document. * @param member the method to document.
* @param methodsContent the content to which the deprecated info will be added * @param methodsContent the content to which the deprecated info will be added
*/ */
@Override protected void addDeprecatedMemberInfo(ExecutableElement member, Content methodsContent) {
public void addDeprecatedMemberInfo(ExecutableElement member, Content methodsContent) {
addDeprecatedInfo(member, methodsContent); addDeprecatedInfo(member, methodsContent);
} }
@ -117,8 +108,7 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
* @param member the method to document. * @param member the method to document.
* @param methodsContent the content to which the deprecated info will be added * @param methodsContent the content to which the deprecated info will be added
*/ */
@Override protected void addMemberDescription(ExecutableElement member, Content methodsContent) {
public void addMemberDescription(ExecutableElement member, Content methodsContent) {
addComment(member, methodsContent); addComment(member, methodsContent);
} }
@ -128,8 +118,7 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
* @param member the method to document. * @param member the method to document.
* @param methodsContent the content to which the member tags info will be added * @param methodsContent the content to which the member tags info will be added
*/ */
@Override protected void addMemberTags(ExecutableElement member, Content methodsContent) {
public void addMemberTags(ExecutableElement member, Content methodsContent) {
TagletManager tagletManager = configuration.tagletManager; TagletManager tagletManager = configuration.tagletManager;
Content tagContent = writer.getBlockTagOutput(member, tagletManager.getSerializedFormTaglets()); Content tagContent = writer.getBlockTagOutput(member, tagletManager.getSerializedFormTaglets());
var dl = HtmlTree.DL(HtmlStyle.notes); var dl = HtmlTree.DL(HtmlStyle.notes);

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -23,12 +23,11 @@
* questions. * questions.
*/ */
package jdk.javadoc.internal.doclets.toolkit.builders; package jdk.javadoc.internal.doclets.formats.html;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.SortedSet; import java.util.SortedSet;
import java.util.TreeSet; import java.util.TreeSet;
@ -41,31 +40,34 @@ import javax.lang.model.type.TypeMirror;
import com.sun.source.doctree.SerialFieldTree; import com.sun.source.doctree.SerialFieldTree;
import com.sun.source.doctree.SerialTree; import com.sun.source.doctree.SerialTree;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.DocletException; import jdk.javadoc.internal.doclets.toolkit.DocletException;
import jdk.javadoc.internal.doclets.toolkit.SerializedFormWriter;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
import jdk.javadoc.internal.doclets.toolkit.util.IndexItem;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;
/** /**
* Builds the serialized form. * Generates the Serialized Form Information Page, <i>serialized-form.html</i>.
*/ */
public class SerializedFormBuilder extends AbstractBuilder { public class SerializedFormWriter extends SubWriterHolderWriter {
/**
* The writer for this builder.
*/
private SerializedFormWriter writer;
/** /**
* The writer for serializable fields. * The writer for serializable fields.
*/ */
private SerializedFormWriter.SerialFieldWriter fieldWriter; private SerialFieldWriter fieldWriter;
/** /**
* The writer for serializable method documentation. * The writer for serializable method documentation.
*/ */
private SerializedFormWriter.SerialMethodWriter methodWriter; private SerialMethodWriter methodWriter;
/** /**
* The header for the serial version UID. Save the string * The header for the serial version UID. Save the string
@ -90,22 +92,15 @@ public class SerializedFormBuilder extends AbstractBuilder {
*/ */
protected Element currentMember; protected Element currentMember;
/** Set<TypeElement> visibleClasses;
* Construct a new SerializedFormBuilder.
* @param context the build context.
*/
private SerializedFormBuilder(Context context) {
super(context);
}
/** /**
* Construct a new SerializedFormBuilder. * @param configuration the configuration data for the doclet
*
* @param context the build context.
* @return the new SerializedFormBuilder
*/ */
public static SerializedFormBuilder getInstance(Context context) { public SerializedFormWriter(HtmlConfiguration configuration) {
return new SerializedFormBuilder(context); super(configuration, DocPaths.SERIALIZED_FORM, false);
visibleClasses = configuration.getIncludedTypeElements();
configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.SERIALIZED_FORM);
} }
/** /**
@ -113,19 +108,17 @@ public class SerializedFormBuilder extends AbstractBuilder {
* *
* @throws DocletException if there is a problem while building the documentation * @throws DocletException if there is a problem while building the documentation
*/ */
@Override void build() throws DocletException {
public void build() throws DocletException {
SortedSet<TypeElement> rootclasses = new TreeSet<>(utils.comparators.makeGeneralPurposeComparator()); SortedSet<TypeElement> rootclasses = new TreeSet<>(utils.comparators.makeGeneralPurposeComparator());
rootclasses.addAll(configuration.getIncludedTypeElements()); rootclasses.addAll(configuration.getIncludedTypeElements());
if (!serialClassFoundToDocument(rootclasses)) { if (!serialClassFoundToDocument(rootclasses)) {
//Nothing to document. //Nothing to document.
return; return;
} }
writer = configuration.getWriterFactory().getSerializedFormWriter();
if (writer == null) { configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.SERIALIZED_FORM);
//Doclet does not support this output. writeGenerating();
return;
}
buildSerializedForm(); buildSerializedForm();
} }
@ -135,39 +128,35 @@ public class SerializedFormBuilder extends AbstractBuilder {
* @throws DocletException if there is a problem while building the documentation * @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildSerializedForm() throws DocletException { protected void buildSerializedForm() throws DocletException {
Content content = writer.getHeader(resources.getText( Content content = getHeader(resources.getText(
"doclet.Serialized_Form")); "doclet.Serialized_Form"));
buildSerializedFormSummaries(); buildSerializedFormSummaries();
writer.addFooter(); addFooter();
writer.printDocument(content); printDocument(content);
} }
/** /**
* Build the serialized form summaries. * Build the serialized form summaries.
*
* @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildSerializedFormSummaries() protected void buildSerializedFormSummaries() {
throws DocletException { Content c = getSerializedSummariesHeader();
Content c = writer.getSerializedSummariesHeader();
for (PackageElement pkg : configuration.packages) { for (PackageElement pkg : configuration.packages) {
currentPackage = pkg; currentPackage = pkg;
buildPackageSerializedForm(c); buildPackageSerializedForm(c);
} }
writer.addSerializedContent(c); addSerializedContent(c);
} }
/** /**
* Build the package serialized form for the current package being processed. * Build the package serialized form for the current package being processed.
* *
* @param target the content to which the documentation will be added * @param target the content to which the documentation will be added
* @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildPackageSerializedForm(Content target) throws DocletException { protected void buildPackageSerializedForm(Content target) {
Content packageSerializedHeader = writer.getPackageSerializedHeader(); Content packageSerializedHeader = getPackageSerializedHeader();
SortedSet<TypeElement> classes = utils.getAllClassesUnfiltered(currentPackage); SortedSet<TypeElement> classes = utils.getAllClassesUnfiltered(currentPackage);
if (classes.isEmpty()) { if (classes.isEmpty()) {
return; return;
@ -182,7 +171,7 @@ public class SerializedFormBuilder extends AbstractBuilder {
buildPackageHeader(packageSerializedHeader); buildPackageHeader(packageSerializedHeader);
buildClassSerializedForm(packageSerializedHeader); buildClassSerializedForm(packageSerializedHeader);
writer.addPackageSerialized(target, packageSerializedHeader); addPackageSerialized(target, packageSerializedHeader);
} }
/** /**
@ -191,33 +180,31 @@ public class SerializedFormBuilder extends AbstractBuilder {
* @param target the content to which the documentation will be added * @param target the content to which the documentation will be added
*/ */
protected void buildPackageHeader(Content target) { protected void buildPackageHeader(Content target) {
target.add(writer.getPackageHeader(currentPackage)); target.add(getPackageHeader(currentPackage));
} }
/** /**
* Build the class serialized form. * Build the class serialized form.
* *
* @param target the content to which the documentation will be added * @param target the content to which the documentation will be added
* @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildClassSerializedForm(Content target) protected void buildClassSerializedForm(Content target) {
throws DocletException { Content classSerializedHeader = getClassSerializedHeader();
Content classSerializedHeader = writer.getClassSerializedHeader();
SortedSet<TypeElement> typeElements = utils.getAllClassesUnfiltered(currentPackage); SortedSet<TypeElement> typeElements = utils.getAllClassesUnfiltered(currentPackage);
for (TypeElement typeElement : typeElements) { for (TypeElement typeElement : typeElements) {
currentTypeElement = typeElement; currentTypeElement = typeElement;
fieldWriter = writer.getSerialFieldWriter(currentTypeElement); fieldWriter = getSerialFieldWriter(currentTypeElement);
methodWriter = writer.getSerialMethodWriter(currentTypeElement); methodWriter = getSerialMethodWriter(currentTypeElement);
if (utils.isClass(currentTypeElement) && utils.isSerializable(currentTypeElement)) { if (utils.isClass(currentTypeElement) && utils.isSerializable(currentTypeElement)) {
if (!serialClassInclude(utils, currentTypeElement)) { if (!serialClassInclude(utils, currentTypeElement)) {
continue; continue;
} }
Content classHeader = writer.getClassHeader(currentTypeElement); Content classHeader = getClassHeader(currentTypeElement);
buildSerialUIDInfo(classHeader); buildSerialUIDInfo(classHeader);
buildClassContent(classHeader); buildClassContent(classHeader);
classSerializedHeader.add(writer.getMember(classHeader)); classSerializedHeader.add(getMember(classHeader));
} }
} }
target.add(classSerializedHeader); target.add(classSerializedHeader);
@ -229,12 +216,12 @@ public class SerializedFormBuilder extends AbstractBuilder {
* @param target the content to which the serial UID information will be added * @param target the content to which the serial UID information will be added
*/ */
protected void buildSerialUIDInfo(Content target) { protected void buildSerialUIDInfo(Content target) {
Content serialUIDHeader = writer.getSerialUIDInfoHeader(); Content serialUIDHeader = getSerialUIDInfoHeader();
for (VariableElement field : utils.getFieldsUnfiltered(currentTypeElement)) { for (VariableElement field : utils.getFieldsUnfiltered(currentTypeElement)) {
if (field.getSimpleName().toString().compareTo(SERIAL_VERSION_UID) == 0 && if (field.getSimpleName().toString().compareTo(SERIAL_VERSION_UID) == 0 &&
field.getConstantValue() != null) { field.getConstantValue() != null) {
writer.addSerialUIDInfo(SERIAL_VERSION_UID_HEADER, addSerialUIDInfo(SERIAL_VERSION_UID_HEADER,
utils.constantValueExpression(field), serialUIDHeader); utils.constantValueExpression(field), serialUIDHeader);
break; break;
} }
} }
@ -245,10 +232,9 @@ public class SerializedFormBuilder extends AbstractBuilder {
* Build the summaries for the methods and fields. * Build the summaries for the methods and fields.
* *
* @param target the content to which the documentation will be added * @param target the content to which the documentation will be added
* @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildClassContent(Content target) throws DocletException { protected void buildClassContent(Content target) {
Content classContent = writer.getClassContentHeader(); Content classContent = getClassContentHeader();
buildSerializableMethods(classContent); buildSerializableMethods(classContent);
buildFieldHeader(classContent); buildFieldHeader(classContent);
@ -261,9 +247,8 @@ public class SerializedFormBuilder extends AbstractBuilder {
* Build the summaries for the methods that belong to the given class. * Build the summaries for the methods that belong to the given class.
* *
* @param target the content to which the documentation will be added * @param target the content to which the documentation will be added
* @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildSerializableMethods(Content target) throws DocletException { protected void buildSerializableMethods(Content target) {
Content serializableMethodsHeader = methodWriter.getSerializableMethodsHeader(); Content serializableMethodsHeader = methodWriter.getSerializableMethodsHeader();
for (var i = utils.serializationMethods(currentTypeElement).iterator(); i.hasNext(); ) { for (var i = utils.serializationMethods(currentTypeElement).iterator(); i.hasNext(); ) {
currentMember = i.next(); currentMember = i.next();
@ -313,9 +298,8 @@ public class SerializedFormBuilder extends AbstractBuilder {
* Build the information for the method. * Build the information for the method.
* *
* @param methodsContent the content to which the documentation will be added * @param methodsContent the content to which the documentation will be added
* @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildMethodInfo(Content methodsContent) throws DocletException { protected void buildMethodInfo(Content methodsContent) {
if (options.noComment()) { if (options.noComment()) {
return; return;
} }
@ -394,10 +378,8 @@ public class SerializedFormBuilder extends AbstractBuilder {
* Build the summaries for the fields that belong to the given class. * Build the summaries for the fields that belong to the given class.
* *
* @param target the content to which the documentation will be added * @param target the content to which the documentation will be added
* @throws DocletException if there is a problem while building the documentation
*/ */
protected void buildSerializableFields(Content target) protected void buildSerializableFields(Content target) {
throws DocletException {
Collection<VariableElement> members = utils.serializableFields(currentTypeElement); Collection<VariableElement> members = utils.serializableFields(currentTypeElement);
if (!members.isEmpty()) { if (!members.isEmpty()) {
Content serializableFieldsHeader = fieldWriter.getSerializableFieldsHeader(); Content serializableFieldsHeader = fieldWriter.getSerializableFieldsHeader();
@ -548,7 +530,6 @@ public class SerializedFormBuilder extends AbstractBuilder {
} }
List<? extends SerialTree> serial = utils.getSerialTrees(element); List<? extends SerialTree> serial = utils.getSerialTrees(element);
if (!serial.isEmpty()) { if (!serial.isEmpty()) {
CommentHelper ch = utils.getCommentHelper(element);
// look for `@serial include|exclude` // look for `@serial include|exclude`
String serialtext = Utils.toLowerCase(serial.get(0).toString()); String serialtext = Utils.toLowerCase(serial.get(0).toString());
if (serialtext.contains("exclude")) { if (serialtext.contains("exclude")) {
@ -574,4 +555,172 @@ public class SerializedFormBuilder extends AbstractBuilder {
} }
return false; return false;
} }
/**
* Get the given header.
*
* @param header the header to write
* @return the body content
*/
Content getHeader(String header) {
HtmlTree body = getBody(getWindowTitle(header));
Content h1Content = Text.of(header);
var heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING,
HtmlStyle.title, h1Content);
var div = HtmlTree.DIV(HtmlStyle.header, heading);
bodyContents.setHeader(getHeader(PageMode.SERIALIZED_FORM))
.addMainContent(div);
return body;
}
/**
* Get the serialized form summaries header.
*
* @return the serialized form summaries header
*/
Content getSerializedSummariesHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
/**
* Get the package serialized form header.
*
* @return the package serialized form header tree
*/
Content getPackageSerializedHeader() {
return HtmlTree.SECTION(HtmlStyle.serializedPackageContainer);
}
Content getPackageHeader(PackageElement packageElement) {
var heading = HtmlTree.HEADING_TITLE(Headings.SerializedForm.PACKAGE_HEADING,
contents.packageLabel);
heading.add(Entity.NO_BREAK_SPACE);
heading.add(getPackageLink(packageElement, Text.of(utils.getPackageName(packageElement))));
return heading;
}
Content getClassSerializedHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
/**
* Checks if a class is generated and is visible.
*
* @param typeElement the class being processed.
* @return true if the class, that is being processed, is generated and is visible.
*/
public boolean isVisibleClass(TypeElement typeElement) {
return visibleClasses.contains(typeElement) && configuration.isGeneratedDoc(typeElement)
&& !utils.hasHiddenTag(typeElement);
}
Content getClassHeader(TypeElement typeElement) {
Content classLink = (isVisibleClass(typeElement))
? getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.PLAIN, typeElement)
.label(configuration.getClassName(typeElement)))
: Text.of(utils.getFullyQualifiedName(typeElement));
var section = HtmlTree.SECTION(HtmlStyle.serializedClassDetails)
.setId(htmlIds.forClass(typeElement));
Content superClassLink = typeElement.getSuperclass() != null
? getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS,
typeElement.getSuperclass()))
: null;
Content interfaceLink = getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS,
utils.isExternalizable(typeElement)
? utils.getExternalizableType()
: utils.getSerializableType()));
// Print the heading.
Content className = new ContentBuilder();
className.add(utils.getTypeElementKindName(typeElement, false));
className.add(Entity.NO_BREAK_SPACE);
className.add(classLink);
section.add(HtmlTree.HEADING(Headings.SerializedForm.CLASS_HEADING, className));
// Print a simplified signature.
Content signature = new ContentBuilder();
signature.add("class ");
signature.add(typeElement.getSimpleName());
signature.add(" extends ");
signature.add(superClassLink);
signature.add(" implements ");
signature.add(interfaceLink);
section.add(HtmlTree.DIV(HtmlStyle.typeSignature, signature));
return section;
}
Content getSerialUIDInfoHeader() {
return HtmlTree.DL(HtmlStyle.nameValue);
}
/**
* Adds the serial UID info.
*
* @param header the header that will show up before the UID.
* @param serialUID the serial UID to print.
* @param target the serial UID content to which the serial UID
* content will be added
*/
void addSerialUIDInfo(String header,
String serialUID,
Content target)
{
Content headerContent = Text.of(header);
target.add(HtmlTree.DT(headerContent));
Content serialContent = Text.of(serialUID);
target.add(HtmlTree.DD(serialContent));
}
Content getClassContentHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
/**
* Add the serialized content section.
*
* @param source the serialized content to be added
*/
void addSerializedContent(Content source) {
bodyContents.addMainContent(source);
}
void addPackageSerialized(Content serializedSummaries,
Content packageSerialized)
{
serializedSummaries.add(HtmlTree.LI(packageSerialized));
}
/**
* Add the footer.
*/
void addFooter() {
bodyContents.setFooter(getFooter());
}
void printDocument(Content source) throws DocFileIOException {
source.add(bodyContents);
printHtmlDocument(null, "serialized forms", source);
if (configuration.mainIndex != null) {
configuration.mainIndex.add(IndexItem.of(IndexItem.Category.TAGS,
resources.getText("doclet.Serialized_Form"), path));
}
}
/**
* Return an instance of a SerialFieldWriter.
*
* @return an instance of a SerialFieldWriter.
*/
SerialFieldWriter getSerialFieldWriter(TypeElement typeElement) {
return new SerialFieldWriter(this, typeElement);
}
/**
* Return an instance of a SerialMethodWriter.
*
* @return an instance of a SerialMethodWriter.
*/
SerialMethodWriter getSerialMethodWriter(TypeElement typeElement) {
return new SerialMethodWriter(this, typeElement);
}
} }

@ -1,244 +0,0 @@
/*
* Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html;
import java.util.Set;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.SerializedFormWriter;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
import jdk.javadoc.internal.doclets.toolkit.util.IndexItem;
/**
* Generates the Serialized Form Information Page, <i>serialized-form.html</i>.
*/
public class SerializedFormWriterImpl extends SubWriterHolderWriter
implements SerializedFormWriter {
Set<TypeElement> visibleClasses;
/**
* @param configuration the configuration data for the doclet
*/
public SerializedFormWriterImpl(HtmlConfiguration configuration) {
super(configuration, DocPaths.SERIALIZED_FORM);
visibleClasses = configuration.getIncludedTypeElements();
configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.SERIALIZED_FORM);
}
/**
* Get the given header.
*
* @param header the header to write
* @return the body content
*/
@Override
public Content getHeader(String header) {
HtmlTree body = getBody(getWindowTitle(header));
Content h1Content = Text.of(header);
var heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING,
HtmlStyle.title, h1Content);
var div = HtmlTree.DIV(HtmlStyle.header, heading);
bodyContents.setHeader(getHeader(PageMode.SERIALIZED_FORM))
.addMainContent(div);
return body;
}
/**
* Get the serialized form summaries header.
*
* @return the serialized form summaries header
*/
@Override
public Content getSerializedSummariesHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
/**
* Get the package serialized form header.
*
* @return the package serialized form header tree
*/
@Override
public Content getPackageSerializedHeader() {
return HtmlTree.SECTION(HtmlStyle.serializedPackageContainer);
}
@Override
public Content getPackageHeader(PackageElement packageElement) {
var heading = HtmlTree.HEADING_TITLE(Headings.SerializedForm.PACKAGE_HEADING,
contents.packageLabel);
heading.add(Entity.NO_BREAK_SPACE);
heading.add(getPackageLink(packageElement, Text.of(utils.getPackageName(packageElement))));
return heading;
}
@Override
public Content getClassSerializedHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
/**
* Checks if a class is generated and is visible.
*
* @param typeElement the class being processed.
* @return true if the class, that is being processed, is generated and is visible.
*/
public boolean isVisibleClass(TypeElement typeElement) {
return visibleClasses.contains(typeElement) && configuration.isGeneratedDoc(typeElement)
&& !utils.hasHiddenTag(typeElement);
}
@Override
public Content getClassHeader(TypeElement typeElement) {
Content classLink = (isVisibleClass(typeElement))
? getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.PLAIN, typeElement)
.label(configuration.getClassName(typeElement)))
: Text.of(utils.getFullyQualifiedName(typeElement));
var section = HtmlTree.SECTION(HtmlStyle.serializedClassDetails)
.setId(htmlIds.forClass(typeElement));
Content superClassLink = typeElement.getSuperclass() != null
? getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS,
typeElement.getSuperclass()))
: null;
Content interfaceLink = getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS,
utils.isExternalizable(typeElement)
? utils.getExternalizableType()
: utils.getSerializableType()));
// Print the heading.
Content className = new ContentBuilder();
className.add(utils.getTypeElementKindName(typeElement, false));
className.add(Entity.NO_BREAK_SPACE);
className.add(classLink);
section.add(HtmlTree.HEADING(Headings.SerializedForm.CLASS_HEADING, className));
// Print a simplified signature.
Content signature = new ContentBuilder();
signature.add("class ");
signature.add(typeElement.getSimpleName());
signature.add(" extends ");
signature.add(superClassLink);
signature.add(" implements ");
signature.add(interfaceLink);
section.add(HtmlTree.DIV(HtmlStyle.typeSignature, signature));
return section;
}
@Override
public Content getSerialUIDInfoHeader() {
return HtmlTree.DL(HtmlStyle.nameValue);
}
/**
* Adds the serial UID info.
*
* @param header the header that will show up before the UID.
* @param serialUID the serial UID to print.
* @param target the serial UID content to which the serial UID
* content will be added
*/
@Override
public void addSerialUIDInfo(String header,
String serialUID,
Content target)
{
Content headerContent = Text.of(header);
target.add(HtmlTree.DT(headerContent));
Content serialContent = Text.of(serialUID);
target.add(HtmlTree.DD(serialContent));
}
@Override
public Content getClassContentHeader() {
return HtmlTree.UL(HtmlStyle.blockList);
}
/**
* Add the serialized content section.
*
* @param source the serialized content to be added
*/
@Override
public void addSerializedContent(Content source) {
bodyContents.addMainContent(source);
}
@Override
public void addPackageSerialized(Content serializedSummaries,
Content packageSerialized)
{
serializedSummaries.add(HtmlTree.LI(packageSerialized));
}
/**
* Add the footer.
*/
@Override
public void addFooter() {
bodyContents.setFooter(getFooter());
}
@Override
public void printDocument(Content source) throws DocFileIOException {
source.add(bodyContents);
printHtmlDocument(null, "serialized forms", source);
if (configuration.mainIndex != null) {
configuration.mainIndex.add(IndexItem.of(IndexItem.Category.TAGS,
resources.getText("doclet.Serialized_Form"), path));
}
}
/**
* Return an instance of a SerialFieldWriter.
*
* @return an instance of a SerialFieldWriter.
*/
@Override
public SerialFieldWriter getSerialFieldWriter(TypeElement typeElement) {
return new HtmlSerialFieldWriter(this, typeElement);
}
/**
* Return an instance of a SerialMethodWriter.
*
* @return an instance of a SerialMethodWriter.
*/
@Override
public SerialMethodWriter getSerialMethodWriter(TypeElement typeElement) {
return new HtmlSerialMethodWriter(this, typeElement);
}
}

@ -32,7 +32,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
@ -63,7 +62,7 @@ import static javax.lang.model.element.Modifier.SYNCHRONIZED;
public class Signatures { public class Signatures {
public static Content getModuleSignature(ModuleElement mdle, ModuleWriterImpl moduleWriter) { public static Content getModuleSignature(ModuleElement mdle, ModuleWriter moduleWriter) {
var signature = HtmlTree.DIV(HtmlStyle.moduleSignature); var signature = HtmlTree.DIV(HtmlStyle.moduleSignature);
Content annotations = moduleWriter.getAnnotationInfo(mdle, true); Content annotations = moduleWriter.getAnnotationInfo(mdle, true);
if (!annotations.isEmpty()) { if (!annotations.isEmpty()) {
@ -80,7 +79,7 @@ public class Signatures {
return signature; return signature;
} }
public static Content getPackageSignature(PackageElement pkg, PackageWriterImpl pkgWriter) { public static Content getPackageSignature(PackageElement pkg, PackageWriter pkgWriter) {
if (pkg.isUnnamed()) { if (pkg.isUnnamed()) {
return Text.EMPTY; return Text.EMPTY;
} }

@ -43,7 +43,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.Messages;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;

@ -37,7 +37,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
/** /**
@ -49,7 +48,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
* class subclass of this class can be subclassed to change formatting. * class subclass of this class can be subclassed to change formatting.
* *
* @see AbstractMemberWriter * @see AbstractMemberWriter
* @see ClassWriterImpl * @see ClassWriter
*/ */
public abstract class SubWriterHolderWriter extends HtmlDocletWriter { public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
@ -62,6 +61,10 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
super(configuration, filename); super(configuration, filename);
} }
public SubWriterHolderWriter(HtmlConfiguration configuration, DocPath filename, boolean generating) {
super(configuration, filename, generating);
}
/** /**
* Add the summary header. * Add the summary header.
* *

@ -38,7 +38,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.Script;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.SummaryAPIListBuilder; import jdk.javadoc.internal.doclets.toolkit.util.SummaryAPIListBuilder;
@ -251,13 +250,15 @@ public abstract class SummaryListWriter<B extends SummaryAPIListBuilder> extends
} }
protected Content getSummaryLink(Element e) { protected Content getSummaryLink(Element e) {
// TODO: notable that these do not go through the writerFactory
// also maybe notable that annotation type members are not handled as such
AbstractMemberWriter writer = switch (e.getKind()) { AbstractMemberWriter writer = switch (e.getKind()) {
case INTERFACE, CLASS, ENUM, case INTERFACE, CLASS, ENUM,
ANNOTATION_TYPE, RECORD -> new NestedClassWriterImpl(this); ANNOTATION_TYPE, RECORD -> new NestedClassWriter(this);
case FIELD -> new FieldWriterImpl(this); case FIELD -> new FieldWriter(this);
case METHOD -> new MethodWriterImpl(this); case METHOD -> new MethodWriter(this);
case CONSTRUCTOR -> new ConstructorWriterImpl(this); case CONSTRUCTOR -> new ConstructorWriter(this);
case ENUM_CONSTANT -> new EnumConstantWriterImpl(this); case ENUM_CONSTANT -> new EnumConstantWriter(this);
case RECORD_COMPONENT -> case RECORD_COMPONENT ->
throw new AssertionError("Record components are not supported by SummaryListWriter!"); throw new AssertionError("Record components are not supported by SummaryListWriter!");
default -> default ->

@ -32,7 +32,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.DocletElement; import jdk.javadoc.internal.doclets.toolkit.DocletElement;
import jdk.javadoc.internal.doclets.toolkit.OverviewElement; import jdk.javadoc.internal.doclets.toolkit.OverviewElement;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;

@ -41,7 +41,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content;
/** /**
* An HTML container used to display summary tables for various kinds of elements * An HTML container used to display summary tables for various kinds of elements

@ -34,7 +34,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content;
/** /**
* A row of header cells for an HTML table. * A row of header cells for an HTML table.

@ -34,7 +34,6 @@ 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -0,0 +1,133 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html;
import javax.lang.model.element.Element;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/**
* The factory that returns HTML writers.
*/
// TODO: be more consistent about using this factory
public class WriterFactory {
private final HtmlConfiguration configuration;
public WriterFactory(HtmlConfiguration configuration) {
this.configuration = configuration;
}
public ConstantsSummaryWriter getConstantsSummaryWriter() {
return new ConstantsSummaryWriter(configuration);
}
public PackageWriter getPackageSummaryWriter(PackageElement packageElement) {
return new PackageWriter(configuration, packageElement);
}
public ModuleWriter getModuleSummaryWriter(ModuleElement mdle) {
return new ModuleWriter(configuration, mdle);
}
public ClassWriter getClassWriter(TypeElement typeElement, ClassTree classTree) {
return new ClassWriter(configuration, typeElement, classTree);
}
public AnnotationTypeMemberWriter getAnnotationTypeMemberWriter(
ClassWriter classWriter) {
TypeElement te = classWriter.getTypeElement();
return new AnnotationTypeMemberWriter(classWriter, te, AnnotationTypeMemberWriter.Kind.ANY);
}
public AnnotationTypeMemberWriter getAnnotationTypeOptionalMemberWriter(
ClassWriter classWriter) {
TypeElement te = classWriter.getTypeElement();
return new AnnotationTypeMemberWriter(classWriter, te, AnnotationTypeMemberWriter.Kind.OPTIONAL);
}
public AnnotationTypeMemberWriter getAnnotationTypeRequiredMemberWriter(
ClassWriter classWriter) {
TypeElement te = classWriter.getTypeElement();
return new AnnotationTypeMemberWriter(classWriter, te, AnnotationTypeMemberWriter.Kind.REQUIRED);
}
public EnumConstantWriter getEnumConstantWriter(ClassWriter classWriter) {
return new EnumConstantWriter(classWriter);
}
public FieldWriter getFieldWriter(ClassWriter classWriter) {
return new FieldWriter(classWriter);
}
public PropertyWriter getPropertyWriter(ClassWriter classWriter) {
return new PropertyWriter(classWriter);
}
public MethodWriter getMethodWriter(ClassWriter classWriter) {
return new MethodWriter(classWriter);
}
public ConstructorWriter getConstructorWriter(ClassWriter classWriter) {
return new ConstructorWriter(classWriter);
}
public AbstractMemberWriter getMemberSummaryWriter(ClassWriter classWriter,
VisibleMemberTable.Kind memberType) {
switch (memberType) {
case CONSTRUCTORS:
return getConstructorWriter(classWriter);
case ENUM_CONSTANTS:
return getEnumConstantWriter(classWriter);
case ANNOTATION_TYPE_MEMBER_OPTIONAL:
return getAnnotationTypeOptionalMemberWriter(classWriter);
case ANNOTATION_TYPE_MEMBER_REQUIRED:
return getAnnotationTypeRequiredMemberWriter(classWriter);
case FIELDS:
return getFieldWriter(classWriter);
case PROPERTIES:
return getPropertyWriter(classWriter);
case NESTED_CLASSES:
return new NestedClassWriter(classWriter, classWriter.getTypeElement());
case METHODS:
return getMethodWriter(classWriter);
default:
return null;
}
}
public SerializedFormWriter getSerializedFormWriter() {
return new SerializedFormWriter(configuration);
}
public DocFilesHandler getDocFilesHandler(Element element) {
return new DocFilesHandler(configuration, element);
}
}

@ -1,162 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html;
import javax.lang.model.element.Element;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.toolkit.ClassWriter;
import jdk.javadoc.internal.doclets.toolkit.ConstantsSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.DocFilesHandler;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.ModuleSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.PackageSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.SerializedFormWriter;
import jdk.javadoc.internal.doclets.toolkit.WriterFactory;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
/**
* The factory that returns HTML writers.
*/
public class WriterFactoryImpl implements WriterFactory {
private final HtmlConfiguration configuration;
public WriterFactoryImpl(HtmlConfiguration configuration) {
this.configuration = configuration;
}
@Override
public ConstantsSummaryWriter getConstantsSummaryWriter() {
return new ConstantsSummaryWriterImpl(configuration);
}
@Override
public PackageSummaryWriter getPackageSummaryWriter(PackageElement packageElement) {
return new PackageWriterImpl(configuration, packageElement);
}
@Override
public ModuleSummaryWriter getModuleSummaryWriter(ModuleElement mdle) {
return new ModuleWriterImpl(configuration, mdle);
}
@Override
public ClassWriter getClassWriter(TypeElement typeElement, ClassTree classTree) {
return new ClassWriterImpl(configuration, typeElement, classTree);
}
@Override
public AnnotationTypeMemberWriterImpl getAnnotationTypeMemberWriter(
ClassWriter classWriter) {
TypeElement te = classWriter.getTypeElement();
return new AnnotationTypeMemberWriterImpl(
(ClassWriterImpl) classWriter, te, AnnotationTypeMemberWriterImpl.Kind.ANY);
}
@Override
public AnnotationTypeMemberWriterImpl getAnnotationTypeOptionalMemberWriter(
ClassWriter classWriter) {
TypeElement te = classWriter.getTypeElement();
return new AnnotationTypeMemberWriterImpl(
(ClassWriterImpl) classWriter, te, AnnotationTypeMemberWriterImpl.Kind.OPTIONAL);
}
@Override
public AnnotationTypeMemberWriterImpl getAnnotationTypeRequiredMemberWriter(
ClassWriter classWriter) {
TypeElement te = classWriter.getTypeElement();
return new AnnotationTypeMemberWriterImpl(
(ClassWriterImpl) classWriter, te, AnnotationTypeMemberWriterImpl.Kind.REQUIRED);
}
@Override
public EnumConstantWriterImpl getEnumConstantWriter(ClassWriter classWriter) {
return new EnumConstantWriterImpl((ClassWriterImpl) classWriter,
classWriter.getTypeElement());
}
@Override
public FieldWriterImpl getFieldWriter(ClassWriter classWriter) {
return new FieldWriterImpl((ClassWriterImpl) classWriter, classWriter.getTypeElement());
}
@Override
public PropertyWriterImpl getPropertyWriter(ClassWriter classWriter) {
return new PropertyWriterImpl((ClassWriterImpl) classWriter,
classWriter.getTypeElement());
}
@Override
public MethodWriterImpl getMethodWriter(ClassWriter classWriter) {
return new MethodWriterImpl((ClassWriterImpl) classWriter, classWriter.getTypeElement());
}
@Override
public ConstructorWriterImpl getConstructorWriter(ClassWriter classWriter) {
return new ConstructorWriterImpl((ClassWriterImpl) classWriter,
classWriter.getTypeElement());
}
@Override
public MemberSummaryWriter getMemberSummaryWriter(ClassWriter classWriter,
VisibleMemberTable.Kind memberType) {
switch (memberType) {
case CONSTRUCTORS:
return getConstructorWriter(classWriter);
case ENUM_CONSTANTS:
return getEnumConstantWriter(classWriter);
case ANNOTATION_TYPE_MEMBER_OPTIONAL:
return getAnnotationTypeOptionalMemberWriter(classWriter);
case ANNOTATION_TYPE_MEMBER_REQUIRED:
return getAnnotationTypeRequiredMemberWriter(classWriter);
case FIELDS:
return getFieldWriter(classWriter);
case PROPERTIES:
return getPropertyWriter(classWriter);
case NESTED_CLASSES:
return new NestedClassWriterImpl((SubWriterHolderWriter)
classWriter, classWriter.getTypeElement());
case METHODS:
return getMethodWriter(classWriter);
default:
return null;
}
}
@Override
public SerializedFormWriter getSerializedFormWriter() {
return new SerializedFormWriterImpl(configuration);
}
@Override
public DocFilesHandler getDocFilesHandler(Element element) {
return new DocFilesHandlerImpl(configuration, element);
}
}

@ -25,7 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html.markup; package jdk.javadoc.internal.doclets.formats.html.markup;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;

@ -29,7 +29,7 @@ import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.util.Objects; import java.util.Objects;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* Class for generating a comment for HTML pages of javadoc output. * Class for generating a comment for HTML pages of javadoc output.

@ -31,7 +31,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* A sequence of Content nodes. * A sequence of Content nodes.

@ -25,7 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html.markup; package jdk.javadoc.internal.doclets.formats.html.markup;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;

@ -34,7 +34,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -29,7 +29,7 @@ import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;

@ -39,7 +39,7 @@ import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr.Role; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr.Role;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* A tree node representing an HTML element, containing the name of the element, * A tree node representing an HTML element, containing the name of the element,

@ -25,7 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html.markup; package jdk.javadoc.internal.doclets.formats.html.markup;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocLink; import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPath;

@ -28,7 +28,7 @@ package jdk.javadoc.internal.doclets.formats.html.markup;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* Class for generating raw HTML content to be added to HTML pages of javadoc output. * Class for generating raw HTML content to be added to HTML pages of javadoc output.

@ -28,8 +28,7 @@ package jdk.javadoc.internal.doclets.formats.html.markup;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
/** /**
* A builder for HTML script elements. * A builder for HTML script elements.
@ -165,7 +164,7 @@ public class Script {
sb.append("\\\""); sb.append("\\\"");
break; break;
case '\'': case '\'':
sb.append("\\\'"); sb.append("\\'");
break; break;
case '\\': case '\\':
sb.append("\\\\"); sb.append("\\\\");

@ -28,7 +28,7 @@ package jdk.javadoc.internal.doclets.formats.html.markup;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* Class for containing immutable string content for HTML tags of javadoc output. * Class for containing immutable string content for HTML tags of javadoc output.

@ -28,7 +28,7 @@ package jdk.javadoc.internal.doclets.formats.html.markup;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* Class for generating string content for HTML tags of javadoc output. * Class for generating string content for HTML tags of javadoc output.

@ -33,7 +33,7 @@ import com.sun.source.doctree.DocTree;
import jdk.javadoc.doclet.Taglet.Location; import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.Messages;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;

@ -38,7 +38,7 @@ import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; 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.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
/** /**

@ -34,7 +34,7 @@ import com.sun.source.doctree.DocTree;
import jdk.javadoc.doclet.Taglet; import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* An inline taglet representing {@code {@docRoot}}. This taglet is * An inline taglet representing {@code {@docRoot}}. This taglet is

@ -35,7 +35,7 @@ import com.sun.source.doctree.TextTree;
import jdk.javadoc.doclet.Taglet; import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* An inline taglet used to index a word or a phrase. * An inline taglet used to index a word or a phrase.

@ -39,7 +39,7 @@ import com.sun.source.util.DocTreePath;
import jdk.javadoc.doclet.Taglet.Location; import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder.Result; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder.Result;

@ -43,12 +43,12 @@ import com.sun.source.doctree.LinkTree;
import com.sun.source.util.DocTreePath; import com.sun.source.util.DocTreePath;
import jdk.javadoc.doclet.Taglet; import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.formats.html.ClassWriterImpl; import jdk.javadoc.internal.doclets.formats.html.ClassWriter;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo; import jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocLink; import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
@ -237,7 +237,7 @@ public class LinkTaglet extends BaseTaglet {
// documented, this must be an inherited link. Redirect it. // documented, this must be an inherited link. Redirect it.
// The current class either overrides the referenced member or // The current class either overrides the referenced member or
// inherits it automatically. // inherits it automatically.
if (htmlWriter instanceof ClassWriterImpl cw) { if (htmlWriter instanceof ClassWriter cw) {
containing = cw.getTypeElement(); containing = cw.getTypeElement();
} else if (!utils.isPublic(containing)) { } else if (!utils.isPublic(containing)) {
reportWarning.accept("doclet.link.see.reference_not_accessible", reportWarning.accept("doclet.link.see.reference_not_accessible",

@ -36,7 +36,7 @@ import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* An inline taglet used to denote literal text, possibly in monospace font. * An inline taglet used to denote literal text, possibly in monospace font.

@ -46,7 +46,7 @@ import jdk.javadoc.internal.doclets.formats.html.HtmlIds;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;

@ -43,7 +43,7 @@ import jdk.javadoc.internal.doclets.formats.html.Contents;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;

@ -39,15 +39,15 @@ import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.SeeTree; import com.sun.source.doctree.SeeTree;
import jdk.javadoc.doclet.Taglet; import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.formats.html.ClassWriterImpl; import jdk.javadoc.internal.doclets.formats.html.ClassWriter;
import jdk.javadoc.internal.doclets.formats.html.Contents; import jdk.javadoc.internal.doclets.formats.html.Contents;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter; import jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter;
import jdk.javadoc.internal.doclets.formats.html.SerializedFormWriter;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.builders.SerializedFormBuilder;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
import jdk.javadoc.internal.doclets.toolkit.util.DocLink; import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
@ -107,7 +107,7 @@ public class SeeTaglet extends BaseTaglet implements InheritableTaglet {
links.add(seeTagOutput(holder, dt)); links.add(seeTagOutput(holder, dt));
} }
if (utils.isVariableElement(holder) && ((VariableElement)holder).getConstantValue() != null && if (utils.isVariableElement(holder) && ((VariableElement)holder).getConstantValue() != null &&
htmlWriter instanceof ClassWriterImpl classWriter) { htmlWriter instanceof ClassWriter classWriter) {
//Automatically add link to constant values page for constant fields. //Automatically add link to constant values page for constant fields.
DocPath constantsPath = DocPath constantsPath =
htmlWriter.pathToRoot.resolve(DocPaths.CONSTANT_VALUES); htmlWriter.pathToRoot.resolve(DocPaths.CONSTANT_VALUES);
@ -120,8 +120,8 @@ public class SeeTaglet extends BaseTaglet implements InheritableTaglet {
} }
if (utils.isClass(holder) && utils.isSerializable((TypeElement)holder)) { if (utils.isClass(holder) && utils.isSerializable((TypeElement)holder)) {
//Automatically add link to serialized form page for serializable classes. //Automatically add link to serialized form page for serializable classes.
if (SerializedFormBuilder.serialInclude(utils, holder) && if (SerializedFormWriter.serialInclude(utils, holder) &&
SerializedFormBuilder.serialInclude(utils, utils.containingPackage(holder))) { SerializedFormWriter.serialInclude(utils, utils.containingPackage(holder))) {
DocPath serialPath = htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM); DocPath serialPath = htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM);
DocLink link = serialPath.fragment(utils.getFullyQualifiedName(holder)); DocLink link = serialPath.fragment(utils.getFullyQualifiedName(holder));
links.add(htmlWriter.links.createLink(link, links.add(htmlWriter.links.createLink(link,

@ -36,14 +36,13 @@ import javax.lang.model.element.ExecutableElement;
import com.sun.source.doctree.BlockTagTree; import com.sun.source.doctree.BlockTagTree;
import com.sun.source.doctree.DocTree; import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.UnknownBlockTagTree;
import jdk.javadoc.doclet.Taglet; import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
/** /**
@ -184,7 +183,7 @@ public class SimpleTaglet extends BaseTaglet implements InheritableTaglet {
if (header == null || tags.isEmpty()) { if (header == null || tags.isEmpty()) {
return null; return null;
} }
return simpleBlockTagOutput(holder, tags, header, tagletWriter); return simpleBlockTagOutput(holder, tags, header);
} }
/** /**
@ -198,8 +197,7 @@ public class SimpleTaglet extends BaseTaglet implements InheritableTaglet {
*/ */
private Content simpleBlockTagOutput(Element element, private Content simpleBlockTagOutput(Element element,
List<? extends DocTree> simpleTags, List<? extends DocTree> simpleTags,
String header, String header) {
TagletWriter writer) {
var ch = utils.getCommentHelper(element); var ch = utils.getCommentHelper(element);
var context = tagletWriter.context; var context = tagletWriter.context;
var htmlWriter = tagletWriter.htmlWriter; var htmlWriter = tagletWriter.htmlWriter;

@ -59,7 +59,7 @@ import jdk.javadoc.internal.doclets.formats.html.taglets.snippet.ParseException;
import jdk.javadoc.internal.doclets.formats.html.taglets.snippet.Parser; import jdk.javadoc.internal.doclets.formats.html.taglets.snippet.Parser;
import jdk.javadoc.internal.doclets.formats.html.taglets.snippet.Style; import jdk.javadoc.internal.doclets.formats.html.taglets.snippet.Style;
import jdk.javadoc.internal.doclets.formats.html.taglets.snippet.StyledText; import jdk.javadoc.internal.doclets.formats.html.taglets.snippet.StyledText;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.DocletElement; import jdk.javadoc.internal.doclets.toolkit.DocletElement;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;

@ -46,7 +46,7 @@ import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;

@ -34,7 +34,7 @@ import com.sun.source.doctree.SummaryTree;
import jdk.javadoc.doclet.Taglet.Location; import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* A taglet that represents the {@code {@summary}} tag. * A taglet that represents the {@code {@summary}} tag.

@ -35,7 +35,7 @@ import com.sun.source.doctree.SystemPropertyTree;
import jdk.javadoc.doclet.Taglet; import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* A taglet that represents the {@code @systemProperty} tag. * A taglet that represents the {@code @systemProperty} tag.

@ -31,7 +31,7 @@ import javax.lang.model.element.Element;
import com.sun.source.doctree.DocTree; import com.sun.source.doctree.DocTree;
import jdk.javadoc.doclet.Taglet.Location; import jdk.javadoc.doclet.Taglet.Location;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* This is the taglet interface used internally within the doclet. * This is the taglet interface used internally within the doclet.

@ -54,7 +54,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlId;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.formats.html.taglets.Taglet.UnsupportedTagletOperationException; import jdk.javadoc.internal.doclets.formats.html.taglets.Taglet.UnsupportedTagletOperationException;
import jdk.javadoc.internal.doclets.toolkit.DocletElement; import jdk.javadoc.internal.doclets.toolkit.DocletElement;
import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.Resources;

@ -59,7 +59,7 @@ import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo; import jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder; import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;

@ -33,7 +33,7 @@ import javax.lang.model.element.Element;
import com.sun.source.doctree.DocTree; import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
/** /**
* A taglet wrapper, allows the public taglet {@link jdk.javadoc.doclet.Taglet} * A taglet wrapper, allows the public taglet {@link jdk.javadoc.doclet.Taglet}

@ -41,7 +41,7 @@ import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo; import jdk.javadoc.internal.doclets.formats.html.HtmlLinkInfo;
import jdk.javadoc.internal.doclets.formats.html.markup.Text; import jdk.javadoc.internal.doclets.formats.html.markup.Text;
import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.formats.html.Content;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
/** /**

@ -35,8 +35,6 @@ import javax.lang.model.element.TypeElement;
import jdk.javadoc.doclet.Doclet; import jdk.javadoc.doclet.Doclet;
import jdk.javadoc.doclet.DocletEnvironment; import jdk.javadoc.doclet.DocletEnvironment;
import jdk.javadoc.internal.doclets.toolkit.builders.AbstractBuilder;
import jdk.javadoc.internal.doclets.toolkit.builders.BuilderFactory;
import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.UncheckedDocletException; import jdk.javadoc.internal.doclets.toolkit.util.UncheckedDocletException;
@ -193,13 +191,7 @@ public abstract class AbstractDoclet implements Doclet {
* @param classTree the data structure representing the class tree * @param classTree the data structure representing the class tree
* @throws DocletException if there is a problem while generating the documentation * @throws DocletException if there is a problem while generating the documentation
*/ */
protected void generateOtherFiles(ClassTree classTree) throws DocletException { protected void generateOtherFiles(ClassTree classTree) throws DocletException { }
BuilderFactory builderFactory = configuration.getBuilderFactory();
AbstractBuilder constantsSummaryBuilder = builderFactory.getConstantsSummaryBuilder();
constantsSummaryBuilder.build();
AbstractBuilder serializedFormBuilder = builderFactory.getSerializedFormBuilder();
serializedFormBuilder.build();
}
/** /**
* Generate the module documentation. * Generate the module documentation.

@ -1,119 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import javax.lang.model.element.Element;
/**
* The interface for writing annotation type required member output.
*/
public interface AnnotationTypeMemberWriter extends MemberWriter {
/**
* Adds the annotation type member header.
*
* @return the content for the member header
*/
Content getMemberHeader();
/**
* Adds the annotation type details marker.
*
* @param memberDetails the content representing details marker
*/
void addAnnotationDetailsMarker(Content memberDetails);
/**
* Adds the annotation type details header.
*
* @return the content for the annotation details header
*/
Content getAnnotationDetailsHeader();
/**
* Gets the annotation type documentation header.
*
* @param member the annotation type being documented
* @return the content for the annotation type documentation header
*/
Content getAnnotationHeaderContent(Element member);
/**
* Gets the annotation type details.
*
* @param annotationDetailsHeader the content representing annotation type details header
* @param annotationDetails the content representing annotation type details
* @return the annotation type details
*/
Content getAnnotationDetails(Content annotationDetailsHeader, Content annotationDetails);
/**
* {@return the signature for the specified member}
*
* @param member the member being documented
*/
Content getSignature(Element member);
/**
* Adds the deprecated output for the given member.
*
* @param member the member being documented
* @param target the content to which the deprecated information will be added
*/
void addDeprecated(Element member, Content target);
/**
* Adds the preview output for the given member.
*
* @param member the member being documented
* @param content the content to which the preview information will be added
*/
void addPreview(Element member, Content content);
/**
* Adds the comments for the given member.
*
* @param member the member being documented
* @param annotationContent the content to which the comments will be added
*/
void addComments(Element member, Content annotationContent);
/**
* Adds the tags for the given member.
*
* @param member the member being documented
* @param annotationContent the content to which the tags will be added
*/
void addTags(Element member, Content annotationContent);
/**
* Adds the default value documentation if the member has one.
*
* @param member the member being documented
* @param annotationContent the content to which the default value will be added
*/
void addDefaultValueInfo(Element member, Content annotationContent);
}

@ -60,7 +60,6 @@ import jdk.javadoc.doclet.DocletEnvironment;
import jdk.javadoc.doclet.Reporter; import jdk.javadoc.doclet.Reporter;
import jdk.javadoc.doclet.StandardDoclet; import jdk.javadoc.doclet.StandardDoclet;
import jdk.javadoc.doclet.Taglet; import jdk.javadoc.doclet.Taglet;
import jdk.javadoc.internal.doclets.toolkit.builders.BuilderFactory;
import jdk.javadoc.internal.doclets.toolkit.util.Comparators; import jdk.javadoc.internal.doclets.toolkit.util.Comparators;
import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileFactory; import jdk.javadoc.internal.doclets.toolkit.util.DocFileFactory;
@ -87,11 +86,6 @@ public abstract class BaseConfiguration {
*/ */
public final Doclet doclet; public final Doclet doclet;
/**
* The factory for builders.
*/
protected BuilderFactory builderFactory;
/** /**
* The meta tag keywords instance. * The meta tag keywords instance.
*/ */
@ -249,18 +243,6 @@ public abstract class BaseConfiguration {
includedTypeElements = Collections.unmodifiableSet(includedSplitter.tset); includedTypeElements = Collections.unmodifiableSet(includedSplitter.tset);
} }
/**
* Return the builder factory for this doclet.
*
* @return the builder factory for this doclet.
*/
public BuilderFactory getBuilderFactory() {
if (builderFactory == null) {
builderFactory = new BuilderFactory(this);
}
return builderFactory;
}
public Reporter getReporter() { public Reporter getReporter() {
return this.reporter; return this.reporter;
} }
@ -482,13 +464,6 @@ public abstract class BaseConfiguration {
return !(utils.isDeprecated(te) || utils.isDeprecated(utils.containingPackage(te))); return !(utils.isDeprecated(te) || utils.isDeprecated(utils.containingPackage(te)));
} }
/**
* Return the doclet specific instance of a writer factory.
*
* @return the {@link WriterFactory} for the doclet.
*/
public abstract WriterFactory getWriterFactory();
/** /**
* Return the Locale for this document. * Return the Locale for this document.
* *

@ -1,228 +0,0 @@
/*
* Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
/**
* The interface for writing class output.
*/
public interface ClassWriter {
/**
* Returns an instance of an output object.
*
* @return an instance of an output object
*/
Content getOutputInstance();
/**
* Get the header of the page.
*
* @param header the header string to write
* @return header content that needs to be added to the documentation
*/
Content getHeader(String header);
/**
* Get the class content header.
*
* @return class content header that needs to be added to the documentation
*/
Content getClassContentHeader();
/**
* Add the class inheritance tree documentation.
*
* @param target the content to which the documentation will be added
*/
void addClassTree(Content target);
/**
* Add the type parameter and state component information.
*
* @param target the content to which the documentation will be added
*/
void addParamInfo(Content target);
/**
* Add all superinterfaces if this is an interface.
*
* @param target the content to which the documentation will be added
*/
void addSuperInterfacesInfo(Content target);
/**
* Add all implemented interfaces if this is a class.
*
* @param target the content to which the documentation will be added
*/
void addImplementedInterfacesInfo(Content target);
/**
* Add all the classes that extend this one.
*
* @param target the content to which the documentation will be added
*/
void addSubClassInfo(Content target);
/**
* Add all the interfaces that extend this one.
*
* @param target the content to which the documentation will be added
*/
void addSubInterfacesInfo(Content target);
/**
* If this is an interface, add all classes that implement this
* interface.
*
* @param target the content to which the documentation will be added
*/
void addInterfaceUsageInfo(Content target);
/**
* If this is an functional interface, display appropriate message.
*
* @param target the content to which the documentation will be added
*/
void addFunctionalInterfaceInfo(Content target);
/**
* If this is an inner class or interface, add the enclosing class or
* interface.
*
* @param target the content to which the documentation will be added
*/
void addNestedClassInfo(Content target);
/**
* {@return the class information}
*
* @param classInfo the class information
*/
Content getClassInfo(Content classInfo);
/**
* If this class is deprecated, add the appropriate information.
*
* @param classInfo the content to which the documentation will be added
*/
void addClassDeprecationInfo(Content classInfo);
/**
* Add the signature of the current class content.
*
* @param classInfo the class content to which the signature will be added
*/
void addClassSignature(Content classInfo);
/**
* Build the class description.
*
* @param classInfo the content to which the documentation will be added
*/
void addClassDescription(Content classInfo);
/**
* Add the tag information for the current class.
*
* @param classInfo the content to which the tag information will be added
*/
void addClassTagInfo(Content classInfo);
/**
* Returns a list to be used for the list of summaries for members of a given kind.
*
* @return a list to be used for the list of summaries for members of a given kind
*/
Content getSummariesList();
/**
* Returns an item for the list of summaries for members of a given kind.
*
* @param content content for the item
* @return an item for the list of summaries for members of a given kind
*/
Content getSummariesListItem(Content content);
/**
* Returns a list to be used for the list of details for members of a given kind.
*
* @return a list to be used for the list of details for members of a given kind
*/
Content getDetailsList();
/**
* Returns an item for the list of details for members of a given kind.
*
* @param content content for the item
* @return an item for the list of details for members of a given kind
*/
Content getDetailsListItem(Content content);
/**
* Add the class content.
*
* @param classContent the class content which will be added to the content
*/
void addClassContent(Content classContent);
/**
* Add the footer of the page.
*/
void addFooter();
/**
* Print the document.
*
* @param content the content that will be printed as a document
* @throws DocFileIOException if there is a problem while writing the document
*/
void printDocument(Content content) throws DocFileIOException;
/**
* Return the TypeElement being documented.
*
* @return the TypeElement being documented.
*/
TypeElement getTypeElement();
/**
* {@return the member summary}
*
* @param memberContent the content used to build the summary
*/
Content getMemberSummary(Content memberContent);
/**
* {@return the member details}
*
* @param memberContent the content used to generate the member details
*/
Content getMemberDetails(Content memberContent);
}

@ -1,129 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import java.util.*;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
/**
* The interface for writing constants summary output.
*/
public interface ConstantsSummaryWriter {
/**
* Get the header for the constant summary documentation.
*
* @return header that needs to be added to the documentation
*/
Content getHeader();
/**
* Get the header for the constant content list.
*
* @return content header that needs to be added to the documentation
*/
Content getContentsHeader();
/**
* Adds the given package name link to the constant content list.
*
* @param abbrevPackageName the abbreviated package name
* @param content the content to which the link will be added
*/
void addLinkToPackageContent(String abbrevPackageName, Content content);
/**
* Add the content list to the documentation.
*
* @param content the content that will be added to the list
*/
void addContentsList(Content content);
/**
* Get the constant summaries for the document.
*
* @return constant summaries header to be added to the documentation
*/
Content getConstantSummaries();
/**
* Adds a header for the given abbreviated package name.
*
* @param abbrevPackageName the abbreviated package name
* @param toContent the summaries documentation
*/
void addPackageGroup(String abbrevPackageName, Content toContent);
/**
* Get the class summary header for the constants summary.
*
* @return the header content for the class constants summary
*/
Content getClassConstantHeader();
/**
* Add the content list to the documentation summaries.
*
* @param fromClassConstant the class constant content that will be added to the list
*/
void addClassConstant(Content fromClassConstant);
/**
* Adds the constant member table to the documentation.
*
* @param typeElement the class whose constants are being documented.
* @param fields the constants being documented.
* @param target the content to which the constant member
* table content will be added
*/
void addConstantMembers(TypeElement typeElement, Collection<VariableElement> fields,
Content target);
/**
* Add the summaries list to the content.
*
* @param content the summaries content that will be added to the list
*/
void addConstantSummaries(Content content);
/**
* Adds the footer for the summary documentation.
*/
void addFooter();
/**
* Print the constants summary document.
*
* @param content the content which should be printed
* @throws DocFileIOException if there is a problem while writing the document
*/
void printDocument(Content content) throws DocFileIOException;
}

@ -1,107 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import javax.lang.model.element.ExecutableElement;
/**
* The interface for writing constructor output.
*/
public interface ConstructorWriter extends MemberWriter {
/**
* {@return the constructor details header}
*
* @param content the content representing member details
*/
Content getConstructorDetailsHeader(Content content);
/**
* {@return the constructor documentation header}
*
* @param constructor the constructor being documented
*/
Content getConstructorHeaderContent(ExecutableElement constructor);
/**
* {@return the signature for the given constructor}
*
* @param constructor the constructor being documented
*/
Content getSignature(ExecutableElement constructor);
/**
* Add the deprecated output for the given constructor.
*
* @param constructor the constructor being documented
* @param constructorContent the content to which the deprecated information will be added
*/
void addDeprecated(ExecutableElement constructor, Content constructorContent);
/**
* Add the preview output for the given member.
*
* @param member the member being documented
* @param content the content to which the preview information will be added
*/
void addPreview(ExecutableElement member, Content content);
/**
* Add the comments for the given constructor.
*
* @param constructor the constructor being documented
* @param constructorContent the content to which the comments will be added
*/
void addComments(ExecutableElement constructor, Content constructorContent);
/**
* Add the tags for the given constructor.
*
* @param constructor the constructor being documented
* @param constructorContent the content to which the tags will be added
*/
void addTags(ExecutableElement constructor, Content constructorContent);
/**
* {@return the constructor details}
*
* @param memberDetailsHeader the content representing member details header
* @param memberDetails the content representing member details
*/
Content getConstructorDetails(Content memberDetailsHeader, Content memberDetails);
/**
* Let the writer know whether a non public constructor was found.
*
* @param foundNonPubConstructor true if we found a non public constructor.
*/
void setFoundNonPubConstructor(boolean foundNonPubConstructor);
/**
* @return the member header}
*/
Content getMemberHeader();
}

@ -1,39 +0,0 @@
/*
* Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import java.util.List;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
/**
* The interface for copying doc-files to the output.
*/
public interface DocFilesHandler {
void copyDocFiles() throws DocletException;
List<DocPath> getStylesheets() throws DocletException;
}

@ -1,111 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
/**
* The interface for writing enum constant output.
*/
public interface EnumConstantWriter extends MemberWriter {
/**
* Get the enum constants details header.
*
* @param typeElement the class being documented
* @param memberDetails the content representing member details
* @return a content for the enum constants details header
*/
Content getEnumConstantsDetailsHeader(TypeElement typeElement,
Content memberDetails);
/**
* Get the enum constants documentation header.
*
* @param enumConstant the enum constant being documented
* @param enumConstantsDetails the content representing enum constant details
* @return the enum constant documentation header
*/
Content getEnumConstantsHeader(VariableElement enumConstant,
Content enumConstantsDetails);
/**
* Get the signature for the given enum constant.
*
* @param enumConstant the enum constant being documented
* @return the enum constant signature
*/
Content getSignature(VariableElement enumConstant);
/**
* Add the deprecated output for the given enum constant.
*
* @param enumConstant the enum constant being documented
* @param content the content to which the deprecated information will be added
*/
void addDeprecated(VariableElement enumConstant, Content content);
/**
* Add the preview output for the given member.
*
* @param member the member being documented
* @param content the content to which the preview information will be added
*/
void addPreview(VariableElement member, Content content);
/**
* Add the comments for the given enum constant.
*
* @param enumConstant the enum constant being documented
* @param enumConstants the content to which the comments will be added
*/
void addComments(VariableElement enumConstant, Content enumConstants);
/**
* Add the tags for the given enum constant.
*
* @param enumConstant the enum constant being documented
* @param content the content to which the tags will be added
*/
void addTags(VariableElement enumConstant, Content content);
/**
* Get the enum constants details.
*
* @param memberDetailsHeader member details header
* @param content the content representing member details
* @return the enum constant details
*/
Content getEnumConstantsDetails(Content memberDetailsHeader, Content content);
/**
* Gets the member header.
*
* @return the member header
*/
Content getMemberHeader();
}

@ -1,106 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import javax.lang.model.element.VariableElement;
/**
* The interface for writing field output.
*/
public interface FieldWriter extends MemberWriter {
/**
* Get the field details header.
*
* @param content the content representing member details
* @return the field details header
*/
Content getFieldDetailsHeader(Content content);
/**
* Get the field documentation header.
*
* @param field the constructor being documented
* @return the field documentation header
*/
Content getFieldHeaderContent(VariableElement field);
/**
* Get the signature for the given field.
*
* @param field the field being documented
* @return the field signature
*/
Content getSignature(VariableElement field);
/**
* Add the deprecated output for the given field.
*
* @param field the field being documented
* @param fieldContent the content to which the deprecated information will be added
*/
void addDeprecated(VariableElement field, Content fieldContent);
/**
* Adds the preview output for the given member.
*
* @param member the member being documented
* @param content the content to which the preview information will be added
*/
void addPreview(VariableElement member, Content content);
/**
* Add the comments for the given field.
*
* @param field the field being documented
* @param fieldContent the content to which the comments will be added
*/
void addComments(VariableElement field, Content fieldContent);
/**
* Add the tags for the given field.
*
* @param field the field being documented
* @param fieldContent the content to which the tags will be added
*/
void addTags(VariableElement field, Content fieldContent);
/**
* Get the field details.
*
* @param memberDetailsHeaderContent the content representing member details header
* @param memberContent the content representing member details
* @return the field details
*/
Content getFieldDetails(Content memberDetailsHeaderContent, Content memberContent);
/**
* Gets the member header.
*
* @return the member header
*/
Content getMemberHeader();
}

@ -1,114 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import java.util.*;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import com.sun.source.doctree.DocTree;
/**
* The interface for writing member summary output.
*/
public interface MemberSummaryWriter {
/**
* Returns the member summary header for the given class.
*
* @param typeElement the class the summary belongs to
* @param content the content to which the member summary will be added
*
* @return the member summary header
*/
Content getMemberSummaryHeader(TypeElement typeElement, Content content);
/**
* Returns the summary table for the given class.
*
* @param typeElement the class the summary table belongs to
*
* @return the summary table
*/
Content getSummaryTable(TypeElement typeElement);
/**
* Adds the member summary for the given class and member.
*
* @param typeElement the class the summary belongs to
* @param member the member that is documented
* @param firstSentenceTrees the tags for the sentence being documented
*/
void addMemberSummary(TypeElement typeElement, Element member,
List<? extends DocTree> firstSentenceTrees);
/**
* Returns the inherited member summary header for the given class.
*
* @param typeElement the class the summary belongs to
*
* @return the inherited member summary header
*/
Content getInheritedSummaryHeader(TypeElement typeElement);
/**
* Adds the inherited member summary for the given class and member.
*
* @param typeElement the class the inherited member belongs to
* @param member the inherited member that is being documented
* @param isFirst true if this is the first member in the list
* @param isLast true if this is the last member in the list
* @param content the content to which the links will be added
*/
void addInheritedMemberSummary(TypeElement typeElement,
Element member, boolean isFirst, boolean isLast,
Content content);
/**
* Returns the inherited summary links.
*
* @return the inherited summary links
*/
Content getInheritedSummaryLinks();
/**
* Adds the given summary to the list of summaries.
*
* @param summariesList the list of summaries
* @param content the summary
*/
void addSummary(Content summariesList, Content content);
/**
* Returns the member content.
*
* @param memberContent the content representing the member
*
* @return the member content
*/
Content getMember(Content memberContent);
}

@ -1,47 +0,0 @@
/*
* Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
/**
* Common behavior for writing members of a type.
*/
public interface MemberWriter {
/**
* {@return a list to add member items to}
*
* @see #getMemberListItem(Content)
*/
Content getMemberList();
/**
* {@return a member item}
*
* @param member the member to represent as an item
* @see #getMemberList()
*/
Content getMemberListItem(Content member);
}

@ -1,108 +0,0 @@
/*
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.type.TypeMirror;
/**
* The interface for writing method output.
*/
public interface MethodWriter extends MemberWriter {
/**
* Get the method details header.
*
* @param content the content representing member details
* @return the method details header
*/
Content getMethodDetailsHeader(Content content);
/**
* Get the method documentation header.
*
* @param method the method being documented
* @return the method documentation header
*/
Content getMethodHeader(ExecutableElement method);
/**
* Get the signature for the given method.
*
* @param method the method being documented
* @return the method signature
*/
Content getSignature(ExecutableElement method);
/**
* Add the deprecated output for the given method.
*
* @param method the method being documented
* @param methodContent the content to which the deprecated information will be added
*/
void addDeprecated(ExecutableElement method, Content methodContent);
/**
* Adds the preview output for the given member.
*
* @param member the member being documented
* @param content the content to which the preview information will be added
*/
void addPreview(ExecutableElement member, Content content);
/**
* Add the comments for the given method.
*
* @param holder the holder type (not erasure) of the method
* @param method the method being documented
* @param methodContent the content to which the comments will be added
*/
void addComments(TypeMirror holder, ExecutableElement method, Content methodContent);
/**
* Add the tags for the given method.
*
* @param method the method being documented
* @param methodContent the content to which the tags will be added
*/
void addTags(ExecutableElement method, Content methodContent);
/**
* Get the method details.
*
* @param methodDetailsHeader the content representing method details header
* @param methodDetails the content representing method details
* @return the method details
*/
Content getMethodDetails(Content methodDetailsHeader, Content methodDetails);
/**
* Gets the member header.
*
* @return the member header
*/
Content getMemberHeader();
}

@ -1,121 +0,0 @@
/*
* Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
/**
* The interface for writing module summary output.
*/
public interface ModuleSummaryWriter {
/**
* Get the header for the summary.
*
* @param heading module name.
* @return the header to be added to the content
*/
Content getModuleHeader(String heading);
/**
* Get the header for the module content.
*
* @return the module content header
*/
Content getContentHeader();
/**
* Get the header for the summary header.
*
* @return the summary header
*/
Content getSummariesList();
/**
* Wrap the content into summary section.
*
* @param source the content to wrap into the summary section
* @return the summary
*/
Content getSummary(Content source);
/**
* Adds the module description.
*
* @param moduleContent the content to which the module description
* will be added
*/
void addModuleDescription(Content moduleContent);
/**
* Adds the module signature.
*
* @param moduleContent the content to which the module signature
* will be added
*/
void addModuleSignature(Content moduleContent);
/**
* Adds the summary of modules to the list of summaries.
*
* @param summariesList the list of summaries
*/
void addModulesSummary(Content summariesList);
/**
* Adds the summary of packages to the list of summaries.
*
* @param summariesList the list of summaries
*/
void addPackagesSummary(Content summariesList);
/**
* Adds the summary of services to the list of summaries.
*
* @param summariesList the list of summaries
*/
void addServicesSummary(Content summariesList);
/**
* Adds the module content to the documentation.
*
* @param source the content that will be added
*/
void addModuleContent(Content source);
/**
* Adds the footer to the documentation.
*/
void addModuleFooter();
/**
* Print the module summary document.
*
* @param content the content that will be printed
* @throws DocFileIOException if there is a problem while writing the document
*/
void printDocument(Content content) throws DocFileIOException;
}

Some files were not shown because too many files have changed in this diff Show More