[clang-format] Do not format likely xml

Summary:
This patch detects the leading '<' in likely xml files and stops formatting in
that case. A recent use of a Qt xml file with a .ts extension triggered this:
http://doc.qt.io/qt-4.8/linguist-ts-file-format.html

Reviewers: djasper

Reviewed By: djasper

Subscribers: sammccall, cfe-commits, klimek

Differential Revision: https://reviews.llvm.org/D37136

llvm-svn: 311999
This commit is contained in:
Krasimir Georgiev 2017-08-29 13:51:38 +00:00
parent 81341d7022
commit a2e7d0dee3
3 changed files with 27 additions and 3 deletions

View File

@ -1539,14 +1539,19 @@ bool isMpegTS(StringRef Code) {
return Code.size() > 188 && Code[0] == 0x47 && Code[188] == 0x47;
}
bool likelyXml(StringRef Code) {
return Code.ltrim().startswith("<");
}
tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code,
ArrayRef<tooling::Range> Ranges,
StringRef FileName, unsigned *Cursor) {
tooling::Replacements Replaces;
if (!Style.SortIncludes)
return Replaces;
if (Style.Language == FormatStyle::LanguageKind::LK_JavaScript &&
isMpegTS(Code))
if (likelyXml(Code) ||
(Style.Language == FormatStyle::LanguageKind::LK_JavaScript &&
isMpegTS(Code)))
return Replaces;
if (Style.Language == FormatStyle::LanguageKind::LK_JavaScript)
return sortJavaScriptImports(Style, Code, Ranges, FileName);
@ -1894,7 +1899,8 @@ tooling::Replacements reformat(const FormatStyle &Style, StringRef Code,
FormatStyle Expanded = expandPresets(Style);
if (Expanded.DisableFormat)
return tooling::Replacements();
if (Expanded.Language == FormatStyle::LK_JavaScript && isMpegTS(Code))
if (likelyXml(Code) ||
(Expanded.Language == FormatStyle::LK_JavaScript && isMpegTS(Code)))
return tooling::Replacements();
typedef std::function<tooling::Replacements(const Environment &)>

View File

@ -11253,6 +11253,13 @@ TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
}
TEST_F(FormatTest, DoNotFormatLikelyXml) {
EXPECT_EQ("<!-- ;> -->",
format("<!-- ;> -->", getGoogleStyle()));
EXPECT_EQ(" <!-- >; -->",
format(" <!-- >; -->", getGoogleStyle()));
}
} // end namespace
} // end namespace format
} // end namespace clang

View File

@ -398,6 +398,17 @@ TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) {
EXPECT_EQ(26u, Ranges[0].getLength());
}
TEST_F(SortIncludesTest, DoNotSortLikelyXml) {
EXPECT_EQ("<!--;\n"
"#include <b>\n"
"#include <a>\n"
"-->",
sort("<!--;\n"
"#include <b>\n"
"#include <a>\n"
"-->"));
}
} // end namespace
} // end namespace format
} // end namespace clang