kentsommer updated this revision to Diff 317790. kentsommer added a comment.
Fix unittests Fixes both failing unit tests Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95017/new/ https://reviews.llvm.org/D95017 Files: clang/docs/ClangFormatStyleOptions.rst clang/include/clang/Tooling/Inclusions/IncludeStyle.h clang/lib/Format/Format.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 @@ -598,6 +598,22 @@ "a.cc")); } +TEST_F(SortIncludesTest, SupportOptionalCaseAwareSorting) { + Style.IncludeSortCaseAware = true; + + EXPECT_EQ("#include \"A/B.h\"\n" + "#include \"A/b.h\"\n" + "#include \"a/b.h\"\n" + "#include \"B/A.h\"\n" + "#include \"B/a.h\"\n", + sort("#include \"B/a.h\"\n" + "#include \"B/A.h\"\n" + "#include \"A/B.h\"\n" + "#include \"a/b.h\"\n" + "#include \"A/b.h\"\n", + "a.h")); +} + TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { // Setup an regex for main includes so we can cover those as well. Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -14395,6 +14395,8 @@ CHECK_PARSE_BOOL(DeriveLineEnding); CHECK_PARSE_BOOL(DerivePointerAlignment); CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); + CHECK_PARSE_BOOL_FIELD(IncludeStyle.IncludeSortCaseAware, + "IncludeSortCaseAware"); CHECK_PARSE_BOOL(DisableFormat); CHECK_PARSE_BOOL(IndentCaseLabels); CHECK_PARSE_BOOL(IndentCaseBlocks); Index: clang/lib/Format/Format.cpp =================================================================== --- clang/lib/Format/Format.cpp +++ clang/lib/Format/Format.cpp @@ -556,6 +556,8 @@ IO.mapOptional("IncludeIsMainRegex", Style.IncludeStyle.IncludeIsMainRegex); IO.mapOptional("IncludeIsMainSourceRegex", Style.IncludeStyle.IncludeIsMainSourceRegex); + IO.mapOptional("IncludeSortCaseAware", + Style.IncludeStyle.IncludeSortCaseAware); IO.mapOptional("IndentCaseLabels", Style.IndentCaseLabels); IO.mapOptional("IndentCaseBlocks", Style.IndentCaseBlocks); IO.mapOptional("IndentGotoLabels", Style.IndentGotoLabels); @@ -2180,6 +2182,14 @@ Indices.push_back(i); } llvm::stable_sort(Indices, [&](unsigned LHSI, unsigned RHSI) { + if (Style.IncludeStyle.IncludeSortCaseAware) { + const auto LHSFilenameLower = Includes[LHSI].Filename.lower(); + const auto RHSFilenameLower = Includes[RHSI].Filename.lower(); + return std::tie(Includes[LHSI].Priority, LHSFilenameLower, + Includes[LHSI].Filename) < + std::tie(Includes[RHSI].Priority, RHSFilenameLower, + Includes[RHSI].Filename); + } return std::tie(Includes[LHSI].Priority, Includes[LHSI].Filename) < std::tie(Includes[RHSI].Priority, Includes[RHSI].Filename); }); Index: clang/include/clang/Tooling/Inclusions/IncludeStyle.h =================================================================== --- clang/include/clang/Tooling/Inclusions/IncludeStyle.h +++ clang/include/clang/Tooling/Inclusions/IncludeStyle.h @@ -147,6 +147,33 @@ /// ``ClassImpl.hpp`` would not have the main include file put on top /// before any other include. std::string IncludeIsMainSourceRegex; + + /// Specify if sorting should be done in a case aware fashion. + /// + /// By default, clang-format sorts includes in an ASCIIbetical + /// fashion. For instance: + /// + /// \code + /// #include "B/a.h" into #include "A/B.h" + /// #include "B/A.h" #include "A/b.h" + /// #include "A/B.h" #include "B/A.h" + /// #include "a/b.h" #include "B/a.h" + /// #include "A/b.h" #include "a/b.h" + /// \endcode + /// + /// This option will cause includes to be sorted alphabetically with case + /// used as a tie-breaker. For instance: + /// + /// \code + /// #include "B/a.h" into #include "A/B.h" + /// #include "B/A.h" #include "A/b.h" + /// #include "A/B.h" #include "a/b.h" + /// #include "a/b.h" #include "B/A.h" + /// #include "A/b.h" #include "B/a.h" + /// \endcode + /// + /// This option is off by default. + bool IncludeSortCaseAware; }; } // namespace tooling Index: clang/docs/ClangFormatStyleOptions.rst =================================================================== --- clang/docs/ClangFormatStyleOptions.rst +++ clang/docs/ClangFormatStyleOptions.rst @@ -2036,6 +2036,33 @@ ``ClassImpl.hpp`` would not have the main include file put on top before any other include. +**IncludeSortCaseAware** (``bool``) + Specify if sorting should be done in a case aware fashion. + + By default, clang-format sorts includes in an ASCIIbetical + fashion. For instance: + + .. code-block:: c++ + + #include "B/a.h" into #include "A/B.h" + #include "B/A.h" #include "A/b.h" + #include "A/B.h" #include "B/A.h" + #include "a/b.h" #include "B/a.h" + #include "A/b.h" #include "a/b.h" + + This option will cause includes to be sorted alphabetically with case + used as a tie-breaker. For instance: + + .. code-block:: c++ + + #include "B/a.h" into #include "A/B.h" + #include "B/A.h" #include "A/b.h" + #include "A/B.h" #include "a/b.h" + #include "a/b.h" #include "B/A.h" + #include "A/b.h" #include "B/a.h" + + This option is off by default. + **IndentCaseBlocks** (``bool``) Indent case label blocks one level from the case label.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits