【发布时间】:2019-06-28 20:47:17
【问题描述】:
例如,我有一个班级:
template<typename T>
class Foo {
public:
T getBar();
private:
T bar_;
};
实例化为:
using FooBarT = Foo<Bar>;
如何获得CXXRecordDecl 以及Foo<bar> 的解析字段和方法?
我试过了:
const auto *typeAliasDecl = llvm::dyn_cast<clang::TypeAliasDecl>(decl);
typeAliasDecl->getUnderlyingType()->getAsCXXRecordDecl()->dump();
我得到的输出是:
ClassTemplateSpecializationDecl 0x0000000 class Foo
`-TemplateArgument type 'Bar'
但是,我也想要带有字段和方法的 CXXRecordDecl,以便我可以遍历它们。我也试过:
for (const auto *contextDecl: typeAliasDecl->getUnderlyingType()->getUnqualifiedDesugaredType()->getAsCXXRecordDecl()->getDeclContext()->decls()) {
const auto *classTemplateDecl = llvm::dyn_cast<clang::ClassTemplateDecl>(contextDecl);
classTemplateDecl->dump();
}
输出:
ClassTemplateDecl Foo
|-TemplateTypeParmDecl 0x0000000 referenced typename depth 0 index 0 T
|-CXXRecordDecl class Foo definition
| ...
| |-FieldDecl 0x0000000 referenced bar_ 'T'
|-ClassTemplateSpecializationDecl 0x0000000 class Foo
`-TemplateArgument type 'Bar'
如您所见,CXXRecordDecl class Foo definition 可以访问FieldDecl,但不知道bar_ 的类型实例化,而ClassTemplateSpecializationDecl 知道。
我想要CXXRecordDecl 的实例化类型为FieldDecl bar_
【问题讨论】:
-
嗨,
ClassTemplateDecl是错误的,但在打印输出中您可以看到它引用了ClassTemplateSpecializationDecl,这就是您需要的。只需查看ClassTemplateDecl的方法,甚至检查打印机的工作原理,看看使用哪个 getter。 -
@ValeriySavchenko 嗨,我可以得到
ClassTemplateSpecializationDecl,但它不包含任何FieldDecls。
标签: c++ clang c++17 abstract-syntax-tree libtooling