我正在使用clang(通過Python綁定通過libclang)將代碼審查機器人放在一起。我一直在假設所有FOR_STMT遊標將有4個孩子; INIT,EVAL,INC,和身體..在for循環中使用libclang查找條件評估
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源代碼,它看起來像使用訪客對象從clang :: ForStmt類中無意添加這4個組件。 ForStmt對象應該返回空語句對象,但某處某處的圖層似乎將這些從訪問節點向量中剝離出來......?