reyg created this revision.
reyg added a reviewer: cfe-commits.
Herald added subscribers: carlosgalvezp, xazax.hun.
reyg requested review of this revision.
Herald added a project: clang-tools-extra.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D116163

Files:
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
  clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
  clang-tools-extra/clang-tidy/ClangTidyOptions.h
  clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
  clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp
  clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
===================================================================
--- clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
@@ -76,12 +76,14 @@
 TEST(ParseConfiguration, ValidConfiguration) {
   llvm::ErrorOr<ClangTidyOptions> Options =
       parseConfiguration(llvm::MemoryBufferRef("Checks: \"-*,misc-*\"\n"
+                                               "SuppressedChecks: \"noisy-*\"\n"
                                                "HeaderFilterRegex: \".*\"\n"
                                                "AnalyzeTemporaryDtors: true\n"
                                                "User: some.user",
                                                "Options"));
   EXPECT_TRUE(!!Options);
   EXPECT_EQ("-*,misc-*", *Options->Checks);
+  EXPECT_EQ("noisy-*", *Options->SuppressedChecks);
   EXPECT_EQ(".*", *Options->HeaderFilterRegex);
   EXPECT_EQ("some.user", *Options->User);
 }
@@ -90,6 +92,7 @@
   llvm::ErrorOr<ClangTidyOptions> Options1 =
       parseConfiguration(llvm::MemoryBufferRef(R"(
       Checks: "check1,check2"
+      SuppressedChecks: "noisycheck1,noisycheck2"
       HeaderFilterRegex: "filter1"
       AnalyzeTemporaryDtors: true
       User: user1
@@ -102,6 +105,7 @@
   llvm::ErrorOr<ClangTidyOptions> Options2 =
       parseConfiguration(llvm::MemoryBufferRef(R"(
       Checks: "check3,check4"
+      SuppressedChecks: "noisycheck3,noisycheck4"
       HeaderFilterRegex: "filter2"
       AnalyzeTemporaryDtors: false
       User: user2
@@ -113,6 +117,8 @@
   ASSERT_TRUE(!!Options2);
   ClangTidyOptions Options = Options1->merge(*Options2, 0);
   EXPECT_EQ("check1,check2,check3,check4", *Options.Checks);
+  EXPECT_EQ("noisycheck1,noisycheck2,noisycheck3,noisycheck4",
+            *Options.SuppressedChecks);
   EXPECT_EQ("filter2", *Options.HeaderFilterRegex);
   EXPECT_EQ("user2", *Options.User);
   ASSERT_TRUE(Options.ExtraArgs.hasValue());
Index: clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp
===================================================================
--- clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp
@@ -24,6 +24,19 @@
   }
 };
 
+// Test that has name == "test-check-noisy" and outputs exactly one diagnostic.
+class NoisyCheck : public ClangTidyCheck {
+public:
+  NoisyCheck(StringRef Name, ClangTidyContext *Context)
+      : ClangTidyCheck("test-check-noisy", Context) {}
+  void registerMatchers(ast_matchers::MatchFinder *Finder) override {
+    Finder->addMatcher(ast_matchers::varDecl().bind("var"), this);
+  }
+  void check(const ast_matchers::MatchFinder::MatchResult &Result) override {
+    diag("Some diagnostic");
+  }
+};
+
 class HighlightTestCheck : public ClangTidyCheck {
 public:
   HighlightTestCheck(StringRef Name, ClangTidyContext *Context)
@@ -75,6 +88,27 @@
   EXPECT_EQ("variable", Errors[2].Message.Message);
 }
 
+TEST(ClangTidyDiagnosticConsumer, SkipsSuppressedChecks) {
+  std::vector<ClangTidyError> Errors;
+  ClangTidyOptions CustomOptions;
+  CustomOptions.SuppressedChecks = "*noisy*";
+  runCheckOnCode<TestCheck, NoisyCheck>("int a;", &Errors, "input.cc", None,
+                                        CustomOptions);
+  // 4 comming from TestCheck, 0 from NoisyCheck (since it's suppressed).
+  EXPECT_EQ(3ul, Errors.size());
+}
+
+TEST(ClangTidyDiagnosticConsumer, ChecksIfNotSuppressed) {
+  std::vector<ClangTidyError> Errors;
+  ClangTidyOptions CustomOptions;
+  CustomOptions.SuppressedChecks = "*different_glob*";
+  runCheckOnCode<TestCheck, NoisyCheck>("int a;", &Errors, "input.cc", None,
+                                        CustomOptions);
+
+  // 4 comming from TestCheck, 1 from NoisyCheck.
+  EXPECT_EQ(4ul, Errors.size());
+}
+
 TEST(ClangTidyDiagnosticConsumer, HandlesSourceRangeHighlight) {
   std::vector<ClangTidyError> Errors;
   runCheckOnCode<HighlightTestCheck>("int abc;", &Errors);
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===================================================================
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -298,6 +298,7 @@
 
   ClangTidyOptions DefaultOptions;
   DefaultOptions.Checks = DefaultChecks;
+  DefaultOptions.SuppressedChecks = "";
   DefaultOptions.WarningsAsErrors = "";
   DefaultOptions.HeaderFilterRegex = HeaderFilter;
   DefaultOptions.SystemHeaders = SystemHeaders;
Index: clang-tools-extra/clang-tidy/ClangTidyOptions.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyOptions.h
+++ clang-tools-extra/clang-tidy/ClangTidyOptions.h
@@ -69,6 +69,9 @@
   /// Checks filter.
   llvm::Optional<std::string> Checks;
 
+  /// Suppressed checks filter.
+  llvm::Optional<std::string> SuppressedChecks;
+
   /// WarningsAsErrors filter.
   llvm::Optional<std::string> WarningsAsErrors;
 
Index: clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
+++ clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
@@ -87,6 +87,7 @@
         IO, Options.CheckOptions);
     bool Ignored = false;
     IO.mapOptional("Checks", Options.Checks);
+    IO.mapOptional("SuppressedChecks", Options.SuppressedChecks);
     IO.mapOptional("WarningsAsErrors", Options.WarningsAsErrors);
     IO.mapOptional("HeaderFilterRegex", Options.HeaderFilterRegex);
     IO.mapOptional("AnalyzeTemporaryDtors", Ignored); // legacy compatibility
@@ -109,6 +110,7 @@
 ClangTidyOptions ClangTidyOptions::getDefaults() {
   ClangTidyOptions Options;
   Options.Checks = "";
+  Options.SuppressedChecks = "";
   Options.WarningsAsErrors = "";
   Options.HeaderFilterRegex = "";
   Options.SystemHeaders = false;
@@ -145,6 +147,7 @@
 ClangTidyOptions &ClangTidyOptions::mergeWith(const ClangTidyOptions &Other,
                                               unsigned Order) {
   mergeCommaSeparatedLists(Checks, Other.Checks);
+  mergeCommaSeparatedLists(SuppressedChecks, Other.SuppressedChecks);
   mergeCommaSeparatedLists(WarningsAsErrors, Other.WarningsAsErrors);
   overrideValue(HeaderFilterRegex, Other.HeaderFilterRegex);
   overrideValue(SystemHeaders, Other.SystemHeaders);
Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
+++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
@@ -194,6 +194,7 @@
   ClangTidyOptions CurrentOptions;
 
   std::unique_ptr<CachedGlobList> CheckFilter;
+  std::unique_ptr<CachedGlobList> SuppressedCheckFilter;
   std::unique_ptr<CachedGlobList> WarningAsErrorFilter;
 
   LangOptions LangOpts;
Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -212,6 +212,8 @@
   CurrentFile = std::string(File);
   CurrentOptions = getOptionsForFile(CurrentFile);
   CheckFilter = std::make_unique<CachedGlobList>(*getOptions().Checks);
+  SuppressedCheckFilter =
+      std::make_unique<CachedGlobList>(*getOptions().SuppressedChecks);
   WarningAsErrorFilter =
       std::make_unique<CachedGlobList>(*getOptions().WarningsAsErrors);
 }
@@ -252,7 +254,9 @@
 
 bool ClangTidyContext::isCheckEnabled(StringRef CheckName) const {
   assert(CheckFilter != nullptr);
-  return CheckFilter->contains(CheckName);
+  assert(SuppressedCheckFilter != nullptr);
+  return CheckFilter->contains(CheckName) &&
+         !SuppressedCheckFilter->contains(CheckName);
 }
 
 bool ClangTidyContext::treatAsError(StringRef CheckName) const {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to