diff options
Diffstat (limited to 'clang/lib/Tooling/Transformer/RewriteRule.cpp')
| -rw-r--r-- | clang/lib/Tooling/Transformer/RewriteRule.cpp | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/clang/lib/Tooling/Transformer/RewriteRule.cpp b/clang/lib/Tooling/Transformer/RewriteRule.cpp index 93bd7e91dba7..3e76489782f3 100644 --- a/clang/lib/Tooling/Transformer/RewriteRule.cpp +++ b/clang/lib/Tooling/Transformer/RewriteRule.cpp @@ -166,10 +166,26 @@ ASTEdit transformer::addInclude(RangeSelector Target, StringRef Header, return E; } -RewriteRule transformer::makeRule(DynTypedMatcher M, EditGenerator Edits, - TextGenerator Explanation) { - return RewriteRule{{RewriteRule::Case{std::move(M), std::move(Edits), - std::move(Explanation)}}}; +EditGenerator +transformer::detail::makeEditGenerator(llvm::SmallVector<ASTEdit, 1> Edits) { + return editList(std::move(Edits)); +} + +EditGenerator transformer::detail::makeEditGenerator(ASTEdit Edit) { + return edit(std::move(Edit)); +} + +RewriteRule transformer::detail::makeRule(DynTypedMatcher M, + EditGenerator Edits) { + RewriteRule R; + R.Cases = {{std::move(M), std::move(Edits)}}; + return R; +} + +RewriteRule transformer::makeRule(ast_matchers::internal::DynTypedMatcher M, + std::initializer_list<ASTEdit> Edits) { + return detail::makeRule(std::move(M), + detail::makeEditGenerator(std::move(Edits))); } namespace { @@ -247,9 +263,8 @@ public: void run(const MatchFinder::MatchResult &Result) override { if (!Edits) return; - transformer::RewriteRule::Case Case = - transformer::detail::findSelectedCase(Result, Rule); - auto Transformations = Case.Edits(Result); + size_t I = transformer::detail::findSelectedCase(Result, Rule); + auto Transformations = Rule.Cases[I].Edits(Result); if (!Transformations) { Edits = Transformations.takeError(); return; @@ -325,7 +340,7 @@ EditGenerator transformer::rewriteDescendants(std::string NodeId, }; } -void transformer::addInclude(RewriteRule &Rule, StringRef Header, +void transformer::addInclude(RewriteRuleBase &Rule, StringRef Header, IncludeFormat Format) { for (auto &Case : Rule.Cases) Case.Edits = flatten(std::move(Case.Edits), addInclude(Header, Format)); @@ -366,7 +381,9 @@ static std::vector<DynTypedMatcher> taggedMatchers( // Simply gathers the contents of the various rules into a single rule. The // actual work to combine these into an ordered choice is deferred to matcher // registration. -RewriteRule transformer::applyFirst(ArrayRef<RewriteRule> Rules) { +template <> +RewriteRuleWith<void> +transformer::applyFirst(ArrayRef<RewriteRuleWith<void>> Rules) { RewriteRule R; for (auto &Rule : Rules) R.Cases.append(Rule.Cases.begin(), Rule.Cases.end()); @@ -374,12 +391,13 @@ RewriteRule transformer::applyFirst(ArrayRef<RewriteRule> Rules) { } std::vector<DynTypedMatcher> -transformer::detail::buildMatchers(const RewriteRule &Rule) { +transformer::detail::buildMatchers(const RewriteRuleBase &Rule) { // Map the cases into buckets of matchers -- one for each "root" AST kind, // which guarantees that they can be combined in a single anyOf matcher. Each // case is paired with an identifying number that is converted to a string id // in `taggedMatchers`. - std::map<ASTNodeKind, SmallVector<std::pair<size_t, RewriteRule::Case>, 1>> + std::map<ASTNodeKind, + SmallVector<std::pair<size_t, RewriteRuleBase::Case>, 1>> Buckets; const SmallVectorImpl<RewriteRule::Case> &Cases = Rule.Cases; for (int I = 0, N = Cases.size(); I < N; ++I) { @@ -405,7 +423,7 @@ transformer::detail::buildMatchers(const RewriteRule &Rule) { return Matchers; } -DynTypedMatcher transformer::detail::buildMatcher(const RewriteRule &Rule) { +DynTypedMatcher transformer::detail::buildMatcher(const RewriteRuleBase &Rule) { std::vector<DynTypedMatcher> Ms = buildMatchers(Rule); assert(Ms.size() == 1 && "Cases must have compatible matchers."); return Ms[0]; @@ -428,19 +446,16 @@ SourceLocation transformer::detail::getRuleMatchLoc(const MatchResult &Result) { // Finds the case that was "selected" -- that is, whose matcher triggered the // `MatchResult`. -const RewriteRule::Case & -transformer::detail::findSelectedCase(const MatchResult &Result, - const RewriteRule &Rule) { +size_t transformer::detail::findSelectedCase(const MatchResult &Result, + const RewriteRuleBase &Rule) { if (Rule.Cases.size() == 1) - return Rule.Cases[0]; + return 0; auto &NodesMap = Result.Nodes.getMap(); for (size_t i = 0, N = Rule.Cases.size(); i < N; ++i) { std::string Tag = ("Tag" + Twine(i)).str(); if (NodesMap.find(Tag) != NodesMap.end()) - return Rule.Cases[i]; + return i; } llvm_unreachable("No tag found for this rule."); } - -const llvm::StringRef RewriteRule::RootID = ::clang::transformer::RootID; |
