https://github.com/vbvictor created https://github.com/llvm/llvm-project/pull/147142
Added function to filter out options that come from `ClangTidyOptions::getDefaults()`, but does not have a corresponding check enabled in the configuration. Fixes https://github.com/llvm/llvm-project/issues/146693. >From d70b792ece6709b7a68baf116c0895394c71fd16 Mon Sep 17 00:00:00 2001 From: Victor Baranov <bar.victor.2...@gmail.com> Date: Sat, 5 Jul 2025 15:12:04 +0300 Subject: [PATCH] [clang-tidy] filter check options by enabled checks in '--dump-config' --- clang-tools-extra/clang-tidy/ClangTidy.cpp | 15 +++++++++++++++ clang-tools-extra/clang-tidy/ClangTidy.h | 5 +++++ .../clang-tidy/tool/ClangTidyMain.cpp | 7 ++++--- clang-tools-extra/docs/ReleaseNotes.rst | 3 +++ .../infrastructure/dump-config-filtering.cpp | 12 ++++++++++++ 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 clang-tools-extra/test/clang-tidy/infrastructure/dump-config-filtering.cpp diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp index f4ab93b51f4a7..30bc96d62de7c 100644 --- a/clang-tools-extra/clang-tidy/ClangTidy.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp @@ -503,6 +503,21 @@ getCheckNames(const ClangTidyOptions &Options, return Factory.getCheckNames(); } +void filterCheckOptions(ClangTidyOptions &Options, + const std::vector<std::string> &EnabledChecks) { + StringSet<> EnabledChecksSet(llvm::from_range, EnabledChecks); + ClangTidyOptions::OptionMap FilteredOptions; + for (const auto &[OptionName, Value] : Options.CheckOptions) { + const size_t CheckNameEndPos = OptionName.find('.'); + if (CheckNameEndPos == StringRef::npos) + continue; + const StringRef CheckName = OptionName.substr(0, CheckNameEndPos); + if (EnabledChecksSet.contains(CheckName)) + FilteredOptions[OptionName] = Value; + } + Options.CheckOptions = std::move(FilteredOptions); +} + ClangTidyOptions::OptionMap getCheckOptions(const ClangTidyOptions &Options, bool AllowEnablingAnalyzerAlphaCheckers) { diff --git a/clang-tools-extra/clang-tidy/ClangTidy.h b/clang-tools-extra/clang-tidy/ClangTidy.h index 4ffd49f6ebf50..02ab3a0c1d213 100644 --- a/clang-tools-extra/clang-tidy/ClangTidy.h +++ b/clang-tools-extra/clang-tidy/ClangTidy.h @@ -76,6 +76,11 @@ ClangTidyOptions::OptionMap getCheckOptions(const ClangTidyOptions &Options, bool AllowEnablingAnalyzerAlphaCheckers); +/// Filters CheckOptions in \p Options to only include options specified in +/// the \p EnabledChecks. +void filterCheckOptions(ClangTidyOptions &Options, + const std::vector<std::string> &EnabledChecks); + /// Run a set of clang-tidy checks on a set of files. /// /// \param EnableCheckProfile If provided, it enables check profile collection diff --git a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp index 4336c723bd7cd..4de1caec5ec8c 100644 --- a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -659,9 +659,10 @@ int clangTidyMain(int argc, const char **argv) { if (DumpConfig) { EffectiveOptions.CheckOptions = getCheckOptions(EffectiveOptions, AllowEnablingAnalyzerAlphaCheckers); - llvm::outs() << configurationAsText(ClangTidyOptions::getDefaults().merge( - EffectiveOptions, 0)) - << "\n"; + ClangTidyOptions OptionsToDump = + ClangTidyOptions::getDefaults().merge(EffectiveOptions, 0); + filterCheckOptions(OptionsToDump, EnabledChecks); + llvm::outs() << configurationAsText(OptionsToDump) << "\n"; return 0; } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 198efee7754de..c8f9c127c115c 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -108,6 +108,9 @@ Improvements to clang-tidy - Improved :program:`clang-tidy-diff.py` script. Add the `-warnings-as-errors` argument to treat warnings as errors. +- Improved :program:`clang-tidy` to show `CheckOptions` only for checks enabled + in `Checks` when running ``--dump-config``. + - Fixed bug in :program:`clang-tidy` by which `HeaderFilterRegex` did not take effect when passed via the `.clang-tidy` file. diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/dump-config-filtering.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/dump-config-filtering.cpp new file mode 100644 index 0000000000000..f22ec7edb1775 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/infrastructure/dump-config-filtering.cpp @@ -0,0 +1,12 @@ +// RUN: clang-tidy -checks='-*,misc-unused-parameters' -dump-config %s -- 2>/dev/null | FileCheck %s --check-prefix=CHECK +// RUN: clang-tidy -checks='-*' -dump-config %s -- 2>/dev/null | FileCheck %s --check-prefix=CHECK-DISABLED + +// CHECK: CheckOptions: +// CHECK-NEXT: misc-unused-parameters.IgnoreVirtual: 'false' +// CHECK-NEXT: misc-unused-parameters.StrictMode: 'false' +// CHECK-NEXT: SystemHeaders: false + +// CHECK-DISABLED: CheckOptions: {} +// CHECK-DISABLED-NEXT: SystemHeaders: false + +int main() { return 0; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits