8350920: Allow inherited member summaries to be viewed inline

Reviewed-by: liach, nbenalla
This commit is contained in:
Hannes Wallnöfer 2025-08-26 15:00:20 +00:00
parent 173dedfb24
commit caaef3a04c
31 changed files with 481 additions and 160 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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()) {

View File

@ -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.

View File

@ -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();

View File

@ -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);

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -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());

View File

@ -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

View File

@ -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

View File

@ -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) {

View File

@ -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;
}

View File

@ -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("<[^>]+>", "");
}
}

View File

@ -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,

View File

@ -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");

View File

@ -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

View File

@ -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");

View File

@ -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"}
*

View File

@ -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);

View File

@ -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"

View File

@ -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;

View File

@ -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&nbsp;<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>
""");
}
}

View File

@ -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,

View File

@ -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>&lt;Integer&gt;, <a href="Spliterator.OfPrimitive.html" title="int\
erface in pkg2">Spliterator.OfPrimitive</a>&lt;T,<wbr>T_CONS,<wbr>T_SPLITR&gt;</\
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&nbsp;</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">&nbsp;</div>
<div class="col-first odd-row-color"><code>static interface&nbsp;</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>&lt;<a href="\
Spliterator.OfInt.html#type-param-Integer" title="type parameter in Spliterator.\
OfInt">Integer</a>&gt;</code></div>
<div class="col-last odd-row-color">&nbsp;</div>
<div class="col-first even-row-color"><code>static interface&nbsp;</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>\
&lt;<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>&lt;<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>&gt;&gt;</code></div>
<div class="col-last even-row-color">&nbsp;</div>
</div>
</div>
</section>""");
checkOutput("pkg2/Spliterator.html", true,
"""
<div class="caption"><span>Nested Classes</span></div>

View File

@ -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");
}

View File

@ -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&nbsp;",
"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&nbsp;<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&nbsp;<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&nbsp;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&nbsp;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&nbsp;Classes.GP</a></li>
<li><a href="#methods-inherited-from-class-java.lang.Object" tabindex="0">Metho\
ds declared in class&nbsp;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&nbsp;<\
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&nbsp;<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>&lt;java.lang\
.String&gt;</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&lt;\
? extends java.lang.CharSequence&gt;&nbsp;p1,
int[]&nbsp;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,
"""

View File

@ -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');",

View File

@ -258,13 +258,13 @@ public class TestUnexported extends JavadocTester {
<h3 id="methods-inherited-from-class-pa.internal.InternalClass">Methods inherit\
ed from class&nbsp;<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&nbsp;<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&nbsp;<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&nbsp;<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>
""");
}

View File

@ -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",