1//===-- ValueObjectPrinter.h ---------------------------------------*- C++
2//-*-===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H
11#define LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H
12
13#include "lldb/lldb-private.h"
14#include "lldb/lldb-public.h"
15
16#include "lldb/Utility/Flags.h"
17
18#include "lldb/DataFormatters/DumpValueObjectOptions.h"
19#include "lldb/Symbol/CompilerType.h"
20
21namespace lldb_private {
22
23class ValueObjectPrinter {
24public:
25 ValueObjectPrinter(ValueObject *valobj, Stream *s);
26
27 ValueObjectPrinter(ValueObject *valobj, Stream *s,
28 const DumpValueObjectOptions &options);
29
30 ~ValueObjectPrinter() {}
31
32 bool PrintValueObject();
33
34protected:
35 typedef std::set<uint64_t> InstancePointersSet;
36 typedef std::shared_ptr<InstancePointersSet> InstancePointersSetSP;
37
38 InstancePointersSetSP m_printed_instance_pointers;
39
40 // only this class (and subclasses, if any) should ever be concerned with the
41 // depth mechanism
42 ValueObjectPrinter(ValueObject *valobj, Stream *s,
43 const DumpValueObjectOptions &options,
44 const DumpValueObjectOptions::PointerDepth &ptr_depth,
45 uint32_t curr_depth,
46 InstancePointersSetSP printed_instance_pointers);
47
48 // we should actually be using delegating constructors here but some versions
49 // of GCC still have trouble with those
50 void Init(ValueObject *valobj, Stream *s,
51 const DumpValueObjectOptions &options,
52 const DumpValueObjectOptions::PointerDepth &ptr_depth,
53 uint32_t curr_depth,
54 InstancePointersSetSP printed_instance_pointers);
55
56 bool GetMostSpecializedValue();
57
58 const char *GetDescriptionForDisplay();
59
60 const char *GetRootNameForDisplay();
61
62 bool ShouldPrintValueObject();
63
64 bool IsNil();
65
66 bool IsUninitialized();
67
68 bool IsPtr();
69
70 bool IsRef();
71
72 bool IsInstancePointer();
73
74 bool IsAggregate();
75
76 bool PrintLocationIfNeeded();
77
78 void PrintDecl();
79
80 bool CheckScopeIfNeeded();
81
82 bool ShouldPrintEmptyBrackets(bool value_printed, bool summary_printed);
83
84 TypeSummaryImpl *GetSummaryFormatter(bool null_if_omitted = true);
85
86 void GetValueSummaryError(std::string &value, std::string &summary,
87 std::string &error);
88
89 bool PrintValueAndSummaryIfNeeded(bool &value_printed, bool &summary_printed);
90
91 bool PrintObjectDescriptionIfNeeded(bool value_printed, bool summary_printed);
92
93 bool
94 ShouldPrintChildren(bool is_failed_description,
95 DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
96
97 bool ShouldExpandEmptyAggregates();
98
99 ValueObject *GetValueObjectForChildrenGeneration();
100
101 void PrintChildrenPreamble();
102
103 void PrintChildrenPostamble(bool print_dotdotdot);
104
105 lldb::ValueObjectSP GenerateChild(ValueObject *synth_valobj, size_t idx);
106
107 void PrintChild(lldb::ValueObjectSP child_sp,
108 const DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
109
110 uint32_t GetMaxNumChildrenToPrint(bool &print_dotdotdot);
111
112 void
113 PrintChildren(bool value_printed, bool summary_printed,
114 const DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
115
116 void PrintChildrenIfNeeded(bool value_printed, bool summary_printed);
117
118 bool PrintChildrenOneLiner(bool hide_names);
119
120private:
121 ValueObject *m_orig_valobj;
122 ValueObject *m_valobj;
123 Stream *m_stream;
124 DumpValueObjectOptions m_options;
125 Flags m_type_flags;
126 CompilerType m_compiler_type;
127 DumpValueObjectOptions::PointerDepth m_ptr_depth;
128 uint32_t m_curr_depth;
129 LazyBool m_should_print;
130 LazyBool m_is_nil;
131 LazyBool m_is_uninit;
132 LazyBool m_is_ptr;
133 LazyBool m_is_ref;
134 LazyBool m_is_aggregate;
135 LazyBool m_is_instance_ptr;
136 std::pair<TypeSummaryImpl *, bool> m_summary_formatter;
137 std::string m_value;
138 std::string m_summary;
139 std::string m_error;
140 bool m_val_summary_ok;
141
142 friend struct StringSummaryFormat;
143
144 ValueObjectPrinter(const ValueObjectPrinter &) = delete;
145 const ValueObjectPrinter &operator=(const ValueObjectPrinter &) = delete;
146};
147
148} // namespace lldb_private
149
150#endif // LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H
151