blob: cdea659bd5fb05cc2372578653b9fc56b85423aa [file] [log] [blame]
//===-- RustUserExpression.cpp ------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "RustUserExpression.h"
#include "lldb/Core/ValueObject.h"
#include "lldb/Expression/DiagnosticManager.h"
#include "lldb/Expression/ExpressionVariable.h"
#include "lldb/Symbol/RustASTContext.h"
#include "lldb/Target/Target.h"
#include "Plugins/ExpressionParser/Rust/RustParse.h"
using namespace lldb_private::rust;
using namespace lldb_private;
using namespace lldb;
bool RustUserExpression::Parse(DiagnosticManager &diagnostic_manager,
ExecutionContext &exe_ctx,
lldb_private::ExecutionPolicy execution_policy,
bool keep_result_in_memory, bool generate_debug_info)
{
InstallContext(exe_ctx);
Parser parser(exe_ctx.GetTargetSP(), m_expr_text);
Status status;
m_expr = parser.ParseFully(status);
if (!m_expr) {
diagnostic_manager.PutString(eDiagnosticSeverityError, status.AsCString());
return false;
}
return true;
}
lldb::ExpressionResults RustUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
ExecutionContext &exe_ctx,
const EvaluateExpressionOptions &options,
lldb::UserExpressionSP &shared_ptr_to_me,
lldb::ExpressionVariableSP &result)
{
Status error;
ValueObjectSP value = m_expr->Evaluate(exe_ctx, error);
m_expr.reset();
if (!value) {
diagnostic_manager.PutString(eDiagnosticSeverityError, error.AsCString());
return lldb::eExpressionDiscarded;
}
result.reset(new ExpressionVariable(ExpressionVariable::eKindRust));
result->m_live_sp = result->m_frozen_sp = value;
result->m_flags |= ExpressionVariable::EVIsProgramReference;
Target *target = exe_ctx.GetTargetPtr();
PersistentExpressionState *pv =
target->GetPersistentExpressionStateForLanguage(eLanguageTypeRust);
if (pv != nullptr) {
result->SetName(pv->GetNextPersistentVariableName(*target,
pv->GetPersistentVariablePrefix()));
pv->AddVariable(result);
}
return lldb::eExpressionCompleted;
}