#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
в своем коде.