xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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*f6aab3d8Srobert LibcxxStdRangesRefViewSyntheticFrontEndCreator(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