Вы правы, не существует прямого сопоставителя, который проверял бы псевдоним типа псевдонима (это не так сложно реализовать самостоятельно, но я думаю, что это должно быть последним средством).
Тем не менее, существует средство has
, которое согласно документации :
Соответствует узлам AST, у которых есть дочерние узлы AST, которые соответствуют
при условии соответствия.
Другим важным моментом является то, что псевдоним типа обязательно будет иметь TypeLoc
в качестве дочернего элемента. Вот небольшая цитата о различии между Type
с и TypeLoc
с (из Внутреннее руководство ):
мы повторно используем узлы Type при представлении одного и того же типа (но поддерживаем отдельные TypeLoc для каждого экземпляра, где записан тип)
Собрав все это вместе, мы получим следующее совпадение:
typeAliasDecl(has(typeLoc(loc(templateTypeParmType())).bind("x")))
Для этого фрагмента кода:
using NotInterestingAlias = int;
template <class AliasedType> class TemplateClass {
using AliasOfType = AliasedType;
using AliasOfSomeOtherType = double;
};
int main() { return 0; }
устройство сопоставления выдаст следующий вывод:
main.cpp:4:3: note: "root" binds here
using AliasOfType = AliasedType;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:4:23: note: "x" binds here
using AliasOfType = AliasedType;
^~~~~~~~~~~
Надеюсь, эта информация полезна. Счастливого взлома с Clang!