【问题标题】:Find clang::Type in Clang AST by name按名称查找 clang::Type in Clang AST
【发布时间】:2018-02-27 19:01:09
【问题描述】:

在 Clang AST 中,是否可以按名称查找类型?

例如,我有限定名称:nspace::my_type<int, 10u>。如何检查当前翻译单元中是否存在类型?

【问题讨论】:

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


    【解决方案1】:

    注意:我的知识非常有限,仅一次写了一个整洁的检查来做一些我需要的更新。可能是错的。

    根据手头的任务,您在 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)))
    

    查找该类型的所有实际用法,无论其拼写方式如何。

    现在对于这种类型的问题,您需要匹配一个类型。

    我自己从来没有这样做过,但是我们可以在这里看到 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

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多