From caaef3a04ce1a9a8c80d9aade96de43416ab058e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Tue, 26 Aug 2025 15:00:20 +0000 Subject: [PATCH] 8350920: Allow inherited member summaries to be viewed inline Reviewed-by: liach, nbenalla --- .../formats/html/AbstractMemberWriter.java | 133 ++++++++++++++---- .../html/AnnotationTypeMemberWriter.java | 10 -- .../formats/html/ConstructorWriter.java | 6 - .../formats/html/EnumConstantWriter.java | 8 -- .../doclets/formats/html/FieldWriter.java | 26 ++-- .../doclets/formats/html/HtmlDoclet.java | 1 + .../doclets/formats/html/MethodWriter.java | 16 ++- .../formats/html/NestedClassWriter.java | 26 ++-- .../doclets/formats/html/PropertyWriter.java | 16 ++- .../internal/doclets/formats/html/Table.java | 9 +- .../doclets/formats/html/resources/down.svg | 12 ++ .../doclets/formats/html/resources/right.svg | 2 +- .../formats/html/resources/script.js.template | 44 ++++-- .../formats/html/resources/stylesheet.css | 56 ++++++-- .../formats/html/taglets/IndexTaglet.java | 13 +- .../formats/html/taglets/SpecTaglet.java | 33 +---- .../doclets/toolkit/CommentUtils.java | 4 + .../toolkit/resources/doclets.properties | 1 + .../doclets/toolkit/util/DocPaths.java | 3 + .../jdk/javadoc/internal/html/Content.java | 7 + .../javadoc/internal/html/ContentBuilder.java | 9 ++ .../jdk/javadoc/internal/html/HtmlTree.java | 10 ++ .../jdk/javadoc/internal/html/RawHtml.java | 5 + .../TestDuplicateMethods.java | 2 +- .../doclet/testHiddenTag/TestHiddenTag.java | 2 +- .../doclet/testInterface/TestInterface.java | 39 ++++- .../javadoc/doclet/testJavaFX/TestJavaFX.java | 26 +++- .../TestOverrideMethods.java | 111 +++++++++++++-- .../doclet/testStylesheet/TestStylesheet.java | 2 +- .../doclet/testUnexported/TestUnexported.java | 8 +- .../jdk/javadoc/tool/api/basic/APITest.java | 1 + 31 files changed, 481 insertions(+), 160 deletions(-) create mode 100644 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/down.svg diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index 5c7bb7f3b37..e2e286d5856 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -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(); - - buildMainSummary(summaryTreeList); + var inheritedTocEntries = new LinkedHashMap(); + 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 summaryTreeList) { + private int buildMainSummary(List summaryTreeList) { Set 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> r = docFinder.search((ExecutableElement) member, (m -> { - var firstSentenceTrees = utils.getFirstSentenceTrees(m); - Optional> 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 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> r = docFinder.search((ExecutableElement) member, (m -> { + var firstSentenceTrees = utils.getFirstSentenceTrees(m); + Optional> 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 targets) { + private int buildInheritedSummary(List targets, Map 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 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 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 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 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 firstSentenceTrees) { - if (tElement != typeElement) { - throw new IllegalStateException(getClass() + ": " + tElement + ", " + typeElement); - } - var table = getSummaryTable(); + List firstSentenceTrees, Table table) { List rowContents = new ArrayList<>(); Content summaryType = new ContentBuilder(); addSummaryType(member, summaryType); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeMemberWriter.java index 18ab23aa294..1568812da66 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeMemberWriter.java @@ -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); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriter.java index c2145c1791a..d8d01a4e6ad 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriter.java @@ -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()) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriter.java index 81c4f1ed87c..56c703e2aef 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriter.java @@ -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. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriter.java index e3eed570f41..e44d06e1565 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriter.java @@ -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 createSummaryTable() { - List bodyRowStyles = Arrays.asList(HtmlStyles.colFirst, HtmlStyles.colSecond, - HtmlStyles.colLast); - return new Table(HtmlStyles.summaryTable) .setCaption(contents.fields) .setHeader(getSummaryTableHeader(typeElement)) - .setColumnStyles(bodyRowStyles); + .setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, + HtmlStyles.colLast); + } + + @Override + protected Table createInheritedSummaryTable(TypeElement typeElement) { + return new Table(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(); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java index 24fc8e6b2de..f364702ca12 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java @@ -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); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriter.java index 2bab8cf6c47..3bc5b7617b0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriter.java @@ -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 createInheritedSummaryTable(TypeElement typeElement) { + return new Table(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; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriter.java index 8368172430e..1847ddf979f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriter.java @@ -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 createSummaryTable() { - List bodyRowStyles = Arrays.asList(HtmlStyles.colFirst, HtmlStyles.colSecond, - HtmlStyles.colLast); - return new Table(HtmlStyles.summaryTable) .setCaption(contents.getContent("doclet.Nested_Classes")) .setHeader(getSummaryTableHeader(typeElement)) - .setColumnStyles(bodyRowStyles); + .setColumnStyles(HtmlStyles.colFirst, HtmlStyles.colSecond, + HtmlStyles.colLast); + } + + @Override + protected Table createInheritedSummaryTable(TypeElement typeElement) { + return new Table(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) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriter.java index 8146689016d..3a29712daff 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriter.java @@ -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 createInheritedSummaryTable(TypeElement typeElement) { + return new Table(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) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Table.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Table.java index 572d489057e..37edd800328 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Table.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Table.java @@ -376,10 +376,13 @@ public class Table 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()); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/down.svg b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/down.svg new file mode 100644 index 00000000000..3d1b8746429 --- /dev/null +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/down.svg @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/right.svg b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/right.svg index 4b54939c31b..138204f2ee7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/right.svg +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/right.svg @@ -9,4 +9,4 @@ - + \ No newline at end of file diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template index a32c44b8043..b275323b2f5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template @@ -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 =" " + linkIcon +""; + template.innerHTML =" "
+                    + linkIcon + ""; 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) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css index 778ee5f03b3..d61283dc677 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css @@ -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; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/IndexTaglet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/IndexTaglet.java index 9e7c9acc7bb..a7e5e7fed34 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/IndexTaglet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/IndexTaglet.java @@ -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("<[^>]+>", ""); - } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SpecTaglet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SpecTaglet.java index 82d37cfad8a..078b2b5206b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SpecTaglet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SpecTaglet.java @@ -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 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 contents) { - contents.forEach(c -> appendText(sb, c)); - return sb; + utils.normalizeWhitespace(label.stripTags().toString()), label); } Content getExternalSpecContent(Element holder, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/CommentUtils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/CommentUtils.java index b123e6f2556..f415a673345 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/CommentUtils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/CommentUtils.java @@ -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"); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 4b02a720c78..138a8fd0040 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -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 diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java index 7bc4da60419..dbe91585aff 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java @@ -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"); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/Content.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/Content.java index 63142f83011..f582dbdc76a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/Content.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/Content.java @@ -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"} * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/ContentBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/ContentBuilder.java index 358b1591dfc..abcd8e199bb 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/ContentBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/ContentBuilder.java @@ -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); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/HtmlTree.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/HtmlTree.java index f53a71a6999..20af3013405 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/HtmlTree.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/HtmlTree.java @@ -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" diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/RawHtml.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/RawHtml.java index 1c9f60f69e8..38be7799c4e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/RawHtml.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/html/RawHtml.java @@ -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; diff --git a/test/langtools/jdk/javadoc/doclet/testDuplicateMethodsWarn/TestDuplicateMethods.java b/test/langtools/jdk/javadoc/doclet/testDuplicateMethodsWarn/TestDuplicateMethods.java index 7e191290f8a..933138e9c6f 100644 --- a/test/langtools/jdk/javadoc/doclet/testDuplicateMethodsWarn/TestDuplicateMethods.java +++ b/test/langtools/jdk/javadoc/doclet/testDuplicateMethodsWarn/TestDuplicateMethods.java @@ -214,7 +214,7 @@ public class TestDuplicateMethods extends JavadocTester { """

Methods inherited from class PubJ

- testJ
+ testJ """); } } diff --git a/test/langtools/jdk/javadoc/doclet/testHiddenTag/TestHiddenTag.java b/test/langtools/jdk/javadoc/doclet/testHiddenTag/TestHiddenTag.java index 88d2788e8da..f9378e624ba 100644 --- a/test/langtools/jdk/javadoc/doclet/testHiddenTag/TestHiddenTag.java +++ b/test/langtools/jdk/javadoc/doclet/testHiddenTag/TestHiddenTag.java @@ -77,7 +77,7 @@ public class TestHiddenTag extends JavadocTester { g1">A A.VisibleInner, A.Visible\ - InnerExtendsInvisibleInner + InnerExtendsInvisibleInner """); checkOutput("pkg1/A.VisibleInner.html", false, diff --git a/test/langtools/jdk/javadoc/doclet/testInterface/TestInterface.java b/test/langtools/jdk/javadoc/doclet/testInterface/TestInterface.java index 3b6d2fee06d..6cabc68f7e9 100644 --- a/test/langtools/jdk/javadoc/doclet/testInterface/TestInterface.java +++ b/test/langtools/jdk/javadoc/doclet/testInterface/TestInterface.java @@ -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, Spliter\ ator.OfInt<Integer>, Spliterator.OfPrimitive<T,T_CONS,T_SPLITR>"""); + code> +
+
Modifier and Type
+
Interface
+
Description
+
static interface 
+ +
 
+
static interface 
+ +
 
+
static interface 
+ +
 
+
+ + """); checkOutput("pkg2/Spliterator.html", true, """
Nested Classes
diff --git a/test/langtools/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java b/test/langtools/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java index e5d8e5309bc..4fa89ee0ead 100644 --- a/test/langtools/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java +++ b/test/langtools/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java @@ -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 { """

Properties inherited from class&\ nbsp;C

- paused, rate"""); + paused, rate +
+
Type
+
Property
+
Description
+ + +
+
Defines if paused.
+
+ + +
+
Defines the direction/speed at which the Timeline is expected to + be played.
+
+
+ + """); checkOutput("pkg1/D.html", false, "shouldNotAppear"); } diff --git a/test/langtools/jdk/javadoc/doclet/testOverriddenMethods/TestOverrideMethods.java b/test/langtools/jdk/javadoc/doclet/testOverriddenMethods/TestOverrideMethods.java index 8a4aa614cd2..8a151407d61 100644 --- a/test/langtools/jdk/javadoc/doclet/testOverriddenMethods/TestOverrideMethods.java +++ b/test/langtools/jdk/javadoc/doclet/testOverriddenMethods/TestOverrideMethods.java @@ -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 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 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""", +

Methods declared in clas\ + s java.lang.Object

+ clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString,\ + wait, wait, wait + """, // Check method details for override """ @@ -190,6 +231,21 @@ public class TestOverrideMethods extends JavadocTester { "#m7()\">m7()" ); + checkOrder("pkg5/Classes.P.html", + // Check table of contents for inherited members + """ +
  • Nested Class Summary
  • +
  • Property Summary
  • +
  • Field Summary
  • +
  • Constructor Summary
  • +
  • Method Summary +
      +
    1. Method\ + s declared in class Classes.GP
    2. +
    3. Metho\ + ds declared in class java.lang.Object
    4. +
    """); + // Tests for interfaces // Make sure the static methods in the super interface @@ -391,8 +447,32 @@ public class TestOverrideMethods extends JavadocTester {

    Methods declared in class <\ a href="Base.html#method-summary" title="class in pkg6">Base

    m1, m3, m9 - """); + le="m3()">m3, m9
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    java.lang.Object
    +
    m1()
    +
    +
    This is Base::m1.
    +
    + +
    m3()
    +
    +
    This is Base::m3.
    +
    +
    abstract java.lang.Object
    +
    m9()
    +
    +
    This is Base::m9.
    +
    +
    + """); } @Test @@ -415,7 +495,22 @@ public class TestOverrideMethods extends JavadocTester { erface AnnotatedBase m1"""); + , int[])">m1
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    java.lang.Iterable<java.lang\ + .String>
    +
    m1(java.lang.Class<\ + ? extends java.lang.CharSequence> p1, + int[] p2)
    +
    +
    This is AnnotatedBase::m1.
    +
    +
    + """); checkOutput("pkg7/AnnotatedSub2.html", true, """ diff --git a/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java b/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java index 44651c16f5e..d63220f5c4b 100644 --- a/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java +++ b/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java @@ -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');", diff --git a/test/langtools/jdk/javadoc/doclet/testUnexported/TestUnexported.java b/test/langtools/jdk/javadoc/doclet/testUnexported/TestUnexported.java index 798a034ae13..c12ae597ce8 100644 --- a/test/langtools/jdk/javadoc/doclet/testUnexported/TestUnexported.java +++ b/test/langtools/jdk/javadoc/doclet/testUnexported/TestUnexported.java @@ -258,13 +258,13 @@ public class TestUnexported extends JavadocTester {

    Methods inherit\ ed from class InternalClass

    - p + p """, """

    Methods inh\ erited from interface InternalInterface

    - m + m """); checkOrder("mb/pb/B.html", @@ -286,13 +286,13 @@ public class TestUnexported extends JavadocTester {

    Methods inherit\ ed from class InternalClass

    - p + p """, """

    Methods inh\ erited from interface InternalInterface

    - m + m """); } diff --git a/test/langtools/jdk/javadoc/tool/api/basic/APITest.java b/test/langtools/jdk/javadoc/tool/api/basic/APITest.java index 5db718cd810..e4e3c6baa87 100644 --- a/test/langtools/jdk/javadoc/tool/api/basic/APITest.java +++ b/test/langtools/jdk/javadoc/tool/api/basic/APITest.java @@ -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",