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. |
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 |