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 | 3d986980bd02594b1a5aa7b9f9f68d201621ced7 (patch) | |
tree | 7d048d7a9030e39a0dc725b9557754064c93df87 /lib/AST/CommentSema.cpp | |
parent | 23458208b25acd7d2dfa003b029299e30124fe5f (diff) |
Make concepts of optional and forbidden end tags separate. Thanks Jordan for pointing this!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160149 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/CommentSema.cpp')
-rw-r--r-- | lib/AST/CommentSema.cpp | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/lib/AST/CommentSema.cpp b/lib/AST/CommentSema.cpp index ae13fa285a..69cc01683c 100644 --- a/lib/AST/CommentSema.cpp +++ b/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 |