src/share/classes/com/sun/tools/doclint/Checker.java

changeset 1650
74d7f9bcac93
parent 1552
153d20d0cac5
child 1668
991f11e13598
equal deleted inserted replaced
1649:9cf17b7a5fe7 1650:74d7f9bcac93
23 * questions. 23 * questions.
24 */ 24 */
25 25
26 package com.sun.tools.doclint; 26 package com.sun.tools.doclint;
27 27
28 import com.sun.source.doctree.LiteralTree; 28 import java.io.IOException;
29 import java.util.regex.Matcher; 29 import java.io.StringWriter;
30 import com.sun.source.doctree.LinkTree;
31 import java.net.URI; 30 import java.net.URI;
32 import java.util.regex.Pattern; 31 import java.net.URISyntaxException;
33 import java.io.IOException;
34 import com.sun.tools.javac.tree.DocPretty;
35 import java.io.StringWriter;
36 import java.util.Deque; 32 import java.util.Deque;
37 import java.util.EnumSet; 33 import java.util.EnumSet;
38 import java.util.HashSet; 34 import java.util.HashSet;
39 import java.util.LinkedList; 35 import java.util.LinkedList;
40 import java.util.List; 36 import java.util.List;
41 import java.util.Set; 37 import java.util.Set;
38 import java.util.regex.Matcher;
39 import java.util.regex.Pattern;
42 40
43 import javax.lang.model.element.Element; 41 import javax.lang.model.element.Element;
44 import javax.lang.model.element.ElementKind; 42 import javax.lang.model.element.ElementKind;
45 import javax.lang.model.element.ExecutableElement; 43 import javax.lang.model.element.ExecutableElement;
46 import javax.lang.model.element.Name; 44 import javax.lang.model.element.Name;
50 import javax.tools.Diagnostic.Kind; 48 import javax.tools.Diagnostic.Kind;
51 49
52 import com.sun.source.doctree.AttributeTree; 50 import com.sun.source.doctree.AttributeTree;
53 import com.sun.source.doctree.AuthorTree; 51 import com.sun.source.doctree.AuthorTree;
54 import com.sun.source.doctree.DocCommentTree; 52 import com.sun.source.doctree.DocCommentTree;
53 import com.sun.source.doctree.DocRootTree;
55 import com.sun.source.doctree.DocTree; 54 import com.sun.source.doctree.DocTree;
56 import com.sun.source.doctree.EndElementTree; 55 import com.sun.source.doctree.EndElementTree;
57 import com.sun.source.doctree.EntityTree; 56 import com.sun.source.doctree.EntityTree;
58 import com.sun.source.doctree.ErroneousTree; 57 import com.sun.source.doctree.ErroneousTree;
59 import com.sun.source.doctree.IdentifierTree; 58 import com.sun.source.doctree.IdentifierTree;
60 import com.sun.source.doctree.InheritDocTree; 59 import com.sun.source.doctree.InheritDocTree;
60 import com.sun.source.doctree.LinkTree;
61 import com.sun.source.doctree.LiteralTree;
61 import com.sun.source.doctree.ParamTree; 62 import com.sun.source.doctree.ParamTree;
62 import com.sun.source.doctree.ReferenceTree; 63 import com.sun.source.doctree.ReferenceTree;
63 import com.sun.source.doctree.ReturnTree; 64 import com.sun.source.doctree.ReturnTree;
64 import com.sun.source.doctree.SerialDataTree; 65 import com.sun.source.doctree.SerialDataTree;
65 import com.sun.source.doctree.SerialFieldTree; 66 import com.sun.source.doctree.SerialFieldTree;
66 import com.sun.source.doctree.SinceTree; 67 import com.sun.source.doctree.SinceTree;
67 import com.sun.source.doctree.StartElementTree; 68 import com.sun.source.doctree.StartElementTree;
68 import com.sun.source.doctree.TextTree; 69 import com.sun.source.doctree.TextTree;
69 import com.sun.source.doctree.ThrowsTree; 70 import com.sun.source.doctree.ThrowsTree;
71 import com.sun.source.doctree.ValueTree;
70 import com.sun.source.doctree.VersionTree; 72 import com.sun.source.doctree.VersionTree;
71 import com.sun.source.util.DocTreeScanner; 73 import com.sun.source.util.DocTreeScanner;
72 import com.sun.source.util.TreePath; 74 import com.sun.source.util.TreePath;
73 import com.sun.tools.doclint.HtmlTag.AttrKind; 75 import com.sun.tools.doclint.HtmlTag.AttrKind;
74 import java.net.URISyntaxException; 76 import com.sun.tools.javac.tree.DocPretty;
75 import static com.sun.tools.doclint.Messages.Group.*; 77 import static com.sun.tools.doclint.Messages.Group.*;
76 78
77 79
78 /** 80 /**
79 * Validate a doc comment. 81 * Validate a doc comment.
93 boolean foundReturn = false; 95 boolean foundReturn = false;
94 96
95 public enum Flag { 97 public enum Flag {
96 TABLE_HAS_CAPTION, 98 TABLE_HAS_CAPTION,
97 HAS_ELEMENT, 99 HAS_ELEMENT,
100 HAS_INLINE_TAG,
98 HAS_TEXT, 101 HAS_TEXT,
99 REPORTED_BAD_INLINE 102 REPORTED_BAD_INLINE
100 } 103 }
101 104
102 static class TagStackItem { 105 static class TagStackItem {
416 "dc.no.summary.or.caption.for.table"); 419 "dc.no.summary.or.caption.for.table");
417 } 420 }
418 } 421 }
419 if (t.flags.contains(HtmlTag.Flag.EXPECT_CONTENT) 422 if (t.flags.contains(HtmlTag.Flag.EXPECT_CONTENT)
420 && !top.flags.contains(Flag.HAS_TEXT) 423 && !top.flags.contains(Flag.HAS_TEXT)
421 && !top.flags.contains(Flag.HAS_ELEMENT)) { 424 && !top.flags.contains(Flag.HAS_ELEMENT)
425 && !top.flags.contains(Flag.HAS_INLINE_TAG)) {
422 env.messages.warning(HTML, tree, "dc.tag.empty", treeName); 426 env.messages.warning(HTML, tree, "dc.tag.empty", treeName);
423 } 427 }
424 tagStack.pop(); 428 tagStack.pop();
425 done = true; 429 done = true;
426 break; 430 break;
569 warnIfEmpty(tree, tree.getName()); 573 warnIfEmpty(tree, tree.getName());
570 return super.visitAuthor(tree, ignore); 574 return super.visitAuthor(tree, ignore);
571 } 575 }
572 576
573 @Override 577 @Override
578 public Void visitDocRoot(DocRootTree tree, Void ignore) {
579 markEnclosingTag(Flag.HAS_INLINE_TAG);
580 return super.visitDocRoot(tree, ignore);
581 }
582
583 @Override
574 public Void visitInheritDoc(InheritDocTree tree, Void ignore) { 584 public Void visitInheritDoc(InheritDocTree tree, Void ignore) {
585 markEnclosingTag(Flag.HAS_INLINE_TAG);
575 // TODO: verify on overridden method 586 // TODO: verify on overridden method
576 foundInheritDoc = true; 587 foundInheritDoc = true;
577 return super.visitInheritDoc(tree, ignore); 588 return super.visitInheritDoc(tree, ignore);
578 } 589 }
579 590
580 @Override 591 @Override
581 public Void visitLink(LinkTree tree, Void ignore) { 592 public Void visitLink(LinkTree tree, Void ignore) {
593 markEnclosingTag(Flag.HAS_INLINE_TAG);
582 // simulate inline context on tag stack 594 // simulate inline context on tag stack
583 HtmlTag t = (tree.getKind() == DocTree.Kind.LINK) 595 HtmlTag t = (tree.getKind() == DocTree.Kind.LINK)
584 ? HtmlTag.CODE : HtmlTag.SPAN; 596 ? HtmlTag.CODE : HtmlTag.SPAN;
585 tagStack.push(new TagStackItem(tree, t)); 597 tagStack.push(new TagStackItem(tree, t));
586 try { 598 try {
590 } 602 }
591 } 603 }
592 604
593 @Override 605 @Override
594 public Void visitLiteral(LiteralTree tree, Void ignore) { 606 public Void visitLiteral(LiteralTree tree, Void ignore) {
607 markEnclosingTag(Flag.HAS_INLINE_TAG);
595 if (tree.getKind() == DocTree.Kind.CODE) { 608 if (tree.getKind() == DocTree.Kind.CODE) {
596 for (TagStackItem tsi: tagStack) { 609 for (TagStackItem tsi: tagStack) {
597 if (tsi.tag == HtmlTag.CODE) { 610 if (tsi.tag == HtmlTag.CODE) {
598 env.messages.warning(HTML, tree, "dc.tag.code.within.code"); 611 env.messages.warning(HTML, tree, "dc.tag.code.within.code");
599 break; 612 break;
744 reportMissing("dc.missing.throws", tl); 757 reportMissing("dc.missing.throws", tl);
745 } 758 }
746 } 759 }
747 760
748 @Override 761 @Override
762 public Void visitValue(ValueTree tree, Void ignore) {
763 markEnclosingTag(Flag.HAS_INLINE_TAG);
764 return super.visitValue(tree, ignore);
765 }
766
767 @Override
749 public Void visitVersion(VersionTree tree, Void ignore) { 768 public Void visitVersion(VersionTree tree, Void ignore) {
750 warnIfEmpty(tree, tree.getBody()); 769 warnIfEmpty(tree, tree.getBody());
751 return super.visitVersion(tree, ignore); 770 return super.visitVersion(tree, ignore);
752 } 771 }
753 772

mercurial