summaryrefslogtreecommitdiffstats
path: root/clang/lib/Tooling
diff options
context:
space:
mode:
authorYitzhak Mandelbaum <yitzhakm@google.com>2019-09-26 00:53:56 +0000
committerYitzhak Mandelbaum <yitzhakm@google.com>2019-09-26 00:53:56 +0000
commitea966c1bc05bca8353db0c28751b4f804a62bd42 (patch)
tree1813ad52745b87f6aea56c5bc1f30d81ab383280 /clang/lib/Tooling
parent3c8c6672358aa13788a1026ac89336d8dee2821d (diff)
downloadbcm5719-llvm-ea966c1bc05bca8353db0c28751b4f804a62bd42.tar.gz
bcm5719-llvm-ea966c1bc05bca8353db0c28751b4f804a62bd42.zip
[libTooling] Add `run` combinator to Stencils.
Summary: This revision adds `run`, a StencilPart that runs a user-defined function that computes a result over `MatchFinder::MatchResult`. Reviewers: gribozavr Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D67969 llvm-svn: 372936
Diffstat (limited to 'clang/lib/Tooling')
-rw-r--r--clang/lib/Tooling/Refactoring/Stencil.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Tooling/Refactoring/Stencil.cpp b/clang/lib/Tooling/Refactoring/Stencil.cpp
index 0e5eaccc7b7..78239b96d3c 100644
--- a/clang/lib/Tooling/Refactoring/Stencil.cpp
+++ b/clang/lib/Tooling/Refactoring/Stencil.cpp
@@ -26,6 +26,7 @@ using namespace tooling;
using ast_matchers::MatchFinder;
using llvm::errc;
using llvm::Error;
+using llvm::Expected;
using llvm::StringError;
// A down_cast function to safely down cast a StencilPartInterface to a subclass
@@ -102,6 +103,12 @@ bool isEqualData(const IfBoundData &A, const IfBoundData &B) {
return A.Id == B.Id && A.TruePart == B.TruePart && A.FalsePart == B.FalsePart;
}
+// Equality is not defined over MatchConsumers, which are opaque.
+bool isEqualData(const MatchConsumer<std::string> &A,
+ const MatchConsumer<std::string> &B) {
+ return false;
+}
+
// The `evalData()` overloads evaluate the given stencil data to a string, given
// the match result, and append it to `Result`. We define an overload for each
// type of stencil data.
@@ -159,6 +166,15 @@ Error evalData(const IfBoundData &Data, const MatchFinder::MatchResult &Match,
.eval(Match, Result);
}
+Error evalData(const MatchConsumer<std::string> &Fn,
+ const MatchFinder::MatchResult &Match, std::string *Result) {
+ Expected<std::string> Value = Fn(Match);
+ if (!Value)
+ return Value.takeError();
+ *Result += *Value;
+ return Error::success();
+}
+
template <typename T>
class StencilPartImpl : public StencilPartInterface {
T Data;
@@ -233,3 +249,9 @@ StencilPart stencil::ifBound(StringRef Id, StencilPart TruePart,
return StencilPart(std::make_shared<StencilPartImpl<IfBoundData>>(
Id, std::move(TruePart), std::move(FalsePart)));
}
+
+StencilPart stencil::run(MatchConsumer<std::string> Fn) {
+ return StencilPart(
+ std::make_shared<StencilPartImpl<MatchConsumer<std::string>>>(
+ std::move(Fn)));
+}
OpenPOWER on IntegriCloud