2014-02-19 2 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

기존 matchers의 코드를 탐색하여 답을 찾았습니다. 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.

이 기능을 사용하면 다른 사람에게도 동일한 문제가 발생할 수 있습니다.

관련 문제