如何匹配来自 cxxMethodDecl 节点的所有 return stmt
how to match all return stmt from cxxMethodDecl node
我想找到所有参数为引用类型的方法,
在所有 return stmt.
之前添加一些代码
这是我的代码:
Matcher.addMatcher(cxxMethodDecl().bind("r"), &HandlerForReturn);
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
}
}
}
}
我是 clang 新手。我的问题是How can I find all return stmt from CXXMethodDecl
?
或任何其他解决方案?
Clang AST 匹配器并非真正设计用于匹配,更重要的是绑定可变数量的节点。
因此,我建议维护您当前的代码,寻找 有趣的 方法并自行收集所有 return 语句。使用 clang::RecursiveASTVisitor 模板实际上非常简单。
这是如何完成的:
class ReturnCollector : public clang::RecursiveASTVisitor<ReturnCollector> {
public:
static constexpr auto AVERAGE_NUMBER_OF_RETURNS = 5;
using Returns = llvm::SmallVector<clang::ReturnStmt *,
AVERAGE_NUMBER_OF_RETURNS>;
static Returns collect(clang::CXXMethodDecl *MD) {
ReturnCollector ActualCollector;
ActualCollector.TraverseDecl(MD);
return ActualCollector.Visited;
}
bool VisitReturnStmt(clang::ReturnStmt *RS) {
Visited.push_back(RS);
return true;
}
private:
ReturnCollector() = default;
Returns Visited;
};
可以这样使用:
/// clang::CXXMethodDecl *MD
auto ReturnStmts = ReturnCollector::collect(MD);
llvm::errs() << "Returns of the '" << MD->getName() << "' method:\n";
for (auto *Return : ReturnStmts) {
Return->dump();
}
llvm::errs() << "\n";
此代码应用于以下代码段:
class A {
int foo(int x) {
if (x > 10) {
if (x < 100) {
return 20;
}
return x + x / 2;
}
return 10;
}
int bar() {
return 42;
}
};
产生这个输出:
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
希望本文能帮助您解决问题![=15=]
我想找到所有参数为引用类型的方法, 在所有 return stmt.
之前添加一些代码这是我的代码:
Matcher.addMatcher(cxxMethodDecl().bind("r"), &HandlerForReturn);
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
}
}
}
}
我是 clang 新手。我的问题是How can I find all return stmt from CXXMethodDecl
?
或任何其他解决方案?
Clang AST 匹配器并非真正设计用于匹配,更重要的是绑定可变数量的节点。
因此,我建议维护您当前的代码,寻找 有趣的 方法并自行收集所有 return 语句。使用 clang::RecursiveASTVisitor 模板实际上非常简单。
这是如何完成的:
class ReturnCollector : public clang::RecursiveASTVisitor<ReturnCollector> {
public:
static constexpr auto AVERAGE_NUMBER_OF_RETURNS = 5;
using Returns = llvm::SmallVector<clang::ReturnStmt *,
AVERAGE_NUMBER_OF_RETURNS>;
static Returns collect(clang::CXXMethodDecl *MD) {
ReturnCollector ActualCollector;
ActualCollector.TraverseDecl(MD);
return ActualCollector.Visited;
}
bool VisitReturnStmt(clang::ReturnStmt *RS) {
Visited.push_back(RS);
return true;
}
private:
ReturnCollector() = default;
Returns Visited;
};
可以这样使用:
/// clang::CXXMethodDecl *MD
auto ReturnStmts = ReturnCollector::collect(MD);
llvm::errs() << "Returns of the '" << MD->getName() << "' method:\n";
for (auto *Return : ReturnStmts) {
Return->dump();
}
llvm::errs() << "\n";
此代码应用于以下代码段:
class A {
int foo(int x) {
if (x > 10) {
if (x < 100) {
return 20;
}
return x + x / 2;
}
return 10;
}
int bar() {
return 42;
}
};
产生这个输出:
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
希望本文能帮助您解决问题![=15=]