diff options
author | Stephen Kelly <steveire@gmail.com> | 2019-12-18 22:35:46 +0000 |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2019-12-20 21:13:23 +0000 |
commit | 494b1318ca77927e919bbf9a61749a58553d738c (patch) | |
tree | 48ebb91ff17410019432f322827fd77dcdd0fad6 /clang/lib/ASTMatchers | |
parent | 44b4b833ad76fc61e43473c581a557f72a4ed8f4 (diff) | |
download | bcm5719-llvm-494b1318ca77927e919bbf9a61749a58553d738c.tar.gz bcm5719-llvm-494b1318ca77927e919bbf9a61749a58553d738c.zip |
Customize simplified dumping and matching of LambdaExpr
Reviewers: aaron.ballman
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71680
Diffstat (limited to 'clang/lib/ASTMatchers')
-rw-r--r-- | clang/lib/ASTMatchers/ASTMatchFinder.cpp | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp index 8ac35d52284..2a43b4c7049 100644 --- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -145,7 +145,9 @@ public: ScopedIncrement ScopedDepth(&CurrentDepth); Stmt *StmtToTraverse = StmtNode; - if (auto *ExprNode = dyn_cast_or_null<Expr>(StmtNode)) + if (auto *ExprNode = dyn_cast_or_null<LambdaExpr>(StmtNode)) + StmtToTraverse = ExprNode; + else if (auto *ExprNode = dyn_cast_or_null<Expr>(StmtNode)) StmtToTraverse = Finder->getASTContext().traverseIgnored(ExprNode); if (Traversal == ast_type_traits::TraversalKind::TK_IgnoreImplicitCastsAndParentheses) { @@ -203,6 +205,38 @@ public: ScopedIncrement ScopedDepth(&CurrentDepth); return traverse(*CtorInit); } + bool TraverseLambdaExpr(LambdaExpr *Node) { + if (!Node) + return true; + ScopedIncrement ScopedDepth(&CurrentDepth); + + for (unsigned I = 0, N = Node->capture_size(); I != N; ++I) { + const auto *C = Node->capture_begin() + I; + if (!C->isExplicit()) + continue; + if (Node->isInitCapture(C) && !match(*C->getCapturedVar())) + return false; + if (!match(*Node->capture_init_begin()[I])) + return false; + } + + if (const auto *TPL = Node->getTemplateParameterList()) { + for (const auto *TP : *TPL) { + if (!match(*TP)) + return false; + } + } + + for (const auto *P : Node->getCallOperator()->parameters()) { + if (!match(*P)) + return false; + } + + if (!match(*Node->getBody())) + return false; + + return false; + } bool shouldVisitTemplateInstantiations() const { return true; } bool shouldVisitImplicitCode() const { return true; } |