//===-- SBExpressionOptions.cpp ---------------------------------------------*-
//C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "lldb/API/SBExpressionOptions.h"
#include "SBReproducerPrivate.h"
#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/Target/Target.h"

using namespace lldb;
using namespace lldb_private;

SBExpressionOptions::SBExpressionOptions()
    : m_opaque_up(new EvaluateExpressionOptions()) {
  LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBExpressionOptions);
}

SBExpressionOptions::SBExpressionOptions(const SBExpressionOptions &rhs)
    : m_opaque_up() {
  LLDB_RECORD_CONSTRUCTOR(SBExpressionOptions,
                          (const lldb::SBExpressionOptions &), rhs);

  m_opaque_up = clone(rhs.m_opaque_up);
}

const SBExpressionOptions &SBExpressionOptions::
operator=(const SBExpressionOptions &rhs) {
  LLDB_RECORD_METHOD(
      const lldb::SBExpressionOptions &,
      SBExpressionOptions, operator=,(const lldb::SBExpressionOptions &), rhs);

  if (this != &rhs)
    m_opaque_up = clone(rhs.m_opaque_up);
  return LLDB_RECORD_RESULT(*this);
}

SBExpressionOptions::~SBExpressionOptions() {}

bool SBExpressionOptions::GetCoerceResultToId() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBExpressionOptions,
                                   GetCoerceResultToId);

  return m_opaque_up->DoesCoerceToId();
}

void SBExpressionOptions::SetCoerceResultToId(bool coerce) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetCoerceResultToId, (bool),
                     coerce);

  m_opaque_up->SetCoerceToId(coerce);
}

bool SBExpressionOptions::GetUnwindOnError() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBExpressionOptions, GetUnwindOnError);

  return m_opaque_up->DoesUnwindOnError();
}

void SBExpressionOptions::SetUnwindOnError(bool unwind) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetUnwindOnError, (bool),
                     unwind);

  m_opaque_up->SetUnwindOnError(unwind);
}

bool SBExpressionOptions::GetIgnoreBreakpoints() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBExpressionOptions,
                                   GetIgnoreBreakpoints);

  return m_opaque_up->DoesIgnoreBreakpoints();
}

void SBExpressionOptions::SetIgnoreBreakpoints(bool ignore) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetIgnoreBreakpoints, (bool),
                     ignore);

  m_opaque_up->SetIgnoreBreakpoints(ignore);
}

lldb::DynamicValueType SBExpressionOptions::GetFetchDynamicValue() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::DynamicValueType, SBExpressionOptions,
                                   GetFetchDynamicValue);

  return m_opaque_up->GetUseDynamic();
}

void SBExpressionOptions::SetFetchDynamicValue(lldb::DynamicValueType dynamic) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetFetchDynamicValue,
                     (lldb::DynamicValueType), dynamic);

  m_opaque_up->SetUseDynamic(dynamic);
}

uint32_t SBExpressionOptions::GetTimeoutInMicroSeconds() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBExpressionOptions,
                                   GetTimeoutInMicroSeconds);

  return m_opaque_up->GetTimeout() ? m_opaque_up->GetTimeout()->count() : 0;
}

void SBExpressionOptions::SetTimeoutInMicroSeconds(uint32_t timeout) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetTimeoutInMicroSeconds,
                     (uint32_t), timeout);

  m_opaque_up->SetTimeout(timeout == 0 ? Timeout<std::micro>(llvm::None)
                                       : std::chrono::microseconds(timeout));
}

uint32_t SBExpressionOptions::GetOneThreadTimeoutInMicroSeconds() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBExpressionOptions,
                                   GetOneThreadTimeoutInMicroSeconds);

  return m_opaque_up->GetOneThreadTimeout()
             ? m_opaque_up->GetOneThreadTimeout()->count()
             : 0;
}

void SBExpressionOptions::SetOneThreadTimeoutInMicroSeconds(uint32_t timeout) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions,
                     SetOneThreadTimeoutInMicroSeconds, (uint32_t), timeout);

  m_opaque_up->SetOneThreadTimeout(timeout == 0
                                       ? Timeout<std::micro>(llvm::None)
                                       : std::chrono::microseconds(timeout));
}

