#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.