查找clang ::按名称输入Clang AST

时间:2018-02-27 19:01:09

标签: clang clang++ llvm-clang llvm-c++-api libclang

在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>。如何检查当前翻译单元中是否存在类型?

1 个答案:

答案 0 :(得分:1)

注意:我的知识非常有限,仅从一次编写 clang tidy check 到做一些我需要的更新。可能是错的。

根据手头的任务,您可能需要在 clang AST 中有两种可能的东西:TypeTypeLocation。我需要类型位置,所以这是我首先要提到的。

找到类型拼写。

在这种情况下,您真正​​想要的是 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