abstract-syntax-tree - 如何将枚举类型与 clang-query 匹配
问题描述
考虑以下 C 源代码:
$ cat type.c
enum a {
b
};
int v1;
enum a v2;
如何将枚举类型与 clang AST 匹配器查询匹配?
我可以匹配这样的内置类型:
$ clang-query type.c --
clang-query> match varDecl(hasType(builtinType()))
Match #1:
/Users/stm/Documents/CTEST/type.c:6:1: note: "root" binds here
int v1;
^~~~~~
1 match.
但是当我尝试匹配使用枚举类型声明的变量时它不起作用:
$ clang-query type.c --
clang-query> match varDecl(hasType(enumType()))
0 matches.
我使用 clang 11.0.0 进行这些测试。
解决方案
我无法解释为什么这是必要的,但通过反复试验,我发现将enumType()
匹配器包装在内部hasUnqualifiedDesugaredType()
会产生所需的结果:
$ clang-query type.c --
clang-query> match varDecl(hasType(hasUnqualifiedDesugaredType(enumType())))
Match #1:
/Users/stm/Documents/CTEST/type.c:7:1: note: "root" binds here
enum a v2;
^~~~~~~~~
1 match.
推荐阅读
- c++ - 如何将 std::array 转换为 std::tuple?
- java - 错误“java.nio.charset.MalformedInputException:输入长度 = 1”Java
- couchdb - doc_count 是否包括 /db 调用的 doc_del_count
- arrays - 如何从数组中的数组中的JSON数组中获取元素
- javascript - 使用 Mocha 运行测试也会启动主程序
- string - 如何在 MATLAB 中从变量名数组创建相同的变量?
- flutter - 无法将扫描流中的条形码扫描传递到列表中
- java - 有没有更有效的方法来编写多个 if else?
- .net - System.Net.Mail.SmtpClient 支持什么版本的 TLS?
- database - 外部服务对于 laravel 中的数据库来说太快了