8232644: bugs in serialized-form.html

Reviewed-by: jjg
This commit is contained in:
Hannes Wallnöfer 2021-05-07 15:34:53 +00:00
parent b5b31197e5
commit c6aa8f19ac
14 changed files with 88 additions and 66 deletions

View file

@ -165,7 +165,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
writer.addInlineComment(field, contentTree); writer.addInlineComment(field, contentTree);
} }
List<? extends SerialTree> tags = utils.getSerialTrees(field); List<? extends SerialTree> tags = utils.getSerialTrees(field);
if (!tags.isEmpty()) { if (!tags.isEmpty() && !tags.get(0).getDescription().isEmpty()) {
writer.addInlineComment(field, tags.get(0), contentTree); writer.addInlineComment(field, tags.get(0), contentTree);
} }
} }

View file

@ -27,8 +27,10 @@ package jdk.javadoc.internal.doclets.formats.html;
import java.util.Set; import java.util.Set;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.Entity; import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.TagName;
@ -106,15 +108,15 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
/** /**
* Get the given package header. * Get the given package header.
* *
* @param packageName the package header to write * @param packageElement the package element to write
* @return a content tree for the package header * @return a content tree for the package header
*/ */
@Override @Override
public Content getPackageHeader(String packageName) { public Content getPackageHeader(PackageElement packageElement) {
Content heading = HtmlTree.HEADING_TITLE(Headings.SerializedForm.PACKAGE_HEADING, Content heading = HtmlTree.HEADING_TITLE(Headings.SerializedForm.PACKAGE_HEADING,
contents.packageLabel); contents.packageLabel);
heading.add(Entity.NO_BREAK_SPACE); heading.add(Entity.NO_BREAK_SPACE);
heading.add(packageName); heading.add(getPackageLink(packageElement, Text.of(utils.getPackageName(packageElement))));
return heading; return heading;
} }
@ -159,15 +161,26 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
? getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.SERIALIZED_FORM, ? getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.SERIALIZED_FORM,
typeElement.getSuperclass())) typeElement.getSuperclass()))
: null; : null;
Content interfaceLink = getLink(new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.SERIALIZED_FORM,
utils.isExternalizable(typeElement)
? utils.getExternalizableType()
: utils.getSerializableType()));
// Print the heading. // Print the heading.
Content className = superClassLink == null ? Content className = new ContentBuilder();
contents.getContent( className.add(utils.getTypeElementKindName(typeElement, false));
"doclet.Class_0_implements_serializable", classLink) : className.add(Entity.NO_BREAK_SPACE);
contents.getContent( className.add(classLink);
"doclet.Class_0_extends_implements_serializable", classLink,
superClassLink);
section.add(HtmlTree.HEADING(Headings.SerializedForm.CLASS_HEADING, className)); section.add(HtmlTree.HEADING(Headings.SerializedForm.CLASS_HEADING, className));
// Print a simplified signature.
Content signature = new ContentBuilder();
signature.add("class ");
signature.add(typeElement.getSimpleName());
signature.add(" extends ");
signature.add(superClassLink);
signature.add(" implements ");
signature.add(interfaceLink);
section.add(HtmlTree.DIV(HtmlStyle.typeSignature, signature));
return section; return section;
} }

View file

