【发布时间】:2019-03-30 07:18:34
【问题描述】:
想法是遍历CXXMemberCallExpr 内的所有NamespaceDecl 实例。
我有一个从ASTConsumer 调用的RecursiveASTVisitor。
RecursiveASTVisitor 有一个 VisitNamespaceDecl 的重载实例,在我使用另一个 RecursiveASTVisitor 的每个声明时调用 TraverseDecl,该实例具有 VisitCXXMethodDecl 的重载实例。
调用clang -Xclang -ast-dump myclass.cc 显示了正确的层次结构,所以我知道它是可访问的。不幸的是,我认为TraverseDecl 没有经过CompoundStmt 或CallExpr:
`-NamespaceDecl 0x555ce9e8b508 prev 0x555ce9e88d38 </class.cc:3:1, line:277:1> line:3:11 my_namespace
|-original Namespace 0x555ce9e7c268 'my_namespace'
|-CXXMethodDecl 0x555ce9e8b970 parent 0x555ce9e88da0 prev 0x555ce9e89480 <line:4:1, line:18:1> line:4:16 Init 'void (std::MyOtherClass *, std::my_namespace::paramstruct_t *, const std::object *, std::double, std::int, std::string, std::string, std::ob
f_namespace::MyClass *)'
| |-ParmVarDecl 0x555ce9e8b5a0 <col:21, col:29> col:29 used env 'std::MyOtherClass *'
| |-ParmVarDecl 0x555ce9e8b610 <col:34, col:49> col:49 used params 'std::my_namespace::paramstruct_t *'
| |-ParmVarDecl 0x555ce9e8b680 <line:5:21, col:36> col:36 used j_dd 'const std::object *'
| |-ParmVarDecl 0x555ce9e8b6f0 <col:47, col:55> col:55 used j_cc 'std::double':'double'
| |-ParmVarDecl 0x555ce9e8b760 <col:65, col:70> col:70 used j_bb 'std::int':'int'
| |-ParmVarDecl 0x555ce9e8b7d0 <line:6:21, col:29> col:29 used js_aa 'std::string':'std::_string *'
| |-ParmVarDecl 0x555ce9e8b840 <col:46, col:54> col:54 used js_ee 'std::string':'std::_string *'
| |-ParmVarDecl 0x555ce9e8b8b0 <line:7:21, col:32> col:32 used my_class 'std::my_namespace::MyClass *'
| `-CompoundStmt 0x555ce9e8c3b8 <col:44, line:18:1>
| `-CXXMemberCallExpr 0x555ce9e8c350 <line:17:5, col:36> 'void'
| |-MemberExpr 0x555ce9e8c2c8 <col:5, col:17> '<bound member function type>' ->Init 0x555ce9e854b0
| | `-ImplicitCastExpr 0x555ce9e8c2b0 <col:5> 'std::my_namespace::MyClass *' <LValueToRValue>
| | `-DeclRefExpr 0x555ce9e8c288 <col:5> 'std::my_namespace::MyClass *' lvalue ParmVar 0x555ce9e8b8b0 'my_class' 'std::my_namespace::MyClass *'
有什么想法吗?
【问题讨论】:
-
实现 TraverseStmt() 来通过 CompoundStmt 怎么样?
-
您对不使用 RecursiveASTVisitor 的方法感兴趣吗?
标签: c++ clang abstract-syntax-tree static-analysis