mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 03:58:21 +00:00
8350920: Allow inherited member summaries to be viewed inline
Reviewed-by: liach, nbenalla
This commit is contained in:
parent
173dedfb24
commit
caaef3a04c
@ -28,7 +28,9 @@ package jdk.javadoc.internal.doclets.formats.html;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
@ -45,6 +47,7 @@ import javax.lang.model.type.TypeMirror;
|
||||
import com.sun.source.doctree.DocTree;
|
||||
|
||||
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyles;
|
||||
import jdk.javadoc.internal.doclets.toolkit.PropertyUtils;
|
||||
import jdk.javadoc.internal.doclets.toolkit.Resources;
|
||||
import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
|
||||
import jdk.javadoc.internal.doclets.toolkit.util.Utils;
|
||||
@ -52,6 +55,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
|
||||
import jdk.javadoc.internal.html.Content;
|
||||
import jdk.javadoc.internal.html.ContentBuilder;
|
||||
import jdk.javadoc.internal.html.Entity;
|
||||
import jdk.javadoc.internal.html.HtmlId;
|
||||
import jdk.javadoc.internal.html.HtmlTree;
|
||||
import jdk.javadoc.internal.html.Text;
|
||||
|
||||
@ -206,16 +210,18 @@ public abstract class AbstractMemberWriter {
|
||||
public void buildSummary(Content target)
|
||||
{
|
||||
var summaryTreeList = new ArrayList<Content>();
|
||||
|
||||
buildMainSummary(summaryTreeList);
|
||||
var inheritedTocEntries = new LinkedHashMap<HtmlId, Content>();
|
||||
var ownMemberCount = buildMainSummary(summaryTreeList);
|
||||
var inheritedSummaries = 0;
|
||||
|
||||
var showInherited = switch (kind) {
|
||||
case FIELDS, METHODS, NESTED_CLASSES, PROPERTIES -> true;
|
||||
case ANNOTATION_TYPE_MEMBER, ANNOTATION_TYPE_MEMBER_OPTIONAL, ANNOTATION_TYPE_MEMBER_REQUIRED,
|
||||
CONSTRUCTORS, ENUM_CONSTANTS -> false;
|
||||
};
|
||||
if (showInherited)
|
||||
buildInheritedSummary(summaryTreeList);
|
||||
if (showInherited) {
|
||||
inheritedSummaries = buildInheritedSummary(summaryTreeList, inheritedTocEntries);
|
||||
}
|
||||
|
||||
if (!summaryTreeList.isEmpty()) {
|
||||
Content member = getMemberSummaryHeader(target);
|
||||
@ -223,6 +229,12 @@ public abstract class AbstractMemberWriter {
|
||||
buildSummary(target, member);
|
||||
writer.tableOfContents.addLink(HtmlIds.forMemberSummary(kind), getSummaryLabel(),
|
||||
TableOfContents.Level.FIRST);
|
||||
|
||||
// Omit TOC entries for inherited members unless there's a substantial number of own members.
|
||||
if (!inheritedTocEntries.isEmpty() && ownMemberCount > 8 && inheritedSummaries > 0) {
|
||||
inheritedTocEntries.forEach((key, value)
|
||||
-> writer.tableOfContents.addLink(key, value, TableOfContents.Level.SECOND));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -230,40 +242,61 @@ public abstract class AbstractMemberWriter {
|
||||
* Builds the main summary table for the members of this kind.
|
||||
*
|
||||
* @param summaryTreeList the list of contents to which the documentation will be added
|
||||
* @return the number of documented members
|
||||
*/
|
||||
private void buildMainSummary(List<Content> summaryTreeList) {
|
||||
private int buildMainSummary(List<Content> summaryTreeList) {
|
||||
Set<? extends Element> members = asSortedSet(visibleMemberTable.getVisibleMembers(kind));
|
||||
if (!members.isEmpty()) {
|
||||
var pHelper = writer.getPropertyHelper();
|
||||
var table = getSummaryTable();
|
||||
for (Element member : members) {
|
||||
final Element property = pHelper.getPropertyElement(member);
|
||||
if (property != null && member instanceof ExecutableElement ee) {
|
||||
configuration.cmtUtils.updatePropertyMethodComment(ee, property);
|
||||
}
|
||||
if (utils.isMethod(member)) {
|
||||
var docFinder = utils.docFinder();
|
||||
Optional<List<? extends DocTree>> r = docFinder.search((ExecutableElement) member, (m -> {
|
||||
var firstSentenceTrees = utils.getFirstSentenceTrees(m);
|
||||
Optional<List<? extends DocTree>> optional = firstSentenceTrees.isEmpty() ? Optional.empty() : Optional.of(firstSentenceTrees);
|
||||
return DocFinder.Result.fromOptional(optional);
|
||||
})).toOptional();
|
||||
// The fact that we use `member` for possibly unrelated tags is suspicious
|
||||
addMemberSummary(typeElement, member, r.orElse(List.of()));
|
||||
} else {
|
||||
addMemberSummary(typeElement, member, utils.getFirstSentenceTrees(member));
|
||||
}
|
||||
addMemberSummaryTableRow(typeElement, member, table, pHelper);
|
||||
}
|
||||
summaryTreeList.add(getSummaryTable(typeElement));
|
||||
}
|
||||
return members.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the summary table row for a member.
|
||||
* @param enclosingType the enclosing type of the member
|
||||
* @param member the member
|
||||
* @param table the summary table
|
||||
* @param propertyHelper property helper to patch doctree
|
||||
*/
|
||||
private void addMemberSummaryTableRow(TypeElement enclosingType, Element member, Table<Element> table,
|
||||
PropertyUtils.PropertyHelper propertyHelper) {
|
||||
final Element property = propertyHelper.getPropertyElement(member);
|
||||
if (property != null && member instanceof ExecutableElement ee) {
|
||||
configuration.cmtUtils.updatePropertyMethodComment(ee, property);
|
||||
}
|
||||
|
||||
if (utils.isMethod(member)) {
|
||||
var docFinder = utils.docFinder();
|
||||
Optional<List<? extends DocTree>> r = docFinder.search((ExecutableElement) member, (m -> {
|
||||
var firstSentenceTrees = utils.getFirstSentenceTrees(m);
|
||||
Optional<List<? extends DocTree>> optional = firstSentenceTrees.isEmpty()
|
||||
? Optional.empty() : Optional.of(firstSentenceTrees);
|
||||
return DocFinder.Result.fromOptional(optional);
|
||||
})).toOptional();
|
||||
// The fact that we use `member` for possibly unrelated tags is suspicious
|
||||
addMemberSummary(enclosingType, member, r.orElse(List.of()), table);
|
||||
} else {
|
||||
addMemberSummary(enclosingType, member, utils.getFirstSentenceTrees(member), table);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the inherited member summary for the members of this kind.
|
||||
*
|
||||
* @param targets the list of contents to which the documentation will be added
|
||||
* @param tocEntries map of TOC entries for added summaries
|
||||
* @return the number of added summary lists, excluding methods from java.lang.Object
|
||||
*/
|
||||
private void buildInheritedSummary(List<Content> targets) {
|
||||
private int buildInheritedSummary(List<Content> targets, Map<HtmlId, Content> tocEntries) {
|
||||
var inheritedMembersFromMap = asSortedSet(visibleMemberTable.getAllVisibleMembers(kind));
|
||||
// Avoid showing TOC entry if it's just methods inherited from java.lang.Object
|
||||
var summaryCount = kind == METHODS && utils.isClass(typeElement) ? -1 : 0;
|
||||
|
||||
for (TypeElement inheritedClass : visibleMemberTable.getVisibleTypeElements()) {
|
||||
if (!utils.isVisible(inheritedClass)) {
|
||||
@ -284,9 +317,27 @@ public abstract class AbstractMemberWriter {
|
||||
Content links = getInheritedSummaryLinks();
|
||||
addSummaryFootNote(inheritedClass, inheritedMembers, links);
|
||||
inheritedHeader.add(links);
|
||||
|
||||
if (utils.isIncluded(inheritedClass)) {
|
||||
var pHelper = writer.getPropertyHelper();
|
||||
Table<Element> table = createInheritedSummaryTable(inheritedClass);
|
||||
|
||||
for (Element member : inheritedMembers) {
|
||||
addMemberSummaryTableRow(inheritedClass, member, table, pHelper);
|
||||
}
|
||||
|
||||
inheritedHeader.add(table);
|
||||
}
|
||||
targets.add(inheritedHeader);
|
||||
|
||||
summaryCount++;
|
||||
var label = new ContentBuilder();
|
||||
addInheritedSummaryLabel(inheritedClass, label);
|
||||
tocEntries.put(getInheritedSummaryId(inheritedClass), label.stripTags());
|
||||
}
|
||||
}
|
||||
|
||||
return summaryCount;
|
||||
}
|
||||
|
||||
private void addSummaryFootNote(TypeElement inheritedClass, Iterable<Element> inheritedMembers,
|
||||
@ -328,6 +379,7 @@ public abstract class AbstractMemberWriter {
|
||||
* @return the member summary header
|
||||
*/
|
||||
public abstract Content getMemberSummaryHeader(Content content);
|
||||
|
||||
/**
|
||||
* Adds the given summary to the list of summaries.
|
||||
*
|
||||
@ -383,13 +435,37 @@ public abstract class AbstractMemberWriter {
|
||||
*/
|
||||
protected abstract Table<Element> createSummaryTable();
|
||||
|
||||
/**
|
||||
* Creates a summary table for members of the kind supported by this writer inherited
|
||||
* from {@code typeElement}.
|
||||
*
|
||||
* @param typeElement the superclass or interface
|
||||
* @return a summary table
|
||||
*/
|
||||
protected Table<Element> createInheritedSummaryTable(TypeElement typeElement) {
|
||||
throw new UnsupportedOperationException("Inherited summary not supported for " + kind);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an id for a summary table for members of the kind supported by this writer
|
||||
* inherited from {@code typeElement}.
|
||||
*
|
||||
* @param typeElement the superclass or interface
|
||||
* @return the id for the summary table
|
||||
*/
|
||||
protected HtmlId getInheritedSummaryId(TypeElement typeElement) {
|
||||
throw new UnsupportedOperationException("Inherited summary not supported for " + kind);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds inherited summary label for the member.
|
||||
*
|
||||
* @param typeElement the type element to which to link to
|
||||
* @param content the content to which the inherited summary label will be added
|
||||
*/
|
||||
public abstract void addInheritedSummaryLabel(TypeElement typeElement, Content content);
|
||||
public void addInheritedSummaryLabel(TypeElement typeElement, Content content) {
|
||||
throw new UnsupportedOperationException("Inherited summary not supported for " + kind);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the summary type for the member.
|
||||
@ -428,8 +504,9 @@ public abstract class AbstractMemberWriter {
|
||||
* @param member the member to be documented
|
||||
* @param target the content to which the inherited summary link will be added
|
||||
*/
|
||||
protected abstract void addInheritedSummaryLink(TypeElement typeElement,
|
||||
Element member, Content target);
|
||||
protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content target) {
|
||||
throw new UnsupportedOperationException("Inherited summary not supported for " + kind);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a link for summary (deprecated, preview) pages.
|
||||
@ -616,11 +693,7 @@ public abstract class AbstractMemberWriter {
|
||||
* @param firstSentenceTrees the tags for the sentence being documented
|
||||
*/
|
||||
public void addMemberSummary(TypeElement tElement, Element member,
|
||||
List<? extends DocTree> firstSentenceTrees) {
|
||||
if (tElement != typeElement) {
|
||||
throw new IllegalStateException(getClass() + ": " + tElement + ", " + typeElement);
|
||||
}
|
||||
var table = getSummaryTable();
|
||||
List<? extends DocTree> firstSentenceTrees, Table<Element> table) {
|
||||
List<Content> rowContents = new ArrayList<>();
|
||||
Content summaryType = new ContentBuilder();
|
||||
addSummaryType(member, summaryType);
|
||||
|
||||
@ -284,10 +284,6 @@ public class AnnotationTypeMemberWriter extends AbstractMemberWriter {
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, HtmlStyles.colLast);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInheritedSummaryLabel(TypeElement typeElement, Content content) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryLink(HtmlLinkInfo.Kind context, TypeElement typeElement, Element member,
|
||||
Content content) {
|
||||
@ -297,12 +293,6 @@ public class AnnotationTypeMemberWriter extends AbstractMemberWriter {
|
||||
content.add(code);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addInheritedSummaryLink(TypeElement typeElement,
|
||||
Element member, Content target) {
|
||||
//Not applicable.
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryType(Element member, Content content) {
|
||||
addModifiersAndType(member, getType(member), content);
|
||||
|
||||
@ -30,7 +30,6 @@ import java.util.List;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.ExecutableElement;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.element.TypeParameterElement;
|
||||
|
||||
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyles;
|
||||
@ -40,7 +39,6 @@ import jdk.javadoc.internal.html.Content;
|
||||
import jdk.javadoc.internal.html.ContentBuilder;
|
||||
import jdk.javadoc.internal.html.Entity;
|
||||
import jdk.javadoc.internal.html.HtmlStyle;
|
||||
import jdk.javadoc.internal.html.HtmlTag;
|
||||
import jdk.javadoc.internal.html.HtmlTree;
|
||||
import jdk.javadoc.internal.html.Text;
|
||||
|
||||
@ -293,10 +291,6 @@ public class ConstructorWriter extends AbstractExecutableMemberWriter {
|
||||
.setColumnStyles(bodyRowStyles);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInheritedSummaryLabel(TypeElement typeElement, Content content) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryType(Element member, Content content) {
|
||||
if (threeColumnSummary()) {
|
||||
|
||||
@ -213,10 +213,6 @@ public class EnumConstantWriter extends AbstractMemberWriter {
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colLast);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInheritedSummaryLabel(TypeElement typeElement, Content content) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryLink(HtmlLinkInfo.Kind context, TypeElement typeElement, Element member,
|
||||
Content content) {
|
||||
@ -226,10 +222,6 @@ public class EnumConstantWriter extends AbstractMemberWriter {
|
||||
content.add(code);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content target) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryType(Element member, Content content) {
|
||||
//Not applicable.
|
||||
|
||||
@ -25,9 +25,6 @@
|
||||
|
||||
package jdk.javadoc.internal.doclets.formats.html;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.element.VariableElement;
|
||||
@ -38,7 +35,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
|
||||
import jdk.javadoc.internal.html.Content;
|
||||
import jdk.javadoc.internal.html.ContentBuilder;
|
||||
import jdk.javadoc.internal.html.Entity;
|
||||
import jdk.javadoc.internal.html.HtmlStyle;
|
||||
import jdk.javadoc.internal.html.HtmlId;
|
||||
import jdk.javadoc.internal.html.HtmlTree;
|
||||
import jdk.javadoc.internal.html.Text;
|
||||
|
||||
@ -219,13 +216,19 @@ public class FieldWriter extends AbstractMemberWriter {
|
||||
|
||||
@Override
|
||||
protected Table<Element> createSummaryTable() {
|
||||
List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyles.colFirst, HtmlStyles.colSecond,
|
||||
HtmlStyles.colLast);
|
||||
|
||||
return new Table<Element>(HtmlStyles.summaryTable)
|
||||
.setCaption(contents.fields)
|
||||
.setHeader(getSummaryTableHeader(typeElement))
|
||||
.setColumnStyles(bodyRowStyles);
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond,
|
||||
HtmlStyles.colLast);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Table<Element> createInheritedSummaryTable(TypeElement typeElement) {
|
||||
return new Table<Element>(HtmlStyles.summaryTable)
|
||||
.setHeader(getSummaryTableHeader(null))
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, HtmlStyles.colLast)
|
||||
.setRenderTabs(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -243,7 +246,7 @@ public class FieldWriter extends AbstractMemberWriter {
|
||||
}
|
||||
var labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING,
|
||||
label);
|
||||
labelHeading.setId(htmlIds.forInheritedFields(typeElement));
|
||||
labelHeading.setId(getInheritedSummaryId(typeElement));
|
||||
labelHeading.add(Entity.NO_BREAK_SPACE);
|
||||
labelHeading.add(classLink);
|
||||
content.add(labelHeading);
|
||||
@ -269,6 +272,11 @@ public class FieldWriter extends AbstractMemberWriter {
|
||||
addModifiersAndType(member, utils.asInstantiatedFieldType(typeElement, (VariableElement)member), content);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HtmlId getInheritedSummaryId(TypeElement typeElement) {
|
||||
return htmlIds.forInheritedFields(typeElement);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Content getSummaryLink(Element member) {
|
||||
String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName();
|
||||
|
||||
@ -324,6 +324,7 @@ public class HtmlDoclet extends AbstractDoclet {
|
||||
copyStylesheet(options);
|
||||
}
|
||||
copyResource(DocPaths.SCRIPT_JS_TEMPLATE, DocPaths.SCRIPT_FILES.resolve(DocPaths.SCRIPT_JS), true);
|
||||
copyResource(DocPaths.DOWN_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.DOWN_SVG), true);
|
||||
copyResource(DocPaths.LEFT_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.LEFT_SVG), true);
|
||||
copyResource(DocPaths.RIGHT_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.RIGHT_SVG), true);
|
||||
copyResource(DocPaths.CLIPBOARD_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.CLIPBOARD_SVG), true);
|
||||
|
||||
@ -43,6 +43,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
|
||||
import jdk.javadoc.internal.html.Content;
|
||||
import jdk.javadoc.internal.html.ContentBuilder;
|
||||
import jdk.javadoc.internal.html.Entity;
|
||||
import jdk.javadoc.internal.html.HtmlId;
|
||||
import jdk.javadoc.internal.html.HtmlTree;
|
||||
import jdk.javadoc.internal.html.Text;
|
||||
|
||||
@ -302,6 +303,14 @@ public class MethodWriter extends AbstractExecutableMemberWriter {
|
||||
e -> utils.isDeprecated(e) || utils.isDeprecated(typeElement));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Table<Element> createInheritedSummaryTable(TypeElement typeElement) {
|
||||
return new Table<Element>(HtmlStyles.summaryTable)
|
||||
.setHeader(getSummaryTableHeader(null))
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, HtmlStyles.colLast)
|
||||
.setRenderTabs(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInheritedSummaryLabel(TypeElement typeElement, Content content) {
|
||||
Content classLink = getMemberSummaryLinkOrFQN(typeElement, VisibleMemberTable.Kind.METHODS);
|
||||
@ -317,12 +326,17 @@ public class MethodWriter extends AbstractExecutableMemberWriter {
|
||||
}
|
||||
var labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING,
|
||||
label);
|
||||
labelHeading.setId(htmlIds.forInheritedMethods(typeElement));
|
||||
labelHeading.setId(getInheritedSummaryId(typeElement));
|
||||
labelHeading.add(Entity.NO_BREAK_SPACE);
|
||||
labelHeading.add(classLink);
|
||||
content.add(labelHeading);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HtmlId getInheritedSummaryId(TypeElement typeElement) {
|
||||
return htmlIds.forInheritedMethods(typeElement);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryType(Element member, Content content) {
|
||||
ExecutableElement meth = (ExecutableElement)member;
|
||||
|
||||
@ -25,9 +25,6 @@
|
||||
|
||||
package jdk.javadoc.internal.doclets.formats.html;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
|
||||
@ -36,7 +33,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
|
||||
import jdk.javadoc.internal.html.Content;
|
||||
import jdk.javadoc.internal.html.ContentBuilder;
|
||||
import jdk.javadoc.internal.html.Entity;
|
||||
import jdk.javadoc.internal.html.HtmlStyle;
|
||||
import jdk.javadoc.internal.html.HtmlId;
|
||||
import jdk.javadoc.internal.html.HtmlTree;
|
||||
import jdk.javadoc.internal.html.Text;
|
||||
|
||||
@ -94,13 +91,19 @@ public class NestedClassWriter extends AbstractMemberWriter {
|
||||
|
||||
@Override
|
||||
protected Table<Element> createSummaryTable() {
|
||||
List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyles.colFirst, HtmlStyles.colSecond,
|
||||
HtmlStyles.colLast);
|
||||
|
||||
return new Table<Element>(HtmlStyles.summaryTable)
|
||||
.setCaption(contents.getContent("doclet.Nested_Classes"))
|
||||
.setHeader(getSummaryTableHeader(typeElement))
|
||||
.setColumnStyles(bodyRowStyles);
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond,
|
||||
HtmlStyles.colLast);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Table<Element> createInheritedSummaryTable(TypeElement typeElement) {
|
||||
return new Table<Element>(HtmlStyles.summaryTable)
|
||||
.setHeader(getSummaryTableHeader(typeElement))
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, HtmlStyles.colLast)
|
||||
.setRenderTabs(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -117,12 +120,17 @@ public class NestedClassWriter extends AbstractMemberWriter {
|
||||
: resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Class"));
|
||||
}
|
||||
var labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, label);
|
||||
labelHeading.setId(htmlIds.forInheritedClasses(typeElement));
|
||||
labelHeading.setId(getInheritedSummaryId(typeElement));
|
||||
labelHeading.add(Entity.NO_BREAK_SPACE);
|
||||
labelHeading.add(classLink);
|
||||
content.add(labelHeading);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HtmlId getInheritedSummaryId(TypeElement typeElement) {
|
||||
return htmlIds.forInheritedClasses(typeElement);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryLink(HtmlLinkInfo.Kind context, TypeElement typeElement, Element member,
|
||||
Content content) {
|
||||
|
||||
@ -42,6 +42,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable;
|
||||
import jdk.javadoc.internal.html.Content;
|
||||
import jdk.javadoc.internal.html.ContentBuilder;
|
||||
import jdk.javadoc.internal.html.Entity;
|
||||
import jdk.javadoc.internal.html.HtmlId;
|
||||
import jdk.javadoc.internal.html.HtmlTree;
|
||||
import jdk.javadoc.internal.html.Text;
|
||||
|
||||
@ -255,6 +256,14 @@ public class PropertyWriter extends AbstractMemberWriter {
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, HtmlStyles.colLast);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Table<Element> createInheritedSummaryTable(TypeElement typeElement) {
|
||||
return new Table<Element>(HtmlStyles.summaryTable)
|
||||
.setHeader(getSummaryTableHeader(null))
|
||||
.setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, HtmlStyles.colLast)
|
||||
.setRenderTabs(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInheritedSummaryLabel(TypeElement typeElement, Content content) {
|
||||
Content classLink = getMemberSummaryLinkOrFQN(typeElement, VisibleMemberTable.Kind.PROPERTIES);
|
||||
@ -270,12 +279,17 @@ public class PropertyWriter extends AbstractMemberWriter {
|
||||
}
|
||||
var labelHeading =
|
||||
HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, label)
|
||||
.setId(htmlIds.forInheritedProperties(typeElement))
|
||||
.setId(getInheritedSummaryId(typeElement))
|
||||
.add(Entity.NO_BREAK_SPACE)
|
||||
.add(classLink);
|
||||
content.add(labelHeading);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HtmlId getInheritedSummaryId(TypeElement typeElement) {
|
||||
return htmlIds.forInheritedProperties(typeElement);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addSummaryLink(HtmlLinkInfo.Kind context, TypeElement typeElement, Element member,
|
||||
Content content) {
|
||||
|
||||
@ -376,10 +376,13 @@ public class Table<T> extends Content {
|
||||
}
|
||||
|
||||
var table = HtmlTree.DIV(tableStyle).addStyle(gridStyle);
|
||||
if ((tabs == null || occurringTabs.size() == 1) && renderTabs) {
|
||||
if (tabs == null) {
|
||||
if (tabs == null || (occurringTabs.size() == 1 && renderTabs)) {
|
||||
// Render table with static content. Note that a single-tab table is only static
|
||||
// if it is controlled by local tabs. In a multi-table summary page, it still
|
||||
// must be able to show/hide its content depending on page-level controls.
|
||||
if (caption != null) {
|
||||
main.add(caption);
|
||||
} else {
|
||||
} else if (tabs != null) {
|
||||
main.add(getCaption(occurringTabs.iterator().next().label()));
|
||||
}
|
||||
table.add(getTableBody());
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--
|
||||
Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
||||
-->
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||||
<path d="m35.763 5.058 38.675 36.885a12.596 12.596 90 0 1 0 18.23L35.763 97.058v-18.32l27.055-25.431a2.975 2.975 90.09 0 0 .007-4.33L35.763 23.38Z" style="fill:#000;stroke-width:.285806" transform="rotate(90 53.877 47.354)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 587 B |
@ -9,4 +9,4 @@
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||||
<path d="m35.763 5.058 38.675 36.885a12.596 12.596 90 0 1 0 18.23L35.763 97.058v-18.32l27.055-25.431a2.975 2.975 90.09 0 0 .007-4.33L35.763 23.38Z" style="fill:#000;stroke-width:.285806" transform="translate(-5.292 -1.058)"/>
|
||||
</svg>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 590 B After Width: | Height: | Size: 589 B |
@ -20,6 +20,7 @@ var activeTableTab = "active-table-tab";
|
||||
|
||||
const linkIcon = "##REPLACE:doclet.Link_icon##";
|
||||
const linkToSection = "##REPLACE:doclet.Link_to_section##";
|
||||
const toggleMemberListing = "##REPLACE:doclet.Toggle_member_listing##";
|
||||
|
||||
if (typeof hljs !== "undefined") {
|
||||
try {
|
||||
@ -508,27 +509,44 @@ document.addEventListener("DOMContentLoaded", function(e) {
|
||||
|| (hdr.querySelector("a") && hdr.querySelector("a").getAttribute("id"));
|
||||
if (id) {
|
||||
var template = document.createElement('template');
|
||||
template.innerHTML =" <a href='#" + encodeURI(id) + "' class='anchor-link' aria-label='" + linkToSection
|
||||
+ "'><img src='" + pathtoroot + "resource-files/link.svg' alt='" + linkIcon +"' tabindex='0'"
|
||||
+ " width='16' height='16'></a>";
|
||||
template.innerHTML =" <a href='#" + encodeURI(id) + "' class='anchor-link' aria-label='"
|
||||
+ linkToSection + "'><img src='" + pathtoroot + "resource-files/link.svg' alt='"
|
||||
+ linkIcon + "' width='16' height='16'></a>";
|
||||
hdr.append(...template.content.childNodes);
|
||||
}
|
||||
});
|
||||
document.querySelectorAll("div.inherited-list:has( > div.summary-table) > h3").forEach(h => {
|
||||
const button = document.createElement("button");
|
||||
const p = h.parentElement;
|
||||
button.addEventListener("click", e => {
|
||||
toggleStyle(p.classList, p.classList.contains("expanded"), "collapsed", "expanded");
|
||||
});
|
||||
button.addEventListener("keydown", e => {
|
||||
if (e.key === " " || e.key === "Enter") {
|
||||
toggleStyle(p.classList, p.classList.contains("expanded"), "collapsed", "expanded");
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
button.setAttribute("aria-label", toggleMemberListing);
|
||||
h.insertAdjacentElement("afterbegin", button);
|
||||
});
|
||||
var sections;
|
||||
var scrollTimeout;
|
||||
var prevHash;
|
||||
function initSectionData() {
|
||||
bodyHeight = document.body.offsetHeight;
|
||||
sections = [{ id: "", top: 0 }].concat(Array.from(main.querySelectorAll(
|
||||
"section[id], h2[id], h2 a[id], h3[id], h3 a[id], div[id]"))
|
||||
.filter((e) => {
|
||||
return sidebar.querySelector("a[href=\"#" + encodeURI(e.getAttribute("id")) + "\"]") !== null
|
||||
}).map((e) => {
|
||||
return {
|
||||
id: e.getAttribute("id"),
|
||||
top: e.offsetTop
|
||||
};
|
||||
}));
|
||||
sections = [{ id: "", top: 0 }].concat(
|
||||
Array.from(main.querySelectorAll("section[id], h2[id], h2 a[id], h3[id], h3 a[id], div[id]"))
|
||||
.filter((e) => {
|
||||
var id = encodeURI(e.getAttribute("id"));
|
||||
return sidebar.querySelector("a[href=\"#" + id + "\"]") !== null
|
||||
}).map((e) => {
|
||||
return {
|
||||
id: e.getAttribute("id"),
|
||||
top: e.offsetTop
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
function setScrollTimeout() {
|
||||
if (scrollTimeout) {
|
||||
|
||||
@ -155,7 +155,8 @@ body.theme-dark {
|
||||
--button-focus-filter: brightness(104%);
|
||||
--invalid-tag-background-color: #ffe6e6;
|
||||
--invalid-tag-text-color: #000000;
|
||||
div.main-grid img {
|
||||
div.main-grid img,
|
||||
.inherited-list h3 > button {
|
||||
filter: invert(100%) brightness(160%);
|
||||
}
|
||||
}
|
||||
@ -208,7 +209,8 @@ body.theme-dark {
|
||||
--button-focus-filter: brightness(104%);
|
||||
--invalid-tag-background-color: #ffe6e6;
|
||||
--invalid-tag-text-color: #000000;
|
||||
div.main-grid img {
|
||||
div.main-grid img,
|
||||
.inherited-list h3 > button {
|
||||
filter: invert(100%) brightness(160%);
|
||||
}
|
||||
}
|
||||
@ -257,7 +259,8 @@ body.theme-dark {
|
||||
--button-focus-filter: brightness(104%);
|
||||
--invalid-tag-background-color: #ffe6e6;
|
||||
--invalid-tag-text-color: #000000;
|
||||
div.main-grid img {
|
||||
div.main-grid img,
|
||||
.inherited-list h3 > button {
|
||||
filter: none;
|
||||
}
|
||||
}
|
||||
@ -881,17 +884,18 @@ ul.preview-feature-list input {
|
||||
}
|
||||
.caption span {
|
||||
background-color: var(--navbar-background-color);
|
||||
padding:5px 12px 7px 12px;
|
||||
height:16px;
|
||||
padding:4.5px 12px;
|
||||
height:19px;
|
||||
color:var(--navbar-text-color);
|
||||
display:inline-block;
|
||||
}
|
||||
.inherited-list h3 {
|
||||
background-color: var(--subnav-background-color);
|
||||
padding:6px 12px 7px 12px;
|
||||
height:17px;
|
||||
padding:5px 5px 6px 12px;
|
||||
height:18px;
|
||||
width: fit-content;
|
||||
max-width: 93%;
|
||||
font-size: 0.99em;
|
||||
}
|
||||
/* Background required for captions with links */
|
||||
.class-use-page .caption span,
|
||||
@ -907,6 +911,12 @@ ul.preview-feature-list input {
|
||||
.inherited-list h3 a:visited {
|
||||
color:var(--subnav-link-color);
|
||||
}
|
||||
.caption a:hover,
|
||||
.caption a:active,
|
||||
.inherited-list.expanded h3 a:hover,
|
||||
.inherited-list.expanded h3 a:active {
|
||||
color: var(--link-color-active);
|
||||
}
|
||||
div.table-tabs {
|
||||
padding: 8px 0 0 1px;
|
||||
white-space: nowrap;
|
||||
@ -995,7 +1005,7 @@ div.checkboxes > label > input {
|
||||
.summary-table > div, .details-table > div {
|
||||
font-size: var(--nav-font-size);
|
||||
line-height: 1.6;
|
||||
padding: 8px 3px 3px 7px;
|
||||
padding: 8px 5px 3px 7px;
|
||||
overflow: auto hidden;
|
||||
}
|
||||
.summary-table > div.table-header, .details-table > div.table-header {
|
||||
@ -1515,6 +1525,27 @@ section[class$="-details"] .detail > div {
|
||||
margin: 20px 0;
|
||||
background-color:var(--detail-background-color);
|
||||
}
|
||||
.inherited-list h3 > button {
|
||||
cursor: pointer;
|
||||
color: var(--subnav-link-color);
|
||||
position: relative;
|
||||
background-color: transparent;
|
||||
background-image:url("right.svg");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 12px;
|
||||
background-position:3px 6px;
|
||||
border:none;
|
||||
width: 1.3em;
|
||||
height: 1.6em;
|
||||
vertical-align: middle;
|
||||
top: -2px;
|
||||
}
|
||||
.inherited-list h3:has(button) {
|
||||
padding-left: 2px;
|
||||
}
|
||||
.inherited-list.expanded h3 > button {
|
||||
background-image: url("down.svg");
|
||||
}
|
||||
.inherited-list > code {
|
||||
padding: 8px;
|
||||
display: block;
|
||||
@ -1522,6 +1553,15 @@ section[class$="-details"] .detail > div {
|
||||
border-radius: 0;
|
||||
line-height: var(--code-line-height);
|
||||
}
|
||||
.inherited-list > div {
|
||||
display: none;
|
||||
}
|
||||
.inherited-list.expanded > code {
|
||||
display: none;
|
||||
}
|
||||
.inherited-list.expanded > div {
|
||||
display: grid;
|
||||
}
|
||||
.vertical-separator {
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2025, 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
|
||||
@ -60,15 +60,10 @@ public class IndexTaglet extends BaseTaglet {
|
||||
}
|
||||
tagText = utils.normalizeWhitespace(tagText);
|
||||
|
||||
Content desc = tagletWriter.htmlWriter.commentTagsToContent(element, indexTree.getDescription(), context.within(indexTree));
|
||||
String descText = utils.normalizeWhitespace(extractText(desc));
|
||||
Content desc = tagletWriter.htmlWriter.commentTagsToContent(element, indexTree.getDescription(),
|
||||
context.within(indexTree));
|
||||
String descText = utils.normalizeWhitespace(desc.stripTags().toString());
|
||||
|
||||
return tagletWriter.createAnchorAndSearchIndex(element, tagText, descText, tag);
|
||||
}
|
||||
|
||||
// ugly but simple;
|
||||
// alternatives would be to walk the Content's tree structure, or to add new functionality to Content
|
||||
private String extractText(Content c) {
|
||||
return c.toString().replaceAll("<[^>]+>", "");
|
||||
}
|
||||
}
|
||||
|
||||
@ -46,11 +46,8 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
|
||||
import jdk.javadoc.internal.doclets.toolkit.util.Utils;
|
||||
import jdk.javadoc.internal.html.Content;
|
||||
import jdk.javadoc.internal.html.ContentBuilder;
|
||||
import jdk.javadoc.internal.html.Entity;
|
||||
import jdk.javadoc.internal.html.HtmlTree;
|
||||
import jdk.javadoc.internal.html.RawHtml;
|
||||
import jdk.javadoc.internal.html.Text;
|
||||
import jdk.javadoc.internal.html.TextBuilder;
|
||||
|
||||
/**
|
||||
* A taglet that represents the {@code @spec} tag.
|
||||
@ -123,35 +120,7 @@ public class SpecTaglet extends BaseTaglet implements InheritableTaglet {
|
||||
List<? extends DocTree> specTreeLabel = specTree.getTitle();
|
||||
Content label = htmlWriter.commentTagsToContent(holder, specTreeLabel, tagletWriter.context.isFirstSentence);
|
||||
return getExternalSpecContent(holder, specTree, specTreeURL,
|
||||
utils.normalizeWhitespace(textOf(label)), label);
|
||||
}
|
||||
|
||||
// this is here, for now, but might be a useful addition elsewhere,
|
||||
// perhaps as a method on Content
|
||||
private String textOf(Content c) {
|
||||
return appendText(new StringBuilder(), c).toString();
|
||||
}
|
||||
|
||||
private StringBuilder appendText(StringBuilder sb, Content c) {
|
||||
if (c instanceof ContentBuilder cb) {
|
||||
appendText(sb, cb.getContents());
|
||||
} else if (c instanceof HtmlTree ht) {
|
||||
appendText(sb, ht.getContents());
|
||||
} else if (c instanceof RawHtml rh) {
|
||||
sb.append(rh.toString().replaceAll("<[^>]*>", ""));
|
||||
} else if (c instanceof TextBuilder tb) {
|
||||
sb.append(tb.toString());
|
||||
} else if (c instanceof Text t) {
|
||||
sb.append(t.toString());
|
||||
} else if (c instanceof Entity e) {
|
||||
sb.append(e.toString());
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
|
||||
private StringBuilder appendText(StringBuilder sb, List<? extends Content> contents) {
|
||||
contents.forEach(c -> appendText(sb, c));
|
||||
return sb;
|
||||
utils.normalizeWhitespace(label.stripTags().toString()), label);
|
||||
}
|
||||
|
||||
Content getExternalSpecContent(Element holder,
|
||||
|
||||
@ -361,6 +361,10 @@ public class CommentUtils {
|
||||
*/
|
||||
public void updatePropertyMethodComment(ExecutableElement member,
|
||||
Element property) {
|
||||
// Check if member was already processed
|
||||
if (dcInfoMap.containsKey(member)) {
|
||||
return;
|
||||
}
|
||||
final String memberName = member.getSimpleName().toString();
|
||||
final boolean isSetter = memberName.startsWith("set");
|
||||
final boolean isGetter = memberName.startsWith("get") || memberName.startsWith("is");
|
||||
|
||||
@ -74,6 +74,7 @@ doclet.JavaScript_in_option=option {0} contains JavaScript.\n\
|
||||
Use --allow-script-in-comments to allow use of JavaScript.
|
||||
doclet.Link_icon=Link icon
|
||||
doclet.Link_to_section=Link to this section
|
||||
doclet.Toggle_member_listing=Toggle between short and detailed list view
|
||||
doclet.Packages=Packages
|
||||
doclet.All_Packages=All Packages
|
||||
doclet.Modules=Modules
|
||||
|
||||
@ -106,6 +106,9 @@ public class DocPaths {
|
||||
/** The name of the copy-to-clipboard icon file. */
|
||||
public static final DocPath CLIPBOARD_SVG = DocPath.create("copy.svg");
|
||||
|
||||
/** The name of the downwards pointing angle icon. */
|
||||
public static final DocPath DOWN_SVG = DocPath.create("down.svg");
|
||||
|
||||
/** The name of the left pointing angle icon. */
|
||||
public static final DocPath LEFT_SVG = DocPath.create("left.svg");
|
||||
|
||||
|
||||
@ -142,6 +142,13 @@ public abstract class Content {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the plain text of this content with HTML tags removed}
|
||||
*/
|
||||
public Content stripTags() {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return true if the content is "phrasing content"}
|
||||
*
|
||||
|
||||
@ -105,6 +105,15 @@ public class ContentBuilder extends Content {
|
||||
return n;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Content stripTags() {
|
||||
var text = new ContentBuilder();
|
||||
for (Content c : contents) {
|
||||
text.add(c.stripTags());
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPhrasingContent() {
|
||||
return contents.stream().allMatch(Content::isPhrasingContent);
|
||||
|
||||
@ -178,6 +178,7 @@ public class HtmlTree extends Content {
|
||||
*/
|
||||
@Override
|
||||
public HtmlTree add(Content content) {
|
||||
Objects.requireNonNull(content, "Content must not be null");
|
||||
if (content instanceof ContentBuilder cb) {
|
||||
cb.contents.forEach(this::add);
|
||||
} else if (!content.isDiscardable()) {
|
||||
@ -279,6 +280,15 @@ public class HtmlTree extends Content {
|
||||
return n;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Content stripTags() {
|
||||
var text = new ContentBuilder();
|
||||
for (Content c : content) {
|
||||
text.add(c.stripTags());
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
/*
|
||||
* The sets of ASCII URI characters to be left unencoded.
|
||||
* See "Uniform Resource Identifier (URI): Generic Syntax"
|
||||
|
||||
@ -157,6 +157,11 @@ public class RawHtml extends Content {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Content stripTags() {
|
||||
return Text.of(rawHtmlContent.replaceAll("<[^>]*>", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return rawHtmlContent;
|
||||
|
||||
@ -214,7 +214,7 @@ public class TestDuplicateMethods extends JavadocTester {
|
||||
"""
|
||||
<div class="inherited-list">
|
||||
<h3 id="methods-inherited-from-class-hm.PubJ">Methods inherited from class <a href="PubJ.html#method-summary" title="class in hm">PubJ</a></h3>
|
||||
<code><a href="PubJ.html#testJ()" title="testJ()">testJ</a></code></div>
|
||||
<code><a href="PubJ.html#testJ()" title="testJ()">testJ</a></code>
|
||||
""");
|
||||
}
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@ public class TestHiddenTag extends JavadocTester {
|
||||
g1">A</a></h3>
|
||||
<code><a href="A.VisibleInner.html" title="class in pkg1">A.VisibleInner</a>, <a\
|
||||
href="A.VisibleInnerExtendsInvisibleInner.html" title="class in pkg1">A.Visible\
|
||||
InnerExtendsInvisibleInner</a></code></div>
|
||||
InnerExtendsInvisibleInner</a></code>
|
||||
""");
|
||||
|
||||
checkOutput("pkg1/A.VisibleInner.html", false,
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2025, 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
|
||||
@ -24,7 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 4682448 4947464 5029946 8025633 8026567 8035473 8139101 8175200
|
||||
8186332 8186703 8182765 8187288 8261976 8303349 8319988
|
||||
8186332 8186703 8182765 8187288 8261976 8303349 8319988 8350920
|
||||
* @summary Verify that the public modifier does not show up in the
|
||||
* documentation for public methods, as recommended by the JLS.
|
||||
* If A implements I and B extends A, B should be in the list of
|
||||
@ -211,7 +211,40 @@ public class TestInterface extends JavadocTester {
|
||||
OfDouble</a>, <a href="Spliterator.OfInt.html" title="interface in pkg2">Spliter\
|
||||
ator.OfInt</a><Integer>, <a href="Spliterator.OfPrimitive.html" title="int\
|
||||
erface in pkg2">Spliterator.OfPrimitive</a><T,<wbr>T_CONS,<wbr>T_SPLITR></\
|
||||
code></div>""");
|
||||
code>
|
||||
<div class="summary-table three-column-summary">
|
||||
<div class="table-header col-first">Modifier and Type</div>
|
||||
<div class="table-header col-second">Interface</div>
|
||||
<div class="table-header col-last">Description</div>
|
||||
<div class="col-first even-row-color"><code>static interface </code></div>
|
||||
<div class="col-second even-row-color"><code><a href="Spliterator.OfDouble.html"\
|
||||
class="type-name-link" title="interface in pkg2">Spliterator.OfDouble</a></code\
|
||||
></div>
|
||||
<div class="col-last even-row-color"> </div>
|
||||
<div class="col-first odd-row-color"><code>static interface </code></div>
|
||||
<div class="col-second odd-row-color"><code><a href="Spliterator.OfInt.html" cla\
|
||||
ss="type-name-link" title="interface in pkg2">Spliterator.OfInt</a><<a href="\
|
||||
Spliterator.OfInt.html#type-param-Integer" title="type parameter in Spliterator.\
|
||||
OfInt">Integer</a>></code></div>
|
||||
<div class="col-last odd-row-color"> </div>
|
||||
<div class="col-first even-row-color"><code>static interface </code></div>
|
||||
<div class="col-second even-row-color"><code><a href="Spliterator.OfPrimitive.ht\
|
||||
ml" class="type-name-link" title="interface in pkg2">Spliterator.OfPrimitive</a>\
|
||||
<<a href="Spliterator.OfPrimitive.html#type-param-T" title="type parameter in\
|
||||
Spliterator.OfPrimitive">T</a>, <a href="Spliterator.OfPrimitive.html#type-para\
|
||||
m-T_CONS" title="type parameter in Spliterator.OfPrimitive">T_CONS</a>, <a href\
|
||||
="Spliterator.OfPrimitive.html#type-param-T_SPLITR" title="type parameter in Sp\
|
||||
literator.OfPrimitive">T_SPLITR</a> extends <a href="Spliterator.OfPrimitive.ht\
|
||||
ml" title="interface in pkg2">Spliterator.OfPrimitive</a><<a href="Spliterat\
|
||||
or.OfPrimitive.html#type-param-T" title="type parameter in Spliterator.OfPrimit\
|
||||
ive">T</a>,<wbr><a href="Spliterator.OfPrimitive.html#type-param-T_CONS" title=\
|
||||
"type parameter in Spliterator.OfPrimitive">T_CONS</a>,<wbr><a href="Spliterato\
|
||||
r.OfPrimitive.html#type-param-T_SPLITR" title="type parameter in Spliterator.Of\
|
||||
Primitive">T_SPLITR</a>>></code></div>
|
||||
<div class="col-last even-row-color"> </div>
|
||||
</div>
|
||||
</div>
|
||||
</section>""");
|
||||
checkOutput("pkg2/Spliterator.html", true,
|
||||
"""
|
||||
<div class="caption"><span>Nested Classes</span></div>
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363
|
||||
* 8167967 8172528 8175200 8178830 8182257 8186332 8182765 8025091
|
||||
* 8203791 8184205 8249633 8261976
|
||||
* 8203791 8184205 8249633 8261976 8350920
|
||||
* @summary Test of the JavaFX doclet features.
|
||||
* @library ../../lib
|
||||
* @modules jdk.javadoc/jdk.javadoc.internal.tool
|
||||
@ -241,7 +241,29 @@ public class TestJavaFX extends JavadocTester {
|
||||
"""
|
||||
<h3 id="properties-inherited-from-class-pkg1.C">Properties inherited from class&\
|
||||
nbsp;<a href="C.html#property-summary" title="class in pkg1">C</a></h3>
|
||||
<code><a href="C.html#pausedProperty">paused</a>, <a href="C.html#rateProperty">rate</a></code></div>""");
|
||||
<code><a href="C.html#pausedProperty">paused</a>, <a href="C.html#rateProperty">rate</a></code>
|
||||
<div class="summary-table three-column-summary">
|
||||
<div class="table-header col-first">Type</div>
|
||||
<div class="table-header col-second">Property</div>
|
||||
<div class="table-header col-last">Description</div>
|
||||
<div class="col-first even-row-color"><code>final <a href="C.BooleanProperty.htm\
|
||||
l" title="class in pkg1">C.BooleanProperty</a></code></div>
|
||||
<div class="col-second even-row-color"><code><a href="C.html#pausedProperty" cla\
|
||||
ss="member-name-link">paused</a></code></div>
|
||||
<div class="col-last even-row-color">
|
||||
<div class="block">Defines if paused.</div>
|
||||
</div>
|
||||
<div class="col-first odd-row-color"><code>final <a href="C.DoubleProperty.html"\
|
||||
title="class in pkg1">C.DoubleProperty</a></code></div>
|
||||
<div class="col-second odd-row-color"><code><a href="C.html#rateProperty" class=\
|
||||
"member-name-link">rate</a></code></div>
|
||||
<div class="col-last odd-row-color">
|
||||
<div class="block">Defines the direction/speed at which the <code>Timeline</code> is expected to
|
||||
be played.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>""");
|
||||
|
||||
checkOutput("pkg1/D.html", false, "shouldNotAppear");
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2017, 2025, 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
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8157000 8192850 8182765 8223607 8261976 8281376 8313204 8345777
|
||||
* @bug 8157000 8192850 8182765 8223607 8261976 8281376 8313204 8345777 8350920
|
||||
* @summary test the behavior of --override-methods option
|
||||
* @library ../../lib
|
||||
* @modules jdk.javadoc/jdk.javadoc.internal.tool
|
||||
@ -85,6 +85,17 @@ public class TestOverrideMethods extends JavadocTester {
|
||||
"K",
|
||||
"V",
|
||||
|
||||
// Check summary table for inherited nested classes
|
||||
"summary-table three-column-summary",
|
||||
"Modifier and Type",
|
||||
"Class",
|
||||
"Description",
|
||||
"class ",
|
||||
"Classes.P.PN.html",
|
||||
"Classes.P.PN.html#type-param-K",
|
||||
"Classes.P.PN.html#type-param-V",
|
||||
"A nested class in parent",
|
||||
|
||||
// Check properties
|
||||
"""
|
||||
Properties declared in class <a href="Classes.P.html#property-summary""",
|
||||
@ -92,12 +103,30 @@ public class TestOverrideMethods extends JavadocTester {
|
||||
"""
|
||||
Classes.P.html#rateProperty">rate""",
|
||||
|
||||
// Check summary table for inherited properties
|
||||
"summary-table three-column-summary",
|
||||
"Type",
|
||||
"Property",
|
||||
"Description",
|
||||
"Classes.DoubleProperty",
|
||||
"Classes.P.html#rateProperty",
|
||||
"rate",
|
||||
|
||||
// Check fields
|
||||
"""
|
||||
Fields declared in class <a href="Classes.P.html#field-summary""",
|
||||
"Classes.P",
|
||||
"Classes.P.html#field0\">field0",
|
||||
|
||||
// Check summary table for inherited fields
|
||||
"summary-table three-column-summary",
|
||||
"Modifier and Type",
|
||||
"Field",
|
||||
"Description",
|
||||
"int",
|
||||
"Classes.P.html#field0",
|
||||
"field0",
|
||||
|
||||
// Check method summary
|
||||
"Method Summary",
|
||||
"void",
|
||||
@ -118,11 +147,23 @@ public class TestOverrideMethods extends JavadocTester {
|
||||
"""
|
||||
Classes.GP.html#m0()" title="m0()">m0""",
|
||||
|
||||
// Check summary table for inherited methods
|
||||
"summary-table three-column-summary",
|
||||
"Modifier and Type",
|
||||
"Method",
|
||||
"Description",
|
||||
"void",
|
||||
"Classes.GP.html#m0()",
|
||||
"m0",
|
||||
"m0 in grand parent",
|
||||
|
||||
// Check methods from java.lang.Object
|
||||
"""
|
||||
Methods declared in class java.lang.Object""",
|
||||
"""
|
||||
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait""",
|
||||
<h3 id="methods-inherited-from-class-java.lang.Object">Methods declared in clas\
|
||||
s java.lang.Object</h3>
|
||||
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString,\
|
||||
wait, wait, wait</code></div>
|
||||
</section>""",
|
||||
|
||||
// Check method details for override
|
||||
"""
|
||||
@ -190,6 +231,21 @@ public class TestOverrideMethods extends JavadocTester {
|
||||
"#m7()\"><code>m7()"
|
||||
);
|
||||
|
||||
checkOrder("pkg5/Classes.P.html",
|
||||
// Check table of contents for inherited members
|
||||
"""
|
||||
<li><a href="#nested-class-summary" tabindex="0">Nested Class Summary</a></li>
|
||||
<li><a href="#property-summary" tabindex="0">Property Summary</a></li>
|
||||
<li><a href="#field-summary" tabindex="0">Field Summary</a></li>
|
||||
<li><a href="#constructor-summary" tabindex="0">Constructor Summary</a></li>
|
||||
<li><a href="#method-summary" tabindex="0">Method Summary</a>
|
||||
<ol class="toc-list">
|
||||
<li><a href="#methods-inherited-from-class-pkg5.Classes.GP" tabindex="0">Method\
|
||||
s declared in class Classes.GP</a></li>
|
||||
<li><a href="#methods-inherited-from-class-java.lang.Object" tabindex="0">Metho\
|
||||
ds declared in class java.lang.Object</a></li>
|
||||
</ol>""");
|
||||
|
||||
// Tests for interfaces
|
||||
|
||||
// Make sure the static methods in the super interface
|
||||
@ -391,8 +447,32 @@ public class TestOverrideMethods extends JavadocTester {
|
||||
<h3 id="methods-inherited-from-class-pkg6.Base">Methods declared in class <\
|
||||
a href="Base.html#method-summary" title="class in pkg6">Base</a></h3>
|
||||
<code><a href="Base.html#m1()" title="m1()">m1</a>, <a href="Base.html#m3()" tit\
|
||||
le="m3()">m3</a>, <a href="Base.html#m9()" title="m9()">m9</a></code></div>
|
||||
""");
|
||||
le="m3()">m3</a>, <a href="Base.html#m9()" title="m9()">m9</a></code>
|
||||
<div class="summary-table three-column-summary">
|
||||
<div class="table-header col-first">Modifier and Type</div>
|
||||
<div class="table-header col-second">Method</div>
|
||||
<div class="table-header col-last">Description</div>
|
||||
<div class="col-first even-row-color"><code>java.lang.Object</code></div>
|
||||
<div class="col-second even-row-color"><code><a href="Base.html#m1()" class="mem\
|
||||
ber-name-link">m1</a>()</code></div>
|
||||
<div class="col-last even-row-color">
|
||||
<div class="block">This is Base::m1.</div>
|
||||
</div>
|
||||
<div class="col-first odd-row-color"><code><a href="#type-param-T" title="type p\
|
||||
arameter in Sub">T</a></code></div>
|
||||
<div class="col-second odd-row-color"><code><a href="Base.html#m3()" class="memb\
|
||||
er-name-link">m3</a>()</code></div>
|
||||
<div class="col-last odd-row-color">
|
||||
<div class="block">This is Base::m3.</div>
|
||||
</div>
|
||||
<div class="col-first even-row-color"><code>abstract java.lang.Object</code></div>
|
||||
<div class="col-second even-row-color"><code><a href="Base.html#m9()" class="mem\
|
||||
ber-name-link">m9</a>()</code></div>
|
||||
<div class="col-last even-row-color">
|
||||
<div class="block">This is Base::m9.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>""");
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -415,7 +495,22 @@ public class TestOverrideMethods extends JavadocTester {
|
||||
erface <a href="AnnotatedBase.html#method-summary" title="interface in pkg7\
|
||||
">AnnotatedBase</a></h3>
|
||||
<code><a href="AnnotatedBase.html#m1(java.lang.Class,int%5B%5D)" title="m1(Class\
|
||||
, int[])">m1</a></code></div>""");
|
||||
, int[])">m1</a></code>
|
||||
<div class="summary-table three-column-summary">
|
||||
<div class="table-header col-first">Modifier and Type</div>
|
||||
<div class="table-header col-second">Method</div>
|
||||
<div class="table-header col-last">Description</div>
|
||||
<div class="col-first even-row-color"><code>java.lang.Iterable<wbr><java.lang\
|
||||
.String></code></div>
|
||||
<div class="col-second even-row-color"><code><a href="AnnotatedBase.html#m1(java\
|
||||
.lang.Class,int%5B%5D)" class="member-name-link">m1</a><wbr>(java.lang.Class<\
|
||||
? extends java.lang.CharSequence> p1,
|
||||
int[] p2)</code></div>
|
||||
<div class="col-last even-row-color">
|
||||
<div class="block">This is AnnotatedBase::m1.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>""");
|
||||
|
||||
checkOutput("pkg7/AnnotatedSub2.html", true,
|
||||
"""
|
||||
|
||||
@ -87,7 +87,7 @@ public class TestStylesheet extends JavadocTester {
|
||||
.summary-table > div, .details-table > div {
|
||||
font-size: var(--nav-font-size);
|
||||
line-height: 1.6;
|
||||
padding: 8px 3px 3px 7px;
|
||||
padding: 8px 5px 3px 7px;
|
||||
overflow: auto hidden;
|
||||
}""",
|
||||
"@import url('fonts/dejavu.css');",
|
||||
|
||||
@ -258,13 +258,13 @@ public class TestUnexported extends JavadocTester {
|
||||
<h3 id="methods-inherited-from-class-pa.internal.InternalClass">Methods inherit\
|
||||
ed from class <a href="internal/InternalClass.html#method-summary" title="\
|
||||
class in pa.internal">InternalClass</a></h3>
|
||||
<code><a href="internal/InternalClass.html#p()" title="p()">p</a></code></div>
|
||||
<code><a href="internal/InternalClass.html#p()" title="p()">p</a></code>
|
||||
""",
|
||||
"""
|
||||
<h3 id="methods-inherited-from-class-pa.internal.InternalInterface">Methods inh\
|
||||
erited from interface <a href="internal/InternalInterface.html#method-summ\
|
||||
ary" title="interface in pa.internal">InternalInterface</a></h3>
|
||||
<code><a href="internal/InternalInterface.html#m()" title="m()">m</a></code></div>
|
||||
<code><a href="internal/InternalInterface.html#m()" title="m()">m</a></code>
|
||||
""");
|
||||
|
||||
checkOrder("mb/pb/B.html",
|
||||
@ -286,13 +286,13 @@ public class TestUnexported extends JavadocTester {
|
||||
<h3 id="methods-inherited-from-class-pa.internal.InternalClass">Methods inherit\
|
||||
ed from class <a href="../../ma/pa/internal/InternalClass.html#method-summ\
|
||||
ary" title="class in pa.internal">InternalClass</a></h3>
|
||||
<code><a href="../../ma/pa/internal/InternalClass.html#p()" title="p()">p</a></code></div>
|
||||
<code><a href="../../ma/pa/internal/InternalClass.html#p()" title="p()">p</a></code>
|
||||
""",
|
||||
"""
|
||||
<h3 id="methods-inherited-from-class-pa.internal.InternalInterface">Methods inh\
|
||||
erited from interface <a href="../../ma/pa/internal/InternalInterface.html\
|
||||
#method-summary" title="interface in pa.internal">InternalInterface</a></h3>
|
||||
<code><a href="../../ma/pa/internal/InternalInterface.html#m()" title="m()">m</a></code></div>
|
||||
<code><a href="../../ma/pa/internal/InternalInterface.html#m()" title="m()">m</a></code>
|
||||
""");
|
||||
|
||||
}
|
||||
|
||||
@ -205,6 +205,7 @@ class APITest {
|
||||
"pkg/package-summary.html",
|
||||
"pkg/package-tree.html",
|
||||
"resource-files/copy.svg",
|
||||
"resource-files/down.svg",
|
||||
"resource-files/glass.svg",
|
||||
"resource-files/jquery-ui.min.css",
|
||||
"resource-files/left.svg",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user