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.util.regex.Matcher; |
29 import java.util.regex.Matcher; |
29 import com.sun.source.doctree.LinkTree; |
30 import com.sun.source.doctree.LinkTree; |
30 import java.net.URI; |
31 import java.net.URI; |
31 import java.util.regex.Pattern; |
32 import java.util.regex.Pattern; |
32 import java.io.IOException; |
33 import java.io.IOException; |
357 final HtmlTag t = HtmlTag.get(treeName); |
358 final HtmlTag t = HtmlTag.get(treeName); |
358 if (t == null) { |
359 if (t == null) { |
359 env.messages.error(HTML, tree, "dc.tag.unknown", treeName); |
360 env.messages.error(HTML, tree, "dc.tag.unknown", treeName); |
360 } else if (t.endKind == HtmlTag.EndKind.NONE) { |
361 } else if (t.endKind == HtmlTag.EndKind.NONE) { |
361 env.messages.error(HTML, tree, "dc.tag.end.not.permitted", treeName); |
362 env.messages.error(HTML, tree, "dc.tag.end.not.permitted", treeName); |
362 } else if (tagStack.isEmpty()) { |
|
363 env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); |
|
364 } else { |
363 } else { |
|
364 boolean done = false; |
365 while (!tagStack.isEmpty()) { |
365 while (!tagStack.isEmpty()) { |
366 TagStackItem top = tagStack.peek(); |
366 TagStackItem top = tagStack.peek(); |
367 if (t == top.tag) { |
367 if (t == top.tag) { |
368 switch (t) { |
368 switch (t) { |
369 case TABLE: |
369 case TABLE: |
381 if (t.flags.contains(HtmlTag.Flag.NO_TEXT) |
381 if (t.flags.contains(HtmlTag.Flag.NO_TEXT) |
382 && top.flags.contains(Flag.HAS_TEXT)) { |
382 && top.flags.contains(Flag.HAS_TEXT)) { |
383 env.messages.error(HTML, tree, "dc.text.not.allowed", treeName); |
383 env.messages.error(HTML, tree, "dc.text.not.allowed", treeName); |
384 } |
384 } |
385 tagStack.pop(); |
385 tagStack.pop(); |
|
386 done = true; |
386 break; |
387 break; |
387 } else if (top.tag == null || top.tag.endKind != HtmlTag.EndKind.REQUIRED) { |
388 } else if (top.tag == null || top.tag.endKind != HtmlTag.EndKind.REQUIRED) { |
388 tagStack.pop(); |
389 tagStack.pop(); |
389 } else { |
390 } else { |
390 boolean found = false; |
391 boolean found = false; |
398 env.messages.error(HTML, top.tree, "dc.tag.start.unmatched", |
399 env.messages.error(HTML, top.tree, "dc.tag.start.unmatched", |
399 ((StartElementTree) top.tree).getName()); |
400 ((StartElementTree) top.tree).getName()); |
400 tagStack.pop(); |
401 tagStack.pop(); |
401 } else { |
402 } else { |
402 env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); |
403 env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); |
|
404 done = true; |
403 break; |
405 break; |
404 } |
406 } |
405 } |
407 } |
|
408 } |
|
409 |
|
410 if (!done && tagStack.isEmpty()) { |
|
411 env.messages.error(HTML, tree, "dc.tag.end.unexpected", treeName); |
406 } |
412 } |
407 } |
413 } |
408 |
414 |
409 return super.visitEndElement(tree, ignore); |
415 return super.visitEndElement(tree, ignore); |
410 } |
416 } |
544 tagStack.pop(); |
550 tagStack.pop(); |
545 } |
551 } |
546 } |
552 } |
547 |
553 |
548 @Override |
554 @Override |
|
555 public Void visitLiteral(LiteralTree tree, Void ignore) { |
|
556 if (tree.getKind() == DocTree.Kind.CODE) { |
|
557 for (TagStackItem tsi: tagStack) { |
|
558 if (tsi.tag == HtmlTag.CODE) { |
|
559 env.messages.warning(HTML, tree, "dc.tag.nested.not.allowed", "code"); |
|
560 break; |
|
561 } |
|
562 } |
|
563 } |
|
564 return super.visitLiteral(tree, ignore); |
|
565 } |
|
566 |
|
567 @Override |
549 public Void visitParam(ParamTree tree, Void ignore) { |
568 public Void visitParam(ParamTree tree, Void ignore) { |
550 boolean typaram = tree.isTypeParameter(); |
569 boolean typaram = tree.isTypeParameter(); |
551 IdentifierTree nameTree = tree.getName(); |
570 IdentifierTree nameTree = tree.getName(); |
552 Element e = env.currElement; |
571 Element e = env.currElement; |
553 switch (e.getKind()) { |
572 switch (e.getKind()) { |