summaryrefslogtreecommitdiffstats
path: root/clang/lib/Tooling/Transformer
diff options
context:
space:
mode:
authorYitzhak Mandelbaum <yitzhakm@google.com>2019-11-21 14:35:22 -0500
committerYitzhak Mandelbaum <yitzhakm@google.com>2019-11-22 12:36:40 -0500
commit01e8dd2e7a852794a60e50f356f171f893503598 (patch)
treee923310ac523e1eb7d556ae18ebb387e1d30fec9 /clang/lib/Tooling/Transformer
parent80cd6b6e043f04ff7cb525bc1f09ab1f6400e9db (diff)
downloadbcm5719-llvm-01e8dd2e7a852794a60e50f356f171f893503598.tar.gz
bcm5719-llvm-01e8dd2e7a852794a60e50f356f171f893503598.zip
[libTooling] Add stencil combinators for nodes that may be pointers or values.
Summary: Adds combinators `maybeDeref` and `maybeAddressOf` to provide a uniform way to handle nodes which may be bound to either a pointer or a value (most often in the context of member expressions). Such polymorphism is already supported by `access`; these combinators extend it to more general uses. Reviewers: gribozavr Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D70554
Diffstat (limited to 'clang/lib/Tooling/Transformer')
-rw-r--r--clang/lib/Tooling/Transformer/Stencil.cpp40
1 files changed, 36 insertions, 4 deletions
diff --git a/clang/lib/Tooling/Transformer/Stencil.cpp b/clang/lib/Tooling/Transformer/Stencil.cpp
index 486e18b341f..8710e3cdf60 100644
--- a/clang/lib/Tooling/Transformer/Stencil.cpp
+++ b/clang/lib/Tooling/Transformer/Stencil.cpp
@@ -59,7 +59,9 @@ struct DebugPrintNodeData {
enum class UnaryNodeOperator {
Parens,
Deref,
- Address,
+ MaybeDeref,
+ AddressOf,
+ MaybeAddressOf,
};
// Generic container for stencil operations with a (single) node-id argument.
@@ -121,9 +123,15 @@ std::string toStringData(const UnaryOperationData &Data) {
case UnaryNodeOperator::Deref:
OpName = "deref";
break;
- case UnaryNodeOperator::Address:
+ case UnaryNodeOperator::MaybeDeref:
+ OpName = "maybeDeref";
+ break;
+ case UnaryNodeOperator::AddressOf:
OpName = "addressOf";
break;
+ case UnaryNodeOperator::MaybeAddressOf:
+ OpName = "maybeAddressOf";
+ break;
}
return (OpName + "(\"" + Data.Id + "\")").str();
}
@@ -191,7 +199,21 @@ Error evalData(const UnaryOperationData &Data,
case UnaryNodeOperator::Deref:
Source = tooling::buildDereference(*E, *Match.Context);
break;
- case UnaryNodeOperator::Address:
+ case UnaryNodeOperator::MaybeDeref:
+ if (!E->getType()->isAnyPointerType()) {
+ *Result += tooling::getText(*E, *Match.Context);
+ return Error::success();
+ }
+ Source = tooling::buildDereference(*E, *Match.Context);
+ break;
+ case UnaryNodeOperator::AddressOf:
+ Source = tooling::buildAddressOf(*E, *Match.Context);
+ break;
+ case UnaryNodeOperator::MaybeAddressOf:
+ if (E->getType()->isAnyPointerType()) {
+ *Result += tooling::getText(*E, *Match.Context);
+ return Error::success();
+ }
Source = tooling::buildAddressOf(*E, *Match.Context);
break;
}
@@ -300,9 +322,19 @@ Stencil transformer::deref(llvm::StringRef ExprId) {
UnaryNodeOperator::Deref, ExprId);
}
+Stencil transformer::maybeDeref(llvm::StringRef ExprId) {
+ return std::make_shared<StencilImpl<UnaryOperationData>>(
+ UnaryNodeOperator::MaybeDeref, ExprId);
+}
+
Stencil transformer::addressOf(llvm::StringRef ExprId) {
return std::make_shared<StencilImpl<UnaryOperationData>>(
- UnaryNodeOperator::Address, ExprId);
+ UnaryNodeOperator::AddressOf, ExprId);
+}
+
+Stencil transformer::maybeAddressOf(llvm::StringRef ExprId) {
+ return std::make_shared<StencilImpl<UnaryOperationData>>(
+ UnaryNodeOperator::MaybeAddressOf, ExprId);
}
Stencil transformer::access(StringRef BaseId, Stencil Member) {
OpenPOWER on IntegriCloud