Найти условную оценку в цикле for с использованием libclang

Я использую clang (через libclang через привязки Python), чтобы собрать бота для проверки кода. Я предполагал, что все курсоры FOR_STMT будут иметь 4 детей; INIT, EVAL, INC, и ТЕЛО..

for( INIT; EVAL; INC )
    BODY;

что подразумевало бы, что я мог бы проверить содержимое оценочного выражения с помощью чего-то в python:

forLoopComponents = [ c for c in forCursor.get_children() ]
assert( len( forLoopComponents ) == 4 )

initExpressionCursor = forLoopComponents[ 0 ]
evalExpressionCursor = forLoopComponents[ 1 ]
incExpressionCursor = forLoopComponents[ 2 ]
bodyExpressionCursor = forLoopComponents[ 3 ]

errorIfContainsAssignment( evalExpressionCursor ) # example code style rule

Этот подход кажется... менее чем хорошим для начала, но я просто принял его как результат libclang, и особенно привязок Python, будучи довольно редким. Однако недавно я заметил, что цикл вроде:

for( ; a < 4; a-- )
    ;

будет иметь только 3 детей - и оценка теперь будет первой, а не второй. Я всегда предполагал, что libclang просто вернет NULL_STMT для любых неиспользуемых частей FOR_STMT... ясно, что я был неправ.

Каков правильный подход для разбора FOR_STMT? Я не могу найти ничего полезного для этого в libclang.

ОБНОВЛЕНИЕ: просматривая исходный код libclang, похоже, что эти 4 компонента тупо добавлены из класса clang::ForStmt с помощью объекта посетителя. Объект ForStmt должен возвращать объекты операторов с нулевым значением, но какой-то слой где-то, кажется, удаляет их из вектора посещенных узлов...?

1 ответ

То же самое здесь, в качестве обходного пути, я заменил первое пустое выражение на пустое выражение int foo=0. Я могу вообразить решение, которое использует get_tokens Курсора, чтобы соответствовать частям утверждения. Функция get_tokens может помочь в ситуациях, когда clang недостаточно.

Другие вопросы по тегам