blob: aaf906051713fe1e1dac69f874232d31fbbe6526 [file] [log] [blame]
Pavel Labath333739d2017-11-01 15:19:52 +00001//===-- LibCxxTuple.cpp -----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "LibCxx.h"
11#include "lldb/DataFormatters/FormattersHelpers.h"
12
13using namespace lldb;
14using namespace lldb_private;
15
16namespace {
17
18class TupleFrontEnd: public SyntheticChildrenFrontEnd {
19public:
20 TupleFrontEnd(ValueObject &valobj) : SyntheticChildrenFrontEnd(valobj) {
21 Update();
22 }
23
24 size_t GetIndexOfChildWithName(const ConstString &name) override {
25 return formatters::ExtractIndexFromString(name.GetCString());
26 }
27
28 bool MightHaveChildren() override { return true; }
29 bool Update() override;
30 size_t CalculateNumChildren() override { return m_elements.size(); }
31 ValueObjectSP GetChildAtIndex(size_t idx) override;
32
33private:
34 std::vector<ValueObjectSP> m_elements;
35 ValueObjectSP m_base_sp;
36};
37}
38
39bool TupleFrontEnd::Update() {
40 m_elements.clear();
41 m_base_sp = m_backend.GetChildMemberWithName(ConstString("base_"), true);
42 if (! m_base_sp)
43 return false;
44 m_elements.assign(m_base_sp->GetCompilerType().GetNumDirectBaseClasses(),
45 ValueObjectSP());
46 return false;
47}
48
49ValueObjectSP TupleFrontEnd::GetChildAtIndex(size_t idx) {
50 if (idx >= m_elements.size())
51 return ValueObjectSP();
52 if (!m_base_sp)
53 return ValueObjectSP();
54 if (m_elements[idx])
55 return m_elements[idx];
56
57 CompilerType holder_type =
58 m_base_sp->GetCompilerType().GetDirectBaseClassAtIndex(idx, nullptr);
59 if (!holder_type)
60 return ValueObjectSP();
61 ValueObjectSP holder_sp = m_base_sp->GetChildAtIndex(idx, true);
62 if (!holder_sp)
63 return ValueObjectSP();
64
65 ValueObjectSP elem_sp = holder_sp->GetChildAtIndex(0, true);
66 if (elem_sp)
67 m_elements[idx] =
68 elem_sp->Clone(ConstString(llvm::formatv("[{0}]", idx).str()));
69
70 return m_elements[idx];
71}
72
73SyntheticChildrenFrontEnd *
74formatters::LibcxxTupleFrontEndCreator(CXXSyntheticChildren *,
75 lldb::ValueObjectSP valobj_sp) {
76 if (valobj_sp)
77 return new TupleFrontEnd(*valobj_sp);
78 return nullptr;
79}