Wed, 16 Jan 2013 10:29:52 -0800
8006236: doclint: structural issue hidden
Reviewed-by: darcy
1.1 --- a/src/share/classes/com/sun/tools/doclint/Checker.java Wed Jan 16 17:40:28 2013 +0000 1.2 +++ b/src/share/classes/com/sun/tools/doclint/Checker.java Wed Jan 16 10:29:52 2013 -0800 1.3 @@ -25,6 +25,7 @@ 1.4 1.5 package com.sun.tools.doclint; 1.6 1.7 +import com.sun.source.doctree.LiteralTree; 1.8 import java.util.regex.Matcher; 1.9 import com.sun.source.doctree.LinkTree; 1.10 import java.net.URI; 1.11 @@ -359,9 +360,8 @@ 1.12 env.messages.error(HTML, tree, "dc.tag.unknown", treeName); 1.13 } else if (t.endKind == HtmlTag.EndKind.NONE) { 1.14 env.messages.error(HTML, tree, "dc.tag.end.not.permitted", treeName); 1.15 - } else if (tagStack.isEmpty()) { 1.16 - env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); 1.17 } else { 1.18 + boolean done = false; 1.19 while (!tagStack.isEmpty()) { 1.20 TagStackItem top = tagStack.peek(); 1.21 if (t == top.tag) { 1.22 @@ -383,6 +383,7 @@ 1.23 env.messages.error(HTML, tree, "dc.text.not.allowed", treeName); 1.24 } 1.25 tagStack.pop(); 1.26 + done = true; 1.27 break; 1.28 } else if (top.tag == null || top.tag.endKind != HtmlTag.EndKind.REQUIRED) { 1.29 tagStack.pop(); 1.30 @@ -400,10 +401,15 @@ 1.31 tagStack.pop(); 1.32 } else { 1.33 env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); 1.34 + done = true; 1.35 break; 1.36 } 1.37 } 1.38 } 1.39 + 1.40 + if (!done && tagStack.isEmpty()) { 1.41 + env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); 1.42 + } 1.43 } 1.44 1.45 return super.visitEndElement(tree, ignore); 1.46 @@ -546,6 +552,19 @@ 1.47 } 1.48 1.49 @Override 1.50 + public Void visitLiteral(LiteralTree tree, Void ignore) { 1.51 + if (tree.getKind() == DocTree.Kind.CODE) { 1.52 + for (TagStackItem tsi: tagStack) { 1.53 + if (tsi.tag == HtmlTag.CODE) { 1.54 + env.messages.warning(HTML, tree, "dc.tag.nested.not.allowed", "code"); 1.55 + break; 1.56 + } 1.57 + } 1.58 + } 1.59 + return super.visitLiteral(tree, ignore); 1.60 + } 1.61 + 1.62 + @Override 1.63 public Void visitParam(ParamTree tree, Void ignore) { 1.64 boolean typaram = tree.isTypeParameter(); 1.65 IdentifierTree nameTree = tree.getName();
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/doclint/EndTagsTest.java Wed Jan 16 10:29:52 2013 -0800 2.3 @@ -0,0 +1,39 @@ 2.4 +/* 2.5 + * @test /nodynamiccopyright/ 2.6 + * @bug 8006236 2.7 + * @summary doclint: structural issue hidden 2.8 + * @build DocLintTester 2.9 + * @run main DocLintTester -Xmsgs:-html EndTagsTest.java 2.10 + * @run main DocLintTester -ref EndTagsTest.out EndTagsTest.java 2.11 + */ 2.12 + 2.13 +/** */ 2.14 +public class EndTagsTest { 2.15 + /** <p> <a name="a1"> text <img alt="image" src="image.png"> </a> </p> */ 2.16 + public void valid_all() { } 2.17 + 2.18 + /** <p> <a name="a2"> text <img alt="image" src="image.png"> </a> */ 2.19 + public void valid_omit_optional_close() { } 2.20 + 2.21 + /** </a> */ 2.22 + public void invalid_missing_start() { } 2.23 + 2.24 + /** <p> </a> */ 2.25 + public void invalid_missing_start_2() { } 2.26 + 2.27 + /** <p> text </p> </a> */ 2.28 + public void invalid_missing_start_3() { } 2.29 + 2.30 + /** <img alt="image" src="image.png"> </img> */ 2.31 + public void invalid_end() { } 2.32 + 2.33 + /** <invalid> </invalid> */ 2.34 + public void unknown_start_end() { } 2.35 + 2.36 + /** <invalid> */ 2.37 + public void unknown_start() { } 2.38 + 2.39 + /** </invalid> */ 2.40 + public void unknown_end() { } 2.41 +} 2.42 +
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/tools/doclint/EndTagsTest.out Wed Jan 16 10:29:52 2013 -0800 3.3 @@ -0,0 +1,25 @@ 3.4 +EndTagsTest.java:18: error: unexpected end tag: </a> 3.5 + /** </a> */ 3.6 + ^ 3.7 +EndTagsTest.java:21: error: unexpected end tag: </a> 3.8 + /** <p> </a> */ 3.9 + ^ 3.10 +EndTagsTest.java:24: error: unexpected end tag: </a> 3.11 + /** <p> text </p> </a> */ 3.12 + ^ 3.13 +EndTagsTest.java:27: error: invalid end tag: </img> 3.14 + /** <img alt="image" src="image.png"> </img> */ 3.15 + ^ 3.16 +EndTagsTest.java:30: error: unknown tag: invalid 3.17 + /** <invalid> </invalid> */ 3.18 + ^ 3.19 +EndTagsTest.java:30: error: unknown tag: invalid 3.20 + /** <invalid> </invalid> */ 3.21 + ^ 3.22 +EndTagsTest.java:33: error: unknown tag: invalid 3.23 + /** <invalid> */ 3.24 + ^ 3.25 +EndTagsTest.java:36: error: unknown tag: invalid 3.26 + /** </invalid> */ 3.27 + ^ 3.28 +8 errors