//===-- MICmdCmdVar.h -------------------------------------------*- 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
//
//===----------------------------------------------------------------------===//

// Overview:    CMICmdCmdVarCreate              interface.
//              CMICmdCmdVarUpdate              interface.
//              CMICmdCmdVarDelete              interface.
//              CMICmdCmdVarAssign              interface.
//              CMICmdCmdVarSetFormat           interface.
//              CMICmdCmdVarListChildren        interface.
//              CMICmdCmdVarEvaluateExpression  interface.
//              CMICmdCmdVarInfoPathExpression  interface.
//              CMICmdCmdVarShowAttributes      interface.
//
//              To implement new MI commands derive a new command class from the
//              command base
//              class. To enable the new command for interpretation add the new
//              command class
//              to the command factory. The files of relevance are:
//                  MICmdCommands.cpp
//                  MICmdBase.h / .cpp
//                  MICmdCmd.h / .cpp
//              For an introduction to adding a new command see
//              CMICmdCmdSupportInfoMiCmdQuery
//              command class as an example.

#pragma once

// In-house headers:
#include "MICmdBase.h"
#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmnLLDBDebugSessionInfoVarObj.h"
#include "MICmnMIValueList.h"
#include "MICmnMIValueTuple.h"

// Declarations:
class CMICmnLLDBDebugSessionInfoVarObj;

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-create".
//--
class CMICmdCmdVarCreate : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarCreate();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;

  // Overridden:
public:
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarCreate() override;

  // Methods:
private:
  void CompleteSBValue(lldb::SBValue &vrwValue);

  // Attribute:
private:
  CMIUtilString m_strVarName;
  MIuint m_nChildren;
  MIuint64 m_nThreadId;
  CMIUtilString m_strType;
  bool m_bValid; // True = Variable is valid, false = not valid
  CMIUtilString m_strExpression;
  CMIUtilString m_strValue;
  const CMIUtilString m_constStrArgName;
  const CMIUtilString m_constStrArgFrameAddr;
  const CMIUtilString m_constStrArgExpression;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-update".
//--
class CMICmdCmdVarUpdate : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarUpdate();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;

  // Overridden:
public:
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarUpdate() override;

  // Methods:
private:
  bool ExamineSBValueForChange(lldb::SBValue &vrwValue, bool &vrwbChanged);
  void MIFormResponse(const CMIUtilString &vrStrVarName,
                      const char *const vpValue,
                      const CMIUtilString &vrStrScope);

  // Attribute:
private:
  const CMIUtilString m_constStrArgPrintValues;
  const CMIUtilString m_constStrArgName;
  bool m_bValueChanged; // True = yes value changed, false = no change
  CMICmnMIValueList m_miValueList;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-delete".
//--
class CMICmdCmdVarDelete : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarDelete();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarDelete() override;

  // Attribute:
private:
  const CMIUtilString m_constStrArgName;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-assign".
//--
class CMICmdCmdVarAssign : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarAssign();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarAssign() override;

  // Attributes:
private:
  bool m_bOk; // True = success, false = failure
  CMIUtilString m_varObjName;
  const CMIUtilString m_constStrArgName;
  const CMIUtilString m_constStrArgExpression;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-set-format".
//--
class CMICmdCmdVarSetFormat : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarSetFormat();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarSetFormat() override;

  // Attributes:
private:
  CMIUtilString m_varObjName;
  const CMIUtilString m_constStrArgName;
  const CMIUtilString m_constStrArgFormatSpec;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-list-children".
//--
class CMICmdCmdVarListChildren : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarListChildren();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarListChildren() override;

  // Attributes:
private:
  const CMIUtilString m_constStrArgPrintValues;
  const CMIUtilString m_constStrArgName;
  const CMIUtilString m_constStrArgFrom;
  const CMIUtilString m_constStrArgTo;
  bool m_bValueValid; // True = yes SBValue object is valid, false = not valid
  MIuint m_nChildren;
  CMICmnMIValueList m_miValueList;
  bool m_bHasMore;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-evaluate-expression".
//--
class CMICmdCmdVarEvaluateExpression : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarEvaluateExpression();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarEvaluateExpression() override;

  // Attributes:
private:
  bool m_bValueValid; // True = yes SBValue object is valid, false = not valid
  CMIUtilString m_varObjName;
  const CMIUtilString m_constStrArgFormatSpec; // Not handled by *this command
  const CMIUtilString m_constStrArgName;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-info-path-expression".
//--
class CMICmdCmdVarInfoPathExpression : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarInfoPathExpression();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarInfoPathExpression() override;

  // Attributes:
private:
  bool m_bValueValid; // True = yes SBValue object is valid, false = not valid
  CMIUtilString m_strPathExpression;
  const CMIUtilString m_constStrArgName;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "var-show-attributes".
//--
class CMICmdCmdVarShowAttributes : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdVarShowAttributes();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdVarShowAttributes() override;

  // Attributes:
private:
  const CMIUtilString m_constStrArgName;
};
