Skip to content

Commit e930bc1

Browse files
committedMay 31, 2024
8329537: Nested and enclosing classes should be linked separately in breadcrumb navigation
Reviewed-by: jjg
1 parent 79a78f0 commit e930bc1

File tree

10 files changed

+68
-130
lines changed

10 files changed

+68
-130
lines changed
 

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java

-16
Original file line numberDiff line numberDiff line change
@@ -430,21 +430,5 @@ protected HtmlTree getClassUseHeader() {
430430
bodyContents.setHeader(getHeader(PageMode.USE, typeElement)).addMainContent(div);
431431
return body;
432432
}
433-
434-
@Override
435-
protected Navigation getNavBar(PageMode pageMode, Element element) {
436-
List<Content> subnavLinks = new ArrayList<>();
437-
if (configuration.showModules) {
438-
subnavLinks.add(getBreadcrumbLink(utils.elementUtils.getModuleOf(typeElement), false));
439-
}
440-
// We may generate a class-use page for an otherwise undocumented page in the condition below.
441-
boolean isUndocumented = options.noDeprecated() && utils.isDeprecated(typeElement);
442-
subnavLinks.add(getBreadcrumbLink(utils.containingPackage(typeElement), isUndocumented));
443-
if (!isUndocumented) {
444-
subnavLinks.add(getBreadcrumbLink(typeElement, true));
445-
}
446-
447-
return super.getNavBar(pageMode, element).setSubNavLinks(subnavLinks);
448-
}
449433
}
450434

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriter.java

-12
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525

2626
package jdk.javadoc.internal.doclets.formats.html;
2727

28-
import java.util.ArrayList;
2928
import java.util.Collection;
3029
import java.util.List;
3130
import java.util.Set;
@@ -449,17 +448,6 @@ protected Content getClassContentHeader() {
449448
return getContentHeader();
450449
}
451450

