Clang Ast посетитель для объявления одной переменной нескольких строк

Я новичок в разработке Clang libTooling.

рассмотрим следующее объявление переменной

int i, j, k = 10;
^              ^

Для моего требования проекта я хочу захватить все выражение объявления, включая «i», «j» и «k».

Как захватить полное выражение объявления, включая все переменные, с помощью clang libTooling?

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

Это ожидаемое поведение в clang libTooling ИЛИ я что-то упустил?

Пожалуйста, предложите мне правильный способ захвата однострочных нескольких объявлений или какой-нибудь обходной путь?
Любая помощь будет по достоинству оценена.

Спасибо,
Hemant

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(), так далее.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]