问题标签 [libtooling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
216 浏览

clang - 为什么 clang AST 为单个类显示两个 CXXRecordDecl?

我正在尝试使用 libtooling 构建工具。使用 clang 转储 AST 时,我发现 Foo 类报告了两个 CXXRecordDecl。似乎外部 CXXRecordDecl 有一个 CXXRecordDecl 子级,它说它是隐式类 Foo。这是为什么?

定义

AST 转储

0 投票
1 回答
76 浏览

c++ - 使用 RecursiveASTVisitor 解析系统标头时出错

我正在使用 libtooling 构建一个独立的工具。我有 a和 aFrontendAction的基本样板代码。访问者只访问我只是保存一些信息的地方。一切正常,但如果我在我正在解析的文件中出现错误:.ConsumerVisitorClassTemplateSpecializationDecl#include <string>'stddef.h' file not found

我以为编译器找不到一些系统头文件,但是我正在解析的输入文件使用 clang++ 命令编译时没有任何错误。

0 投票
2 回答
126 浏览

clang - Clang 不解析具有部分特化的模板:template < class T, class U = TYPE_A> 类 TYPE_B;

我有带有模板部分专业化的模板的代码示例。解析时在哪里叮当,返回结果无效声明。

我有结果转储:

为什么叮当声(转储中的最后一行)无效?

0 投票
0 回答
109 浏览

c - 是否可以在翻译单元上运行自定义 clang 工具并同时编译它?

正如我在标题中所说。我想在编译过程运行时在翻译单元上运行自定义 clang 工具。我想接管这个翻译过程,并在它运行时进行静态分析。我知道可以使用 libTooling 库执行静态分析,但我希望它在编译过程中发生在编译器内部。

0 投票
0 回答
53 浏览

objective-c - 将 @import 声明与 ASTMatchers 匹配

我正在尝试@import使用 AST 匹配器为我正在创建的自定义工具匹配 objc 声明;我正在使用Result.Context->local_imports(),但尽管我@import的源代码中有语句并且我正在传递fmodules标志,但从返回的迭代器local_imports始终为空。有什么想法我能做到这一点吗?

0 投票
1 回答
1009 浏览

clang - Clang:如何获取用于常量大小数组声明大小的宏名称

TL;博士;

如何从 callExpr -> arg_0 -> DeclRefExpr 获取用于常量大小数组声明大小的宏名称。

详细问题说明:

最近我开始研究一个挑战,它需要源到源转换工具来修改带有附加参数的特定函数调用。研究我可以实现的方式向我介绍了这个惊人的工具集 Clang。我一直在学习如何使用 libtooling 中提供的不同工具来实现我的目标。但是现在我遇到了一个问题,请在这里寻求您的帮助。

考虑下面的程序(我的源代码的虚拟),我的目标是使用安全版本的 strcpy_s 重写对 strcpy 函数的所有调用,并在新函数调用中添加一个附加参数,即 - 目标指针最大大小。所以,对于下面的程序,我重构的调用就像 strcpy_s(inStr, STR_MAX, argv[1]);

我编写了一个 RecursiveVisitor 类并检查了 VisitCallExpr 方法中的所有函数调用,以获取 dest arg 的最大大小,我正在获取第一个 agrument 的 VarDecl 并尝试获取大小(ConstArrayType)。由于源文件已经过预处理,我将 2049 视为大小,但在这种情况下我需要的是宏 STR_MAX。我怎么能得到那个?(使用此信息创建替换,然后使用 RefactoringTool 替换它们)

0 投票
1 回答
148 浏览

c++ - 如何使用 clang 将复杂的 typedef 扩展为其基本的内置形式?

我希望能够从复杂的 typedef 中获取原始类型。我正在使用 clang 版本 7.1.0

看看下面的代码

我可以像这样提取p_uint_var使用类型VisitVarDecl

我得到的输出是这个

p_uint32 p_uint_var

我想收到的是这个

无符号整数 * p_uint_var

我怎样才能做到这一点?

0 投票
2 回答
1212 浏览

c++ - 如何使用 Clang 获取模板类型类成员的实际类型?

例如,我有以下课程:

它被实例化为:

我提取 的clang::CXXRecordDecl节点class Foo,并遍历其字段:

我想要一些能fieldDecl->getInstantiatedType()提供的东西Bar

我了解CXXRecordDeclof的 ASTFoo不应包含有关实例化类型的任何信息。我想知道这个链接信息是否存储在 AST 的其他地方,以及如何检索它。


我当前的解决方案涉及按顺序获取未初始化的模板参数,例如{A, B, C}fortemplate<typename A, typename B, typename C> class Baz {};并将它们存储在std::vector. 然后找到实例化调用Baz<Foo, Bar, Baz>,将实例化的类型按顺序存储在另一个中std::vector,并通过索引将它们链接在一起,得到:

这看起来很复杂,而且像“un-Clang”一样。

0 投票
2 回答
790 浏览

c++ - 如何在 Clang 中获取模板化类的实例化 CXXRecordDecl?

例如,我有一堂课:

它被实例化为:

如何获得已CXXRecordDecl解析的字段和方法Foo<bar>


我试过了:

我得到的输出是:

但是,我也想要CXXRecordDecl字段和方法,以便我可以遍历它们。我也试过:

输出:

如您所见,CXXRecordDecl class Foo definition可以访问FieldDecl,但不知道 的类型实例化bar_,而ClassTemplateSpecializationDecl确实。

我想要CXXRecordDecl实例化类型FieldDecl bar_

0 投票
0 回答
108 浏览

c++ - 有没有办法使用 libtooling 跨多个翻译单元交叉引用符号?

我有一个 Lib 和多个应用程序。我想从应用程序中收集有关对 Lib 的 API 的函数调用的使用统计信息。基本上我目前的流程是:

  • 解析所有函数/方法的 Lib
  • 以格式化的方式输出信息
  • 使用该输出从应用程序收集统计信息。

我目前正在使用以 USR 形式提供交叉引用的 libclang API,因此我正在构建函数索引并在解析应用程序时使用它。问题是这个 API 是有限的,这就是我想迁移到 Libtooling 的原因。

我查看了 libtooling 的 API,但找不到类似的东西。所以我的问题是使用 Libtooling 实现“交叉引用”的最佳方法是什么。

一个例子是:

预期的输出将是一个 json 文件: