diff options
author | Yitzhak Mandelbaum <yitzhakm@google.com> | 2019-06-26 16:04:38 +0000 |
---|---|---|
committer | Yitzhak Mandelbaum <yitzhakm@google.com> | 2019-06-26 16:04:38 +0000 |
commit | 039af0ea03f987654a162b6160399a00fd22b1b0 (patch) | |
tree | 152c66521e8734b2beef0da296d593c07fdb0348 /clang-tools-extra/unittests/clang-tidy | |
parent | 71ad22707cdf2997469ee8bbbbd9ea03cf096726 (diff) | |
download | bcm5719-llvm-039af0ea03f987654a162b6160399a00fd22b1b0.tar.gz bcm5719-llvm-039af0ea03f987654a162b6160399a00fd22b1b0.zip |
[clang-tidy] Generalize TransformerClangTidyCheck to take a rule generator.
Summary: Tidy check behavior often depends on language and/or clang-tidy options. This revision allows a user of TranformerClangTidyCheck to pass rule _generator_ in place of a rule, where the generator takes both the language and clang-tidy options. Additionally, the generator returns an `Optional` to allow for the case where the check is deemed irrelevant/disable based on those options.
Reviewers: gribozavr
Subscribers: xazax.hun, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D63288
llvm-svn: 364442
Diffstat (limited to 'clang-tools-extra/unittests/clang-tidy')
-rw-r--r-- | clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp index 6b8763810e9..6e42be25d5f 100644 --- a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp @@ -18,16 +18,16 @@ namespace clang { namespace tidy { namespace utils { namespace { +using tooling::change; using tooling::RewriteRule; +using tooling::text; +using tooling::stencil::cat; // Invert the code of an if-statement, while maintaining its semantics. RewriteRule invertIf() { using namespace ::clang::ast_matchers; - using tooling::change; using tooling::node; using tooling::statement; - using tooling::text; - using tooling::stencil::cat; StringRef C = "C", T = "T", E = "E"; RewriteRule Rule = tooling::makeRule( @@ -65,6 +65,62 @@ TEST(TransformerClangTidyCheckTest, Basic) { )"; EXPECT_EQ(Expected, test::runCheckOnCode<IfInverterCheck>(Input)); } + +// A trivial rewrite-rule generator that requires Objective-C code. +Optional<RewriteRule> needsObjC(const LangOptions &LangOpts, + const ClangTidyCheck::OptionsView &Options) { + if (!LangOpts.ObjC) + return None; + return tooling::makeRule(clang::ast_matchers::functionDecl(), + change(cat("void changed() {}")), text("no message")); +} + +class NeedsObjCCheck : public TransformerClangTidyCheck { +public: + NeedsObjCCheck(StringRef Name, ClangTidyContext *Context) + : TransformerClangTidyCheck(needsObjC, Name, Context) {} +}; + +// Verify that the check only rewrites the code when the input is Objective-C. +TEST(TransformerClangTidyCheckTest, DisableByLang) { + const std::string Input = "void log() {}"; + EXPECT_EQ(Input, + test::runCheckOnCode<NeedsObjCCheck>(Input, nullptr, "input.cc")); + + EXPECT_EQ("void changed() {}", + test::runCheckOnCode<NeedsObjCCheck>(Input, nullptr, "input.mm")); +} + +// A trivial rewrite rule generator that checks config options. +Optional<RewriteRule> noSkip(const LangOptions &LangOpts, + const ClangTidyCheck::OptionsView &Options) { + if (Options.get("Skip", "false") == "true") + return None; + return tooling::makeRule(clang::ast_matchers::functionDecl(), + change(cat("void nothing()")), text("no message")); +} + +class ConfigurableCheck : public TransformerClangTidyCheck { +public: + ConfigurableCheck(StringRef Name, ClangTidyContext *Context) + : TransformerClangTidyCheck(noSkip, Name, Context) {} +}; + +// Tests operation with config option "Skip" set to true and false. +TEST(TransformerClangTidyCheckTest, DisableByConfig) { + const std::string Input = "void log(int);"; + const std::string Expected = "void nothing();"; + ClangTidyOptions Options; + + Options.CheckOptions["test-check-0.Skip"] = "true"; + EXPECT_EQ(Input, test::runCheckOnCode<ConfigurableCheck>( + Input, nullptr, "input.cc", None, Options)); + + Options.CheckOptions["test-check-0.Skip"] = "false"; + EXPECT_EQ(Expected, test::runCheckOnCode<ConfigurableCheck>( + Input, nullptr, "input.cc", None, Options)); +} + } // namespace } // namespace utils } // namespace tidy |