Author: mitchell Date: 2025-12-12T14:58:08+08:00 New Revision: 3383004a958d51890443ec48e87f0f8e5a76d139
URL: https://github.com/llvm/llvm-project/commit/3383004a958d51890443ec48e87f0f8e5a76d139 DIFF: https://github.com/llvm/llvm-project/commit/3383004a958d51890443ec48e87f0f8e5a76d139.diff LOG: [clang-tidy] Support comments in WarningsAsErrors (#171816) Closes #171792 --------- Co-authored-by: Victor Chernyakin <[email protected]> Added: Modified: clang-tools-extra/clang-tidy/ClangTidyOptions.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp index 550f7809d75f9..f61540069d071 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp @@ -178,12 +178,13 @@ template <> struct MappingTraits<ClangTidyOptions::CustomCheckValue> { } }; -struct ChecksVariant { +struct GlobListVariant { std::optional<std::string> AsString; std::optional<std::vector<std::string>> AsVector; }; -template <> void yamlize(IO &IO, ChecksVariant &Val, bool, EmptyContext &Ctx) { +template <> +void yamlize(IO &IO, GlobListVariant &Val, bool, EmptyContext &Ctx) { if (!IO.outputting()) { // Special case for reading from YAML // Must support reading from both a string or a list @@ -200,25 +201,26 @@ template <> void yamlize(IO &IO, ChecksVariant &Val, bool, EmptyContext &Ctx) { } } -static void mapChecks(IO &IO, std::optional<std::string> &Checks) { +static void mapGlobList(IO &IO, std::optional<std::string> &GlobList, + StringRef Key) { if (IO.outputting()) { // Output always a string - IO.mapOptional("Checks", Checks); + IO.mapOptional(Key, GlobList); } else { // Input as either a string or a list - ChecksVariant ChecksAsVariant; - IO.mapOptional("Checks", ChecksAsVariant); - if (ChecksAsVariant.AsString) - Checks = ChecksAsVariant.AsString; - else if (ChecksAsVariant.AsVector) - Checks = llvm::join(*ChecksAsVariant.AsVector, ","); + GlobListVariant GlobListAsVariant; + IO.mapOptional(Key, GlobListAsVariant); + if (GlobListAsVariant.AsString) + GlobList = GlobListAsVariant.AsString; + else if (GlobListAsVariant.AsVector) + GlobList = llvm::join(*GlobListAsVariant.AsVector, ","); } } template <> struct MappingTraits<ClangTidyOptions> { static void mapping(IO &IO, ClangTidyOptions &Options) { - mapChecks(IO, Options.Checks); - IO.mapOptional("WarningsAsErrors", Options.WarningsAsErrors); + mapGlobList(IO, Options.Checks, "Checks"); + mapGlobList(IO, Options.WarningsAsErrors, "WarningsAsErrors"); IO.mapOptional("HeaderFileExtensions", Options.HeaderFileExtensions); IO.mapOptional("ImplementationFileExtensions", Options.ImplementationFileExtensions); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 8efde0ab121e6..42f35daa942e7 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -196,6 +196,9 @@ Improvements to clang-tidy moved to the ``fuchsia`` module instead. The ``zircon`` module will be removed in the 24th release. +- Improved :program:`clang-tidy` configuration parsing by allowing the same list + syntax in `WarningsAsErrors` as in `Checks`. + New checks ^^^^^^^^^^ diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp index 410cebf90913d..aee3313f2263b 100644 --- a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp @@ -107,6 +107,37 @@ TEST(ParseConfiguration, ChecksSeparatedByNewlines) { EXPECT_EQ("-*,misc-*\nllvm-*\n-clang-*,\ngoogle-*\n", *Options->Checks); } +TEST(ParseConfiguration, WarningsAsErrorsSeparatedByNewlines) { + const auto MemoryBuffer = llvm::MemoryBufferRef("WarningsAsErrors: |\n" + " -*,misc-*\n" + " llvm-*\n" + " -clang-*,\n" + " google-*", + "Options"); + + const auto Options = parseConfiguration(MemoryBuffer); + + EXPECT_TRUE(!!Options); + EXPECT_EQ("-*,misc-*\nllvm-*\n-clang-*,\ngoogle-*\n", + *Options->WarningsAsErrors); +} + +TEST(ParseConfiguration, WarningsAsErrorsAsList) { + const auto MemoryBuffer = llvm::MemoryBufferRef("WarningsAsErrors: [\n" + " '-*',\n" + " 'misc-*',\n" + " 'llvm-*',\n" + " '-clang-*',\n" + " 'google-*'\n" + "]", + "Options"); + + const auto Options = parseConfiguration(MemoryBuffer); + + EXPECT_TRUE(!!Options); + EXPECT_EQ("-*,misc-*,llvm-*,-clang-*,google-*", *Options->WarningsAsErrors); +} + TEST(ParseConfiguration, MergeConfigurations) { llvm::ErrorOr<ClangTidyOptions> Options1 = parseConfiguration(llvm::MemoryBufferRef(R"( _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
