Clang Ast посетитель для объявления одной переменной нескольких строк
Я новичок в разработке Clang libTooling.
рассмотрим следующее объявление переменной
int i, j, k = 10;
^ ^
Для моего требования проекта я хочу захватить все выражение объявления, включая "i", "j" и "k".
Как захватить полное выражение объявления, включая все переменные, с помощью clang libTooling?
Что я испытываю, так это то, что я не получаю посетителя для полного выражения, вместо этого я получаю посетителя для объявления отдельной переменной.
Это ожидаемое поведение в clang libTooling ИЛИ я что-то упустил?
Пожалуйста, предложите мне правильный способ захвата однострочных нескольких объявлений или какой-нибудь обходной путь? Любая помощь будет по достоинству оценена.
Спасибо, Хемант
1 ответ
Для решения описанной проблемы вы можете, например, написать рекурсивного посетителя AST, который посещает DeclStmt
узлы (не только VarDecl
). Проверьте этот сайт, чтобы увидеть, как написать такого посетителя: http://clang.llvm.org/docs/RAVFrontendAction.html
Причина, почему вы должны посетить DeclStmt
узлы и не только VarDecl
узлы можно объяснить, посмотрев на представление AST вашего оператора объявления:
|-DeclStmt 0x35dbfc8 <line:3:1, col:17>
| |-VarDecl 0x35dbe48 <col:1, col:5> col:5 i 'int'
| |-VarDecl 0x35dbeb8 <col:1, col:8> col:8 j 'int'
| `-VarDecl 0x35dbf28 <col:1, col:15> col:11 k 'int' cinit
| `-IntegerLiteral 0x35dbf88 <col:15> 'int' 10
Как вы можете видеть DeclStmt
"захватывает" все VarDecl
узлы (и инициализация, если дано). Как только ваш посетитель посещает DeclStmt
Вы можете проверить с isSingleDecl()
функция-член, если ваша декларация ссылается на одну декларацию или нет. Если нет (как в вашем случае), вы можете получить итератор для другого VarDecl
узлы с decl_begin()
, decl_end()
, так далее.