Нахождение неквалифицированного типа в clang AST

#c #clang #llvm #abstract-syntax-tree

Вопрос:

Учитывая эти AST:

 // using foo = const char*; TypeAliasDecl 0x26c72e0 lt;dread.cc:2:1, col:23gt; col:7 foo 'const char *' `-PointerType 0x26c6fc0 'const char *'  `-QualType 0x26c6961 'const char' const  `-BuiltinType 0x26c6960 'char' //lt; What I want  // using foo = std::unique_ptrlt;intgt;; TypeAliasDecl 0x2570928 lt;dread.cc:32:1, col:32gt; col:7 foo 'std::unique_ptrlt;intgt;':'std::unique_ptrlt;intgt;' `-ElaboratedType 0x25708b0 'std::unique_ptrlt;intgt;' sugar //lt; What I want  `-TemplateSpecializationType 0x2570880 'unique_ptrlt;intgt;' sugar unique_ptr  |-TemplateArgument type 'int'  | `-BuiltinType 0x2525de0 'int'  `-RecordType 0x2570860 'std::unique_ptrlt;intgt;'  `-ClassTemplateSpecialization 0x2570798 'unique_ptr'  

Как бы я мог получить типы, указанные выше, которые в основном приравниваются к неподтвержденным псевдонимным типам ? Я очень новичок в clang AST, и не сразу понятно, в чем заключается решение. Лучшее, что у меня есть до сих пор, — это:

 typeAliasDecl(  hasName("foo"),  has(  typeLoc(  loc(type()).bind("unqualifiedAliasedType")  )  ) )  

И хотя это, похоже, работает во всех моих тестах, clang-запрос показывает этот вывод:

 dread.cc:32:1: note: "root" binds here using foo = const char*; ^~~~~~~~~~~~~~~~~~~~~~~ dread.cc:32:19: note: "unqualifiedAliasedType" binds here using foo = const char*;  ^~~~~  

в diag выводе, установив его на dump показывает это:

 // Done on another test (const std::unique_ptrlt;intgt;), but same issue across all. Match #1:  Binding for "root": TypeAliasDecl 0x28a0658 lt;dread.cc:32:1, col:38gt; col:7 foo 'const std::unique_ptrlt;intgt;':'const std::unique_ptrlt;intgt;' `-QualType 0x28a05e1 'const std::unique_ptrlt;intgt;' const  `-ElaboratedType 0x28a05e0 'std::unique_ptrlt;intgt;' sugar  `-TemplateSpecializationType 0x28a05b0 'unique_ptrlt;intgt;' sugar unique_ptr  |-TemplateArgument type 'int'  | `-BuiltinType 0x2855ba0 'int'  `-RecordType 0x28a0590 'std::unique_ptrlt;intgt;'  `-ClassTemplateSpecialization 0x28a04c8 'unique_ptr'  Binding for "unqualifiedAliasedType": // There's nothing here  

Из-за этого я не могу определить, какой тип узла я должен выбирать selectFirst в своем коде.