clang-format: Teach --sort-includes to interleave #include and #import.

clang accepts both #include and #import for includes (the latter having an
implicit header guard).  Let clang-format interleave both types if
--sort-includes is passed.  #import is used frequently in Objective-C code.

http://reviews.llvm.org/D13853

llvm-svn: 250909
This commit is contained in:
Nico Weber 2015-10-21 17:13:45 +00:00
parent da9dd05011
commit ff06370e12
2 changed files with 14 additions and 4 deletions

View File

@ -1732,7 +1732,7 @@ tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code,
unsigned Prev = 0;
unsigned SearchFrom = 0;
llvm::Regex IncludeRegex(
R"(^[\t\ ]*#[\t\ ]*include[^"<]*(["<][^">]*[">]))");
R"(^[\t\ ]*#[\t\ ]*(import|include)[^"<]*(["<][^">]*[">]))");
SmallVector<StringRef, 4> Matches;
SmallVector<IncludeDirective, 16> IncludesInBlock;
@ -1762,20 +1762,21 @@ tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code,
Code.substr(Prev, (Pos != StringRef::npos ? Pos : Code.size()) - Prev);
if (!Line.endswith("\\")) {
if (IncludeRegex.match(Line, &Matches)) {
StringRef IncludeName = Matches[2];
unsigned Category;
if (LookForMainHeader && !Matches[1].startswith("<")) {
if (LookForMainHeader && !IncludeName.startswith("<")) {
Category = 0;
} else {
Category = UINT_MAX;
for (unsigned i = 0, e = CategoryRegexs.size(); i != e; ++i) {
if (CategoryRegexs[i].match(Matches[1])) {
if (CategoryRegexs[i].match(IncludeName)) {
Category = Style.IncludeCategories[i].Priority;
break;
}
}
}
LookForMainHeader = false;
IncludesInBlock.push_back({Matches[1], Line, Prev, Category});
IncludesInBlock.push_back({IncludeName, Line, Prev, Category});
} else if (!IncludesInBlock.empty()) {
sortIncludes(Style, IncludesInBlock, Ranges, FileName, Replaces);
IncludesInBlock.clear();

View File

@ -40,6 +40,15 @@ TEST_F(SortIncludesTest, BasicSorting) {
"#include \"b.h\"\n"));
}
TEST_F(SortIncludesTest, MixIncludeAndImport) {
EXPECT_EQ("#include \"a.h\"\n"
"#import \"b.h\"\n"
"#include \"c.h\"\n",
sort("#include \"a.h\"\n"
"#include \"c.h\"\n"
"#import \"b.h\"\n"));
}
TEST_F(SortIncludesTest, FixTrailingComments) {
EXPECT_EQ("#include \"a.h\" // comment\n"
"#include \"bb.h\" // comment\n"