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