2014-02-19 58 views
4

我正在修改Clang工具模板(如描述here)以在我的代碼中搜索特定的方法調用。爲了稍後重寫該調用,我想獲取調用該方法的參數的類型,以及該方法被調用的對象的類型。從clang匹配回調中獲取方法調用的參數

我設法找到該回調以下內容的匹配:

class AddListenerPrinter : public MatchFinder::MatchCallback 
{ 
    public : 
    virtual void run(const MatchFinder::MatchResult &Result) { 
    if (const auto *FS = Result.Nodes.getNodeAs<clang::MemberExpr>("ListeningBound")) 
    { 
     FS->dump(); 
    } 
    } 
}; 

打印出:

MemberExpr 0x7fb05b07b948 '<bound member function type>' .addListener 0x7fb05b077670 
`-MemberExpr 0x7fb05b07b918 'class MyCore' lvalue ->mCore 0x7fb05b078e30 
    `-CXXThisExpr 0x7fb05b07b900 'class MyComponent *' this 

現在,我找不到任何方法來檢索對象的類型方法被調用(這裏class MyCore)或方法參數的類型(這裏class MyComponent)。

我該怎麼做?

回答

4

我通過瀏覽現有匹配器的代碼找到答案。

使用matcher = memberCallExpr(callee(methodDecl(hasName("addListener"))))

我能夠檢索CXXMemberCallExpr節點。然後獲取對象的類型的方法被調用於:

// FS is the CXXMemberCallExpr 
// Prints out the type of x in x.method() 
llvm::outs() << FS->getRecordDecl()->getName(); 

和方法的參數是通過FS->getArg(n)訪問。

底線是:找到CXX對象,其中包含你要尋找的第一(例如其類有方法來訪問函數的參數?),然後發現,將返回相同類型的對象在的匹配ASTMatchers.h

希望這可以幫助其他人有同樣的問題。

相關問題