2016-11-29 51 views
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(); 
     } 

    } 
} 

ContextASTContext和精細的工作時,我使用它的其他功能,如:Context->getSourceManager()
對於所有訪問過的語句,結果總是(不管我輸入什麼):

Trying to get parents 
parents not found 
parents size 0: 

我是否錯過任何(初始化,設置)使用getParents?

+1

我對'const stmt currentStmt = * s;'感到困惑。我認爲你的意思是'const stmt&currentStmt = * s;'我不確定這是否是你的問題的原因,但是這可能會愚蠢地認爲它是一個類似但不同的聲明,它沒有父母。 – Frank

+1

我從來沒有與鏗鏘合作,但已與其他幾個解析/ AST庫一起工作。儘管節點的API仍然保持相同(基本上是因爲在每次處理時重新創建新節點對象會花費太多的代價),但在處理的一些(通常是早期)階段,某些信息是不可用的階段)。你確定API沒有在getParents()函數中指定這樣的限制嗎? – jwatkins

+0

@Frank'const stmt&currentStmt = * s;'做了詭計,謝謝。如果您有很好的解釋,請在下面回答,以便我可以將您的答案標記爲正確答案 – minhhn2910

回答

3

的問題來自於以下行:

const Stmt currentStmt = *s; 

這樣做是使陳述的副本。 Context->getParents()通過查找具有作爲孩子傳遞參數的節點來工作。但由於currentStmt只存在於您的堆棧上,而不在上下文中,因此無法找到任何此類節點。

通過使currentStmt到由s指向的節點的引用:

const Stmt& currentStmt = *s; 

然後你會被傳遞到上下文的實際節點實例,它有自身內部,和鐺將設法成功地找到父母。