Clang 如何匹配来自CXxMethodDelcl节点的所有返回stmt
我想找到所有参数为引用类型的方法, 在所有返回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()
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