【发布时间】:2018-02-27 19:01:09
【问题描述】:
在 Clang AST 中,是否可以按名称查找类型?
例如,我有限定名称:nspace::my_type<int, 10u>。如何检查当前翻译单元中是否存在类型?
【问题讨论】:
标签: clang clang++ llvm-clang llvm-c++-api libclang
在 Clang AST 中,是否可以按名称查找类型?
例如,我有限定名称:nspace::my_type<int, 10u>。如何检查当前翻译单元中是否存在类型?
【问题讨论】:
标签: clang clang++ llvm-clang llvm-c++-api libclang
注意:我的知识非常有限,仅一次写了一个整洁的检查来做一些我需要的更新。可能是错的。
根据手头的任务,您在 clang AST 中可能需要两种可能的东西:Type 和 TypeLocation。我需要类型位置,所以这是我首先要提到的。
在这种情况下,您真正想要的是 TypeLocation ast 节点。它们代表一种类型的拼写。
不幸的是,clang-query 没有打印出来。
搜索它们的方法是使用type_loc 匹配器。
这是我需要的东西:找到wide 模板的所有特化。
这会找到我wide<T>的所有拼写
l isWide hasDeclaration(classTemplateDecl(namedDecl(hasName("wide"))))
l isWideSpec templateSpecializationType(isWide)
l wideLoc typeLoc(loc(isWideSpec))
wideLoc - 是我用来更改类型拼写的。
不同的type_loc 的父母也是type_loc。
例如,我可以找到 T 的所有条目,除非它们在 wide<T> 中
typeLoc(loc(asString("T")), unless(hasAncestor(wideLoc)))
现在对于这种类型的问题,您需要匹配一个类型。
我自己从来没有这样做过,但是我们可以在这里看到 abseil 这样做: https://github.com/llvm/llvm-project/blob/b426b45d101740a21610205ec80610c6d0969966/clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.cpp#L36
附言。以防万一-所有clang ast匹配器: https://clang.llvm.org/docs/LibASTMatchersReference.html
【讨论】: