From 2245c726fb38430b84dec2e801f00a2e46d25f9f Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Thu, 29 Aug 2024 12:59:32 -0700 Subject: [PATCH] JDK-8338133: Cleanup direct use of `new HtmlTree` --- .../html/AbstractExecutableMemberWriter.java | 6 +- .../formats/html/AbstractMemberWriter.java | 4 +- .../formats/html/AbstractTreeWriter.java | 5 +- .../doclets/formats/html/ClassUseWriter.java | 2 +- .../doclets/formats/html/ClassWriter.java | 12 +- .../formats/html/ConstantsSummaryWriter.java | 2 +- .../formats/html/ConstructorWriter.java | 2 +- .../doclets/formats/html/HelpWriter.java | 10 +- .../formats/html/HtmlDocletWriter.java | 6 +- .../doclets/formats/html/HtmlLinkFactory.java | 4 +- .../formats/html/IndexRedirectWriter.java | 7 +- .../doclets/formats/html/IndexWriter.java | 6 +- .../doclets/formats/html/ModuleWriter.java | 4 +- .../doclets/formats/html/Navigation.java | 10 +- .../formats/html/PackageUseWriter.java | 2 +- .../doclets/formats/html/PackageWriter.java | 2 +- .../doclets/formats/html/SearchWriter.java | 12 +- .../formats/html/SerialFieldWriter.java | 10 +- .../formats/html/SerialMethodWriter.java | 2 +- .../doclets/formats/html/Signatures.java | 2 +- .../formats/html/SourceToHTMLConverter.java | 4 +- .../internal/doclets/formats/html/Table.java | 8 +- .../doclets/formats/html/TableOfContents.java | 4 +- .../doclets/formats/html/markup/Head.java | 12 +- .../formats/html/taglets/SnippetTaglet.java | 8 +- .../jdk/javadoc/internal/html/HtmlTree.java | 219 ++++++++++++++++-- .../testHtmlDocument/TestHtmlDocument.java | 34 +-- .../TestVoidHtmlElements.java | 2 +- 28 files changed, 286 insertions(+), 115 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java index 84672926cf81a..7efaec8769245 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -109,7 +109,7 @@ protected Content getSummaryLink(Element member) { } String signature = utils.flatSignature((ExecutableElement) member, typeElement); if (signature.length() > 2) { - content.add(new HtmlTree(HtmlTag.WBR)); + content.add(HtmlTree.WBR()); } content.add(signature); @@ -144,7 +144,7 @@ protected void addTypeParameters(ExecutableElement member, Content target) { // Add explicit line break between method type parameters and // return type in member summary table to avoid random wrapping. if (typeParameters.charCount() > 10) { - target.add(new HtmlTree(HtmlTag.BR)); + target.add(HtmlTree.BR()); } else { target.add(Entity.NO_BREAK_SPACE); } @@ -233,7 +233,7 @@ protected void addParameters(ExecutableElement member, Content target) { Content params = getParameters(member, false); if (params.charCount() > 2) { // only add for non-empty parameters - target.add(new HtmlTree(HtmlTag.WBR)); + target.add(HtmlTree.WBR()); } target.add(params); } 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 e2b81bb39822d..59a8f58923085 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 @@ -451,7 +451,7 @@ protected abstract void addInheritedSummaryLink(TypeElement typeElement, */ protected void addModifiersAndType(Element member, TypeMirror type, Content target) { - var code = new HtmlTree(HtmlTag.CODE); + var code = HtmlTree.CODE(); addModifiers(member, code); if (type == null) { code.add(switch (member.getKind()) { @@ -670,7 +670,7 @@ public Content getInheritedSummaryHeader(TypeElement tElement) { * @return the inherited summary links */ public Content getInheritedSummaryLinks() { - return new HtmlTree(HtmlTag.CODE); + return HtmlTree.CODE(); } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractTreeWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractTreeWriter.java index 594132743eb0f..915dbd7627a73 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractTreeWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractTreeWriter.java @@ -79,10 +79,9 @@ protected AbstractTreeWriter(HtmlConfiguration configuration, protected void addLevelInfo(TypeElement parent, Collection collection, Hierarchy hierarchy, Content content) { if (!collection.isEmpty()) { - var ul = new HtmlTree(HtmlTag.UL); + var ul = HtmlTree.UL(); for (TypeElement local : collection) { - var li = new HtmlTree(HtmlTag.LI); - li.setStyle(HtmlStyles.circle); + var li = HtmlTree.LI(HtmlStyles.circle); addPartialInfo(local, li); addExtendsImplements(parent, local, li); addLevelInfo(local, hierarchy.subtypes(local), hierarchy, li); // Recurse diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java index ac953dccb55df..d10478fb3bad5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java @@ -423,7 +423,7 @@ protected HtmlTree getClassUseHeader() { HtmlTree body = getBody(getWindowTitle(title)); ContentBuilder headingContent = new ContentBuilder(); headingContent.add(contents.getContent("doclet.ClassUse_Title", cltype)); - headingContent.add(new HtmlTree(HtmlTag.BR)); + headingContent.add(HtmlTree.BR()); headingContent.add(clname); var heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING, HtmlStyles.title, headingContent); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriter.java index 8218e5128be3b..7b271485f1f4a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriter.java @@ -165,7 +165,7 @@ protected void buildClassInfo(Content target) { buildInterfaceUsageInfo(c); buildNestedClassInfo(c); buildFunctionalInterfaceInfo(c); - c.add(new HtmlTree(HtmlTag.HR)); + c.add(HtmlTree.HR()); var div = HtmlTree.DIV(HtmlStyles.horizontalScroll); buildClassSignature(div); buildDeprecationInfo(div); @@ -461,7 +461,7 @@ private Content getTypeParameters() { var first = true; for (TypeParameterElement t : typeParams) { if (!first) { - content.add(",").add(new HtmlTree(HtmlTag.WBR)); + content.add(",").add(HtmlTree.WBR()); } var typeParamLink = getLink(linkInfo.forType(t.asType())); content.add(needsId @@ -689,11 +689,9 @@ public Void visitType(TypeElement e, Void p) { protected void addFunctionalInterfaceInfo (Content target) { if (utils.isFunctionalInterface(typeElement)) { - var dl = HtmlTree.DL(HtmlStyles.notes); - dl.add(HtmlTree.DT(contents.functionalInterface)); - var dd = new HtmlTree(HtmlTag.DD); - dd.add(contents.functionalInterfaceMessage); - dl.add(dd); + var dl = HtmlTree.DL(HtmlStyles.notes) + .add(HtmlTree.DT(contents.functionalInterface)) + .add(HtmlTree.DD(contents.functionalInterfaceMessage)); target.add(dl); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriter.java index cdae0e8d9115e..9731cd14e8855 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriter.java @@ -414,7 +414,7 @@ void addConstantMembers(TypeElement typeElement, Collection fie */ private Content getTypeColumn(VariableElement member) { Content typeContent = new ContentBuilder(); - var code = new HtmlTree(HtmlTag.CODE) + var code = HtmlTree.CODE() .setId(htmlIds.forMember(currentTypeElement, member)); for (Modifier mod : member.getModifiers()) { code.add(Text.of(mod.toString())) 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 11975404a5564..d1d04d4f7f10e 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 @@ -300,7 +300,7 @@ public void addInheritedSummaryLabel(TypeElement typeElement, Content content) { @Override protected void addSummaryType(Element member, Content content) { if (threeColumnSummary()) { - var code = new HtmlTree(HtmlTag.CODE); + var code = HtmlTree.CODE(); if (utils.isProtected(member)) { code.add("protected "); } else if (utils.isPrivate(member)) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java index 22e778d39868f..1687f891896a3 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java @@ -105,11 +105,11 @@ protected void addHelpFileContents(Content content) { tableOfContents.addLink(HtmlIds.TOP_OF_PAGE, mainHeading); tableOfContents.pushNestedList(); content.add(HtmlTree.HEADING(Headings.PAGE_TITLE_HEADING, HtmlStyles.title, mainHeading)) - .add(new HtmlTree(HtmlTag.HR)) + .add(HtmlTree.HR()) .add(getNavigationSection()) - .add(new HtmlTree(HtmlTag.HR)) + .add(HtmlTree.HR()) .add(getPageKindSection()) - .add(new HtmlTree(HtmlTag.HR)) + .add(HtmlTree.HR()) .add(HtmlTree.SPAN(HtmlStyles.helpFootnote, getContent("doclet.help.footnote"))); tableOfContents.popNestedList(); @@ -255,7 +255,7 @@ private Content getPageKindSection() { getContent("doclet.help.class_interface.implementations"), getContent("doclet.help.class_interface.declaration"), getContent("doclet.help.class_interface.description"))) - .add(new HtmlTree(HtmlTag.BR)) + .add(HtmlTree.BR()) .add(newHelpSectionList( contents.nestedClassSummary, contents.enumConstantSummary, @@ -265,7 +265,7 @@ private Content getPageKindSection() { contents.methodSummary, contents.annotateTypeRequiredMemberSummaryLabel, contents.annotateTypeOptionalMemberSummaryLabel)) - .add(new HtmlTree(HtmlTag.BR)) + .add(HtmlTree.BR()) .add(newHelpSectionList( contents.enumConstantDetailLabel, contents.fieldDetailsLabel, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 235a0361b9233..fdf05489168f7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -685,7 +685,7 @@ public HtmlTree getFooter() { return (bottom == null || bottom.isEmpty()) ? null : HtmlTree.FOOTER() - .add(new HtmlTree(HtmlTag.HR)) + .add(HtmlTree.HR()) .add(HtmlTree.P(HtmlStyles.legalCopy, HtmlTree.SMALL( RawHtml.of(replaceDocRootDir(bottom))))); @@ -2405,7 +2405,7 @@ static String getGenerator(Class clazz) { * @return an HtmlTree for the BODY tag */ public HtmlTree getBody(String title) { - var body = new HtmlTree(HtmlTag.BODY).setStyle(getBodyStyle()); + var body = HtmlTree.BODY(getBodyStyle()); this.winTitle = title; // Don't print windowtitle script for overview-frame, allclasses-frame @@ -2601,7 +2601,7 @@ private Content withPreviewFeatures(String key, String className, String feature }); return contents.getContent(key, HtmlTree.CODE(Text.of(className)), - new HtmlTree(HtmlTag.EM).add(featureName), + HtmlTree.EM(featureName), featureCodes); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlLinkFactory.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlLinkFactory.java index 494d5e22d6e10..bf210b91ea6eb 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlLinkFactory.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlLinkFactory.java @@ -395,14 +395,14 @@ protected Content getTypeParameterLinks(HtmlLinkInfo linkInfo) { } if (!vars.isEmpty()) { if (linkInfo.addLineBreakOpportunitiesInTypeParameters()) { - links.add(new HtmlTree(HtmlTag.WBR)); + links.add(HtmlTree.WBR()); } links.add("<"); boolean many = false; for (TypeMirror t : vars) { if (many) { links.add(","); - links.add(new HtmlTree(HtmlTag.WBR)); + links.add(HtmlTree.WBR()); if (linkInfo.addLineBreaksInTypeParameters()) { links.add(Text.NL); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexRedirectWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexRedirectWriter.java index e449ecebf40a2..df59f984f8585 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexRedirectWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexRedirectWriter.java @@ -92,7 +92,7 @@ public void buildPage() throws DocFileIOException { Script script = new Script("window.location.replace(") .appendStringLiteral(targetPath, '\'') .append(")"); - var metaRefresh = new HtmlTree(HtmlTag.META) + var metaRefresh = HtmlTree.of(HtmlTag.META) .put(HtmlAttr.HTTP_EQUIV, "Refresh") .put(HtmlAttr.CONTENT, "0;" + targetPath); head.addContent(script.asContent(), HtmlTree.NOSCRIPT(metaRefresh)); @@ -103,9 +103,8 @@ public void buildPage() throws DocFileIOException { bodyContent.add(HtmlTree.P(HtmlTree.A(targetPath, Text.of(targetPath)))); - var body = new HtmlTree(HtmlTag.BODY).setStyle(HtmlStyles.indexRedirectPage); - var main = HtmlTree.MAIN(bodyContent); - body.add(main); + var body = HtmlTree.BODY(HtmlStyles.indexRedirectPage) + .add(bodyContent); HtmlDocument htmlDocument = new HtmlDocument( HtmlTree.HTML(configuration.getLocale().getLanguage(), head, body)); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexWriter.java index ecf1114364217..87d0fa95bf3c7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexWriter.java @@ -224,7 +224,7 @@ protected void addElementDescription(IndexItem item, Content target) { default -> throw new Error(); } target.add(dt); - var dd = new HtmlTree(HtmlTag.DD); + var dd = HtmlTree.DD(); if (element.getKind() == ElementKind.MODULE || element.getKind() == ElementKind.PACKAGE) { addSummaryComment(element, dd); } else { @@ -261,7 +261,7 @@ protected void addTagDescription(IndexItem item, Content target) { dt.add(" - "); dt.add(contents.getContent("doclet.Search_tag_in", item.getHolder())); target.add(dt); - var dd = new HtmlTree(HtmlTag.DD); + var dd = HtmlTree.DD(); if (item.getDescription().isEmpty()) { dd.add(Entity.NO_BREAK_SPACE); } else { @@ -348,7 +348,7 @@ protected void addLinksForIndexes(List allFirstCharacters, Content co content.add(Entity.NO_BREAK_SPACE); } - content.add(new HtmlTree(HtmlTag.BR)); + content.add(HtmlTree.BR()); var pageLinks = Stream.of(IndexItem.Category.values()) .flatMap(c -> mainIndex.getItems(c).stream()) .filter(i -> !(i.isElementItem() || i.isTagItem())) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriter.java index bd0ab2958d4e0..b688420681fd3 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriter.java @@ -194,7 +194,7 @@ protected void buildModuleDoc() throws DocletException { */ protected void buildContent() { Content moduleContent = getContentHeader(); - moduleContent.add(new HtmlTree(HtmlTag.HR)); + moduleContent.add(HtmlTree.HR()); Content div = HtmlTree.DIV(HtmlStyles.horizontalScroll); addModuleSignature(div); buildModuleDescription(div); @@ -825,7 +825,7 @@ public void addProvidesList(Table table) { } // Only display the implementation details in the "all" mode. if (moduleMode == ModuleMode.ALL && !implSet.isEmpty()) { - desc.add(new HtmlTree(HtmlTag.BR)); + desc.add(HtmlTree.BR()); desc.add("("); var implSpan = HtmlTree.SPAN(HtmlStyles.implementationLabel, contents.implementation); desc.add(implSpan); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java index 293a6453925f6..9d12d3bb23dcd 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java @@ -516,14 +516,14 @@ public Content getContent() { } var navigationBar = HtmlTree.NAV(); - var navContent = new HtmlTree(HtmlTag.DIV); + var navContent = HtmlTree.DIV(HtmlStyles.navContent); Content skipNavLinks = contents.getContent("doclet.Skip_navigation_links"); String toggleNavLinks = configuration.getDocResources().getText("doclet.Toggle_navigation_links"); navigationBar.add(MarkerComments.START_OF_TOP_NAVBAR); // The mobile menu button uses three empty spans to produce its animated icon HtmlTree iconSpan = HtmlTree.SPAN(HtmlStyles.navBarToggleIcon).add(Entity.NO_BREAK_SPACE); - navContent.setStyle(HtmlStyles.navContent).add(HtmlTree.DIV(HtmlStyles.navMenuButton, - new HtmlTree(HtmlTag.BUTTON).setId(HtmlIds.NAVBAR_TOGGLE_BUTTON) + navContent.add(HtmlTree.DIV(HtmlStyles.navMenuButton, + HtmlTree.BUTTON(HtmlIds.NAVBAR_TOGGLE_BUTTON) .put(HtmlAttr.ARIA_CONTROLS, HtmlIds.NAVBAR_TOP.name()) .put(HtmlAttr.ARIA_EXPANDED, String.valueOf(false)) .put(HtmlAttr.ARIA_LABEL, toggleNavLinks) @@ -535,9 +535,7 @@ public Content getContent() { skipNavLinks.toString()))); Content aboutContent = userHeader; - var navList = new HtmlTree(HtmlTag.UL) - .setId(HtmlIds.NAVBAR_TOP_FIRSTROW) - .setStyle(HtmlStyles.navList) + var navList = HtmlTree.UL(HtmlIds.NAVBAR_TOP_FIRSTROW, HtmlStyles.navList) .put(HtmlAttr.TITLE, rowListTitle); addMainNavLinks(navList); navContent.add(navList); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java index b28b44d4cd3a6..078f5246de7f8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java @@ -204,7 +204,7 @@ private HtmlTree getBody() { HtmlTree body = getBody(getWindowTitle(title)); ContentBuilder headingContent = new ContentBuilder(); headingContent.add(contents.getContent("doclet.ClassUse_Title", packageText)); - headingContent.add(new HtmlTree(HtmlTag.BR)); + headingContent.add(HtmlTree.BR()); headingContent.add(name); var heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING, HtmlStyles.title, headingContent); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriter.java index ee022144fea57..d5683ec6e3c0a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriter.java @@ -128,7 +128,7 @@ protected void buildPackageDoc() throws DocletException { */ protected void buildContent() { Content packageContent = getContentHeader(); - packageContent.add(new HtmlTree(HtmlTag.HR)); + packageContent.add(HtmlTree.HR()); Content div = HtmlTree.DIV(HtmlStyles.horizontalScroll); addPackageSignature(div); buildPackageDescription(div); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchWriter.java index 0bd173df3d5f0..3de16c0bf1a10 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchWriter.java @@ -97,24 +97,22 @@ protected void addSearchFileContents(Content contentTree) { .add(HtmlTree.P(contents.getContent("doclet.search.browser_info"))) .add(HtmlTree.SPAN(Text.of("link")) .setId(HtmlId.of("page-search-link"))) - .add(new HtmlTree(HtmlTag.BUTTON) - .add(new HtmlTree(HtmlTag.IMG) + .add(HtmlTree.BUTTON(HtmlId.of("page-search-copy")) + .add(HtmlTree.of(HtmlTag.IMG) .put(HtmlAttr.SRC, pathToRoot.resolve(DocPaths.RESOURCE_FILES) .resolve(DocPaths.CLIPBOARD_SVG).getPath()) .put(HtmlAttr.ALT, copyUrlText)) .add(HtmlTree.SPAN(Text.of(copyText)) .put(HtmlAttr.DATA_COPIED, copiedText)) .addStyle(HtmlStyles.copy) - .put(HtmlAttr.ARIA_LABEL, copyUrlText) - .setId(HtmlId.of("page-search-copy"))) + .put(HtmlAttr.ARIA_LABEL, copyUrlText)) .add(HtmlTree.P(HtmlTree.INPUT(HtmlAttr.InputType.CHECKBOX, HtmlId.of("search-redirect"))) .add(HtmlTree.LABEL("search-redirect", contents.getContent("doclet.search.redirect"))))) - .add(new HtmlTree(HtmlTag.P) + .add(HtmlTree.of(HtmlTag.P) .setId(HtmlId.of("page-search-notify")) .add(contents.getContent("doclet.search.loading"))) - .add(HtmlTree.DIV(new HtmlTree(HtmlTag.DIV) - .setId(HtmlId.of("result-container")) + .add(HtmlTree.DIV(HtmlTree.DIV(HtmlId.of("result-container")) .addUnchecked(Text.EMPTY)) .setId(HtmlId.of("result-section")) .put(HtmlAttr.STYLE, "display: none;") diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialFieldWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialFieldWriter.java index c3d1cc582f36a..ef9810f73749b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialFieldWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialFieldWriter.java @@ -58,7 +58,7 @@ protected Content getSerializableFieldsHeader() { } protected Content getFieldsContentHeader() { - return new HtmlTree(HtmlTag.LI).setStyle(HtmlStyles.blockList); + return HtmlTree.LI(HtmlStyles.blockList); } protected Content getSerializableFields(String heading, Content source) { @@ -76,12 +76,12 @@ protected void addMemberHeader(TypeMirror fieldType, String fieldName, Content c Content nameContent = Text.of(fieldName); var heading = HtmlTree.HEADING(Headings.SerializedForm.MEMBER_HEADING, nameContent); content.add(heading); - var pre = new HtmlTree(HtmlTag.PRE); Content fieldContent = writer.getLink(new HtmlLinkInfo( configuration, HtmlLinkInfo.Kind.LINK_TYPE_PARAMS_AND_BOUNDS, fieldType)); - pre.add(fieldContent); - pre.add(" "); - pre.add(fieldName); + var pre = HtmlTree.PRE() + .add(fieldContent) + .add(" ") + .add(fieldName); content.add(pre); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialMethodWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialMethodWriter.java index d9b888f2ee1b8..4ce7d662abbdb 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialMethodWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerialMethodWriter.java @@ -51,7 +51,7 @@ protected Content getSerializableMethodsHeader() { } protected Content getMethodsContentHeader() { - return new HtmlTree(HtmlTag.LI); + return HtmlTree.LI(); } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Signatures.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Signatures.java index 9059efcf81438..f1e26879ef44f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Signatures.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Signatures.java @@ -569,7 +569,7 @@ private void appendParametersAndExceptions(Content target, int lastLineSeparator // empty parameters are added without packing target.add(parameters); } else { - target.add(new HtmlTree(HtmlTag.WBR)) + target.add(HtmlTree.WBR()) .add(HtmlTree.SPAN(HtmlStyles.parameters, parameters)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java index 070b38421225b..aa20fc8c9aebc 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java @@ -201,7 +201,7 @@ public void convertClass(TypeElement te, DocPath outputdir) .resolve(configuration.docPaths.forPackage(te)) .invert(); Content body = getHeader(); - var pre = new HtmlTree(HtmlTag.PRE); + var pre = HtmlTree.PRE(); try (var reader = new LineNumberReader(r)) { while ((line = reader.readLine()) != null) { addLineNo(pre, lineno); @@ -246,7 +246,7 @@ private void writeToFile(Content body, DocPath path, TypeElement te) throws DocF * @return the header content for the HTML file */ private static Content getHeader() { - return new HtmlTree(HtmlTag.BODY).setStyle(HtmlStyles.sourcePage); + return HtmlTree.BODY(HtmlStyles.sourcePage); } /** 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 5d09682d4920b..0e09920b7b158 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 @@ -361,7 +361,7 @@ public boolean write(Writer out, String newline, boolean atNewline) throws IOExc private Content toContent() { Content main; if (id != null) { - main = new HtmlTree(HtmlTag.DIV).setId(id); + main = HtmlTree.DIV(id); } else { main = new ContentBuilder(); } @@ -403,8 +403,7 @@ private Content toContent() { if (id == null) { throw new IllegalStateException("no id set for table"); } - var tabpanel = new HtmlTree(HtmlTag.DIV) - .setId(HtmlIds.forTabPanel(id)) + var tabpanel = HtmlTree.DIV(HtmlIds.forTabPanel(id)) .put(HtmlAttr.ROLE, "tabpanel") .put(HtmlAttr.ARIA_LABELLEDBY, defaultTabId.name()); table.add(getTableBody()); @@ -416,8 +415,7 @@ private Content toContent() { } private HtmlTree createTab(HtmlId tabId, HtmlStyle style, boolean defaultTab, Content tabLabel) { - var tab = new HtmlTree(HtmlTag.BUTTON) - .setId(tabId) + var tab = HtmlTree.BUTTON(tabId) .put(HtmlAttr.ROLE, "tab") .put(HtmlAttr.ARIA_SELECTED, defaultTab ? "true" : "false") .put(HtmlAttr.ARIA_CONTROLS, HtmlIds.forTabPanel(id).name()) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java index a9036d7dcd856..cfb8f7260d081 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java @@ -101,10 +101,10 @@ protected Content toContent(boolean hasFilterInput) { .put(HtmlAttr.VALUE, writer.resources.getText("doclet.filter_reset"))); } content.add(header); - content.add(new HtmlTree(HtmlTag.BUTTON).addStyle(HtmlStyles.hideSidebar) + content.add(HtmlTree.BUTTON(HtmlStyles.hideSidebar) .add(HtmlTree.SPAN(writer.contents.hideSidebar).add(Entity.NO_BREAK_SPACE)) .add(Entity.LEFT_POINTING_ANGLE)); - content.add(new HtmlTree(HtmlTag.BUTTON).addStyle(HtmlStyles.showSidebar) + content.add(HtmlTree.BUTTON(HtmlStyles.showSidebar) .add(Entity.RIGHT_POINTING_ANGLE) .add(HtmlTree.SPAN(Entity.NO_BREAK_SPACE).add(writer.contents.showSidebar))); return content.add(listBuilder); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java index 3d5b1a494ba2c..9b6b1c831b179 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java @@ -272,9 +272,9 @@ public boolean write(Writer out, String newline, boolean atNewline) throws IOExc * @return the HTML */ private Content toContent() { - var head = new HtmlTree(HtmlTag.HEAD); - head.add(getGeneratedBy(showTimestamp, generatedDate)); - head.add(HtmlTree.TITLE(title)); + var head = HtmlTree.of(HtmlTag.HEAD) + .add(getGeneratedBy(showTimestamp, generatedDate)) + .add(HtmlTree.TITLE(title)); head.add(HtmlTree.META("viewport", "width=device-width, initial-scale=1")); @@ -300,9 +300,9 @@ private Content toContent() { } if (canonicalLink != null) { - var link = new HtmlTree(HtmlTag.LINK); - link.put(HtmlAttr.REL, "canonical"); - link.put(HtmlAttr.HREF, canonicalLink.getPath()); + var link = HtmlTree.of(HtmlTag.LINK) + .put(HtmlAttr.REL, "canonical") + .put(HtmlAttr.HREF, canonicalLink.getPath()); head.add(link); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java index af2378c0351d1..93f83c5ba90c1 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/taglets/SnippetTaglet.java @@ -122,13 +122,13 @@ public Content getInlineTagOutput(Element holder, DocTree tag, TagletWriter tagl private Content snippetTagOutput(Element element, SnippetTree tag, StyledText content, String id, String lang) { var pathToRoot = tagletWriter.htmlWriter.pathToRoot; - var pre = new HtmlTree(HtmlTag.PRE).setStyle(HtmlStyles.snippet); + var pre = HtmlTree.PRE(HtmlStyles.snippet); if (id != null && !id.isBlank()) { pre.put(HtmlAttr.ID, id); } else { pre.put(HtmlAttr.ID, config.htmlIds.forSnippet(element, ids).name()); } - var code = new HtmlTree(HtmlTag.CODE) + var code = HtmlTree.CODE() .addUnchecked(Text.EMPTY); // Make sure the element is always rendered if (lang != null && !lang.isBlank()) { code.addStyle("language-" + lang); @@ -197,10 +197,10 @@ private Content snippetTagOutput(Element element, SnippetTree tag, StyledText co String copiedText = resources.getText("doclet.Copied_to_clipboard"); String copySnippetText = resources.getText("doclet.Copy_snippet_to_clipboard"); var snippetContainer = HtmlTree.DIV(HtmlStyles.snippetContainer, - new HtmlTree(HtmlTag.BUTTON) + HtmlTree.of(HtmlTag.BUTTON) .add(HtmlTree.SPAN(Text.of(copyText)) .put(HtmlAttr.DATA_COPIED, copiedText)) - .add(new HtmlTree(HtmlTag.IMG) + .add(HtmlTree.of(HtmlTag.IMG) .put(HtmlAttr.SRC, pathToRoot.resolve(DocPaths.RESOURCE_FILES) .resolve(DocPaths.CLIPBOARD_SVG).getPath()) .put(HtmlAttr.ALT, copySnippetText)) 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 f60537511746d..b8785cbad76eb 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 @@ -83,7 +83,17 @@ public class HtmlTree extends Content { * * @param tag the name */ - public HtmlTree(HtmlTag tag) { + public static HtmlTree of(HtmlTag tag) { + return new HtmlTree(tag); + } + + /** + * Creates an {@code HTMLTree} object representing an HTML element + * with the given name. + * + * @param tag the name + */ + HtmlTree(HtmlTag tag) { this.tag = Objects.requireNonNull(tag); } @@ -365,6 +375,44 @@ public static HtmlTree A(URI ref, Content body) { .add(body); } + /** + * Creates an HTML {@code BODY} element with the given style. + * + * @param style the style + * @return the element + */ + public static HtmlTree BODY(HtmlStyle style) { + return new HtmlTree(HtmlTag.BODY) + .setStyle(style); + } + + private static HtmlTree BR_INSTANCE = unmodifiableTree(HtmlTag.BR); + + /** + * {@return an HTML {@code BR} element} + */ + public static HtmlTree BR() { + return BR_INSTANCE; + } + + /** + * Creates an HTML {@code BUTTON} element with the given id. + * + * @return the element + */ + public static HtmlTree BUTTON(HtmlId id) { + return new HtmlTree(HtmlTag.BUTTON).setId(id); + } + + /** + * Creates an HTML {@code BUTTON} element with the given style. + * + * @return the element + */ + public static HtmlTree BUTTON(HtmlStyle style) { + return new HtmlTree(HtmlTag.BUTTON).setStyle(style); + } + /** * Creates an HTML {@code CAPTION} element with the given content. * @@ -376,6 +424,15 @@ public static HtmlTree CAPTION(Content body) { .add(body); } + /** + * Creates an empty HTML {@code CODE} element. + * + * @return the element + */ + public static HtmlTree CODE() { + return new HtmlTree(HtmlTag.CODE); + } + /** * Creates an HTML {@code CODE} element with the given content. * @@ -387,6 +444,15 @@ public static HtmlTree CODE(Content body) { .add(body); } + /** + * Creates an empty HTML {@code DD} element. + * + * @return the element + */ + public static HtmlTree DD() { + return new HtmlTree(HtmlTag.DD); + } + /** * Creates an HTML {@code DD} element with the given content. * @@ -418,27 +484,14 @@ public static HtmlTree DETAILS(HtmlStyle style) { } /** - * Creates an HTML {@code DL} element with the given style. - * - * @param style the style - * @return the element - */ - public static HtmlTree DL(HtmlStyle style) { - return new HtmlTree(HtmlTag.DL) - .setStyle(style); - } - - /** - * Creates an HTML {@code DL} element with the given style and content. + * Creates an HTML {@code DIV} element with the given id. * - * @param style the style - * @param body the content + * @param id the id * @return the element */ - public static HtmlTree DL(HtmlStyle style, Content body) { - return new HtmlTree(HtmlTag.DL) - .setStyle(style) - .add(body); + public static HtmlTree DIV(HtmlId id) { + return new HtmlTree(HtmlTag.DIV) + .setId(id); } /** @@ -476,6 +529,30 @@ public static HtmlTree DIV(Content body) { .add(body); } + /** + * Creates an HTML {@code DL} element with the given style. + * + * @param style the style + * @return the element + */ + public static HtmlTree DL(HtmlStyle style) { + return new HtmlTree(HtmlTag.DL) + .setStyle(style); + } + + /** + * Creates an HTML {@code DL} element with the given style and content. + * + * @param style the style + * @param body the content + * @return the element + */ + public static HtmlTree DL(HtmlStyle style, Content body) { + return new HtmlTree(HtmlTag.DL) + .setStyle(style) + .add(body); + } + /** * Creates an HTML {@code DT} element with the given content. * @@ -487,6 +564,17 @@ public static HtmlTree DT(Content body) { .add(body); } + /** + * Creates an HTML {@code EM} element with the given content. + * + * @param body content for the element + * @return the element + */ + public static HtmlTree EM(String body) { + return new HtmlTree(HtmlTag.EM) + .add(body); + } + /** * Creates an HTML {@code FOOTER} element. * The role is set to {@code contentinfo}. @@ -573,6 +661,15 @@ private static HtmlTag checkHeading(HtmlTag headingTag) { }; } + private static HtmlTree HR_INSTANCE = unmodifiableTree(HtmlTag.HR); + + /** + * {@return an HTML {@code HR} element} + */ + public static HtmlTree HR() { + return HR_INSTANCE; + } + /** * Creates an HTML {@code HTML} element with the given {@code lang} attribute, * and {@code HEAD} and {@code BODY} contents. @@ -630,6 +727,27 @@ public static HtmlTree LABEL(String forLabel, Content body) { .add(body); } + /** + * Creates an empty HTML {@code LI} element. + * + * @return the element + */ + public static HtmlTree LI() { + return new HtmlTree(HtmlTag.LI); + } + + + /** + * Creates an HTML {@code LI} element with the given style. + * + * @param style the style + * @return the element + */ + public static HtmlTree LI(HtmlStyle style) { + return new HtmlTree(HtmlTag.LI) + .setStyle(style); + } + /** * Creates an HTML {@code LI} element with the given content. * @@ -776,6 +894,25 @@ public static HtmlTree P(HtmlStyle style, Content body) { .setStyle(style); } + /** + * Creates an empty HTML {@code PRE} element. + * + * @return the element + */ + public static HtmlTree PRE() { + return new HtmlTree(HtmlTag.PRE); + } + + /** + * Creates an HTML {@code PRE} element with the given style + * + * @param style the style + * @return the element + */ + public static HtmlTree PRE(HtmlStyle style) { + return new HtmlTree(HtmlTag.PRE).setStyle(style); + } + /** * Creates an HTML {@code PRE} element with some content. * @@ -971,6 +1108,15 @@ public static HtmlTree TITLE(String body) { .add(body); } + /** + * Creates an empty HTML {@code UL} element. + * + * @return the element + */ + public static HtmlTree UL() { + return new HtmlTree(HtmlTag.UL); + } + /** * Creates an HTML {@code UL} element with the given style. * @@ -982,6 +1128,19 @@ public static HtmlTree UL(HtmlStyle style) { .setStyle(style); } + /** + * Creates an HTML {@code UL} element with the given id and style. + * + * @param id the id + * @param style the style + * @return the element + */ + public static HtmlTree UL(HtmlId id, HtmlStyle style) { + return new HtmlTree(HtmlTag.UL) + .setId(id) + .setStyle(style); + } + /** * Creates an HTML {@code UL} element with the given style and some content. * @@ -1015,6 +1174,15 @@ public static HtmlTree UL(HtmlStyle style, Collection items, Function out a link."); p.add(pContent); body.add(p); - HtmlTree p1 = new HtmlTree(HtmlTag.P); + HtmlTree p1 = HtmlTree.of(HtmlTag.P); // Test another version of A tag. - HtmlTree anchor = new HtmlTree(HtmlTag.A); + HtmlTree anchor = HtmlTree.of(HtmlTag.A); anchor.put(HtmlAttr.HREF, "testLink.html"); anchor.put(HtmlAttr.ID, "Another version of a tag"); p1.add(anchor); body.add(p1); // Test for empty tags. - HtmlTree dl = new HtmlTree(HtmlTag.DL); + HtmlTree dl = HtmlTree.of(HtmlTag.DL); html.add(dl); // Test for empty nested tags. - HtmlTree dlTree = new HtmlTree(HtmlTag.DL); - dlTree.add(new HtmlTree(HtmlTag.DT)); - dlTree.add(new HtmlTree (HtmlTag.DD)); + HtmlTree dlTree = HtmlTree.of(HtmlTag.DL); + dlTree.add(HtmlTree.of(HtmlTag.DT)); + dlTree.add(HtmlTree.of (HtmlTag.DD)); html.add(dlTree); - HtmlTree dlDisplay = new HtmlTree(HtmlTag.DL); - dlDisplay.add(new HtmlTree(HtmlTag.DT)); - HtmlTree dd = new HtmlTree (HtmlTag.DD); + HtmlTree dlDisplay = HtmlTree.of(HtmlTag.DL); + dlDisplay.add(HtmlTree.of(HtmlTag.DT)); + HtmlTree dd = HtmlTree.of (HtmlTag.DD); TextBuilder ddContent = new TextBuilder("Test DD"); dd.add(ddContent); dlDisplay.add(dd); @@ -132,7 +132,7 @@ public static String generateHtmlTree() { body.add(emptyString); Comment emptyComment = new Comment(""); body.add(emptyComment); - HtmlTree hr = new HtmlTree(HtmlTag.HR); + HtmlTree hr = HtmlTree.of(HtmlTag.HR); body.add(hr); html.add(body); HtmlDocument htmlDoc = new HtmlDocument(html); diff --git a/test/langtools/jdk/javadoc/doclet/testVoidHtmlElements/TestVoidHtmlElements.java b/test/langtools/jdk/javadoc/doclet/testVoidHtmlElements/TestVoidHtmlElements.java index bd44fe8814119..518ecebd70488 100644 --- a/test/langtools/jdk/javadoc/doclet/testVoidHtmlElements/TestVoidHtmlElements.java +++ b/test/langtools/jdk/javadoc/doclet/testVoidHtmlElements/TestVoidHtmlElements.java @@ -55,7 +55,7 @@ public static void main(String[] args) { } private static void check(HtmlTag htmlTag) { - boolean elementIsVoid = new HtmlTree(htmlTag).isVoid(); + boolean elementIsVoid = HtmlTree.of(htmlTag).isVoid(); boolean elementHasNoEndTag = htmlTag.endKind == HtmlTag.EndKind.NONE; if (elementIsVoid != elementHasNoEndTag) { throw new AssertionError(htmlTag + ", " + elementIsVoid + ", " + elementHasNoEndTag);