1

我是 Clang libTooling 开发的新手。

考虑以下变量声明

int i, j, k = 10;
^              ^  

对于我的项目要求,我想捕获整个声明表达式,包括“i”、“j”和“k”。

如何使用 clang libTooling 捕获完整的声明表达式,包括所有变量?

我正在经历的是,我没有让访问者获得完整的表达式,而是获得了访问者进行单个变量声明。

这是 clang libTooling 中的预期行为还是我遗漏了什么?

请建议我捕获单行多个声明或任何解决方法的正确方法?任何形式的帮助将不胜感激。

谢谢,赫曼特

4

1 回答 1

2

为了解决所描述的问题,您可以例如编写一个访问DeclStmt节点(不仅VarDecl)的递归 AST 访问者。查看此站点以了解如何编写这样的访问者:http ://clang.llvm.org/docs/RAVFrontendAction.html

您应该访问DeclStmt节点而不仅仅是VarDecl节点的原因可以通过查看声明语句的 AST 表示来解释:

    |-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“捕获”了所有VarDecl节点(以及初始化,如果给定)。一旦您的访问者访问,DeclStmt您可以使用isSingleDecl()成员函数检查您的声明是否引用单个声明。如果不是(如您的情况),您可以使用,等检索到不同VarDecl节点的迭代器。decl_begin()decl_end()

于 2016-12-27T16:17:18.747 回答