从clang匹配回调中获取方法调用的参数

ada*_*elm 5 llvm 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();
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

打印出:

MemberExpr 0x7fb05b07b948 '<bound member function type>' .addListener 0x7fb05b077670
`-MemberExpr 0x7fb05b07b918 'class MyCore' lvalue ->mCore 0x7fb05b078e30
  `-CXXThisExpr 0x7fb05b07b900 'class MyComponent *' this
Run Code Online (Sandbox Code Playgroud)

现在我找不到任何方法来检索方法被调用的对象的类型(这里class MyCore)或方法参数的类型(这里class MyComponent).

我怎样才能做到这一点?

ada*_*elm 5

我通过浏览现有匹配器的代码找到了答案.

运用 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();
Run Code Online (Sandbox Code Playgroud)

并且方法参数可通过FS->getArg(n).

底线是:找到包含您首先要查找的内容的CXX对象(例如,哪个类具有访问函数参数的方法?),然后找到将在ASTMatchers.h中返回相同类型对象的匹配器.

希望这可以帮助其他人解决同样的问题.