summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Format/Format.h12
-rw-r--r--clang/lib/Format/Format.cpp6
-rw-r--r--clang/unittests/Format/SortIncludesTest.cpp8
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
OpenPOWER on IntegriCloud