Comment parsing: close a hole in CDATA escaping in XML output

llvm-svn: 206886
This commit is contained in:
Dmitri Gribenko 2014-04-22 12:34:52 +00:00
parent 64f6ebb8a9
commit 6db07e2ab7
2 changed files with 45 additions and 3 deletions

View File

@ -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 << "<rawHTML";
if (C->isSafeToPassThrough())
Result << " isSafeToPassThrough=\"1\"";
Result << "><![CDATA[";
printHTMLStartTagComment(C, Result);
Result << "]]></rawHTML>";
Result << ">";
{
SmallString<32> Tag;
{
llvm::raw_svector_ostream TagOS(Tag);
printHTMLStartTagComment(C, TagOS);
}
appendToResultWithCDATAEscaping(Tag);
}
Result << "</rawHTML>";
}
void
@ -1106,6 +1114,28 @@ void CommentASTToXMLConverter::appendToResultWithXMLEscaping(StringRef S) {
}
}
void CommentASTToXMLConverter::appendToResultWithCDATAEscaping(StringRef S) {
if (S.empty())
return;
Result << "<![CDATA[";
while (!S.empty()) {
size_t Pos = S.find("]]>");
if (Pos == 0) {
Result << "]]]]><![CDATA[>";
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<char> &HTML,
const ASTContext &Context) {

View File

@ -721,6 +721,18 @@ void comment_to_html_conversion_35();
// CHECK-NEXT: (CXComment_Text Text=[Γ])
// CHECK-NEXT: (CXComment_Text Text=[ Greek letter Gamma Γ.])))]
/// <h1 id="]]>">Aaa</h1>
void comment_to_html_conversion_36();
// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:6: FunctionDecl=comment_to_html_conversion_36:{{.*}} FullCommentAsHTML=[<p class="para-brief"> <h1 id="]]>">Aaa</h1></p>] FullCommentAsXML=[<Function file="{{[^"]+}}comment-to-html-xml-conversion.cpp" line="[[@LINE-2]]" column="6"><Name>comment_to_html_conversion_36</Name><USR>c:@F@comment_to_html_conversion_36#</USR><Declaration>void comment_to_html_conversion_36()</Declaration><Abstract><Para> <rawHTML isSafeToPassThrough="1"><![CDATA[<h1 id="]]]]><![CDATA[>">]]></rawHTML>Aaa<rawHTML isSafeToPassThrough="1">&lt;/h1&gt;</rawHTML></Para></Abstract></Function>]
// 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 {