Возникли проблемы при получении информации из Clang Expressions - PullRequest
0 голосов
/ 28 ноября 2018

В настоящее время я работаю над конвертером кода в clang llvm, но у меня возникли некоторые проблемы с получением нужной информации из операторов и выражений.Более конкретно, я пытаюсь найти строку кода и работаю с ней.Например, я хочу быть в состоянии найти назначение переменной, например (int x = getAge ();) Я пытаюсь использовать посетителей, чтобы найти операторы и переменные, но не могу понять, как разобрать оператор, чтобы получить обаимя переменной и имя метода.Я хочу иметь возможность получить имя переменной '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;
}

Так что я могу разобрать левуюсо стороны, и вижу имя переменной, но я не могу понять, как разобрать правую часть, чтобы я мог проверить и увидеть, как называется метод.Любые предложения приветствуются!

...