From 07aed9621e8ab315f9b820a17420e16cb5e0314b Mon Sep 17 00:00:00 2001
From: Dmitri Gribenko
Date: Tue, 22 Apr 2014 12:34:52 +0000
Subject: [PATCH] Comment parsing: close a hole in CDATA escaping in XML output
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206886 91177308-0d34-0410-b5e6-96231b3b80d8
---
lib/Index/CommentToXML.cpp | 36 +++++++++++++++++--
test/Index/comment-to-html-xml-conversion.cpp | 12 +++++++
2 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/lib/Index/CommentToXML.cpp b/lib/Index/CommentToXML.cpp
index 377440f81d..4f5c0745d7 100644
--- a/lib/Index/CommentToXML.cpp
+++ b/lib/Index/CommentToXML.cpp
@@ -563,6 +563,7 @@ public:
// Helpers.
void appendToResultWithXMLEscaping(StringRef S);
+ void appendToResultWithCDATAEscaping(StringRef S);
void formatTextOfDeclaration(const DeclInfo *DI,
SmallString<128> &Declaration);
@@ -670,9 +671,16 @@ void CommentASTToXMLConverter::visitHTMLStartTagComment(
Result << "isSafeToPassThrough())
Result << " isSafeToPassThrough=\"1\"";
- Result << ">";
+ Result << ">";
+ {
+ SmallString<32> Tag;
+ {
+ llvm::raw_svector_ostream TagOS(Tag);
+ printHTMLStartTagComment(C, TagOS);
+ }
+ appendToResultWithCDATAEscaping(Tag);
+ }
+ Result << "";
}
void
@@ -1106,6 +1114,28 @@ void CommentASTToXMLConverter::appendToResultWithXMLEscaping(StringRef S) {
}
}
+void CommentASTToXMLConverter::appendToResultWithCDATAEscaping(StringRef S) {
+ if (S.empty())
+ return;
+
+ Result << "");
+ if (Pos == 0) {
+ Result << "]]]]>";
+ S = S.drop_front(3);
+ continue;
+ }
+ if (Pos == StringRef::npos)
+ Pos = S.size();
+
+ Result << S.substr(0, Pos);
+
+ S = S.drop_front(Pos);
+ }
+ Result << "]]>";
+}
+
void CommentToXMLConverter::convertCommentToHTML(const FullComment *FC,
SmallVectorImpl &HTML,
const ASTContext &Context) {
diff --git a/test/Index/comment-to-html-xml-conversion.cpp b/test/Index/comment-to-html-xml-conversion.cpp
index 590e187197..f93126b1e5 100644
--- a/test/Index/comment-to-html-xml-conversion.cpp
+++ b/test/Index/comment-to-html-xml-conversion.cpp
@@ -721,6 +721,18 @@ void comment_to_html_conversion_35();
// CHECK-NEXT: (CXComment_Text Text=[Î])
// CHECK-NEXT: (CXComment_Text Text=[ Greek letter Gamma Î.])))]
+/// Aaa
+void comment_to_html_conversion_36();
+
+// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:6: FunctionDecl=comment_to_html_conversion_36:{{.*}} FullCommentAsHTML=[
Aaa
] FullCommentAsXML=[comment_to_html_conversion_36c:@F@comment_to_html_conversion_36#void comment_to_html_conversion_36() ">]]>Aaa</h1>]
+// CHECK-NEXT: CommentAST=[
+// CHECK-NEXT: (CXComment_FullComment
+// CHECK-NEXT: (CXComment_Paragraph
+// CHECK-NEXT: (CXComment_Text Text=[ ] IsWhitespace)
+// CHECK-NEXT: (CXComment_HTMLStartTag Name=[h1] Attrs: id=]]>)
+// CHECK-NEXT: (CXComment_Text Text=[Aaa])
+// CHECK-NEXT: (CXComment_HTMLEndTag Name=[h1])))]
+
/// Aaa.
class comment_to_xml_conversion_01 {
--
2.40.0