diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2012-07-12 23:37:09 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2012-07-12 23:37:09 +0000 |
commit | 9460fbf21957f5b1c8b6d85d7c606301209ece62 (patch) | |
tree | b4686005fbac7fd9747c705c07661e74e5cf4341 /clang/lib/AST/CommentSema.cpp | |
parent | bf57091f8b81406835189f59bea511a412f2b7c8 (diff) | |
download | bcm5719-llvm-9460fbf21957f5b1c8b6d85d7c606301209ece62.tar.gz bcm5719-llvm-9460fbf21957f5b1c8b6d85d7c606301209ece62.zip |
Make concepts of optional and forbidden end tags separate. Thanks Jordan for pointing this!
llvm-svn: 160149
Diffstat (limited to 'clang/lib/AST/CommentSema.cpp')
-rw-r--r-- | clang/lib/AST/CommentSema.cpp | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp index ae13fa285ad..69cc01683c4 100644 --- a/clang/lib/AST/CommentSema.cpp +++ b/clang/lib/AST/CommentSema.cpp @@ -289,7 +289,7 @@ HTMLOpenTagComment *Sema::actOnHTMLOpenTagFinish( Tag->setGreaterLoc(GreaterLoc); if (IsSelfClosing) Tag->setSelfClosing(); - else + else if (!isHTMLCloseTagForbidden(Tag->getTagName())) HTMLOpenTags.push_back(Tag); return Tag; } @@ -299,6 +299,12 @@ HTMLCloseTagComment *Sema::actOnHTMLCloseTag(SourceLocation LocBegin, StringRef TagName) { HTMLCloseTagComment *HCT = new (Allocator) HTMLCloseTagComment(LocBegin, LocEnd, TagName); + if (isHTMLCloseTagForbidden(TagName)) { + Diag(HCT->getLocation(), diag::warn_doc_html_close_forbidden) + << TagName << HCT->getSourceRange(); + return HCT; + } + bool FoundOpen = false; for (SmallVectorImpl<HTMLOpenTagComment *>::const_reverse_iterator I = HTMLOpenTags.rbegin(), E = HTMLOpenTags.rend(); @@ -321,7 +327,7 @@ HTMLCloseTagComment *Sema::actOnHTMLCloseTag(SourceLocation LocBegin, if (LastNotClosedTagName == TagName) break; - if (!HTMLOpenTagNeedsClosing(LastNotClosedTagName)) + if (isHTMLCloseTagOptional(LastNotClosedTagName)) continue; bool OpenLineInvalid; @@ -448,12 +454,29 @@ bool Sema::isInlineCommand(StringRef Name) { .Default(false); } -bool Sema::HTMLOpenTagNeedsClosing(StringRef Name) { +bool Sema::isHTMLCloseTagOptional(StringRef Name) { return llvm::StringSwitch<bool>(Name) - .Case("br", false) - .Case("hr", false) - .Case("li", false) - .Default(true); + .Case("p", true) + .Case("li", true) + .Case("dt", true) + .Case("dd", true) + .Case("tr", true) + .Case("th", true) + .Case("td", true) + .Case("thead", true) + .Case("tfoot", true) + .Case("tbody", true) + .Case("colgroup", true) + .Default(false); +} + +bool Sema::isHTMLCloseTagForbidden(StringRef Name) { + return llvm::StringSwitch<bool>(Name) + .Case("br", true) + .Case("hr", true) + .Case("img", true) + .Case("col", true) + .Default(false); } } // end namespace comments |