bool SBExpressionOptions::GetTryAllThreads() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBExpressionOptions, GetTryAllThreads);

  return m_opaque_up->GetTryAllThreads();
}

void SBExpressionOptions::SetTryAllThreads(bool run_others) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetTryAllThreads, (bool),
                     run_others);

  m_opaque_up->SetTryAllThreads(run_others);
}

bool SBExpressionOptions::GetStopOthers() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBExpressionOptions, GetStopOthers);

  return m_opaque_up->GetStopOthers();
}

void SBExpressionOptions::SetStopOthers(bool run_others) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetStopOthers, (bool),
                     run_others);

  m_opaque_up->SetStopOthers(run_others);
}

bool SBExpressionOptions::GetTrapExceptions() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBExpressionOptions,
                                   GetTrapExceptions);

  return m_opaque_up->GetTrapExceptions();
}

void SBExpressionOptions::SetTrapExceptions(bool trap_exceptions) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetTrapExceptions, (bool),
                     trap_exceptions);

  m_opaque_up->SetTrapExceptions(trap_exceptions);
}

void SBExpressionOptions::SetLanguage(lldb::LanguageType language) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetLanguage,
                     (lldb::LanguageType), language);

  m_opaque_up->SetLanguage(language);
}

void SBExpressionOptions::SetCancelCallback(
    lldb::ExpressionCancelCallback callback, void *baton) {
  LLDB_RECORD_DUMMY(void, SBExpressionOptions, SetCancelCallback,
                    (lldb::ExpressionCancelCallback, void *), callback, baton);

  m_opaque_up->SetCancelCallback(callback, baton);
}

bool SBExpressionOptions::GetGenerateDebugInfo() {
  LLDB_RECORD_METHOD_NO_ARGS(bool, SBExpressionOptions, GetGenerateDebugInfo);

  return m_opaque_up->GetGenerateDebugInfo();
}

void SBExpressionOptions::SetGenerateDebugInfo(bool b) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetGenerateDebugInfo, (bool),
                     b);

  return m_opaque_up->SetGenerateDebugInfo(b);
}

bool SBExpressionOptions::GetSuppressPersistentResult() {
  LLDB_RECORD_METHOD_NO_ARGS(bool, SBExpressionOptions,
                             GetSuppressPersistentResult);

  return m_opaque_up->GetResultIsInternal();
}

void SBExpressionOptions::SetSuppressPersistentResult(bool b) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetSuppressPersistentResult,
                     (bool), b);

  return m_opaque_up->SetResultIsInternal(b);
}

const char *SBExpressionOptions::GetPrefix() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBExpressionOptions,
                                   GetPrefix);

  return m_opaque_up->GetPrefix();
}

void SBExpressionOptions::SetPrefix(const char *prefix) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetPrefix, (const char *),
                     prefix);

  return m_opaque_up->SetPrefix(prefix);
}

bool SBExpressionOptions::GetAutoApplyFixIts() {
  LLDB_RECORD_METHOD_NO_ARGS(bool, SBExpressionOptions, GetAutoApplyFixIts);

  return m_opaque_up->GetAutoApplyFixIts();
}

void SBExpressionOptions::SetAutoApplyFixIts(bool b) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetAutoApplyFixIts, (bool), b);

  return m_opaque_up->SetAutoApplyFixIts(b);
}

bool SBExpressionOptions::GetTopLevel() {
  LLDB_RECORD_METHOD_NO_ARGS(bool, SBExpressionOptions, GetTopLevel);

  return m_opaque_up->GetExecutionPolicy() == eExecutionPolicyTopLevel;
}

void SBExpressionOptions::SetTopLevel(bool b) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetTopLevel, (bool), b);

  m_opaque_up->SetExecutionPolicy(b ? eExecutionPolicyTopLevel
                                    : m_opaque_up->default_execution_policy);
}

