//===-- LibCxxRangesRefView.cpp -------------------------------------------===//
//
// 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 "LibCxx.h"

#include "lldb/DataFormatters/FormattersHelpers.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/ValueObject/ValueObject.h"
#include "llvm/ADT/APSInt.h"

using namespace lldb;
using namespace lldb_private;
using namespace lldb_private::formatters;

namespace lldb_private {
namespace formatters {

class LibcxxStdRangesRefViewSyntheticFrontEnd
    : public SyntheticChildrenFrontEnd {
public:
  LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);

  ~LibcxxStdRangesRefViewSyntheticFrontEnd() override = default;

  llvm::Expected<uint32_t> CalculateNumChildren() override {
    // __range_ will be the sole child of this type
    return 1;
  }

  lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override {
    // Since we only have a single child, return it
    assert(idx == 0);
    return m_range_sp;
  }

  lldb::ChildCacheState Update() override;

  bool MightHaveChildren() override { return true; }

  size_t GetIndexOfChildWithName(ConstString name) override {
    // We only have a single child
    return 0;
  }

private:
  /// Pointer to the dereferenced __range_ member
  lldb::ValueObjectSP m_range_sp = nullptr;
};

lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::
    LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
    : SyntheticChildrenFrontEnd(*valobj_sp) {
  if (valobj_sp)
    Update();
}

lldb::ChildCacheState
lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::Update() {
  ValueObjectSP range_ptr =
      GetChildMemberWithName(m_backend, {ConstString("__range_")});
  if (!range_ptr)
    return lldb::ChildCacheState::eRefetch;

  lldb_private::Status error;
  m_range_sp = range_ptr->Dereference(error);

  return error.Success() ? lldb::ChildCacheState::eReuse
                         : lldb::ChildCacheState::eRefetch;
}

lldb_private::SyntheticChildrenFrontEnd *
LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *,
                                               lldb::ValueObjectSP valobj_sp) {
  if (!valobj_sp)
    return nullptr;
  CompilerType type = valobj_sp->GetCompilerType();
  if (!type.IsValid())
    return nullptr;
  return new LibcxxStdRangesRefViewSyntheticFrontEnd(valobj_sp);
}

} // namespace formatters
} // namespace lldb_private
