问题标签 [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 投票
1 回答
116 浏览

c++ - Clang RecursiveASTVisitor 是否有最终的访问方法?

我找不到查看 API 的人,但基本上我想要以下内容:在所有 Visit* 方法之后,我会调用一个 final 方法,对我的数据成员进行一些后处理。我认为这类似于访问 TranslationUnitDecl,除了不是第一次访问方法,而是最后一次访问方法。

0 投票
1 回答
960 浏览

c++ - 禁用在 clang 前端查找预编译的头文件

我使用 clang lib-tooling 和 RecursiveAStVisitor 创建了一个 C++ 前端。

我使用预先生成的compile_commands.json文件来加载编译数据库。有时源文件的编译命令包含-include <file.h>编译器参数。对于哪个 clang 尝试查找对应的预编译头文件。如果 PCH 文件不存在,clang 将中止源文件的编译。

有什么办法可以禁用这种行为?这样如果没有找到 PCH 文件,clang 应该以正常方式继续编译。

提前致谢。

0 投票
1 回答
499 浏览

c++ - 如何访问序列化的 clang 抽象语法树 (AST)

我已经能够实现一个ASTFrontendAction来创建一个ASTConsumer,它使用一个RescursiveASTVisitor来遍历一个翻译单元decl,从而访问一个给定源文件的AST的所有节点。我通过实现ToolAction传递给ClangTool::run(ToolAction *action). 此工具会覆盖ToolAction::runInvocation成员函数,以便在每次调用 my 之间进行一些处理ASTFrontendAction。到目前为止一切顺利,一切都按预期工作,我的自定义 clang 工具正在帮助我更好地探索一个相当大的、超过 15 年的代码库。

但是,每次我想运行我的工具时,我都需要对 AST 进行全面解析。正如我所提到的,这是一个相当大的代码库,因此执行一次运行需要一段时间。通过查看代码,我收集到可以从保存的文件中创建和遍历 AST,而不是执行解析。谷歌搜索确认可以保存 AST,并且通过查看ClangToolASTUnitAPI,它似乎很容易做到。

虽然保存AST似乎很简单,但我不知道在运行我的自定义 clang 工具时如何使用保存的 AST。查看运行工具的代码路径,我发现有一点可以通过解析源文件或从文件中读取来创建 AST。我想做的是将我所有的 ASTs 放在一个文件中,这样我的工具的每次运行都会从一个文件中创建 ASTs,而不需要执行完整的解析(我认为这会很多快点)。

有人可以帮忙吗?提前致谢!

0 投票
2 回答
1194 浏览

clang - 获取 FunctionDecl 的签名

我得到了用于定义函数的 FunctionDecl。这个函数没有声明。

例如:

如何获取签名(限定符、返回类型、函数名、参数)作为可用于进行声明的有效签名?

0 投票
1 回答
332 浏览

c++ - 如何使用 clang 前端获取 asm 语句的位置

示例代码:

此代码的 AST:

在此处输入图像描述

我在 AST 中只得到 MSASMStmt,而里面什么也没有。

我想在__asm块中提取 ASM 语句的位置。如何获得具有 clang 前端和 lib-tooling 库的那些?

0 投票
1 回答
1415 浏览

clang - Clang - 如何检索“Expr”作为字符串?

我正在使用 Clang/libtooling(ASTComsumer带有 Matcher)来访问所有return语句(ReturnStmt)。我需要以return字符串形式提取关键字之后的表达式,以便可以将其放入要替换return语句的宏中。

例如,我想替换以下行:

return在进行一些记录后,宏将从函数中提取。

我正在使用ReturnStmt::getRetValue()它返回一个Expr并尝试以字符串形式获取它(以便可以将其传递给宏),但我还没有找到方法。有没有办法字符串化Expr

0 投票
1 回答
965 浏览

clang - clang 工具:包含路径

我想根据输入更改我的 clang 工具的包含路径。当我在示例测试文件上运行以下代码时,出现编译错误“找不到标头”。

0 投票
1 回答
352 浏览

c++ - 如何将 AST 用于自定义前端操作和 clang 静态分析

我正在开发一个基于 libTooling 的项目,我通过引用this编写了一个自定义前端操作类。现在我想在同一个工具中运行 clang 静态分析。目前,我正在再次运行该工具进行 clang 静态分析(在修改编译器选项之后)。但这将解析文件并再次创建 AST。

我想创建一次 AST 并用于自定义前端操作和 clang 静态分析。

我怎样才能做到这一点?MultiplexConsumer 在这里有什么帮助吗?

0 投票
1 回答
731 浏览

c++ - 如何使用 clang LibTooling 获取函数指针参数名称?

假设我分析这样的代码:

我使用 clang LibTooling 并FieldDecl使用setParam.

我想我可以得到这样的参数类型:

但是我如何获得参数名称?(在这种情况下是“名称”和“价值”)这甚至可能还是我需要手动查看源代码(使用SourceManager)?

0 投票
1 回答
240 浏览

objective-c - 在不解决依赖关系的情况下获取objective-C类的AST节点

我正在尝试创建一个重构工具,它允许我从 Objective-c 类中获取语法树,以便我可以更改类的结构并输出符合我的标准的不同版本。我正在查看 Clang 的 Libtooling 以生成 AST,然后从那里获取它,我遇到的问题是我需要以某种方式确保我提供了从该源导入的所有可能的标头的所有路径,这就是我想避免。

我想知道是否有一种方法可以为一个类生成 AST,而不必例如为包含我想要重构的类所持有的属性的类定义的框架提供路径。

理想情况下,我将能够在包含属性、函数等内容的源文件的原始文本中获取节点......这样我就可以遍历该树并更改其结构,以便稍后在所需的位置重新生成我的源方法。