//===-- SBBlock.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
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SBBlock_h_
#define LLDB_SBBlock_h_

#include "lldb/API/SBDefines.h"
#include "lldb/API/SBFrame.h"
#include "lldb/API/SBTarget.h"
#include "lldb/API/SBValueList.h"

namespace lldb {

class LLDB_API SBBlock {
public:
  SBBlock();

  SBBlock(const lldb::SBBlock &rhs);

  ~SBBlock();

  const lldb::SBBlock &operator=(const lldb::SBBlock &rhs);

  bool IsInlined() const;

  explicit operator bool() const;

  bool IsValid() const;

  const char *GetInlinedName() const;

  lldb::SBFileSpec GetInlinedCallSiteFile() const;

  uint32_t GetInlinedCallSiteLine() const;

  uint32_t GetInlinedCallSiteColumn() const;

  lldb::SBBlock GetParent();

  lldb::SBBlock GetSibling();

  lldb::SBBlock GetFirstChild();

  uint32_t GetNumRanges();

  lldb::SBAddress GetRangeStartAddress(uint32_t idx);

  lldb::SBAddress GetRangeEndAddress(uint32_t idx);

  uint32_t GetRangeIndexForBlockAddress(lldb::SBAddress block_addr);

  lldb::SBValueList GetVariables(lldb::SBFrame &frame, bool arguments,
                                 bool locals, bool statics,
                                 lldb::DynamicValueType use_dynamic);

  lldb::SBValueList GetVariables(lldb::SBTarget &target, bool arguments,
                                 bool locals, bool statics);
  /// Get the inlined block that contains this block.
  ///
  /// \return
  ///     If this block is inlined, it will return this block, else
  ///     parent blocks will be searched to see if any contain this
  ///     block and are themselves inlined. An invalid SBBlock will
  ///     be returned if this block nor any parent blocks are inlined
  ///     function blocks.
  lldb::SBBlock GetContainingInlinedBlock();

  bool GetDescription(lldb::SBStream &description);

private:
  friend class SBAddress;
  friend class SBFrame;
  friend class SBFunction;
  friend class SBSymbolContext;

  lldb_private::Block *GetPtr();

  void SetPtr(lldb_private::Block *lldb_object_ptr);

  SBBlock(lldb_private::Block *lldb_object_ptr);

  void AppendVariables(bool can_create, bool get_parent_variables,
                       lldb_private::VariableList *var_list);

  lldb_private::Block *m_opaque_ptr;
};

} // namespace lldb

#endif // LLDB_SBBlock_h_
