aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Format
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2025-07-17 09:36:52 +0200
committerGitHub <noreply@github.com>2025-07-17 00:36:52 -0700
commit1653a093def10543d8f958fe7d4cde9ab1dd8bca (patch)
tree8d8d5a7b48603f0644c0dde5c300878e44fb917d /clang/lib/Format
parent3cb0c7f45b97802ddc13a15560fbbca2efb75326 (diff)
downloadllvm-1653a093def10543d8f958fe7d4cde9ab1dd8bca.zip
llvm-1653a093def10543d8f958fe7d4cde9ab1dd8bca.tar.gz
llvm-1653a093def10543d8f958fe7d4cde9ab1dd8bca.tar.bz2
[clang-format] Add IgnoreExtension to SortIncludes (#137840)
Sorting by stem gives nicer results when various header file names are substrings of other header file names. For example, a CLI application with a main header named analyze.h and an analyze-xxx.h header for each subcommand currently will always put analyze.h last after all the analyze-xxx.h headers, but putting analyze.h first instead is arguably nicer to read. TLDR; Instead of ``` #include "analyze-blame.h" #include "analyze.h" ``` You'd get ``` #include "analyze.h" #include "analyze-blame.h" ``` Let's allow sorting by stem instead of full path by adding IgnoreExtension to SortIncludes.
Diffstat (limited to 'clang/lib/Format')
-rw-r--r--clang/lib/Format/Format.cpp45
1 files changed, 29 insertions, 16 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 78c09be..62feb3d 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -665,21 +665,25 @@ template <> struct MappingTraits<FormatStyle::SortIncludesOptions> {
IO.enumCase(Value, "Never", FormatStyle::SortIncludesOptions({}));
IO.enumCase(Value, "CaseInsensitive",
FormatStyle::SortIncludesOptions({/*Enabled=*/true,
- /*IgnoreCase=*/true}));
+ /*IgnoreCase=*/true,
+ /*IgnoreExtension=*/false}));
IO.enumCase(Value, "CaseSensitive",
FormatStyle::SortIncludesOptions({/*Enabled=*/true,
- /*IgnoreCase=*/false}));
+ /*IgnoreCase=*/false,
+ /*IgnoreExtension=*/false}));
// For backward compatibility.
IO.enumCase(Value, "false", FormatStyle::SortIncludesOptions({}));
IO.enumCase(Value, "true",
FormatStyle::SortIncludesOptions({/*Enabled=*/true,
- /*IgnoreCase=*/false}));
+ /*IgnoreCase=*/false,
+ /*IgnoreExtension=*/false}));
}
static void mapping(IO &IO, FormatStyle::SortIncludesOptions &Value) {
IO.mapOptional("Enabled", Value.Enabled);
IO.mapOptional("IgnoreCase", Value.IgnoreCase);
+ IO.mapOptional("IgnoreExtension", Value.IgnoreExtension);
}
};
@@ -1650,7 +1654,8 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
LLVMStyle.SeparateDefinitionBlocks = FormatStyle::SDS_Leave;
LLVMStyle.ShortNamespaceLines = 1;
LLVMStyle.SkipMacroDefinitionBody = false;
- LLVMStyle.SortIncludes = {/*Enabled=*/true, /*IgnoreCase=*/false};
+ LLVMStyle.SortIncludes = {/*Enabled=*/true, /*IgnoreCase=*/false,
+ /*IgnoreExtension=*/false};
LLVMStyle.SortJavaStaticImport = FormatStyle::SJSIO_Before;
LLVMStyle.SortUsingDeclarations = FormatStyle::SUD_LexicographicNumeric;
LLVMStyle.SpaceAfterCStyleCast = false;
@@ -3239,19 +3244,27 @@ static void sortCppIncludes(const FormatStyle &Style,
SmallVector<unsigned, 16> Indices =
llvm::to_vector<16>(llvm::seq<unsigned>(0, Includes.size()));
- if (Style.SortIncludes.Enabled && Style.SortIncludes.IgnoreCase) {
+ if (Style.SortIncludes.Enabled) {
stable_sort(Indices, [&](unsigned LHSI, unsigned RHSI) {
- 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);
- });
- } else {
- stable_sort(Indices, [&](unsigned LHSI, unsigned RHSI) {
- return std::tie(Includes[LHSI].Priority, Includes[LHSI].Filename) <
- std::tie(Includes[RHSI].Priority, Includes[RHSI].Filename);
+ SmallString<128> LHSStem, RHSStem;
+ if (Style.SortIncludes.IgnoreExtension) {
+ LHSStem = Includes[LHSI].Filename;
+ RHSStem = Includes[RHSI].Filename;
+ llvm::sys::path::replace_extension(LHSStem, "");
+ llvm::sys::path::replace_extension(RHSStem, "");
+ }
+ std::string LHSStemLower, RHSStemLower;
+ std::string LHSFilenameLower, RHSFilenameLower;
+ if (Style.SortIncludes.IgnoreCase) {
+ LHSStemLower = LHSStem.str().lower();
+ RHSStemLower = RHSStem.str().lower();
+ LHSFilenameLower = Includes[LHSI].Filename.lower();
+ RHSFilenameLower = Includes[RHSI].Filename.lower();
+ }
+ return std::tie(Includes[LHSI].Priority, LHSStemLower, LHSStem,
+ LHSFilenameLower, Includes[LHSI].Filename) <
+ std::tie(Includes[RHSI].Priority, RHSStemLower, RHSStem,
+ RHSFilenameLower, Includes[RHSI].Filename);
});
}