diff options
| author | Yitzhak Mandelbaum <yitzhakm@google.com> | 2019-05-24 16:32:03 +0000 |
|---|---|---|
| committer | Yitzhak Mandelbaum <yitzhakm@google.com> | 2019-05-24 16:32:03 +0000 |
| commit | 5b33554319cb3aeb88c43ecc6acbbef06a779190 (patch) | |
| tree | d1f7ce96d7ad0103d79c2c8d457b8fdf35cfd30d /clang-tools-extra/clang-tidy/utils | |
| parent | 07745a131fa99931e83077e19cfaa4ae46e6c2bc (diff) | |
| download | bcm5719-llvm-5b33554319cb3aeb88c43ecc6acbbef06a779190.tar.gz bcm5719-llvm-5b33554319cb3aeb88c43ecc6acbbef06a779190.zip | |
[clang-tidy] In TransformerClangTidyCheck, require Explanation field.
Summary:
In general, the `Explanation` field is optional in `RewriteRule` cases. But,
because the primary purpose of clang-tidy checks is to provide users with
diagnostics, we assume that a missing explanation is a bug. This change adds an
assertion that checks all cases for an explanation, and updates the code to rely
on that assertion correspondingly.
Reviewers: ilya-biryukov
Subscribers: xazax.hun, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D62340
llvm-svn: 361647
Diffstat (limited to 'clang-tools-extra/clang-tidy/utils')
| -rw-r--r-- | clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp | 25 | ||||
| -rw-r--r-- | clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h | 10 |
2 files changed, 24 insertions, 11 deletions
diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp index f142de46441..12be8a6dce7 100644 --- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp @@ -13,6 +13,17 @@ namespace tidy { namespace utils { using tooling::RewriteRule; +TransformerClangTidyCheck::TransformerClangTidyCheck(tooling::RewriteRule R, + StringRef Name, + ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), Rule(std::move(R)) { + for (const auto &Case : Rule.Cases) { + assert(Case.Explanation != nullptr && + "clang-tidy checks must have an explanation by default;" + " explicitly provide an empty explanation if none is desired"); + } +} + void TransformerClangTidyCheck::registerMatchers( ast_matchers::MatchFinder *Finder) { Finder->addDynamicMatcher(tooling::detail::buildMatcher(Rule), this); @@ -44,15 +55,13 @@ void TransformerClangTidyCheck::check( if (Transformations->empty()) return; - StringRef Message = "no explanation"; - if (Case.Explanation) { - if (Expected<std::string> E = Case.Explanation(Result)) - Message = *E; - else - llvm::errs() << "Error in explanation: " << llvm::toString(E.takeError()) - << "\n"; + Expected<std::string> Explanation = Case.Explanation(Result); + if (!Explanation) { + llvm::errs() << "Error in explanation: " + << llvm::toString(Explanation.takeError()) << "\n"; + return; } - DiagnosticBuilder Diag = diag(RootLoc, Message); + DiagnosticBuilder Diag = diag(RootLoc, *Explanation); for (const auto &T : *Transformations) { Diag << FixItHint::CreateReplacement(T.Range, T.Replacement); } diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h index 6d0f86795bf..faf946ceb0f 100644 --- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h +++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h @@ -31,10 +31,14 @@ namespace utils { // }; class TransformerClangTidyCheck : public ClangTidyCheck { public: + // All cases in \p R must have a non-null \c Explanation, even though \c + // Explanation is optional for RewriteRule in general. Because the primary + // purpose of clang-tidy checks is to provide users with diagnostics, we + // assume that a missing explanation is a bug. If no explanation is desired, + // indicate that explicitly (for example, by passing `text("no explanation")` + // to `makeRule` as the `Explanation` argument). TransformerClangTidyCheck(tooling::RewriteRule R, StringRef Name, - ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), Rule(std::move(R)) {} - + ClangTidyContext *Context); void registerMatchers(ast_matchers::MatchFinder *Finder) final; void check(const ast_matchers::MatchFinder::MatchResult &Result) final; |