@ -26,6 +26,7 @@
package jdk.javadoc.internal.doclets.toolkit; package jdk.javadoc.internal.doclets.toolkit;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement; import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeMirror;
@ -77,10 +78,10 @@ public interface SerializedFormWriter {
/** /**
* Get the given package header. * Get the given package header.
* *
* @param packageName the package header to write * @param packageElement the package element to write
* @return a content tree for the package header * @return a content tree for the package header
*/ */
Content getPackageHeader(String packageName); Content getPackageHeader(PackageElement packageElement);
/** /**
* Get the serialized class header. * Get the serialized class header.

View file

@ -193,8 +193,7 @@ public class SerializedFormBuilder extends AbstractBuilder {
* @param packageSerializedTree content tree to which the documentation will be added * @param packageSerializedTree content tree to which the documentation will be added
*/ */
protected void buildPackageHeader(Content packageSerializedTree) { protected void buildPackageHeader(Content packageSerializedTree) {
packageSerializedTree.add(writer.getPackageHeader( packageSerializedTree.add(writer.getPackageHeader(currentPackage));
utils.getPackageName(currentPackage)));
} }
/** /**

View file

@ -32,8 +32,6 @@ doclet.Serialized_Form=Serialized Form
doclet.Serialized_Form_methods=Serialization Methods doclet.Serialized_Form_methods=Serialization Methods
doclet.Serialized_Form_fields=Serialized Fields doclet.Serialized_Form_fields=Serialized Fields
doclet.Serialized_Form_class=Serialization Overview doclet.Serialized_Form_class=Serialization Overview
doclet.Class_0_implements_serializable=Class {0} implements Serializable
doclet.Class_0_extends_implements_serializable=Class {0} extends {1} implements Serializable
doclet.Option_conflict=Option {0} conflicts with {1} doclet.Option_conflict=Option {0} conflicts with {1}
doclet.Option_reuse=Option reused: {0} doclet.Option_reuse=Option reused: {0}
doclet.Option_invalid=Invalid argument {0} for {1} option doclet.Option_invalid=Invalid argument {0} for {1} option

View file

@ -54,13 +54,13 @@ h3 {
font-size:16px; font-size:16px;
} }
h4 { h4 {
font-size:13px; font-size:15px;
} }
h5 { h5 {
font-size:12px; font-size:14px;
} }
h6 { h6 {
font-size:11px; font-size:13px;
} }
ul { ul {
list-style-type:disc; list-style-type:disc;

View file

@ -69,6 +69,7 @@ import static com.sun.source.doctree.DocTree.Kind.EXCEPTION;
import static com.sun.source.doctree.DocTree.Kind.HIDDEN; import static com.sun.source.doctree.DocTree.Kind.HIDDEN;
import static com.sun.source.doctree.DocTree.Kind.LINK; import static com.sun.source.doctree.DocTree.Kind.LINK;
import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN; import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN;
import static com.sun.source.doctree.DocTree.Kind.PARAM;
import static com.sun.source.doctree.DocTree.Kind.PROVIDES; import static com.sun.source.doctree.DocTree.Kind.PROVIDES;
import static com.sun.source.doctree.DocTree.Kind.SEE; import static com.sun.source.doctree.DocTree.Kind.SEE;
import static com.sun.source.doctree.DocTree.Kind.SERIAL; import static com.sun.source.doctree.DocTree.Kind.SERIAL;
@ -594,6 +595,7 @@ public class TagletManager {
// init the serialized form tags for the serialized form page // init the serialized form tags for the serialized form page
serializedFormTags = new ArrayList<>(); serializedFormTags = new ArrayList<>();
serializedFormTags.add(allTaglets.get(SERIAL_DATA.tagName)); serializedFormTags.add(allTaglets.get(SERIAL_DATA.tagName));
serializedFormTags.add(allTaglets.get(PARAM.tagName));
serializedFormTags.add(allTaglets.get(THROWS.tagName)); serializedFormTags.add(allTaglets.get(THROWS.tagName));
if (!nosince) if (!nosince)
serializedFormTags.add(allTaglets.get(SINCE.tagName)); serializedFormTags.add(allTaglets.get(SINCE.tagName));

View file

@ -92,9 +92,9 @@ public class TestHeadings extends JavadocTester {
// Serialized Form // Serialized Form
checkOutput("serialized-form.html", true, checkOutput("serialized-form.html", true,
""" """
<h2 title="Package">Package&nbsp;pkg1</h2>""", <h2 title="Package">Package&nbsp;<a href="pkg1/package-summary.html">pkg1</a></h2>""",
""" """
<h3>Class <a href="pkg1/C1.html" title="class in pkg1">pkg1.C1</a> extends java.lang.Object implements Serializable</h3>""", <h3>Class&nbsp;<a href="pkg1/C1.html" title="class in pkg1">pkg1.C1</a></h3>""",
"<h4>Serialized Fields</h4>"); "<h4>Serialized Fields</h4>");
// Overview Summary // Overview Summary

View file

@ -241,7 +241,6 @@ public class TestHtmlDefinitionListTag extends JavadocTester {
<a href="pkg1/C1.html#setUndecorated(boolean)"><code>setUndecorated(boolean)</code></a>.</div> <a href="pkg1/C1.html#setUndecorated(boolean)"><code>setUndecorated(boolean)</code></a>.</div>
</div> </div>
<div class="block">This field indicates whether the C1 is undecorated.</div> <div class="block">This field indicates whether the C1 is undecorated.</div>
&nbsp;
<dl class="notes"> <dl class="notes">
<dt>Since:</dt> <dt>Since:</dt>
<dd>1.4</dd> <dd>1.4</dd>
@ -259,6 +258,8 @@ public class TestHtmlDefinitionListTag extends JavadocTester {
</div> </div>
<div class="block">Reads the object stream.</div> <div class="block">Reads the object stream.</div>
<dl class="notes"> <dl class="notes">
<dt>Parameters:</dt>
<dd><code>s</code> - ObjectInputStream</dd>
<dt>Throws:</dt> <dt>Throws:</dt>
<dd><code>java.io.IOException</code></dd> <dd><code>java.io.IOException</code></dd>
</dl>""", </dl>""",
@ -350,7 +351,6 @@ public class TestHtmlDefinitionListTag extends JavadocTester {
<a href="pkg1/C1.html#setUndecorated(boolean)"><code>setUndecorated(boolean)</code></a>.</div> <a href="pkg1/C1.html#setUndecorated(boolean)"><code>setUndecorated(boolean)</code></a>.</div>
</div> </div>
<div class="block">This field indicates whether the C1 is undecorated.</div> <div class="block">This field indicates whether the C1 is undecorated.</div>
&nbsp;
<dl class="notes"> <dl class="notes">
<dt>Since:</dt> <dt>Since:</dt>
<dd>1.4</dd> <dd>1.4</dd>
@ -368,6 +368,8 @@ public class TestHtmlDefinitionListTag extends JavadocTester {
</div> </div>
<div class="block">Reads the object stream.</div> <div class="block">Reads the object stream.</div>
<dl class="notes"> <dl class="notes">
<dt>Parameters:</dt>
<dd><code>s</code> - ObjectInputStream</dd>
<dt>Throws:</dt> <dt>Throws:</dt>
<dd><code>java.io.IOException</code></dd> <dd><code>java.io.IOException</code></dd>
</dl>""", </dl>""",

View file

@ -241,7 +241,7 @@ public class TestHtmlVersion extends JavadocTester {
<div class="header">""", <div class="header">""",
""" """
<section class="serialized-package-container"> <section class="serialized-package-container">
<h2 title="Package">Package&nbsp;pkg</h2> <h2 title="Package">Package&nbsp;<a href="pkg/package-summary.html">pkg</a></h2>
""", """,
""" """
<footer role="contentinfo">""", <footer role="contentinfo">""",

View file

@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 4341304 4485668 4966728 8032066 8071982 8192933 8215307 * @bug 4341304 4485668 4966728 8032066 8071982 8192933 8215307 8232644
* @summary Test that methods readResolve and writeReplace show * @summary Test that methods readResolve and writeReplace show
* up in serialized-form.html the same way that readObject and writeObject do. * up in serialized-form.html the same way that readObject and writeObject do.
* If the doclet includes readResolve and writeReplace in the serialized-form * If the doclet includes readResolve and writeReplace in the serialized-form
@ -76,28 +76,32 @@ public class TestSerializedForm extends JavadocTester {
</ul> </ul>
</dd> </dd>
</dl>""", </dl>""",
"<h3>Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " """
+ "extends java.lang.Object implements Serializable</h3>", <h3>Class&nbsp;pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass</h3>
"<h3>Class pkg1.PrivateIncludeInnerClass.PriInnerClass extends " <div class="type-signature">class ProNestedInnerClass extends java.lang.Object i\
+ "java.lang.Object implements Serializable</h3>", mplements java.io.Serializable</div>
"<h3>Class pkg1.ProtectedInnerClass.ProInnerClass extends " """,
+ "java.lang.Object implements Serializable</h3>"); """
<h3>Class&nbsp;pkg1.PrivateIncludeInnerClass.PriInnerClass</h3>
<div class="type-signature">class PriInnerClass extends java.lang.Object impleme\
nts java.io.Serializable</div>""",
"""
<h3>Class&nbsp;pkg1.ProtectedInnerClass.ProInnerClass</h3>
<div class="type-signature">class ProInnerClass extends java.lang.Object impleme\
nts java.io.Serializable</div>""");
checkOutput("serialized-form.html", false, checkOutput("serialized-form.html", false,
""" """
<h3>Class <a href="pkg1/NestedInnerClass.InnerClass.ProNestedInnerClass.html" ti\ <h3>Class&nbsp;<a href="pkg1/NestedInnerClass.InnerClass.ProNestedInnerClass.htm\
tle="class in pkg1">pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass</a> ext\ l" title="class in pkg1">pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass</a\
ends java.lang.Object implements Serializable</h3>""", ></h3>""",
""" """
<h3>Class <a href="pkg1/PrivateInnerClass.PriInnerClass.html" title="class in pk\ <h3>Class&nbsp;<a href="pkg1/PrivateInnerClass.PriInnerClass.html" title="class \
g1">pkg1.PrivateInnerClass.PriInnerClass</a> extends java.lang.Object implements\ in pkg1">pkg1.PrivateInnerClass.PriInnerClass</a></h3>""",
Serializable</h3>""",
""" """
<h3>Class <a href="pkg1/ProtectedInnerClass.ProInnerClass.html" title="class in \ <h3>Class&nbsp;<a href="pkg1/ProtectedInnerClass.ProInnerClass.html" title="class in \
pkg1">pkg1.ProtectedInnerClass.ProInnerClass</a> extends java.lang.Object implem\ pkg1">pkg1.ProtectedInnerClass.ProInnerClass</a></h3>""",
ents Serializable</h3>""", "<h3>Class&nbsp;pkg1.PublicExcludeInnerClass.PubInnerClass</h3>");
"<h3>Class pkg1.PublicExcludeInnerClass.PubInnerClass extends java.lang.Object implements "
+ "Serializable</h3>");
checkOutput("serialized-form.html", true, checkOutput("serialized-form.html", true,
""" """
@ -127,29 +131,29 @@ public class TestSerializedForm extends JavadocTester {
checkOutput("serialized-form.html", true, checkOutput("serialized-form.html", true,
""" """
<h3>Class <a href="pkg1/NestedInnerClass.InnerClass.ProNestedInnerClass.html" ti\ <h3>Class&nbsp;<a href="pkg1/NestedInnerClass.InnerClass.ProNestedInnerClass.htm\
tle="class in pkg1">pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass</a> ext\ l" title="class in pkg1">pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass</a\
ends java.lang.Object implements Serializable</h3>""", ></h3>
<div class="type-signature">class ProNestedInnerClass extends java.lang.Object i\
mplements java.io.Serializable</div>""",
""" """
<h3>Class <a href="pkg1/PrivateIncludeInnerClass.PriInnerClass.html" title="clas\ <h3>Class&nbsp;<a href="pkg1/PrivateIncludeInnerClass.PriInnerClass.html" title=\
s in pkg1">pkg1.PrivateIncludeInnerClass.PriInnerClass</a> extends java.lang.Obj\ "class in pkg1">pkg1.PrivateIncludeInnerClass.PriInnerClass</a></h3>
ect implements Serializable</h3>""", <div class="type-signature">class PriInnerClass extends java.lang.Object impleme\
nts java.io.Serializable</div>""",
""" """
<h3>Class <a href="pkg1/ProtectedInnerClass.ProInnerClass.html" title="class in \ <h3>Class&nbsp;<a href="pkg1/ProtectedInnerClass.ProInnerClass.html" title="clas\
pkg1">pkg1.ProtectedInnerClass.ProInnerClass</a> extends java.lang.Object implem\ s in pkg1">pkg1.ProtectedInnerClass.ProInnerClass</a></h3>
ents Serializable</h3>"""); <div class="type-signature">class ProInnerClass extends java.lang.Object impleme\
nts java.io.Serializable</div>""");
checkOutput("serialized-form.html", false, checkOutput("serialized-form.html", false,
"<h3>Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " "<h3>Class&nbsp;pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass</h3>",
+ "extends java.lang.Object implements Serializable</h3>", "<h3>Class&nbsp;pkg1.PrivateInnerClass.PriInnerClass</h3>",
"<h3>Class pkg1.PrivateInnerClass.PriInnerClass extends " "<h3>Class&nbsp;pkg1.ProtectedInnerClass.ProInnerClass</h3>",
+ "java.lang.Object implements Serializable</h3>",
"<h3>Class pkg1.ProtectedInnerClass.ProInnerClass extends "
+ "java.lang.Object implements Serializable</h3>",
""" """
<h3>Class <a href="pkg1/PublicExcludeInnerClass.PubInnerClass.html" title="class\ <h3>Class&nbsp;<a href="pkg1/PublicExcludeInnerClass.PubInnerClass.html" title="class\
in pkg1">pkg1.PublicExcludeInnerClass.PubInnerClass</a> extends java.lang.Objec\ in pkg1">pkg1.PublicExcludeInnerClass.PubInnerClass</a></h3>""");
t implements Serializable</h3>""");
checkOutput("serialized-form.html", true, checkOutput("serialized-form.html", true,
""" """

View file

@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 6802694 8025633 8026567 8183511 8074407 8182765 * @bug 6802694 8025633 8026567 8183511 8074407 8182765 8232644
* @summary This test verifies deprecation info in serialized-form.html. * @summary This test verifies deprecation info in serialized-form.html.
* @library ../../lib * @library ../../lib
* @modules jdk.javadoc/jdk.javadoc.internal.tool * @modules jdk.javadoc/jdk.javadoc.internal.tool
@ -110,7 +110,6 @@ public class TestSerializedFormDeprecationInfo extends JavadocTester {
<a href="pkg1/C1.html#setUndecorated(boolean)"><code>setUndecorated(boolean)</code></a>.</div> <a href="pkg1/C1.html#setUndecorated(boolean)"><code>setUndecorated(boolean)</code></a>.</div>
</div> </div>
<div class="block">This field indicates whether the C1 is undecorated.</div> <div class="block">This field indicates whether the C1 is undecorated.</div>
&nbsp;
<dl class="notes"> <dl class="notes">
<dt>Since:</dt> <dt>Since:</dt>
<dd>1.4</dd> <dd>1.4</dd>
@ -128,6 +127,8 @@ public class TestSerializedFormDeprecationInfo extends JavadocTester {
</div> </div>
<div class="block">Reads the object stream.</div> <div class="block">Reads the object stream.</div>
<dl class="notes"> <dl class="notes">
<dt>Parameters:</dt>
<dd><code>s</code> - ObjectInputStream</dd>
<dt>Throws:</dt> <dt>Throws:</dt>
<dd><code>java.io.IOException</code> - on error</dd> <dd><code>java.io.IOException</code> - on error</dd>
</dl>""", </dl>""",

View file

@ -44,13 +44,15 @@ public class TestSuperClassInSerialForm extends JavadocTester {
@Test @Test
public void test() { public void test() {
javadoc("-d", "out", javadoc("-d", "out",
"--no-platform-links",
"-sourcepath", testSrc, "-sourcepath", testSrc,
"pkg"); "pkg");
checkExit(Exit.OK); checkExit(Exit.OK);
checkOutput("serialized-form.html", true, checkOutput("serialized-form.html", true,
""" """
<a href="pkg/SubClass.html" title="class in pkg">pkg.SubClass</a> extends <a hre\ <h3>Class&nbsp;<a href="pkg/SubClass.html" title="class in pkg">pkg.SubClass</a></h3>
f="pkg/SuperClass.html" title="class in pkg">SuperClass</a>"""); <div class="type-signature">class SubClass extends <a href="pkg/SuperClass.html" tit\
le="class in pkg">SuperClass</a> implements java.io.Serializable</div>""");
} }
} }