1*f6aab3d8Srobert //===-- LibCxxRangesRefView.cpp -------------------------------------------===// 2*f6aab3d8Srobert // 3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information. 5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*f6aab3d8Srobert // 7*f6aab3d8Srobert //===----------------------------------------------------------------------===// 8*f6aab3d8Srobert 9*f6aab3d8Srobert #include "LibCxx.h" 10*f6aab3d8Srobert 11*f6aab3d8Srobert #include "lldb/Core/ValueObject.h" 12*f6aab3d8Srobert #include "lldb/DataFormatters/FormattersHelpers.h" 13*f6aab3d8Srobert #include "lldb/Utility/ConstString.h" 14*f6aab3d8Srobert #include "llvm/ADT/APSInt.h" 15*f6aab3d8Srobert 16*f6aab3d8Srobert using namespace lldb; 17*f6aab3d8Srobert using namespace lldb_private; 18*f6aab3d8Srobert using namespace lldb_private::formatters; 19*f6aab3d8Srobert 20*f6aab3d8Srobert namespace lldb_private { 21*f6aab3d8Srobert namespace formatters { 22*f6aab3d8Srobert 23*f6aab3d8Srobert class LibcxxStdRangesRefViewSyntheticFrontEnd 24*f6aab3d8Srobert : public SyntheticChildrenFrontEnd { 25*f6aab3d8Srobert public: 26*f6aab3d8Srobert LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); 27*f6aab3d8Srobert 28*f6aab3d8Srobert ~LibcxxStdRangesRefViewSyntheticFrontEnd() override = default; 29*f6aab3d8Srobert CalculateNumChildren()30*f6aab3d8Srobert size_t CalculateNumChildren() override { 31*f6aab3d8Srobert // __range_ will be the sole child of this type 32*f6aab3d8Srobert return 1; 33*f6aab3d8Srobert } 34*f6aab3d8Srobert GetChildAtIndex(size_t idx)35*f6aab3d8Srobert lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { 36*f6aab3d8Srobert // Since we only have a single child, return it 37*f6aab3d8Srobert assert(idx == 0); 38*f6aab3d8Srobert return m_range_sp; 39*f6aab3d8Srobert } 40*f6aab3d8Srobert 41*f6aab3d8Srobert bool Update() override; 42*f6aab3d8Srobert MightHaveChildren()43*f6aab3d8Srobert bool MightHaveChildren() override { return true; } 44*f6aab3d8Srobert GetIndexOfChildWithName(ConstString name)45*f6aab3d8Srobert size_t GetIndexOfChildWithName(ConstString name) override { 46*f6aab3d8Srobert // We only have a single child 47*f6aab3d8Srobert return 0; 48*f6aab3d8Srobert } 49*f6aab3d8Srobert 50*f6aab3d8Srobert private: 51*f6aab3d8Srobert /// Pointer to the dereferenced __range_ member 52*f6aab3d8Srobert lldb::ValueObjectSP m_range_sp = nullptr; 53*f6aab3d8Srobert }; 54*f6aab3d8Srobert 55*f6aab3d8Srobert lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd:: LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)56*f6aab3d8Srobert LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) 57*f6aab3d8Srobert : SyntheticChildrenFrontEnd(*valobj_sp) { 58*f6aab3d8Srobert if (valobj_sp) 59*f6aab3d8Srobert Update(); 60*f6aab3d8Srobert } 61*f6aab3d8Srobert 62*f6aab3d8Srobert bool lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd:: Update()63*f6aab3d8Srobert Update() { 64*f6aab3d8Srobert ValueObjectSP range_ptr = 65*f6aab3d8Srobert GetChildMemberWithName(m_backend, {ConstString("__range_")}); 66*f6aab3d8Srobert if (!range_ptr) 67*f6aab3d8Srobert return false; 68*f6aab3d8Srobert 69*f6aab3d8Srobert lldb_private::Status error; 70*f6aab3d8Srobert m_range_sp = range_ptr->Dereference(error); 71*f6aab3d8Srobert 72*f6aab3d8Srobert return error.Success(); 73*f6aab3d8Srobert } 74*f6aab3d8Srobert 75*f6aab3d8Srobert lldb_private::SyntheticChildrenFrontEnd * LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *,lldb::ValueObjectSP valobj_sp)76*f6aab3d8SrobertLibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *, 77*f6aab3d8Srobert lldb::ValueObjectSP valobj_sp) { 78*f6aab3d8Srobert if (!valobj_sp) 79*f6aab3d8Srobert return nullptr; 80*f6aab3d8Srobert CompilerType type = valobj_sp->GetCompilerType(); 81*f6aab3d8Srobert if (!type.IsValid()) 82*f6aab3d8Srobert return nullptr; 83*f6aab3d8Srobert return new LibcxxStdRangesRefViewSyntheticFrontEnd(valobj_sp); 84*f6aab3d8Srobert } 85*f6aab3d8Srobert 86*f6aab3d8Srobert } // namespace formatters 87*f6aab3d8Srobert } // namespace lldb_private 88