我正在使用 clang(通过 Python 绑定通过 libclang)来组合一个代码审查机器人。我一直假设所有 FOR_STMT 游标都有 4 个孩子;INIT、EVAL、INC 和 BODY..
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 只会为 FOR_STMT 的任何未使用部分返回 NULL_STMT ......显然,我错了。
解析 FOR_STMT 的正确方法是什么?我在 libclang 中找不到任何有用的东西。
更新:通过 libclang 源代码,看起来这 4 个组件是使用访问者对象从 clang::ForStmt 类中添加的。ForStmt 对象应该返回空语句对象,但是某处的某个层似乎正在将这些从访问节点向量中剥离出来......?