我目前正在使用clang llvm开发代码转换器,但是在从语句和表达式获取所需的信息时遇到了一些麻烦。更具体地说,我正在尝试搜索代码行,并使用它。例如,我希望能够找到一个像(int x = getAge();)这样的变量赋值,我正在尝试使用访问者来查找语句和变量,但似乎无法弄清楚如何解析该语句以获取两者变量名和方法名。我希望能够获得var名称'x'和方法名称'getAge'
我试图找到赋值表达式,并分析左侧和右侧以获取变量名称,以及右侧的方法名称,但是我似乎无法弄清楚如何获取方法名称,只是右侧的值或类型。
virtual bool VisitBinaryOperator(clang::BinaryOperator* bo){
clang::Expr* lhs = bo->getLHS();
clang::Expr* rhs = bo->getRHS();
clang::QualType type_rhs = rhs->getType();
llvm::APSInt Result;
clang::Expr::EvalResult Result2;
clang::Expr::ConstExprUsage ceu;
//clang::ASTContext context;
if (rhs->EvaluateAsRValue(Result2, *ast_context_)) {
//std::cout << "RHS method name " << Result2.Val.getAsString(*ast_context_, type_rhs) << std::endl;
}
if(clang::Stmt* stmt = dyn_cast<clang::Stmt>(rhs)){
//trying to get right hand side name....
}
if (clang::DeclRefExpr *DRE = dyn_cast<clang::DeclRefExpr>(lhs)) {
//check and Expression is a declaration.
if (clang::VarDecl *VD = dyn_cast<clang::VarDecl>(DRE->getDecl())) {
cout << "LHS is " << VD->getQualifiedNameAsString() << std::endl;
}
}
return true;
}
因此,我可以解析左侧,并查看变量名称,但是我无法弄清楚如何解析右侧,以便可以检查并查看方法名称是什么。任何建议表示赞赏!