4
我正在使用基於示例Clang ASTFrontendActions sample的LibTooling編寫叮噹4.0工具。鑑於目前的聲明stmt,我想在AST中獲得它的直接父母。因此,我想下面的代碼轉儲語句的所有家長(用於測試目的):叮噹ASTContext.getParents總是返回一個空列表
bool VisitStmt(Stmt *s) {
cout <<"Trying to get parents \n";
const Stmt currentStmt = *s;
const auto& parents = Context->getParents(currentStmt);
auto it = Context->getParents(currentStmt).begin();
if(it == Context->getParents(currentStmt).end())
cout<< "parents not found\n";
cout<<"parents size "<< parents.size() <<": \n";
if (!parents.empty()){
for (int i = 0; i< parents.size(); i++){
cout<<"parent at "<< i <<": \n";
const Stmt* parentStmt = parents[i].get<Stmt>();
parentStmt->dump();
}
}
}
Context
是ASTContext
和精細的工作時,我使用它的其他功能,如:Context->getSourceManager()
對於所有訪問過的語句,結果總是(不管我輸入什麼):
Trying to get parents
parents not found
parents size 0:
我是否錯過任何(初始化,設置)使用getParents?
我對'const stmt currentStmt = * s;'感到困惑。我認爲你的意思是'const stmt&currentStmt = * s;'我不確定這是否是你的問題的原因,但是這可能會愚蠢地認爲它是一個類似但不同的聲明,它沒有父母。 – Frank
我從來沒有與鏗鏘合作,但已與其他幾個解析/ AST庫一起工作。儘管節點的API仍然保持相同(基本上是因爲在每次處理時重新創建新節點對象會花費太多的代價),但在處理的一些(通常是早期)階段,某些信息是不可用的階段)。你確定API沒有在getParents()函數中指定這樣的限制嗎? – jwatkins
@Frank'const stmt&currentStmt = * s;'做了詭計,謝謝。如果您有很好的解釋,請在下面回答,以便我可以將您的答案標記爲正確答案 – minhhn2910