From 2b21fc5520b39fba555f4e5f2480a5651056be84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Tue, 15 Mar 2022 14:29:33 -0400 Subject: [PATCH] Allow newline characters as separators for checks in Clang-Tidy configurations This is a fix for #53737. In addition to commas, newline characters are considered as separators of checks. --- clang-tools-extra/clang-tidy/GlobList.cpp | 4 ++-- .../unittests/clang-tidy/ClangTidyOptionsTest.cpp | 14 ++++++++++++++ .../unittests/clang-tidy/GlobListTest.cpp | 13 +++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/GlobList.cpp b/clang-tools-extra/clang-tidy/GlobList.cpp index a55cac412cf6..15d856ea3e10 100644 --- a/clang-tools-extra/clang-tidy/GlobList.cpp +++ b/clang-tools-extra/clang-tidy/GlobList.cpp @@ -27,7 +27,7 @@ static bool consumeNegativeIndicator(StringRef &GlobList) { // Converts first glob from the comma-separated list of globs to Regex and // removes it and the trailing comma from the GlobList. static llvm::Regex consumeGlob(StringRef &GlobList) { - StringRef UntrimmedGlob = GlobList.substr(0, GlobList.find(',')); + StringRef UntrimmedGlob = GlobList.substr(0, GlobList.find_first_of(",\n")); StringRef Glob = UntrimmedGlob.trim(); GlobList = GlobList.substr(UntrimmedGlob.size() + 1); SmallString<128> RegexText("^"); @@ -44,7 +44,7 @@ static llvm::Regex consumeGlob(StringRef &GlobList) { } GlobList::GlobList(StringRef Globs, bool KeepNegativeGlobs /* =true */) { - Items.reserve(Globs.count(',') + 1); + Items.reserve(Globs.count(',') + Globs.count('\n') + 1); do { GlobListItem Item; Item.IsPositive = !consumeNegativeIndicator(Globs); diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp index c4fb8bd7b756..41621aad7d4f 100644 --- a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp @@ -86,6 +86,20 @@ TEST(ParseConfiguration, ValidConfiguration) { EXPECT_EQ("some.user", *Options->User); } +TEST(ParseConfiguration, ChecksSeparatedByNewlines) { + auto MemoryBuffer = llvm::MemoryBufferRef("Checks: |\n" + " -*,misc-*\n" + " llvm-*\n" + " -clang-*,\n" + " google-*", + "Options"); + + auto Options = parseConfiguration(MemoryBuffer); + + EXPECT_TRUE(!!Options); + EXPECT_EQ("-*,misc-*\nllvm-*\n-clang-*,\ngoogle-*\n", *Options->Checks); +} + TEST(ParseConfiguration, MergeConfigurations) { llvm::ErrorOr Options1 = parseConfiguration(llvm::MemoryBufferRef(R"( diff --git a/clang-tools-extra/unittests/clang-tidy/GlobListTest.cpp b/clang-tools-extra/unittests/clang-tidy/GlobListTest.cpp index 9460a10683fe..833ba78351d4 100644 --- a/clang-tools-extra/unittests/clang-tidy/GlobListTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/GlobListTest.cpp @@ -104,5 +104,18 @@ TYPED_TEST(GlobListTest, Complex) { EXPECT_TRUE(Filter.contains("asdfqwEasdf")); } +TYPED_TEST(GlobListTest, NewlineCharactersAsSeparators) { + TypeParam Filter("a* \n b,\n-c*,dd"); + + EXPECT_FALSE(Filter.contains("")); + EXPECT_TRUE(Filter.contains("aaa")); + EXPECT_TRUE(Filter.contains("b")); + EXPECT_FALSE(Filter.contains("c")); + EXPECT_FALSE(Filter.contains("ccc")); + EXPECT_FALSE(Filter.contains("d")); + EXPECT_TRUE(Filter.contains("dd")); + EXPECT_FALSE(Filter.contains("ddd")); +} + } // namespace tidy } // namespace clang