Разбор специализированного класса шаблонов с использованием Clang - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в clang и хочу использовать его для синтаксического анализа файлов заголовков C ++, чтобы выгрузить найденные в них определения классов. Ниже приведен пример заголовочного файла test.h:

template <typename T>
class Foo
{
    void hello() {};

    private:
    T* data;
    int length; 
};

template <>
class Foo <bool>
{
    private:
    unsigned int *data;
    int length;
};

Я использую «RecursiveASTVisitor» для подключения моих методов сброса, как показано ниже:

bool
ParserASTVisitor::VisitClassTemplateDecl(clang::ClassTemplateDecl *recDecl)
{
   if (!recDecl) {
      return true;
   }

   recDecl->dump();
}

Я получаю следующий дамп:

ClassTemplateDecl 0x1c73860 <test.h:1:1, line:9:1> Foo
|-TemplateTypeParmDecl 0x1c73720 <line:1:11, col:20> typename T
`-CXXRecordDecl 0x1c737d0 <line:2:1, line:9:1> class Foo definition
  |-CXXRecordDecl 0x1ca6080 <line:2:1, col:7> class Foo
  |-CXXMethodDecl 0x1ca6160 <line:4:5, col:19> hello 'void (void)'
  | `-CompoundStmt 0x1ca6398 <col:18, col:19>
  |-AccessSpecDecl 0x1ca6220 <line:6:5, col:12> private
  |-FieldDecl 0x1ca62c0 <line:7:5, col:8> data 'T *'
  `-FieldDecl 0x1ca6320 <line:8:5, col:9> length 'int'

Я не понимаю, почему я не вижу определение специализированного класса? Кроме того, если я изменю test.h, как показано ниже:

template <>
class Foo <bool>
{
    private:
    unsigned int *data;
    int length;
};

template <typename T>
class Foo
{
    void hello() {};

    private:
    T* data;
    int length; 
};

, я получу следующий дамп:

CXXRecordDecl 0x231b760 <test.h:2:1, line:7:1> class Foo definition
|-CXXRecordDecl 0x231b870 <line:2:1, col:7> class Foo
|-AccessSpecDecl 0x231b900 <line:4:5, col:12> private
|-FieldDecl 0x231b970 <line:5:5, col:19> data 'unsigned int *'
`-FieldDecl 0x231b9d0 <line:6:5, col:9> length 'int'

, который предназначен только для специализированного класса шаблонов.

...