452-
@Override
453-
protected Navigation getNavBar(PageMode pageMode, Element element) {
454-
List<Content> subnavLinks = new ArrayList<>();
455-
if (configuration.showModules) {
456-
subnavLinks.add(getBreadcrumbLink(utils.elementUtils.getModuleOf(typeElement), false));
457-
}
458-
subnavLinks.add(getBreadcrumbLink(utils.containingPackage(typeElement), false));
459-
subnavLinks.add(getBreadcrumbLink(typeElement, true));
460-
return super.getNavBar(pageMode, element).setSubNavLinks(subnavLinks);
461-
}
462-
463451
protected void addFooter() {
464452
bodyContents.addMainContent(MarkerComments.END_OF_CLASS_DATA);
465453
bodyContents.setFooter(getFooter());

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandler.java

-13
Original file line numberDiff line numberDiff line change
@@ -214,19 +214,6 @@ public DocFileWriter(HtmlConfiguration configuration, DocPath path, DocFileEleme
214214
this.dfElement = dfElement;
215215
}
216216

217-
@Override
218-
protected Navigation getNavBar(PageMode pageMode, Element element) {
219-
List<Content> subnavLinks = new ArrayList<>();
220-
var pkg = dfElement.getPackageElement();
221-
if (configuration.showModules) {
222-
subnavLinks.add(getBreadcrumbLink(utils.elementUtils.getModuleOf(element), pkg.isUnnamed()));
223-
}
224-
if (!pkg.isUnnamed()) {
225-
subnavLinks.add(getBreadcrumbLink(pkg, true));
226-
}
227-
return super.getNavBar(pageMode, element).setSubNavLinks(subnavLinks);
228-
}
229-
230217
@Override
231218
public void buildPage() throws DocFileIOException {
232219

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java

-23
Original file line numberDiff line numberDiff line change
@@ -750,29 +750,6 @@ protected DocPath pathString(PackageElement packageElement, DocPath name) {
750750
return pathToRoot.resolve(docPaths.forPackage(packageElement).resolve(name));
751751
}
752752

753-
/**
754-
* {@return a content element containing a breadcrumb navigtation link for {@code elem}}
755-
* Only module, package and type elements can appear in breadcrumb navigation.
756-
*
757-
* @param elem the element
758-
* @param selected whether to use the style for current page element
759-
*/
760-
protected Content getBreadcrumbLink(Element elem, boolean selected) {
761-
HtmlTree link = switch (elem) {
762-
case ModuleElement mdle -> links.createLink(pathToRoot.resolve(docPaths.moduleSummary(mdle)),
763-
Text.of(mdle.getQualifiedName()));
764-
case PackageElement pkg -> links.createLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY),
765-
getLocalizedPackageName(pkg));
766-
case TypeElement type -> links.createLink(pathString(type, docPaths.forName(type)),
767-
utils.getSimpleName(type));
768-
default -> throw new IllegalArgumentException(Objects.toString(elem));
769-
};
770-
if (selected) {
771-
link.setStyle(HtmlStyle.currentSelection);
772-
}
773-
return link;
774-
}
775-
776753
/**
777754
* {@return the link to the given package}
778755
*

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriter.java

-6
Original file line numberDiff line numberDiff line change
@@ -274,12 +274,6 @@ protected Content getModuleHeader(String heading) {
274274
return body;
275275
}
276276

277-
@Override
278-
protected Navigation getNavBar(PageMode pageMode, Element element) {
279-
return super.getNavBar(pageMode, element)
280-
.setSubNavLinks(List.of(getBreadcrumbLink(mdle, true)));
281-
}
282-
283277
protected Content getContentHeader() {
284278
return new ContentBuilder();
285279
}

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java

+48-27
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727

2828
import java.util.ArrayList;
2929
import java.util.List;
30+
import java.util.Objects;
3031

3132
import javax.lang.model.element.Element;
33+
import javax.lang.model.element.ElementKind;
3234
import javax.lang.model.element.ModuleElement;
3335
import javax.lang.model.element.PackageElement;
3436
import javax.lang.model.element.TypeElement;
@@ -68,7 +70,6 @@ public class Navigation {
6870
private final PageMode documentedPage;
6971
private Content userHeader;
7072
private final String rowListTitle;
71-
private List<Content> subNavLinks = List.of();
7273

7374
public enum PageMode {
7475
ALL_CLASSES,
@@ -120,11 +121,6 @@ public Navigation setUserHeader(Content userHeader) {
120121
return this;
121122
}
122123

123-
public Navigation setSubNavLinks(List<Content> subNavLinks) {
124-
this.subNavLinks = subNavLinks;
125-
return this;
126-
}
127-
128124
/**
129125
* Adds the links for the main navigation.
130126
*
@@ -320,26 +316,6 @@ private void addMainNavLinks(Content target) {
320316
}
321317
}
322318

323-
/**
324-
* Adds the navigation Type detail link.
325-
*
326-
* @param kind the kind of member being documented
327-
* @param link true if the members are listed and need to be linked
328-
* @param listContents the list of contents to which the detail will be added.
329-
*/
330-
protected void addTypeDetailLink(VisibleMemberTable.Kind kind, boolean link, List<Content> listContents) {
331-
addContentToList(listContents, switch (kind) {
332-
case CONSTRUCTORS -> links.createLinkOrLabel(HtmlIds.CONSTRUCTOR_DETAIL, contents.navConstructor, link);
333-
case ENUM_CONSTANTS -> links.createLinkOrLabel(HtmlIds.ENUM_CONSTANT_DETAIL, contents.navEnum, link);
334-
case FIELDS -> links.createLinkOrLabel(HtmlIds.FIELD_DETAIL, contents.navField, link);
335-
case METHODS -> links.createLinkOrLabel(HtmlIds.METHOD_DETAIL, contents.navMethod, link);
336-
case PROPERTIES -> links.createLinkOrLabel(HtmlIds.PROPERTY_DETAIL, contents.navProperty, link);
337-
case ANNOTATION_TYPE_MEMBER -> links.createLinkOrLabel(HtmlIds.ANNOTATION_TYPE_ELEMENT_DETAIL,
338-
contents.navAnnotationTypeMember, link);
339-
default -> Text.EMPTY;
340-
});
341-
}
342-
343319
private void addContentToList(List<Content> listContents, Content source) {
344320
listContents.add(HtmlTree.LI(source));
345321
}
@@ -397,6 +373,46 @@ private void addOverviewLink(Content target) {
397373
}
398374
}
399375

