无法从clang表达式获取信息

时间:2018-11-27 22:32:28

标签: c++ clang++ llvm-clang clang-format clang-static-analyzer

我目前正在使用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;
}

因此,我可以解析左侧,并查看变量名称,但是我无法弄清楚如何解析右侧,以便可以检查并查看方法名称是什么。任何建议表示赞赏!

0 个答案:

没有答案