diff options
-rw-r--r-- | clang/include/clang/Format/Format.h | 12 | ||||
-rw-r--r-- | clang/lib/Format/Format.cpp | 6 | ||||
-rw-r--r-- | clang/unittests/Format/SortIncludesTest.cpp | 8 |
3 files changed, 18 insertions, 8 deletions
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index 36b05516f0e..f957f39d889 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -343,7 +343,7 @@ struct FormatStyle { /// \brief The regular expression that this category matches. std::string Regex; /// \brief The priority to assign to this category. - unsigned Priority; + int Priority; bool operator==(const IncludeCategory &Other) const { return Regex == Other.Regex && Priority == Other.Priority; } @@ -358,10 +358,12 @@ struct FormatStyle { /// according to increasing category number and then alphabetically within /// each category. /// - /// If none of the regular expressions match, UINT_MAX is assigned as - /// category. The main header for a source file automatically gets category 0, - /// so that it is kept at the beginning of the #includes - /// (http://llvm.org/docs/CodingStandards.html#include-style). + /// If none of the regular expressions match, INT_MAX is assigned as + /// category. The main header for a source file automatically gets category 0. + /// so that it is generally kept at the beginning of the #includes + /// (http://llvm.org/docs/CodingStandards.html#include-style). However, you + /// can also assign negative priorities if you have certain headers that + /// always need to be first. /// /// To configure this in the .clang-format file, use: /// \code diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 896ecad60f5..a7e0799c119 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1684,7 +1684,7 @@ struct IncludeDirective { StringRef Filename; StringRef Text; unsigned Offset; - unsigned Category; + int Category; }; } // end anonymous namespace @@ -1807,11 +1807,11 @@ tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code, if (!FormattingOff && !Line.endswith("\\")) { if (IncludeRegex.match(Line, &Matches)) { StringRef IncludeName = Matches[2]; - unsigned Category; + int Category; if (LookForMainHeader && !IncludeName.startswith("<")) { Category = 0; } else { - Category = UINT_MAX; + Category = INT_MAX; for (unsigned i = 0, e = CategoryRegexs.size(); i != e; ++i) { if (CategoryRegexs[i].match(IncludeName)) { Category = Style.IncludeCategories[i].Priority; diff --git a/clang/unittests/Format/SortIncludesTest.cpp b/clang/unittests/Format/SortIncludesTest.cpp index 70c7960df07..9b0db349b04 100644 --- a/clang/unittests/Format/SortIncludesTest.cpp +++ b/clang/unittests/Format/SortIncludesTest.cpp @@ -185,6 +185,14 @@ TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { "some_header.h")); } +TEST_F(SortIncludesTest, NegativePriorities) { + Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; + EXPECT_EQ("#include \"important_os_header.h\"\n" + "#include \"a.h\"\n", + sort("#include \"a.h\"\n" + "#include \"important_os_header.h\"\n")); +} + TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { std::string Code = "#include <ccc>\n" // Start of line: 0 "#include <bbbbbb>\n" // Start of line: 15 |