我是Clang libTooling开发的新手。
考虑以下变量声明
int i, j, k = 10;
^ ^
对于我的项目要求,我想捕获整个声明表达式,包括" i"," j"和" k"。
如何使用clang libTooling捕获包含所有变量的完整声明表达式?
我所遇到的是,我没有让访问者获得完整的表达,而是让访问者获得个别变量声明。
这是clang libTooling中的预期行为还是我错过了什么?
请建议我捕获单行多声明或任何解决方法的正确方法? 任何形式的帮助都将非常感激。
谢谢, 与Hemant
答案 0 :(得分:2)
要解决上述问题,您可以编写一个访问DeclStmt
个节点(不仅是VarDecl
)的递归AST访问者。查看此网站,了解如何撰写此类访问者:http://clang.llvm.org/docs/RAVFrontendAction.html
您可以通过查看声明语句的AST表示来解释您应该访问DeclStmt
个节点而不仅仅是VarDecl
个节点的原因:
|-DeclStmt 0x35dbfc8 <line:3:1, col:17>
| |-VarDecl 0x35dbe48 <col:1, col:5> col:5 i 'int'
| |-VarDecl 0x35dbeb8 <col:1, col:8> col:8 j 'int'
| `-VarDecl 0x35dbf28 <col:1, col:15> col:11 k 'int' cinit
| `-IntegerLiteral 0x35dbf88 <col:15> 'int' 10
正如您所见,DeclStmt
&#34;捕获&#34;所有VarDecl
个节点(以及初始化,如果给定)。
访问者访问DeclStmt
后,如果您的声明引用了单个声明,则可以使用isSingleDecl()
成员函数进行检查。如果不是(在您的情况下),您可以使用VarDecl
,decl_begin()
等检索到不同decl_end()
节点的迭代器。