From 489449c28aaa45086d507fbad96826420adf409d Mon Sep 17 00:00:00 2001 From: Yitzhak Mandelbaum Date: Mon, 4 Nov 2019 08:30:18 -0500 Subject: [libTooling] Further simplify `Stencil` type and introduce `MatchComputation`. Summary: This revision introduces a new interface `MatchComputation` which generalizes the `Stencil` interface and replaces the `std::function` interface of `MatchConsumer`. With this revision, `Stencil` (as an abstraction) becomes just one collection of implementations of `MatchComputation`. Correspondingly, we remove the `Stencil` class entirely in favor of a simple type alias, deprecate `MatchConsumer` and change all functions that accepted `MatchConsumer` to use `MatchComputation` instead. Reviewers: gribozavr Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D69802 --- clang/lib/Tooling/Transformer/RewriteRule.cpp | 28 ++++++++++++++++++- clang/lib/Tooling/Transformer/Stencil.cpp | 40 ++++++++++----------------- 2 files changed, 42 insertions(+), 26 deletions(-) (limited to 'clang/lib/Tooling') diff --git a/clang/lib/Tooling/Transformer/RewriteRule.cpp b/clang/lib/Tooling/Transformer/RewriteRule.cpp index b96b5eeabad..20d3a371950 100644 --- a/clang/lib/Tooling/Transformer/RewriteRule.cpp +++ b/clang/lib/Tooling/Transformer/RewriteRule.cpp @@ -43,7 +43,7 @@ transformer::detail::translateEdits(const MatchResult &Result, // it as is currently done. if (!EditRange) return SmallVector(); - auto Replacement = Edit.Replacement(Result); + auto Replacement = Edit.Replacement->eval(Result); if (!Replacement) return Replacement.takeError(); transformer::detail::Transformation T; @@ -61,6 +61,28 @@ ASTEdit transformer::changeTo(RangeSelector S, TextGenerator Replacement) { return E; } +namespace { +/// A \c TextGenerator that always returns a fixed string. +class SimpleTextGenerator : public MatchComputation { + std::string S; + +public: + SimpleTextGenerator(std::string S) : S(std::move(S)) {} + llvm::Error eval(const ast_matchers::MatchFinder::MatchResult &, + std::string *Result) const override { + Result->append(S); + return llvm::Error::success(); + } + std::string toString() const override { + return (llvm::Twine("text(\"") + S + "\")").str(); + } +}; +} // namespace + +ASTEdit transformer::remove(RangeSelector S) { + return change(std::move(S), std::make_shared("")); +} + RewriteRule transformer::makeRule(DynTypedMatcher M, SmallVector Edits, TextGenerator Explanation) { return RewriteRule{{RewriteRule::Case{ @@ -176,3 +198,7 @@ transformer::detail::findSelectedCase(const MatchResult &Result, } constexpr llvm::StringLiteral RewriteRule::RootID; + +TextGenerator tooling::text(std::string M) { + return std::make_shared(std::move(M)); +} diff --git a/clang/lib/Tooling/Transformer/Stencil.cpp b/clang/lib/Tooling/Transformer/Stencil.cpp index d994fdcf870..486e18b341f 100644 --- a/clang/lib/Tooling/Transformer/Stencil.cpp +++ b/clang/lib/Tooling/Transformer/Stencil.cpp @@ -272,14 +272,6 @@ public: }; } // namespace -llvm::Expected -StencilInterface::eval(const MatchFinder::MatchResult &R) const { - std::string Output; - if (auto Err = eval(R, &Output)) - return std::move(Err); - return Output; -} - Stencil transformer::detail::makeStencil(StringRef Text) { return text(Text); } Stencil transformer::detail::makeStencil(RangeSelector Selector) { @@ -287,52 +279,50 @@ Stencil transformer::detail::makeStencil(RangeSelector Selector) { } Stencil transformer::text(StringRef Text) { - return Stencil(std::make_shared>(Text)); + return std::make_shared>(Text); } Stencil transformer::selection(RangeSelector Selector) { - return Stencil( - std::make_shared>(std::move(Selector))); + return std::make_shared>(std::move(Selector)); } Stencil transformer::dPrint(StringRef Id) { - return Stencil(std::make_shared>(Id)); + return std::make_shared>(Id); } Stencil transformer::expression(llvm::StringRef Id) { - return Stencil(std::make_shared>( - UnaryNodeOperator::Parens, Id)); + return std::make_shared>( + UnaryNodeOperator::Parens, Id); } Stencil transformer::deref(llvm::StringRef ExprId) { - return Stencil(std::make_shared>( - UnaryNodeOperator::Deref, ExprId)); + return std::make_shared>( + UnaryNodeOperator::Deref, ExprId); } Stencil transformer::addressOf(llvm::StringRef ExprId) { - return Stencil(std::make_shared>( - UnaryNodeOperator::Address, ExprId)); + return std::make_shared>( + UnaryNodeOperator::Address, ExprId); } Stencil transformer::access(StringRef BaseId, Stencil Member) { - return Stencil( - std::make_shared>(BaseId, std::move(Member))); + return std::make_shared>(BaseId, std::move(Member)); } Stencil transformer::ifBound(StringRef Id, Stencil TrueStencil, Stencil FalseStencil) { - return Stencil(std::make_shared>( - Id, std::move(TrueStencil), std::move(FalseStencil))); + return std::make_shared>(Id, std::move(TrueStencil), + std::move(FalseStencil)); } Stencil transformer::run(MatchConsumer Fn) { - return Stencil( - std::make_shared>>(std::move(Fn))); + return std::make_shared>>( + std::move(Fn)); } Stencil transformer::catVector(std::vector Parts) { // Only one argument, so don't wrap in sequence. if (Parts.size() == 1) return std::move(Parts[0]); - return Stencil(std::make_shared>(std::move(Parts))); + return std::make_shared>(std::move(Parts)); } -- cgit v1.2.3