问题标签 [clang-ast-matchers]

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 投票
0 回答
12 浏览

libclang - 如何在 Matchcallback::onEndOfTranslationUnit() 中正确注入标头

我正在编写一个将表达式转换expr1 + expr2myFunc(expr1, expr2). 我面临的问题是,当且仅当我执行转换时,我必须注入包含 myFunc 声明的标头,也就是说,我的 AST 匹配器回调被成功调用。

Matchcallback::onEndOfTranslationUnit()通过检查一个简单的标志translationOccured来决定是否必须注入标头来执行此操作。我可以通过检索位置来注入标头,SourceManager::getLocForStartOfFile()但是有两个问题

  1. 它包含在所有内容之前,甚至是许可证注释
  2. 我无法检查该标题是否已包含在内。

我的问题是

  1. 如何获得第一个包含的位置?我可以在没有 的情况下向前移动位置Lexer吗?
  2. 我可以在此阶段处理包含列表,还是应该使用FrontendActionlike运行第二遍RewriteIncludesFrontend

谢谢。

0 投票
1 回答
32 浏览

c++ - 如何使用 clang-tool 检测 SEXP 类型

我想使用 clang-tool 检测“SEXP”返回类型函数,并打印它。

我的铿锵工具:

我的 test.cpp :

预期的输出是type is SEXP

但结果是type is int,错误消息未知类型名称 'SEXP'

如何编辑我的工具以获取函数的 SEXP 类型?

0 投票
1 回答
118 浏览

c++ - 使用 AST 匹配器匹配可变参数模板参数

我有以下示例代码。

当我运行它时clang-check -ast-dump,我得到以下树。

我想为第一种情况编写一个匹配器,其中函数的一个参数是可变参数。从AST Matcher Reference,我发现有一个isVariadic匹配器,尽管正如文档所说,

有没有办法匹配可变参数函数声明,并将可变参数声明进一步绑定到某个节点?我想做类似的事情functionDecl(has(parmVarDecl(hasType(packExpansionType().bind("parameter_type"))))),但似乎这不可能,因为没有packExpansionType匹配器。我在这里错过了什么吗?

0 投票
0 回答
42 浏览

clang-tidy - 如何在 Clang AST 中仅识别用户定义的变量?

最近我写了一个 Clang-tidy 命名检查,检查用户定义变量的名称是否以 '_' 字符开头。

但是我发现编译器在处理某些表达式时会定义一些变量。

例如:</p>

在处理'for(auto &i : arr)'表达式时,编译器将分别定义三个名为'__begin1、__end1、__range1'的变量,这与我的命名检查相匹配,但我想忽略这些编译器定义的变量。

如何在 Clang AST 中仅识别用户定义的变量?

0 投票
0 回答
30 浏览

c++ - clang-tooling:如何检查一个字段是否是一个不完整的构造类型?

我想编写一个匹配器,它排除包含不完整类型的类,例如: std::unique_ptr<ForwardDeclared>,但它没有被标识为一个,因为它是一个模板类型(我认为是这样)。有谁知道如何规避这个?

最小代码:

test.h

test.cpp

0 投票
1 回答
15 浏览

parsing - 具有全局存储但非静态的 Clang 匹配器

我试图编写一个匹配器来查找没有静态存储的全局变量

这是我到目前为止所拥有的

根据 Clang AST 匹配器参考

hasGlobalStorage 还将匹配函数体内的静态变量

在此处输入图像描述

我不想匹配 'y' 变量

我怎么做?

0 投票
0 回答
211 浏览

c++ - 为什么在 clang 工具发生中毒后使用?

我正在尝试运行 clangTool 并使用地址清理程序。但是会发生毒后使用错误。它在 ubuntu 14.04 和 ubuntu 18.04 上复制。你能帮忙找出问题所在吗?

使用地址清理程序时出错:

代码:

Clang 版本:10.0.0

为什么会发生此错误?

llvm 跟踪器中的错误已创建:https ://bugs.llvm.org/show_bug.cgi?id=50567

0 投票
1 回答
25 浏览

clang - Create a new LabelDecl and add to Clang AST

I have a problem inserting LabelDecl. My goal is to create a goto statement in the program and to do that, first I need to create LabelDecl and add it to Clang AST.

There is an API to Create Label, but I am not able to get the IdentifierInfo.

#xA;

My Only problem is getting the IdentifierInfo *II object. Any idea on this.

0 投票
0 回答
36 浏览

c++ - 如何使用 clang-query 查找包含给定子字符串的字符串文字?

我正在做一些自动重构,我想了解字符串中是否使用了某些名称。例如,在下面的代码中,我想找到所有包含子字符串“hello”的字符串文字,这将产生第一个字符串。

为此,我正在使用 clang-query。似乎我需要stringLiteral匹配器,但我无法理解将什么缩小或遍历匹配器传递给它以仅选择具有给定子字符串的文字。

0 投票
0 回答
46 浏览

c++ - 如何检查给定 clang::VarDecl 的变量类型?

我正在编写一个整洁的检查来自动重命名某种类型的某些变量。我可以成功地将他们的声明与 matcher 匹配varDecl(hasType(asString("class MyType")))。但后来我想重命名这些变量及其用法。如果我使用FixItHint::CreateReplacement(),它只会替换声明中的名称,而不是所有用法。

我找到了一个RenamerClangTidyCheck,这似乎正是我需要的:

然而,它是通过重写虚函数来定制的getDeclFailureInfo(),这些虚函数是从ClangTidyCheck::check()函数调用的,并且手头没有任何匹配器,它们使用NamedDecl. 我只对变量声明感兴趣,所以我可以将它转换为VarDecl,但是我如何确保这个特定VarDecl对应于一个类型为 的变量MyType