问题标签 [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 回答
1313 浏览

c++ - 使用 libtooling 获取完全限定的模板模板参数名称

我正在尝试使用模板模板参数libtooling打印CXXRecordDecl模板类的实例。不幸的是,模板模板参数的字符串表示不是完全限定的(例如,它缺少名称空间)。

我正在CXXRecordDecl使用以下代码打印:

这是一个示例,我希望输出为ns::A<ns::B>,但我得到ns::A<B>

如何使用模板模板参数打印类的完全限定名称?

在相关的说明中,有没有办法在不调用的情况下做到这一点getCanonicalTypeInternal,这听起来像一个内部函数?

[编辑#1]我也试过decl->getQualifiedNameAsString()了,它完全省略了模板参数和输出ns::A

[编辑#2] Cling 将一组问题换成另一组问题。它确实为模板模板参数正确生成了完全限定的类型。但是,它会为函数(和函数指针)的参数和返回类型生成非限定名称。例如,下面的代码生成输出ns::A<void (B)>而不是ns::A<void (ns::B)>

[编辑 #3]在 Cling 问题跟踪器上针对上述问题发布了一个问题。请注意,查看该页面需要您使用 CERN 轻量级帐户登录。有关创建帐户的说明,请参阅此页面。

0 投票
0 回答
590 浏览

libclang - 如何使用 clang libtooling 更改特定的 ctor 定义

我只想重写特定的ctor定义。为了找到改变我使用“正常”DeclarationMatcher 的女巫

找到特定的类/ctor 非常有用,但是我如何在 cpp 类中从标题切换到定义。运行工具的命令是:

为了处理回调,我使用 MatchCallback:

正如您从描述 m_rewriter.InsertText 中所知道的那样,它根本不适合我(没有更改标题)。

输入文件derived_t1.h:

输入文件derived_t1.cpp:

整个示例工具:

因此,如果有人知道如何在 cpp 文件中更改该 ctor 这将对我有很大帮助。谢谢

0 投票
0 回答
243 浏览

clang - 使用 clang libtooling 获取多个宏定义的完整源代码

最终,我试图从数千个现有的 c 和 c++ 头文件中提取相关结构。我已经能够使用 libtooling 从各种不同的标头中提取一个结构以及它所依赖的所有结构/枚举/类型定义等。不幸的是,当我得到支持 Decls 的源时,它仍然引用其中定义的宏。我目前正在尝试找到一种方法来访问和打印这些宏的源,但在定义多个宏时运气不佳。

例如:

当我获得与名称对应的 FieldDecl 并获得 SourceRange 时,我看到拼写位置指向“#define UNSIGNED unsigned”。我想知道如何到达其他宏定义的源位置。我知道当我更改“UNSIGNED long INT NAME;”时 到“无符号长整数名称;” 然后拼写位置将指向“#define INT int”。似乎名称的处理方式与更改为“unsigned long int NAME;”不同。让我没有拼写位置。

有没有办法在给定 SourceRange 的情况下获得多个拼写位置?我是否需要以其他方式缩小源范围?我已经尝试对下一个标记进行词法分析,但它并没有给我留下一个新的拼写位置。我还必须考虑数组中的宏,例如“int bob[MAX_WIDTH][MAX_HEIGHT]”,但我希望一旦我在这里弄清楚我的问题就会变得清晰。提前感谢您提供的任何帮助。

0 投票
1 回答
310 浏览

llvm-clang - 为什么源位置在这里以两个字符结尾?

我正在尝试使用 libTooling 编写源到源转换器。

我正在使用 ASTMatchers 尝试查找if没有大括号的语句,然后使用重写器添加大括号。

我正在使用的匹配器是:

然后我只得到开始和结束位置,并重写花括号。

这是它的源代码:

现在的问题是,由于某种原因,结束位置总是偏离 2 个字符。为什么会这样?

0 投票
1 回答
277 浏览

clang - 从 ObjCPropertyDecl 获取类信息

ObjCPropertyDecl我在从 clang类型中提取类信息时遇到了一些麻烦。

示例 Objective-C 文件:

倾倒 ast 给了我这个:

以前,我有一个 OCLint 规则,它依赖于检查类型以查看它是否为NSArray,因此我将使用 anASTVisitor和以下代码:

请注意,nullable上面代码示例中的关键字和泛型都会更改限定类型(请参阅 AST 转储)。

我的问题是:有没有一种方法可以只从ObjCPropertyDecleg中获取 Objective-C 类类型,NSArray *或者NSString *没有任何额外的糖?

我已经尝试过getSplitDesugaredType();,这对于删除可为空的部分效果很好,但不会删除泛型。

编辑:

我目前的想法是,我可能能够TypeSplitQualTypethen cast toObjCObjectPointerType获得 the ObjCObjectTypeand ,这可能具有我想要的信息,但是,我会在明天尝试实现它。

0 投票
1 回答
258 浏览

c++ - 阻止我的基于 Clang 的工具分析源代码中的头文件?

我正在编写一个基于 LibTooling 和 RecursiveASTVistor 的独立工具,我不想查看存储在源代码中的头文件的内容。我需要更改编译数据库吗?我一直在使用这个小技巧来防止我的工具崩溃,但我不希望我的工具分析我正在处理的源代码中包含的任何头文件。

0 投票
1 回答
884 浏览

c++ - 如何使用 cmake build config 在我的整个代码库上运行不是插件的 llvm libclang 工具?

我已经编写了一个 llvm 插件并制作了一个 cmake 对象库,该对象库在每个源文件上运行该插件,但我需要从整个编译中获取数据,而为每个编译单元再次运行一个插件。

然而,我的构建环境相当复杂,我不想仅仅为了运行这个工具而管理配置的第二个表示。

如何使用我现有的 CMakeLists.txt 发送诸如#define 之类的内容并包含指向可以在一次运行中运行整个代码库的工具的路径?

我考虑过尝试在插件上使用 Coliru 的统一构建,因为它将是一个单一的编译单元,但希望 cmake 内置的东西(可能与一些命令行工具结合)可以获得我需要的信息. 我也可以进行多次运行,在其中构建一堆数据文件,然后制作一个不同的工具来组合这些文件,但这也不理想。

谢谢你。

0 投票
1 回答
2757 浏览

c++ - clang:自定义属性在 AST 中不可见

我按照官方手册中的描述在 clang 中实现了一个自定义属性:http: //clang.llvm.org/docs/InternalsManual.html#how-to-add-an-attribute

所以我在 Attr.td 中添加了以下代码:

以及AttrDocs.td的文档。重建clang后,它显然知道该属性,因为我在使用它时没有收到未知属性警告。我什至可以使用libtooling访问新的属性类,但该属性不会出现在 AST 中,即使我将该行添加let ASTNode = 1到属性定义中也是如此。

还有什么我需要考虑的或者可能是什么问题?

0 投票
1 回答
134 浏览

c++ - 跳过 IfStatements 中的语句

我创建了一个if(isa<IfStmt>(s))if(isa<ReturnStmt>(s))如果找到它会打印一些东西。我创建了这个简单的 C++ 代码,它在 if 语句中包含 return 语句

是否可以跳过/忽略if else 语句中的return语句?

0 投票
1 回答
213 浏览

installation - 如何运行 LibTool?

目前我已经在我正在开发它的机器上安装了 clang-llvm 测试了我的工具。我所要做的就是build/bin运行我的工具。

但是,我现在想尝试在另一台机器上运行这个工具。我应该在这里做什么来运行我开发的工具?

我是否也必须设置整个 clang-llvm 环境?这非常耗时,整个文件夹的大小约为 22+ GB。

我正在创建的工具正在运行 RecursiveASTVisitor(与下面的链接相同的环境) http://clang.llvm.org/docs/LibASTMatchersTutorial.html