在Clang AST中,是否可以按名称查找类型?
例如,我有一个合格的名字:<div class='body'>
<h1>Hello</h1>
<div class='text'>World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World WorWorld ld World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World WorWorld ld World World World World World World World World World World World World</div>
<h1>END</h1>
</div>
<div class='body'>
<h1>Hello</h1>
<div class='text'>World World World World World World World World World World World World World World World World d</div>
<h1>END</h1>
</div>
<div class='body'>
<h1>Hello</h1>
<div class='text'>World </div>
<h1>END</h1>
</div>
。如何检查当前翻译单元中是否存在类型?
答案 0 :(得分:1)
注意:我的知识非常有限,仅从一次编写 clang tidy check 到做一些我需要的更新。可能是错的。
根据手头的任务,您可能需要在 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)))
现在对于这种类型的问题,您需要匹配一个类型。
我自己从来没有这样做过,但我们可以在这里看到绳索这样做的例子: 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