Я новичок в разработке Clang libTooling.
рассмотрим следующее объявление переменной
int i, j, k = 10;
^ ^
Для моего требования проекта я хочу захватить все выражение объявления, включая «i», «j» и «k».
Как захватить полное выражение объявления, включая все переменные, с помощью clang libTooling?
Что я испытываю, так это то, что я не получаю посетителя для полного выражения, вместо этого я получаю посетителя для объявления отдельной переменной.
Это ожидаемое поведение в clang libTooling ИЛИ я что-то упустил?
Пожалуйста, предложите мне правильный способ захвата однострочных нескольких объявлений или какой-нибудь обходной путь?
Любая помощь будет по достоинству оценена.
Спасибо,
Hemant
Для решения описанной проблемы вы можете, например, написать рекурсивного посетителя 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()
, так далее.
Других решений пока нет …