376+
/**
377+
* Adds breadcrumb navigation links for {@code element} and its containing elements
378+
* to {@code contents}. Only module, package and type elements are supported in
379+
* breadcrumb navigation.
380+
*
381+
* @param elem a module, package or type element
382+
* @param contents the list to which links are added
383+
* @param selected {@code true} if elem is the current page element
384+
*/
385+
protected void addBreadcrumbLinks(Element elem, List<Content> contents, boolean selected) {
386+
if (elem == null) {
387+
return;
388+
} else if (elem.getKind() != ElementKind.MODULE) {
389+
addBreadcrumbLinks(elem.getEnclosingElement(), contents, false);
390+
} else if (!configuration.showModules) {
391+
return;
392+
}
393+
var docPaths = configuration.docPaths;
394+
HtmlTree link = switch (elem) {
395+
case ModuleElement mdle -> links.createLink(pathToRoot.resolve(
396+
docPaths.moduleSummary(mdle)),
397+
Text.of(mdle.getQualifiedName()));
398+
case PackageElement pkg -> links.createLink(pathToRoot.resolve(
399+
docPaths.forPackage(pkg).resolve(DocPaths.PACKAGE_SUMMARY)),
400+
pkg.isUnnamed()
401+
? configuration.contents.defaultPackageLabel
402+
: Text.of(pkg.getQualifiedName()));
403+
// Breadcrumb navigation displays nested classes as separate links.
404+
// Enclosing classes may be undocumented, in which case we just display the class name.
405+
case TypeElement type -> (configuration.isGeneratedDoc(type) && !configuration.utils.hasHiddenTag(type))
406+
? links.createLink(pathToRoot.resolve(
407+
docPaths.forClass(type)), type.getSimpleName().toString())
408+
: HtmlTree.SPAN(Text.of(type.getSimpleName().toString()));
409+
default -> throw new IllegalArgumentException(Objects.toString(elem));
410+
};
411+
if (selected) {
412+
link.setStyle(HtmlStyle.currentSelection);
413+
}
414+
contents.add(link);
415+
}
400416

