Clang 如何匹配来自CXxMethodDelcl节点的所有返回stmt

Clang 如何匹配来自CXxMethodDelcl节点的所有返回stmt,clang,libtooling,Clang,Libtooling,我想找到所有参数为引用类型的方法, 在所有返回stmt之前添加一些代码。 这是我的密码: Matcher.addMatcher(cxxMethodDecl().bind("r"), &HandlerForReturn); const cxxmethoddel*re=Result.Nodes.getNodeAs(“r”); if(sourceManager->iswriteniminmainfile(re->getBeginLoc())){ 如果(re->getnameastring()

我想找到所有参数为引用类型的方法, 在所有返回stmt之前添加一些代码。

这是我的密码:

Matcher.addMatcher(cxxMethodDecl().bind("r"), &HandlerForReturn);
const cxxmethoddel*re=Result.Nodes.getNodeAs(“r”);
if(sourceManager->iswriteniminmainfile(re->getBeginLoc())){
如果(re->getnameastring()=“ChkMemCanUse”){
对于(自动i=0;igetNumParams();i++){
auto paramDecl=re->getParamDecl(i);
if(paramDecl->getType().getTypePtr()->isReferenceType()){
//待办事项
}
}
}
}
我不熟悉叮当声。我的问题是
如何从CXXMethodDecl中找到所有返回的stmt

或任何其他解决方案?

Clang AST匹配器并不是真正为匹配而设计的,更重要的是绑定数量可变的节点

因此,我建议您维护当前的代码,自己寻找有趣的方法并收集所有返回语句。使用模板实际上非常简单

以下是如何做到这一点:

class ReturnCollector:public clang::RecursiveASTVisitor{
公众:
静态constexpr自动平均返回数=5;
使用Returns=llvm::SmallVector;
静态返回collect(clang::cxxmethoddel*MD){
返回采集器-实际采集器;
实际采集器。横向采集器(MD);
返回实际收集器。已访问;
}
bool VisitReturnStmt(铿锵::ReturnStmt*RS){
访问。推回(RS);
返回true;
}
私人:
ReturnCollector()=默认值;
回访;
};
它可以这样使用:

///clang::cxxmethoddel*MD
自动返回stmts=ReturnCollector::collect(MD);
llvm::errs()
        const CXXMethodDecl *re = Result.Nodes.getNodeAs<CXXMethodDecl>("r");
        if(sourceManager->isWrittenInMainFile(re->getBeginLoc())) {
            if (re->getNameAsString() == "ChkMemCanUse") {
                for (auto i = 0; i < re->getNumParams(); i++) {
                    auto paramDecl = re->getParamDecl(i);
                    if (paramDecl->getType().getTypePtr()->isReferenceType()) {
                        //TODO
                    }
                }
            }
        }
Returns of the 'foo' method:
ReturnStmt 0x3e6e6b0
`-IntegerLiteral 0x3e6e690 'int' 20
ReturnStmt 0x3e6e7c0
`-BinaryOperator 0x3e6e7a0 'int' '+'
  |-ImplicitCastExpr 0x3e6e788 'int' <LValueToRValue>
  | `-DeclRefExpr 0x3e6e6f0 'int' lvalue ParmVar 0x3e6e308 'x' 'int'
  `-BinaryOperator 0x3e6e768 'int' '/'
    |-ImplicitCastExpr 0x3e6e750 'int' <LValueToRValue>
    | `-DeclRefExpr 0x3e6e710 'int' lvalue ParmVar 0x3e6e308 'x' 'int'
    `-IntegerLiteral 0x3e6e730 'int' 2
ReturnStmt 0x3e6e828
`-IntegerLiteral 0x3e6e808 'int' 10

Returns of the 'bar' method:
ReturnStmt 0x3e6e878
`-IntegerLiteral 0x3e6e858 'int' 42