bool SBExpressionOptions::GetAllowJIT() {
  LLDB_RECORD_METHOD_NO_ARGS(bool, SBExpressionOptions, GetAllowJIT);

  return m_opaque_up->GetExecutionPolicy() != eExecutionPolicyNever;
}

void SBExpressionOptions::SetAllowJIT(bool allow) {
  LLDB_RECORD_METHOD(void, SBExpressionOptions, SetAllowJIT, (bool), allow);

  m_opaque_up->SetExecutionPolicy(allow ? m_opaque_up->default_execution_policy
                                        : eExecutionPolicyNever);
}

EvaluateExpressionOptions *SBExpressionOptions::get() const {
  return m_opaque_up.get();
}

EvaluateExpressionOptions &SBExpressionOptions::ref() const {
  return *(m_opaque_up.get());
}

namespace lldb_private {
namespace repro {

template <>
void RegisterMethods<SBExpressionOptions>(Registry &R) {
  LLDB_REGISTER_CONSTRUCTOR(SBExpressionOptions, ());
  LLDB_REGISTER_CONSTRUCTOR(SBExpressionOptions,
                            (const lldb::SBExpressionOptions &));
  LLDB_REGISTER_METHOD(
      const lldb::SBExpressionOptions &,
      SBExpressionOptions, operator=,(const lldb::SBExpressionOptions &));
  LLDB_REGISTER_METHOD_CONST(bool, SBExpressionOptions, GetCoerceResultToId,
                             ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetCoerceResultToId,
                       (bool));
  LLDB_REGISTER_METHOD_CONST(bool, SBExpressionOptions, GetUnwindOnError, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetUnwindOnError, (bool));
  LLDB_REGISTER_METHOD_CONST(bool, SBExpressionOptions, GetIgnoreBreakpoints,
                             ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetIgnoreBreakpoints,
                       (bool));
  LLDB_REGISTER_METHOD_CONST(lldb::DynamicValueType, SBExpressionOptions,
                             GetFetchDynamicValue, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetFetchDynamicValue,
                       (lldb::DynamicValueType));
  LLDB_REGISTER_METHOD_CONST(uint32_t, SBExpressionOptions,
                             GetTimeoutInMicroSeconds, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetTimeoutInMicroSeconds,
                       (uint32_t));
  LLDB_REGISTER_METHOD_CONST(uint32_t, SBExpressionOptions,
                             GetOneThreadTimeoutInMicroSeconds, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions,
                       SetOneThreadTimeoutInMicroSeconds, (uint32_t));
  LLDB_REGISTER_METHOD_CONST(bool, SBExpressionOptions, GetTryAllThreads, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetTryAllThreads, (bool));
  LLDB_REGISTER_METHOD_CONST(bool, SBExpressionOptions, GetStopOthers, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetStopOthers, (bool));
  LLDB_REGISTER_METHOD_CONST(bool, SBExpressionOptions, GetTrapExceptions,
                             ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetTrapExceptions, (bool));
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetLanguage,
                       (lldb::LanguageType));
  LLDB_REGISTER_METHOD(bool, SBExpressionOptions, GetGenerateDebugInfo, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetGenerateDebugInfo,
                       (bool));
  LLDB_REGISTER_METHOD(bool, SBExpressionOptions, GetSuppressPersistentResult,
                       ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetSuppressPersistentResult,
                       (bool));
  LLDB_REGISTER_METHOD_CONST(const char *, SBExpressionOptions, GetPrefix,
                             ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetPrefix, (const char *));
  LLDB_REGISTER_METHOD(bool, SBExpressionOptions, GetAutoApplyFixIts, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetAutoApplyFixIts, (bool));
  LLDB_REGISTER_METHOD(bool, SBExpressionOptions, GetTopLevel, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetTopLevel, (bool));
  LLDB_REGISTER_METHOD(bool, SBExpressionOptions, GetAllowJIT, ());
  LLDB_REGISTER_METHOD(void, SBExpressionOptions, SetAllowJIT, (bool));
}

}
}
