Как сопоставить типы перечислений с помощью clang-запроса

#abstract-syntax-tree #clang

Вопрос:

Рассмотрим следующий источник C:

 $ cat type.c
enum a {
    b
};

int v1;
enum a v2;
 

Как сопоставить тип перечисления с запросом сопоставления clang AST?

Я могу сопоставлять встроенные типы, подобные этому:

 $ clang-query type.c  --
clang-query> match varDecl(hasType(builtinType()))

Match #1:

/Users/stm/Documents/CTEST/type.c:6:1: note: "root" binds here
int v1;
^~~~~~
1 match.
 

Но это не работает, когда я пытаюсь сопоставить переменную, объявленную с типом перечисления:

 $ clang-query type.c  --
clang-query> match varDecl(hasType(enumType()))
0 matches.
 

Я использую clang 11.0.0 для этих тестов.

Ответ №1:

Я не могу объяснить, почему это необходимо, но методом проб и ошибок я обнаружил, что обертывание enumType() сопоставления внутри hasUnqualifiedDesugaredType() дает желаемый результат:

 $ clang-query type.c --
clang-query> match varDecl(hasType(hasUnqualifiedDesugaredType(enumType())))

Match #1:

/Users/stm/Documents/CTEST/type.c:7:1: note: "root" binds here
enum a v2;
^~~~~~~~~
1 match.