401417
private void addPageElementLink(Content list) {
402418
Content link = switch (element) {
@@ -530,7 +546,12 @@ public Content getContent() {
530546
navigationBar.add(HtmlTree.DIV(HtmlStyle.topNav, navContent).setId(HtmlIds.NAVBAR_TOP));
531547

532548
var subNavContent = HtmlTree.DIV(HtmlStyle.navContent);
533-
549+
List<Content> subNavLinks = new ArrayList<>();
550+
switch (documentedPage) {
551+
case MODULE, PACKAGE, CLASS, USE, DOC_FILE, TREE -> {
552+
addBreadcrumbLinks(element, subNavLinks, true);
553+
}
554+
}
534555
// Add the breadcrumb navigation links if present.
535556
var breadcrumbNav = HtmlTree.OL(HtmlStyle.subNavList);
536557
breadcrumbNav.addAll(subNavLinks, HtmlTree::LI);

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java

-12
Original file line numberDiff line numberDiff line change
@@ -130,18 +130,6 @@ protected HtmlTree getPackageTreeHeader() {
130130
return body;
131131
}
132132

133-
@Override
134-
protected Navigation getNavBar(PageMode pageMode, Element element) {
135-
List<Content> subnavLinks = new ArrayList<>();
136-
if (configuration.showModules) {
137-
var mdle = utils.elementUtils.getModuleOf(packageElement);
138-
subnavLinks.add(getModuleLink(mdle, Text.of(mdle.getQualifiedName())));
139-
}
140-
subnavLinks.add(links.createLink(pathString(packageElement, DocPaths.PACKAGE_SUMMARY),
141-
getLocalizedPackageName(packageElement), HtmlStyle.currentSelection, ""));
142-
return super.getNavBar(pageMode, element).setSubNavLinks(subnavLinks);
143-
}
144-
145133
/**
146134
* Add a link to the tree for all the packages.
147135
*

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java

-10
Original file line numberDiff line numberDiff line change
@@ -215,14 +215,4 @@ private HtmlTree getBody() {
215215
.addMainContent(div);
216216
return body;
217217
}
218-
219-
@Override
220-
protected Navigation getNavBar(PageMode pageMode, Element element) {
221-
List<Content> subnavLinks = new ArrayList<>();
222-
if (configuration.showModules) {
223-
subnavLinks.add(getBreadcrumbLink(utils.elementUtils.getModuleOf(packageElement), false));
224-
}
225-
subnavLinks.add(getBreadcrumbLink(packageElement, true));
226-
return super.getNavBar(pageMode, element).setSubNavLinks(subnavLinks);
227-
}
228218
}

‎src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriter.java

-10
Original file line numberDiff line numberDiff line change
@@ -268,16 +268,6 @@ private List<PackageElement> findRelatedPackages() {
268268
return packages;
269269
}
270270

271-
@Override
272-
protected Navigation getNavBar(PageMode pageMode, Element element) {
273-
List<Content> subnavLinks = new ArrayList<>();
274-
if (configuration.showModules) {
275-
subnavLinks.add(getBreadcrumbLink(utils.elementUtils.getModuleOf(packageElement), false));
276-
}
277-
subnavLinks.add(getBreadcrumbLink(packageElement, true));
278-
return super.getNavBar(pageMode, element).setSubNavLinks(subnavLinks);
279-
}
280-
281271
/**
282272
* Add the package deprecation information to the documentation tree.
283273
*

‎test/langtools/jdk/javadoc/doclet/testNavigation/TestNavigation.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
/*
2525
* @test
2626
* @bug 7025314 8023700 7198273 8025633 8026567 8081854 8196027 8182765
27-
* 8196200 8196202 8223378 8258659 8261976 8320458
27+
* 8196200 8196202 8223378 8258659 8261976 8320458 8329537
2828
* @summary Make sure the Next/Prev Class links iterate through all types.
2929
* Make sure the navagation is 2 columns, not 3.
3030
* @library /tools/lib ../../lib
@@ -178,6 +178,12 @@ public static class Y extends X {
178178
checkExit(Exit.OK);
179179

180180
checkOrder("pkg1/A.X.html",
181+
"""
182+
<ol class="sub-nav-list">
183+
<li><a href="package-summary.html">pkg1</a></li>
184+
<li><a href="A.html">A</a></li>
185+
<li><a href="A.X.html" class="current-selection">X</a></li>
186+
</ol>""",
181187
"""
182188
<ol class="toc-list">
183189
<li><a href="#" tabindex="0">Description</a></li>
@@ -203,6 +209,12 @@ public static class Y extends X {
203209
</ol>""");
204210

205211
checkOrder("pkg1/A.Y.html",
212+
"""
213+
<ol class="sub-nav-list">
214+
<li><a href="package-summary.html">pkg1</a></li>
215+
<li><a href="A.html">A</a></li>
216+
<li><a href="A.Y.html" class="current-selection">Y</a></li>
217+
</ol>""",
206218
"""
207219
<ol class="toc-list">
208220
<li><a href="#" tabindex="0">Description</a></li>
@@ -218,6 +230,13 @@ public static class Y extends X {
218230
</ol>""");
219231

220232
checkOrder("pkg1/A.X.IC.html",
233+
"""
234+
<ol class="sub-nav-list">
235+
<li><a href="package-summary.html">pkg1</a></li>
236+
<li><a href="A.html">A</a></li>
237+
<li><a href="A.X.html">X</a></li>
238+
<li><a href="A.X.IC.html" class="current-selection">IC</a></li>
239+
</ol>""",
221240
"""
222241
<ol class="toc-list">
223242
<li><a href="#" tabindex="0">Description</a></li>

0 commit comments

Comments
 (0)
Please sign in to comment.