summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp')
-rw-r--r--clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp31
1 files changed, 26 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
index 80a82980868..1dedb0571c3 100644
--- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
@@ -14,20 +14,40 @@ namespace tidy {
namespace utils {
using tooling::RewriteRule;
+static bool hasExplanation(const RewriteRule::Case &C) {
+ return C.Explanation != nullptr;
+}
+
+// This constructor cannot dispatch to the simpler one (below), because, in
+// order to get meaningful results from `getLangOpts` and `Options`, we need the
+// `ClangTidyCheck()` constructor to have been called. If we were to dispatch,
+// we would be accessing `getLangOpts` and `Options` before the underlying
+// `ClangTidyCheck` instance was properly initialized.
+TransformerClangTidyCheck::TransformerClangTidyCheck(
+ std::function<Optional<RewriteRule>(const LangOptions &,
+ const OptionsView &)>
+ MakeRule,
+ StringRef Name, ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context), Rule(MakeRule(getLangOpts(), Options)) {
+ if (Rule)
+ assert(llvm::all_of(Rule->Cases, hasExplanation) &&
+ "clang-tidy checks must have an explanation by default;"
+ " explicitly provide an empty explanation if none is desired");
+}
+
TransformerClangTidyCheck::TransformerClangTidyCheck(RewriteRule R,
StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context), Rule(std::move(R)) {
- assert(llvm::all_of(Rule.Cases, [](const RewriteRule::Case &C) {
- return C.Explanation != nullptr;
- }) &&
+ assert(llvm::all_of(Rule->Cases, hasExplanation) &&
"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);
+ if (Rule)
+ Finder->addDynamicMatcher(tooling::detail::buildMatcher(*Rule), this);
}
void TransformerClangTidyCheck::check(
@@ -43,7 +63,8 @@ void TransformerClangTidyCheck::check(
Root->second.getSourceRange().getBegin());
assert(RootLoc.isValid() && "Invalid location for Root node of match.");
- RewriteRule::Case Case = tooling::detail::findSelectedCase(Result, Rule);
+ assert(Rule && "check() should not fire if Rule is None");
+ RewriteRule::Case Case = tooling::detail::findSelectedCase(Result, *Rule);
Expected<SmallVector<tooling::detail::Transformation, 1>> Transformations =
tooling::detail::translateEdits(Result, Case.Edits);
if (!Transformations) {
OpenPOWER on IntegriCloud