summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/CommentSema.cpp
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2012-07-12 23:37:09 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2012-07-12 23:37:09 +0000
commit9460fbf21957f5b1c8b6d85d7c606301209ece62 (patch)
treeb4686005fbac7fd9747c705c07661e74e5cf4341 /clang/lib/AST/CommentSema.cpp
parentbf57091f8b81406835189f59bea511a412f2b7c8 (diff)
downloadbcm5719-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.cpp37
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
OpenPOWER on IntegriCloud