Как вы получаете экземпляр CXXRecordDecl из шаблонного класса в Clang? - PullRequest
2 голосов
/ 28 июня 2019

Например, у меня есть класс:

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_

1 Ответ

1 голос
/ 03 июля 2019

Это сработало для меня:

  1. приведение ClassTemplateSpecializationDecl к DeclContext,
  2. перебрать сохраненные объявления с DeclContext::decls(),
  3. dyn_cast повторяется Decl с FieldDecl и getType() - это будет экземплярный тип переменной-члена.
  4. dyn_cast до CXXMethodDecl для функций-членов и продолжить аналогично - я не Я попробовал это для себя.

Все это я узнал, пройдя и изучив, как работает ASTDumper.

...