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
16using namespace lldb;
17using namespace lldb_private;
18using namespace lldb_private::formatters;
19
20namespace lldb_private {
21namespace formatters {
22
23class LibcxxStdRangesRefViewSyntheticFrontEnd
24 : public SyntheticChildrenFrontEnd {
25public:
26 LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
27
28 ~LibcxxStdRangesRefViewSyntheticFrontEnd() override = default;
29
30 llvm::Expected<uint32_t> CalculateNumChildren() override {
31 // __range_ will be the sole child of this type
32 return 1;
33 }
34
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
43 bool MightHaveChildren() override { return true; }
44
45 size_t GetIndexOfChildWithName(ConstString name) override {
46 // We only have a single child
47 return 0;
48 }
49
50private:
51 /// Pointer to the dereferenced __range_ member
52 lldb::ValueObjectSP m_range_sp = nullptr;
53};
54
55lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::
56 LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
57 : SyntheticChildrenFrontEnd(*valobj_sp) {
58 if (valobj_sp)
59 Update();
60}
61
62lldb::ChildCacheState
63lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::Update() {
64 ValueObjectSP range_ptr =
65 GetChildMemberWithName(obj&: m_backend, alternative_names: {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
76lldb_private::SyntheticChildrenFrontEnd *
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

source code of lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp