[cfe-commits] r160149 - in /cfe/trunk: include/clang/AST/CommentSema.h include/clang/Basic/DiagnosticCommentKinds.td lib/AST/CommentSema.cpp test/Sema/warn-documentation.cpp

Dmitri Gribenko gribozavr at gmail.com
Thu Jul 12 16:37:09 PDT 2012


Author: gribozavr
Date: Thu Jul 12 18:37:09 2012
New Revision: 160149

URL: http://llvm.org/viewvc/llvm-project?rev=160149&view=rev
Log:
Make concepts of optional and forbidden end tags separate.  Thanks Jordan for pointing this!

Modified:
    cfe/trunk/include/clang/AST/CommentSema.h
    cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td
    cfe/trunk/lib/AST/CommentSema.cpp
    cfe/trunk/test/Sema/warn-documentation.cpp

Modified: cfe/trunk/include/clang/AST/CommentSema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CommentSema.h?rev=160149&r1=160148&r2=160149&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/CommentSema.h (original)
+++ cfe/trunk/include/clang/AST/CommentSema.h Thu Jul 12 18:37:09 2012
@@ -156,7 +156,9 @@
   unsigned getBlockCommandNumArgs(StringRef Name);
 
   bool isInlineCommand(StringRef Name);
-  bool HTMLOpenTagNeedsClosing(StringRef Name);
+
+  bool isHTMLCloseTagOptional(StringRef Name);
+  bool isHTMLCloseTagForbidden(StringRef Name);
 };
 
 } // end namespace comments

Modified: cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td?rev=160149&r1=160148&r2=160149&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td Thu Jul 12 18:37:09 2012
@@ -26,6 +26,10 @@
 
 // HTML semantic errors
 
+def warn_doc_html_close_forbidden : Warning<
+  "HTML closing tag '%0' is forbidden">,
+  InGroup<DocumentationHTML>, DefaultIgnore;
+
 def warn_doc_html_close_unbalanced : Warning<
   "HTML closing tag does not match any opening tag">,
   InGroup<DocumentationHTML>, DefaultIgnore;

Modified: cfe/trunk/lib/AST/CommentSema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentSema.cpp?rev=160149&r1=160148&r2=160149&view=diff
==============================================================================
--- cfe/trunk/lib/AST/CommentSema.cpp (original)
+++ cfe/trunk/lib/AST/CommentSema.cpp Thu Jul 12 18:37:09 2012
@@ -289,7 +289,7 @@
   Tag->setGreaterLoc(GreaterLoc);
   if (IsSelfClosing)
     Tag->setSelfClosing();
-  else
+  else if (!isHTMLCloseTagForbidden(Tag->getTagName()))
     HTMLOpenTags.push_back(Tag);
   return Tag;
 }
@@ -299,6 +299,12 @@
                                              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 @@
     if (LastNotClosedTagName == TagName)
       break;
 
-    if (!HTMLOpenTagNeedsClosing(LastNotClosedTagName))
+    if (isHTMLCloseTagOptional(LastNotClosedTagName))
       continue;
 
     bool OpenLineInvalid;
@@ -448,12 +454,29 @@
       .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

Modified: cfe/trunk/test/Sema/warn-documentation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-documentation.cpp?rev=160149&r1=160148&r2=160149&view=diff
==============================================================================
--- cfe/trunk/test/Sema/warn-documentation.cpp (original)
+++ cfe/trunk/test/Sema/warn-documentation.cpp Thu Jul 12 18:37:09 2012
@@ -45,6 +45,9 @@
  */
 int test_html10(int);
 
+// expected-warning at +1 {{HTML closing tag 'br' is forbidden}}
+/// <br></br>
+int test_html11(int);
 
 /// <blockquote>Meow</blockquote>
 int test_html_nesting1(int);





More information about the cfe-commits mailing list