diff --git a/langtools/src/share/classes/com/sun/tools/doclint/Checker.java b/langtools/src/share/classes/com/sun/tools/doclint/Checker.java index 0664838936d..b0d8d06f127 100644 --- a/langtools/src/share/classes/com/sun/tools/doclint/Checker.java +++ b/langtools/src/share/classes/com/sun/tools/doclint/Checker.java @@ -25,6 +25,7 @@ package com.sun.tools.doclint; +import com.sun.source.doctree.LiteralTree; import java.util.regex.Matcher; import com.sun.source.doctree.LinkTree; import java.net.URI; @@ -359,9 +360,8 @@ public class Checker extends DocTreeScanner { env.messages.error(HTML, tree, "dc.tag.unknown", treeName); } else if (t.endKind == HtmlTag.EndKind.NONE) { env.messages.error(HTML, tree, "dc.tag.end.not.permitted", treeName); - } else if (tagStack.isEmpty()) { - env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); } else { + boolean done = false; while (!tagStack.isEmpty()) { TagStackItem top = tagStack.peek(); if (t == top.tag) { @@ -383,6 +383,7 @@ public class Checker extends DocTreeScanner { env.messages.error(HTML, tree, "dc.text.not.allowed", treeName); } tagStack.pop(); + done = true; break; } else if (top.tag == null || top.tag.endKind != HtmlTag.EndKind.REQUIRED) { tagStack.pop(); @@ -400,10 +401,15 @@ public class Checker extends DocTreeScanner { tagStack.pop(); } else { env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); + done = true; break; } } } + + if (!done && tagStack.isEmpty()) { + env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); + } } return super.visitEndElement(tree, ignore); @@ -545,6 +551,19 @@ public class Checker extends DocTreeScanner { } } + @Override + public Void visitLiteral(LiteralTree tree, Void ignore) { + if (tree.getKind() == DocTree.Kind.CODE) { + for (TagStackItem tsi: tagStack) { + if (tsi.tag == HtmlTag.CODE) { + env.messages.warning(HTML, tree, "dc.tag.nested.not.allowed", "code"); + break; + } + } + } + return super.visitLiteral(tree, ignore); + } + @Override public Void visitParam(ParamTree tree, Void ignore) { boolean typaram = tree.isTypeParameter(); diff --git a/langtools/test/tools/doclint/EndTagsTest.java b/langtools/test/tools/doclint/EndTagsTest.java new file mode 100644 index 00000000000..154f516324a --- /dev/null +++ b/langtools/test/tools/doclint/EndTagsTest.java @@ -0,0 +1,39 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8006236 + * @summary doclint: structural issue hidden + * @build DocLintTester + * @run main DocLintTester -Xmsgs:-html EndTagsTest.java + * @run main DocLintTester -ref EndTagsTest.out EndTagsTest.java + */ + +/** */ +public class EndTagsTest { + /**

text image

*/ + public void valid_all() { } + + /**

text image */ + public void valid_omit_optional_close() { } + + /** */ + public void invalid_missing_start() { } + + /**

*/ + public void invalid_missing_start_2() { } + + /**

text

*/ + public void invalid_missing_start_3() { } + + /** image */ + public void invalid_end() { } + + /** */ + public void unknown_start_end() { } + + /** */ + public void unknown_start() { } + + /** */ + public void unknown_end() { } +} + diff --git a/langtools/test/tools/doclint/EndTagsTest.out b/langtools/test/tools/doclint/EndTagsTest.out new file mode 100644 index 00000000000..61af632535c --- /dev/null +++ b/langtools/test/tools/doclint/EndTagsTest.out @@ -0,0 +1,25 @@ +EndTagsTest.java:18: error: unexpected end tag: + /** */ + ^ +EndTagsTest.java:21: error: unexpected end tag: + /**

*/ + ^ +EndTagsTest.java:24: error: unexpected end tag: + /**

text

*/ + ^ +EndTagsTest.java:27: error: invalid end tag: + /** image */ + ^ +EndTagsTest.java:30: error: unknown tag: invalid + /** */ + ^ +EndTagsTest.java:30: error: unknown tag: invalid + /** */ + ^ +EndTagsTest.java:33: error: unknown tag: invalid + /** */ + ^ +EndTagsTest.java:36: error: unknown tag: invalid + /** */ + ^ +8 errors