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