Найти условную оценку в цикле 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 недостаточно.