HazardyKnusperkeks created this revision. HazardyKnusperkeks added reviewers: ioeric, MyDeveloperDay. HazardyKnusperkeks added a project: clang-format. Herald added a project: clang. Herald added a subscriber: cfe-commits. HazardyKnusperkeks requested review of this revision.
I think the title says everything. I have one question, should I update the `clang/docs/ClangFormatStyleOptions.rst` by hand, or is it generated? If so how do I generate it? Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D91507 Files: clang/include/clang/Tooling/Inclusions/IncludeStyle.h clang/lib/Tooling/Inclusions/HeaderIncludes.cpp clang/lib/Tooling/Inclusions/IncludeStyle.cpp clang/unittests/Format/FormatTest.cpp clang/unittests/Format/SortIncludesTest.cpp
Index: clang/unittests/Format/SortIncludesTest.cpp =================================================================== --- clang/unittests/Format/SortIncludesTest.cpp +++ clang/unittests/Format/SortIncludesTest.cpp @@ -72,19 +72,19 @@ TEST_F(SortIncludesTest, SortedIncludesUsingSortPriorityAttribute) { FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; FmtStyle.IncludeStyle.IncludeCategories = { - {"^<sys/param\\.h>", 1, 0}, - {"^<sys/types\\.h>", 1, 1}, - {"^<sys.*/", 1, 2}, - {"^<uvm/", 2, 3}, - {"^<machine/", 3, 4}, - {"^<dev/", 4, 5}, - {"^<net.*/", 5, 6}, - {"^<protocols/", 5, 7}, - {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8}, - {"^<(x86|amd64|i386|xen)/", 7, 8}, - {"<path", 9, 11}, - {"^<[^/].*\\.h>", 8, 10}, - {"^\".*\\.h\"", 10, 12}}; + {"^<sys/param\\.h>", 1, 0, false}, + {"^<sys/types\\.h>", 1, 1, false}, + {"^<sys.*/", 1, 2, false}, + {"^<uvm/", 2, 3, false}, + {"^<machine/", 3, 4, false}, + {"^<dev/", 4, 5, false}, + {"^<net.*/", 5, 6, false}, + {"^<protocols/", 5, 7, false}, + {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8, false}, + {"^<(x86|amd64|i386|xen)/", 7, 8, false}, + {"<path", 9, 11, false}, + {"^<[^/].*\\.h>", 8, 10, false}, + {"^\".*\\.h\"", 10, 12, false}}; EXPECT_EQ("#include <sys/param.h>\n" "#include <sys/types.h>\n" "#include <sys/ioctl.h>\n" @@ -587,8 +587,59 @@ "a_TEST.cc")); } +TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveMachting) { + Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; + Style.IncludeCategories = {{"^\"", 1, 0, false}, + {"^<.*\\.h>$", 2, 0, false}, + {"^<Q[A-Z][^\\.]*>", 3, 0, false}, + {"^<Qt[^\\.]*>", 4, 0, false}, + {"^<", 5, 0, false}}; + + StringRef UnsortedCode = "#include <QWidget>\n" + "#include \"qt.h\"\n" + "#include <algorithm>\n" + "#include <windows.h>\n" + "#include <QLabel>\n" + "#include \"qa.h\"\n" + "#include <queue>\n" + "#include <qtwhatever.h>\n" + "#include <QtGlobal>\n"; + + EXPECT_EQ("#include \"qa.h\"\n" + "#include \"qt.h\"\n" + "\n" + "#include <qtwhatever.h>\n" + "#include <windows.h>\n" + "\n" + "#include <QLabel>\n" + "#include <QWidget>\n" + "#include <QtGlobal>\n" + "#include <queue>\n" + "\n" + "#include <algorithm>\n", + sort(UnsortedCode)); + + Style.IncludeCategories[2].RegexIsCaseSensitive = true; + Style.IncludeCategories[3].RegexIsCaseSensitive = true; + EXPECT_EQ("#include \"qa.h\"\n" + "#include \"qt.h\"\n" + "\n" + "#include <qtwhatever.h>\n" + "#include <windows.h>\n" + "\n" + "#include <QLabel>\n" + "#include <QWidget>\n" + "\n" + "#include <QtGlobal>\n" + "\n" + "#include <algorithm>\n" + "#include <queue>\n", + sort(UnsortedCode)); +} + TEST_F(SortIncludesTest, NegativePriorities) { - Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}}; + Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, + {".*", 1, 0, false}}; EXPECT_EQ("#include \"important_os_header.h\"\n" "#include \"c_main.h\"\n" "#include \"a_other.h\"\n", @@ -608,7 +659,8 @@ } TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { - Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}}; + Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, + {".*", 1, 0, false}}; Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; EXPECT_EQ("#include \"important_os_header.h\"\n" Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -14524,12 +14524,13 @@ Style.IncludeStyle.IncludeCategories.clear(); std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { - {"abc/.*", 2, 0}, {".*", 1, 0}}; + {"abc/.*", 2, 0, false}, {".*", 1, 0, true}}; CHECK_PARSE("IncludeCategories:\n" " - Regex: abc/.*\n" " Priority: 2\n" " - Regex: .*\n" - " Priority: 1", + " Priority: 1\n" + " CaseSensitive: true\n", IncludeStyle.IncludeCategories, ExpectedCategories); CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, "abc$"); Index: clang/lib/Tooling/Inclusions/IncludeStyle.cpp =================================================================== --- clang/lib/Tooling/Inclusions/IncludeStyle.cpp +++ clang/lib/Tooling/Inclusions/IncludeStyle.cpp @@ -18,6 +18,7 @@ IO.mapOptional("Regex", Category.Regex); IO.mapOptional("Priority", Category.Priority); IO.mapOptional("SortPriority", Category.SortPriority); + IO.mapOptional("CaseSensitive", Category.RegexIsCaseSensitive); } void ScalarEnumerationTraits<IncludeStyle::IncludeBlocksStyle>::enumeration( Index: clang/lib/Tooling/Inclusions/HeaderIncludes.cpp =================================================================== --- clang/lib/Tooling/Inclusions/HeaderIncludes.cpp +++ clang/lib/Tooling/Inclusions/HeaderIncludes.cpp @@ -190,8 +190,11 @@ IncludeCategoryManager::IncludeCategoryManager(const IncludeStyle &Style, StringRef FileName) : Style(Style), FileName(FileName) { - for (const auto &Category : Style.IncludeCategories) - CategoryRegexs.emplace_back(Category.Regex, llvm::Regex::IgnoreCase); + for (const auto &Category : Style.IncludeCategories) { + CategoryRegexs.emplace_back(Category.Regex, Category.RegexIsCaseSensitive + ? llvm::Regex::NoFlags + : llvm::Regex::IgnoreCase); + } IsMainFile = FileName.endswith(".c") || FileName.endswith(".cc") || FileName.endswith(".cpp") || FileName.endswith(".c++") || FileName.endswith(".cxx") || FileName.endswith(".m") || Index: clang/include/clang/Tooling/Inclusions/IncludeStyle.h =================================================================== --- clang/include/clang/Tooling/Inclusions/IncludeStyle.h +++ clang/include/clang/Tooling/Inclusions/IncludeStyle.h @@ -60,8 +60,11 @@ int Priority; /// The custom priority to sort before grouping. int SortPriority; + /// If the regular expression is case sensitive. + bool RegexIsCaseSensitive; bool operator==(const IncludeCategory &Other) const { - return Regex == Other.Regex && Priority == Other.Priority; + return Regex == Other.Regex && Priority == Other.Priority && + RegexIsCaseSensitive == Other.RegexIsCaseSensitive; } }; @@ -92,12 +95,16 @@ /// priority for order.``SortPriority`` is set to the value of ``Priority`` /// as default if it is not assigned. /// + /// Each regular expression can be marked as case sensitive with the field + /// ``CaseSensitive``, per default it is not. + /// /// To configure this in the .clang-format file, use: /// \code{.yaml} /// IncludeCategories: /// - Regex: '^"(llvm|llvm-c|clang|clang-c)/' /// Priority: 2 /// SortPriority: 2 + /// CaseSensitive: true /// - Regex: '^(<|"(gtest|gmock|isl|json)/)' /// Priority: 3 /// - Regex: '<[[:alnum:].]+>'
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits