8281533: Odd "preview" label in link/linkplain

Reviewed-by: jjg
This commit is contained in:
Hannes Wallnöfer 2024-08-19 18:05:37 +00:00
parent c7690c34c2
commit 55851a312b
4 changed files with 73 additions and 42 deletions

View File

@ -52,6 +52,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag;
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.HtmlTag;
import jdk.javadoc.internal.html.HtmlTree;
import jdk.javadoc.internal.html.Text;
@ -296,26 +297,12 @@ public class HtmlLinkFactory {
Content link = new ContentBuilder();
if (utils.isIncluded(typeElement)) {
if (configuration.isGeneratedDoc(typeElement) && !utils.hasHiddenTag(typeElement)) {
DocPath filename = getPath(linkInfo);
DocPath fileName = getPath(linkInfo);
if (linkInfo.linkToSelf() || typeElement != m_writer.getCurrentPageElement()) {
link.add(m_writer.links.createLink(
filename.fragment(linkInfo.getFragment()),
label,
linkInfo.getStyle(),
title));
Content spacer = Text.EMPTY;
if (flags.contains(ElementFlag.PREVIEW)) {
link.add(HtmlTree.SUP(m_writer.links.createLink(
filename.fragment(m_writer.htmlIds.forPreviewSection(previewTarget).name()),
m_writer.contents.previewMark)));
spacer = Entity.NO_BREAK_SPACE;
}
if (flags.contains(ElementFlag.RESTRICTED)) {
link.add(spacer);
link.add(HtmlTree.SUP(m_writer.links.createLink(
filename.fragment(m_writer.htmlIds.forRestrictedSection(restrictedTarget).name()),
m_writer.contents.restrictedMark)));
}
fileName.fragment(linkInfo.getFragment()),
label, linkInfo.getStyle(), title));
addSuperscript(link, flags, fileName, null, previewTarget, restrictedTarget);
return link;
}
}
@ -325,38 +312,61 @@ public class HtmlLinkFactory {
label, linkInfo.getStyle(), true);
if (crossLink != null) {
link.add(crossLink);
Content spacer = Text.EMPTY;
if (flags.contains(ElementFlag.PREVIEW)) {
link.add(HtmlTree.SUP(m_writer.getCrossClassLink(
typeElement,
m_writer.htmlIds.forPreviewSection(previewTarget).name(),
m_writer.contents.previewMark,
null, false)));
spacer = Entity.NO_BREAK_SPACE;
}
if (flags.contains(ElementFlag.RESTRICTED)) {
link.add(spacer);
link.add(HtmlTree.SUP(m_writer.getCrossClassLink(
typeElement,
m_writer.htmlIds.forRestrictedSection(restrictedTarget).name(),
m_writer.contents.restrictedMark,
null, false)));
}
addSuperscript(link, flags, null, typeElement, previewTarget, restrictedTarget);
return link;
}
}
// Can't link so just write label.
link.add(label);
addSuperscript(link, flags, null, null, previewTarget, restrictedTarget);
return link;
}
/**
* Adds PREVIEW and RESTRICTED superscript labels. Depending on the parameter values,
* labels will be formatted as local or external links or plain text.
*
* @param content the content to add to
* @param flags the flags
* @param fileName file name to link to, or null if no local link target
* @param typeElement external type to link to, or null if no external link
* @param previewTarget preview link target element
* @param restrictedTarget restricted link target element
*/
private void addSuperscript(Content content, Set<ElementFlag> flags, DocPath fileName, TypeElement typeElement,
Element previewTarget, ExecutableElement restrictedTarget) {
Content spacer = Text.EMPTY;
if (flags.contains(ElementFlag.PREVIEW)) {
link.add(HtmlTree.SUP(m_writer.contents.previewMark));
content.add(HtmlTree.SUP(getSuperscript(fileName, typeElement,
m_writer.htmlIds.forPreviewSection(previewTarget),
m_writer.contents.previewMark)));
spacer = Entity.NO_BREAK_SPACE;
}
if (flags.contains(ElementFlag.RESTRICTED)) {
link.add(spacer);
link.add(HtmlTree.SUP(m_writer.contents.restrictedMark));
content.add(spacer);
content.add(HtmlTree.SUP(getSuperscript(fileName, typeElement,
m_writer.htmlIds.forRestrictedSection(restrictedTarget),
m_writer.contents.restrictedMark)));
}
}
/**
* Returns PREVIEW or RESTRICTED superscript as either local or external link or as plain text.
*
* @param fileName local file name to link to, or null if no local link target
* @param typeElement external type to link to, or null if no external link
* @param id the id fragment to link to
* @param label the label content
* @return superscript content
*/
private Content getSuperscript(DocPath fileName, TypeElement typeElement, HtmlId id, Content label) {
if (fileName != null) {
return m_writer.links.createLink(fileName.fragment(id.name()), label);
} else if (typeElement != null) {
return (m_writer.getCrossClassLink(typeElement, id.name(), label, null, false));
} else {
return label;
}
return link;
}
/**

View File

@ -224,6 +224,7 @@ public class LinkTaglet extends BaseTaglet {
labelContent = plainOrCode(isPlain, Text.of(utils.getSimpleName(refClass)));
}
return htmlWriter.getLink(new HtmlLinkInfo(config, HtmlLinkInfo.Kind.PLAIN, refClass)
.skipPreview(isPlain)
.label(labelContent));
} else if (refMem == null) {
// This is a fragment reference since refClass and refFragment are not null but refMem is null.

View File

@ -24,7 +24,7 @@
/*
* @test
* @bug 8250768 8261976 8277300 8282452 8287597 8325325 8325874 8297879
* 8331947
* 8331947 8281533
* @summary test generated docs for items declared using preview
* @library ../../lib
* @modules jdk.javadoc/jdk.javadoc.internal.tool
@ -156,7 +156,20 @@ public class TestPreview extends JavadocTester {
<li><a href="../module-summary.html">java.base</a></li>
<li><a href="package-summary.html">preview</a></li>
<li><a href="Core.html" class="current-selection">Core</a></li>
</ol>""");
</ol>""",
"""
<div class="block">Preview feature. Links: <a href="CoreRecord.html" title="cla\
ss in preview"><code>CoreRecord</code></a><sup><a href="CoreRecord.html#preview\
-preview.CoreRecord">PREVIEW</a></sup>, <a href="CoreRecord.html" title="class \
in preview"><code>core record</code></a><sup><a href="CoreRecord.html#preview-p\
review.CoreRecord">PREVIEW</a></sup>,
<a href="CoreRecord.html" title="class in preview">CoreRecord</a>, <a href="Co\
reRecord.html" title="class in preview">core record</a>.</div>""",
"""
<li><a href="CoreRecord.html" title="class in preview"><code>CoreRecord</code><\
/a><sup><a href="CoreRecord.html#preview-preview.CoreRecord">PREVIEW</a></sup><\
/li>
<li><a href="CoreRecord.html" title="class in preview">core record</a></li>""");
// 8331947: Support preview features without JEP should not be included in Preview API page
checkOutput("preview-list.html", false, "supportMethod");

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 2024, 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
@ -25,6 +25,13 @@ package preview;
import jdk.internal.javac.PreviewFeature;
import jdk.internal.javac.PreviewFeature.Feature;
/**
* Preview feature. Links: {@link CoreRecord}, {@link CoreRecord core record},
* {@linkplain CoreRecord}, {@linkplain CoreRecord core record}.
*
* @see CoreRecord
* @see CoreRecord core record
*/
@PreviewFeature(feature=Feature.TEST)
public class Core {
}