summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-tidy/utils
diff options
context:
space:
mode:
authorYitzhak Mandelbaum <yitzhakm@google.com>2019-05-24 16:32:03 +0000
committerYitzhak Mandelbaum <yitzhakm@google.com>2019-05-24 16:32:03 +0000
commit5b33554319cb3aeb88c43ecc6acbbef06a779190 (patch)
treed1f7ce96d7ad0103d79c2c8d457b8fdf35cfd30d /clang-tools-extra/clang-tidy/utils
parent07745a131fa99931e83077e19cfaa4ae46e6c2bc (diff)
downloadbcm5719-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.cpp25
-rw-r--r--clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h10
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;
OpenPOWER on IntegriCloud