180814287SRaphael Isemann //===-- SBTypeSummary.cpp -------------------------------------------------===//
2061858ceSEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061858ceSEnrico Granata //
7061858ceSEnrico Granata //===----------------------------------------------------------------------===//
8061858ceSEnrico Granata 
9061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h"
10bd4bf82aSJonas Devlieghere #include "Utils.h"
11061858ceSEnrico Granata #include "lldb/API/SBStream.h"
1274b8f4cbSDawn Perchik #include "lldb/API/SBValue.h"
135548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
14*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
15061858ceSEnrico Granata 
16da7cb142SEnrico Granata #include "llvm/Support/Casting.h"
17da7cb142SEnrico Granata 
18061858ceSEnrico Granata using namespace lldb;
19061858ceSEnrico Granata using namespace lldb_private;
20061858ceSEnrico Granata 
SBTypeSummaryOptions()21baf5664fSJonas Devlieghere SBTypeSummaryOptions::SBTypeSummaryOptions() {
22*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
23baf5664fSJonas Devlieghere 
241c0bbe43SJonas Devlieghere   m_opaque_up = std::make_unique<TypeSummaryOptions>();
25baf5664fSJonas Devlieghere }
26c1247f55SEnrico Granata 
SBTypeSummaryOptions(const lldb::SBTypeSummaryOptions & rhs)27b9c1b51eSKate Stone SBTypeSummaryOptions::SBTypeSummaryOptions(
28b9c1b51eSKate Stone     const lldb::SBTypeSummaryOptions &rhs) {
29*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
30baf5664fSJonas Devlieghere 
31bd4bf82aSJonas Devlieghere   m_opaque_up = clone(rhs.m_opaque_up);
32c1247f55SEnrico Granata }
33c1247f55SEnrico Granata 
34866b7a65SJonas Devlieghere SBTypeSummaryOptions::~SBTypeSummaryOptions() = default;
35c1247f55SEnrico Granata 
IsValid()36baf5664fSJonas Devlieghere bool SBTypeSummaryOptions::IsValid() {
37*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
387f5237bcSPavel Labath   return this->operator bool();
397f5237bcSPavel Labath }
operator bool() const407f5237bcSPavel Labath SBTypeSummaryOptions::operator bool() const {
41*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
42baf5664fSJonas Devlieghere 
43baf5664fSJonas Devlieghere   return m_opaque_up.get();
44baf5664fSJonas Devlieghere }
45c1247f55SEnrico Granata 
GetLanguage()46b9c1b51eSKate Stone lldb::LanguageType SBTypeSummaryOptions::GetLanguage() {
47*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
48baf5664fSJonas Devlieghere 
49c1247f55SEnrico Granata   if (IsValid())
50d5b44036SJonas Devlieghere     return m_opaque_up->GetLanguage();
51c1247f55SEnrico Granata   return lldb::eLanguageTypeUnknown;
52c1247f55SEnrico Granata }
53c1247f55SEnrico Granata 
GetCapping()54b9c1b51eSKate Stone lldb::TypeSummaryCapping SBTypeSummaryOptions::GetCapping() {
55*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
56baf5664fSJonas Devlieghere 
57c1247f55SEnrico Granata   if (IsValid())
58d5b44036SJonas Devlieghere     return m_opaque_up->GetCapping();
59c1247f55SEnrico Granata   return eTypeSummaryCapped;
60c1247f55SEnrico Granata }
61c1247f55SEnrico Granata 
SetLanguage(lldb::LanguageType l)62b9c1b51eSKate Stone void SBTypeSummaryOptions::SetLanguage(lldb::LanguageType l) {
63*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, l);
64baf5664fSJonas Devlieghere 
65c1247f55SEnrico Granata   if (IsValid())
66d5b44036SJonas Devlieghere     m_opaque_up->SetLanguage(l);
67c1247f55SEnrico Granata }
68c1247f55SEnrico Granata 
SetCapping(lldb::TypeSummaryCapping c)69b9c1b51eSKate Stone void SBTypeSummaryOptions::SetCapping(lldb::TypeSummaryCapping c) {
70*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, c);
71baf5664fSJonas Devlieghere 
72c1247f55SEnrico Granata   if (IsValid())
73d5b44036SJonas Devlieghere     m_opaque_up->SetCapping(c);
74c1247f55SEnrico Granata }
75c1247f55SEnrico Granata 
operator ->()76b9c1b51eSKate Stone lldb_private::TypeSummaryOptions *SBTypeSummaryOptions::operator->() {
77d5b44036SJonas Devlieghere   return m_opaque_up.get();
78c1247f55SEnrico Granata }
79c1247f55SEnrico Granata 
80b9c1b51eSKate Stone const lldb_private::TypeSummaryOptions *SBTypeSummaryOptions::
operator ->() const81b9c1b51eSKate Stone operator->() const {
82d5b44036SJonas Devlieghere   return m_opaque_up.get();
83c1247f55SEnrico Granata }
84c1247f55SEnrico Granata 
get()85b9c1b51eSKate Stone lldb_private::TypeSummaryOptions *SBTypeSummaryOptions::get() {
86d5b44036SJonas Devlieghere   return m_opaque_up.get();
87c1247f55SEnrico Granata }
88c1247f55SEnrico Granata 
ref()89b9c1b51eSKate Stone lldb_private::TypeSummaryOptions &SBTypeSummaryOptions::ref() {
90d5b44036SJonas Devlieghere   return *m_opaque_up;
91c1247f55SEnrico Granata }
92c1247f55SEnrico Granata 
ref() const93b9c1b51eSKate Stone const lldb_private::TypeSummaryOptions &SBTypeSummaryOptions::ref() const {
94d5b44036SJonas Devlieghere   return *m_opaque_up;
95c1247f55SEnrico Granata }
96c1247f55SEnrico Granata 
SBTypeSummaryOptions(const lldb_private::TypeSummaryOptions & lldb_object)97b9c1b51eSKate Stone SBTypeSummaryOptions::SBTypeSummaryOptions(
982efc6892SPavel Labath     const lldb_private::TypeSummaryOptions &lldb_object)
992efc6892SPavel Labath     : m_opaque_up(std::make_unique<TypeSummaryOptions>(lldb_object)) {
100*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, lldb_object);
101c1247f55SEnrico Granata }
102c1247f55SEnrico Granata 
SBTypeSummary()103*1755f5b1SJonas Devlieghere SBTypeSummary::SBTypeSummary() { LLDB_INSTRUMENT_VA(this); }
104061858ceSEnrico Granata 
CreateWithSummaryString(const char * data,uint32_t options)105b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithSummaryString(const char *data,
106b9c1b51eSKate Stone                                                      uint32_t options) {
107*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(data, options);
108061858ceSEnrico Granata 
109baf5664fSJonas Devlieghere   if (!data || data[0] == 0)
110d232abc3SJonas Devlieghere     return SBTypeSummary();
111baf5664fSJonas Devlieghere 
112d232abc3SJonas Devlieghere   return SBTypeSummary(
113d232abc3SJonas Devlieghere       TypeSummaryImplSP(new StringSummaryFormat(options, data)));
114061858ceSEnrico Granata }
115061858ceSEnrico Granata 
CreateWithFunctionName(const char * data,uint32_t options)116b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithFunctionName(const char *data,
117b9c1b51eSKate Stone                                                     uint32_t options) {
118*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(data, options);
119061858ceSEnrico Granata 
120baf5664fSJonas Devlieghere   if (!data || data[0] == 0)
121d232abc3SJonas Devlieghere     return SBTypeSummary();
122baf5664fSJonas Devlieghere 
123d232abc3SJonas Devlieghere   return SBTypeSummary(
124d232abc3SJonas Devlieghere       TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
125061858ceSEnrico Granata }
126061858ceSEnrico Granata 
CreateWithScriptCode(const char * data,uint32_t options)127b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithScriptCode(const char *data,
128b9c1b51eSKate Stone                                                   uint32_t options) {
129*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(data, options);
130061858ceSEnrico Granata 
131baf5664fSJonas Devlieghere   if (!data || data[0] == 0)
132d232abc3SJonas Devlieghere     return SBTypeSummary();
133baf5664fSJonas Devlieghere 
134d232abc3SJonas Devlieghere   return SBTypeSummary(
135d232abc3SJonas Devlieghere       TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
136061858ceSEnrico Granata }
137061858ceSEnrico Granata 
CreateWithCallback(FormatCallback cb,uint32_t options,const char * description)138b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithCallback(FormatCallback cb,
139b9c1b51eSKate Stone                                                 uint32_t options,
140b9c1b51eSKate Stone                                                 const char *description) {
141*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(cb, options, description);
1420d7b0c96SJonas Devlieghere 
143e7cbaf3eSEnrico Granata   SBTypeSummary retval;
144b9c1b51eSKate Stone   if (cb) {
145b9c1b51eSKate Stone     retval.SetSP(TypeSummaryImplSP(new CXXFunctionSummaryFormat(
146b9c1b51eSKate Stone         options,
147b9c1b51eSKate Stone         [cb](ValueObject &valobj, Stream &stm,
148b9c1b51eSKate Stone              const TypeSummaryOptions &opt) -> bool {
1492592fb96SSean Callanan           SBStream stream;
150e7cbaf3eSEnrico Granata           SBValue sb_value(valobj.GetSP());
1512efc6892SPavel Labath           SBTypeSummaryOptions options(opt);
152e7cbaf3eSEnrico Granata           if (!cb(sb_value, options, stream))
1538826519eSDawn Perchik             return false;
1548826519eSDawn Perchik           stm.Write(stream.GetData(), stream.GetSize());
1558826519eSDawn Perchik           return true;
1568826519eSDawn Perchik         },
157e7cbaf3eSEnrico Granata         description ? description : "callback summary formatter")));
158e7cbaf3eSEnrico Granata   }
159e7cbaf3eSEnrico Granata 
160e7cbaf3eSEnrico Granata   return retval;
1618826519eSDawn Perchik }
1628826519eSDawn Perchik 
SBTypeSummary(const lldb::SBTypeSummary & rhs)163b9c1b51eSKate Stone SBTypeSummary::SBTypeSummary(const lldb::SBTypeSummary &rhs)
164baf5664fSJonas Devlieghere     : m_opaque_sp(rhs.m_opaque_sp) {
165*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
166baf5664fSJonas Devlieghere }
167061858ceSEnrico Granata 
168866b7a65SJonas Devlieghere SBTypeSummary::~SBTypeSummary() = default;
169061858ceSEnrico Granata 
IsValid() const170baf5664fSJonas Devlieghere bool SBTypeSummary::IsValid() const {
171*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1727f5237bcSPavel Labath   return this->operator bool();
1737f5237bcSPavel Labath }
operator bool() const1747f5237bcSPavel Labath SBTypeSummary::operator bool() const {
175*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
176baf5664fSJonas Devlieghere 
177248a1305SKonrad Kleine   return m_opaque_sp.get() != nullptr;
178baf5664fSJonas Devlieghere }
179061858ceSEnrico Granata 
IsFunctionCode()180b9c1b51eSKate Stone bool SBTypeSummary::IsFunctionCode() {
181*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
182baf5664fSJonas Devlieghere 
183061858ceSEnrico Granata   if (!IsValid())
184061858ceSEnrico Granata     return false;
185b9c1b51eSKate Stone   if (ScriptSummaryFormat *script_summary_ptr =
186b9c1b51eSKate Stone           llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
187061858ceSEnrico Granata     const char *ftext = script_summary_ptr->GetPythonScript();
188061858ceSEnrico Granata     return (ftext && *ftext != 0);
189061858ceSEnrico Granata   }
190061858ceSEnrico Granata   return false;
191061858ceSEnrico Granata }
192061858ceSEnrico Granata 
IsFunctionName()193b9c1b51eSKate Stone bool SBTypeSummary::IsFunctionName() {
194*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
195baf5664fSJonas Devlieghere 
196061858ceSEnrico Granata   if (!IsValid())
197061858ceSEnrico Granata     return false;
198b9c1b51eSKate Stone   if (ScriptSummaryFormat *script_summary_ptr =
199b9c1b51eSKate Stone           llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
200061858ceSEnrico Granata     const char *ftext = script_summary_ptr->GetPythonScript();
201061858ceSEnrico Granata     return (!ftext || *ftext == 0);
202061858ceSEnrico Granata   }
203061858ceSEnrico Granata   return false;
204061858ceSEnrico Granata }
205061858ceSEnrico Granata 
IsSummaryString()206b9c1b51eSKate Stone bool SBTypeSummary::IsSummaryString() {
207*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
208baf5664fSJonas Devlieghere 
209061858ceSEnrico Granata   if (!IsValid())
210061858ceSEnrico Granata     return false;
211061858ceSEnrico Granata 
212da7cb142SEnrico Granata   return m_opaque_sp->GetKind() == TypeSummaryImpl::Kind::eSummaryString;
213061858ceSEnrico Granata }
214061858ceSEnrico Granata 
GetData()215b9c1b51eSKate Stone const char *SBTypeSummary::GetData() {
216*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
217baf5664fSJonas Devlieghere 
218061858ceSEnrico Granata   if (!IsValid())
219248a1305SKonrad Kleine     return nullptr;
220b9c1b51eSKate Stone   if (ScriptSummaryFormat *script_summary_ptr =
221b9c1b51eSKate Stone           llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
222061858ceSEnrico Granata     const char *fname = script_summary_ptr->GetFunctionName();
223061858ceSEnrico Granata     const char *ftext = script_summary_ptr->GetPythonScript();
224061858ceSEnrico Granata     if (ftext && *ftext)
225061858ceSEnrico Granata       return ftext;
226061858ceSEnrico Granata     return fname;
227b9c1b51eSKate Stone   } else if (StringSummaryFormat *string_summary_ptr =
228b9c1b51eSKate Stone                  llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get()))
229061858ceSEnrico Granata     return string_summary_ptr->GetSummaryString();
230da7cb142SEnrico Granata   return nullptr;
231061858ceSEnrico Granata }
232061858ceSEnrico Granata 
GetOptions()233b9c1b51eSKate Stone uint32_t SBTypeSummary::GetOptions() {
234*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
235baf5664fSJonas Devlieghere 
236061858ceSEnrico Granata   if (!IsValid())
237061858ceSEnrico Granata     return lldb::eTypeOptionNone;
238061858ceSEnrico Granata   return m_opaque_sp->GetOptions();
239061858ceSEnrico Granata }
240061858ceSEnrico Granata 
SetOptions(uint32_t value)241b9c1b51eSKate Stone void SBTypeSummary::SetOptions(uint32_t value) {
242*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, value);
243baf5664fSJonas Devlieghere 
244061858ceSEnrico Granata   if (!CopyOnWrite_Impl())
245061858ceSEnrico Granata     return;
246061858ceSEnrico Granata   m_opaque_sp->SetOptions(value);
247061858ceSEnrico Granata }
248061858ceSEnrico Granata 
SetSummaryString(const char * data)249b9c1b51eSKate Stone void SBTypeSummary::SetSummaryString(const char *data) {
250*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data);
251baf5664fSJonas Devlieghere 
252061858ceSEnrico Granata   if (!IsValid())
253061858ceSEnrico Granata     return;
254da7cb142SEnrico Granata   if (!llvm::isa<StringSummaryFormat>(m_opaque_sp.get()))
255061858ceSEnrico Granata     ChangeSummaryType(false);
256b9c1b51eSKate Stone   if (StringSummaryFormat *string_summary_ptr =
257b9c1b51eSKate Stone           llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get()))
258da7cb142SEnrico Granata     string_summary_ptr->SetSummaryString(data);
259061858ceSEnrico Granata }
260061858ceSEnrico Granata 
SetFunctionName(const char * data)261b9c1b51eSKate Stone void SBTypeSummary::SetFunctionName(const char *data) {
262*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data);
263baf5664fSJonas Devlieghere 
264061858ceSEnrico Granata   if (!IsValid())
265061858ceSEnrico Granata     return;
266da7cb142SEnrico Granata   if (!llvm::isa<ScriptSummaryFormat>(m_opaque_sp.get()))
267061858ceSEnrico Granata     ChangeSummaryType(true);
268b9c1b51eSKate Stone   if (ScriptSummaryFormat *script_summary_ptr =
269b9c1b51eSKate Stone           llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
270da7cb142SEnrico Granata     script_summary_ptr->SetFunctionName(data);
271061858ceSEnrico Granata }
272061858ceSEnrico Granata 
SetFunctionCode(const char * data)273b9c1b51eSKate Stone void SBTypeSummary::SetFunctionCode(const char *data) {
274*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data);
275baf5664fSJonas Devlieghere 
276061858ceSEnrico Granata   if (!IsValid())
277061858ceSEnrico Granata     return;
278da7cb142SEnrico Granata   if (!llvm::isa<ScriptSummaryFormat>(m_opaque_sp.get()))
279061858ceSEnrico Granata     ChangeSummaryType(true);
280b9c1b51eSKate Stone   if (ScriptSummaryFormat *script_summary_ptr =
281b9c1b51eSKate Stone           llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
282da7cb142SEnrico Granata     script_summary_ptr->SetPythonScript(data);
283061858ceSEnrico Granata }
284061858ceSEnrico Granata 
GetDescription(lldb::SBStream & description,lldb::DescriptionLevel description_level)285b9c1b51eSKate Stone bool SBTypeSummary::GetDescription(lldb::SBStream &description,
286b9c1b51eSKate Stone                                    lldb::DescriptionLevel description_level) {
287*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description, description_level);
288baf5664fSJonas Devlieghere 
289061858ceSEnrico Granata   if (!CopyOnWrite_Impl())
290061858ceSEnrico Granata     return false;
291061858ceSEnrico Granata   else {
292b9c1b51eSKate Stone     description.Printf("%s\n", m_opaque_sp->GetDescription().c_str());
293061858ceSEnrico Granata     return true;
294061858ceSEnrico Granata   }
295061858ceSEnrico Granata }
296061858ceSEnrico Granata 
DoesPrintValue(lldb::SBValue value)297b9c1b51eSKate Stone bool SBTypeSummary::DoesPrintValue(lldb::SBValue value) {
298*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, value);
299baf5664fSJonas Devlieghere 
30074b8f4cbSDawn Perchik   if (!IsValid())
30174b8f4cbSDawn Perchik     return false;
30274b8f4cbSDawn Perchik   lldb::ValueObjectSP value_sp = value.GetSP();
30374b8f4cbSDawn Perchik   return m_opaque_sp->DoesPrintValue(value_sp.get());
30474b8f4cbSDawn Perchik }
30574b8f4cbSDawn Perchik 
operator =(const lldb::SBTypeSummary & rhs)306b9c1b51eSKate Stone lldb::SBTypeSummary &SBTypeSummary::operator=(const lldb::SBTypeSummary &rhs) {
307*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
308baf5664fSJonas Devlieghere 
309b9c1b51eSKate Stone   if (this != &rhs) {
310061858ceSEnrico Granata     m_opaque_sp = rhs.m_opaque_sp;
311061858ceSEnrico Granata   }
312d232abc3SJonas Devlieghere   return *this;
313061858ceSEnrico Granata }
314061858ceSEnrico Granata 
operator ==(lldb::SBTypeSummary & rhs)315b9c1b51eSKate Stone bool SBTypeSummary::operator==(lldb::SBTypeSummary &rhs) {
316*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
317baf5664fSJonas Devlieghere 
318a6682a41SJonas Devlieghere   if (!IsValid())
319061858ceSEnrico Granata     return !rhs.IsValid();
320061858ceSEnrico Granata   return m_opaque_sp == rhs.m_opaque_sp;
321061858ceSEnrico Granata }
322061858ceSEnrico Granata 
IsEqualTo(lldb::SBTypeSummary & rhs)323b9c1b51eSKate Stone bool SBTypeSummary::IsEqualTo(lldb::SBTypeSummary &rhs) {
324*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
325baf5664fSJonas Devlieghere 
326b9c1b51eSKate Stone   if (IsValid()) {
327204aa1d9SEnrico Granata     // valid and invalid are different
328204aa1d9SEnrico Granata     if (!rhs.IsValid())
329204aa1d9SEnrico Granata       return false;
330b9c1b51eSKate Stone   } else {
331204aa1d9SEnrico Granata     // invalid and valid are different
332204aa1d9SEnrico Granata     if (rhs.IsValid())
333204aa1d9SEnrico Granata       return false;
334204aa1d9SEnrico Granata     else
335204aa1d9SEnrico Granata       // both invalid are the same
336204aa1d9SEnrico Granata       return true;
337204aa1d9SEnrico Granata   }
338061858ceSEnrico Granata 
339da7cb142SEnrico Granata   if (m_opaque_sp->GetKind() != rhs.m_opaque_sp->GetKind())
3403467d80bSEnrico Granata     return false;
3413467d80bSEnrico Granata 
342b9c1b51eSKate Stone   switch (m_opaque_sp->GetKind()) {
343da7cb142SEnrico Granata   case TypeSummaryImpl::Kind::eCallback:
344b9c1b51eSKate Stone     return llvm::dyn_cast<CXXFunctionSummaryFormat>(m_opaque_sp.get()) ==
345b9c1b51eSKate Stone            llvm::dyn_cast<CXXFunctionSummaryFormat>(rhs.m_opaque_sp.get());
346da7cb142SEnrico Granata   case TypeSummaryImpl::Kind::eScript:
347061858ceSEnrico Granata     if (IsFunctionCode() != rhs.IsFunctionCode())
348061858ceSEnrico Granata       return false;
349061858ceSEnrico Granata     if (IsFunctionName() != rhs.IsFunctionName())
350061858ceSEnrico Granata       return false;
351061858ceSEnrico Granata     return GetOptions() == rhs.GetOptions();
352da7cb142SEnrico Granata   case TypeSummaryImpl::Kind::eSummaryString:
353da7cb142SEnrico Granata     if (IsSummaryString() != rhs.IsSummaryString())
354da7cb142SEnrico Granata       return false;
355da7cb142SEnrico Granata     return GetOptions() == rhs.GetOptions();
356204aa1d9SEnrico Granata   case TypeSummaryImpl::Kind::eInternal:
357204aa1d9SEnrico Granata     return (m_opaque_sp.get() == rhs.m_opaque_sp.get());
358da7cb142SEnrico Granata   }
359061858ceSEnrico Granata 
360da7cb142SEnrico Granata   return false;
361061858ceSEnrico Granata }
362061858ceSEnrico Granata 
operator !=(lldb::SBTypeSummary & rhs)363b9c1b51eSKate Stone bool SBTypeSummary::operator!=(lldb::SBTypeSummary &rhs) {
364*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
365baf5664fSJonas Devlieghere 
366a6682a41SJonas Devlieghere   if (!IsValid())
367061858ceSEnrico Granata     return !rhs.IsValid();
368061858ceSEnrico Granata   return m_opaque_sp != rhs.m_opaque_sp;
369061858ceSEnrico Granata }
370061858ceSEnrico Granata 
GetSP()371b9c1b51eSKate Stone lldb::TypeSummaryImplSP SBTypeSummary::GetSP() { return m_opaque_sp; }
372061858ceSEnrico Granata 
SetSP(const lldb::TypeSummaryImplSP & typesummary_impl_sp)373b9c1b51eSKate Stone void SBTypeSummary::SetSP(const lldb::TypeSummaryImplSP &typesummary_impl_sp) {
374061858ceSEnrico Granata   m_opaque_sp = typesummary_impl_sp;
375061858ceSEnrico Granata }
376061858ceSEnrico Granata 
SBTypeSummary(const lldb::TypeSummaryImplSP & typesummary_impl_sp)377b9c1b51eSKate Stone SBTypeSummary::SBTypeSummary(const lldb::TypeSummaryImplSP &typesummary_impl_sp)
378b9c1b51eSKate Stone     : m_opaque_sp(typesummary_impl_sp) {}
379061858ceSEnrico Granata 
CopyOnWrite_Impl()380b9c1b51eSKate Stone bool SBTypeSummary::CopyOnWrite_Impl() {
381061858ceSEnrico Granata   if (!IsValid())
382061858ceSEnrico Granata     return false;
3833467d80bSEnrico Granata 
384061858ceSEnrico Granata   if (m_opaque_sp.unique())
385061858ceSEnrico Granata     return true;
386061858ceSEnrico Granata 
387061858ceSEnrico Granata   TypeSummaryImplSP new_sp;
388061858ceSEnrico Granata 
389b9c1b51eSKate Stone   if (CXXFunctionSummaryFormat *current_summary_ptr =
390b9c1b51eSKate Stone           llvm::dyn_cast<CXXFunctionSummaryFormat>(m_opaque_sp.get())) {
391b9c1b51eSKate Stone     new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(
392b9c1b51eSKate Stone         GetOptions(), current_summary_ptr->m_impl,
3933467d80bSEnrico Granata         current_summary_ptr->m_description.c_str()));
394b9c1b51eSKate Stone   } else if (ScriptSummaryFormat *current_summary_ptr =
395b9c1b51eSKate Stone                  llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
396b9c1b51eSKate Stone     new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(
397b9c1b51eSKate Stone         GetOptions(), current_summary_ptr->GetFunctionName(),
398061858ceSEnrico Granata         current_summary_ptr->GetPythonScript()));
399b9c1b51eSKate Stone   } else if (StringSummaryFormat *current_summary_ptr =
400b9c1b51eSKate Stone                  llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get())) {
401b9c1b51eSKate Stone     new_sp = TypeSummaryImplSP(new StringSummaryFormat(
402b9c1b51eSKate Stone         GetOptions(), current_summary_ptr->GetSummaryString()));
403061858ceSEnrico Granata   }
404061858ceSEnrico Granata 
405061858ceSEnrico Granata   SetSP(new_sp);
406061858ceSEnrico Granata 
407da7cb142SEnrico Granata   return nullptr != new_sp.get();
408061858ceSEnrico Granata }
409061858ceSEnrico Granata 
ChangeSummaryType(bool want_script)410b9c1b51eSKate Stone bool SBTypeSummary::ChangeSummaryType(bool want_script) {
411061858ceSEnrico Granata   if (!IsValid())
412061858ceSEnrico Granata     return false;
413061858ceSEnrico Granata 
414061858ceSEnrico Granata   TypeSummaryImplSP new_sp;
415061858ceSEnrico Granata 
416b9c1b51eSKate Stone   if (want_script ==
417b9c1b51eSKate Stone       (m_opaque_sp->GetKind() == TypeSummaryImpl::Kind::eScript)) {
418b9c1b51eSKate Stone     if (m_opaque_sp->GetKind() ==
419b9c1b51eSKate Stone             lldb_private::TypeSummaryImpl::Kind::eCallback &&
420b9c1b51eSKate Stone         !want_script)
4213467d80bSEnrico Granata       new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
4223467d80bSEnrico Granata     else
4233467d80bSEnrico Granata       return CopyOnWrite_Impl();
4243467d80bSEnrico Granata   }
4253467d80bSEnrico Granata 
426b9c1b51eSKate Stone   if (!new_sp) {
427061858ceSEnrico Granata     if (want_script)
428061858ceSEnrico Granata       new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
429061858ceSEnrico Granata     else
430061858ceSEnrico Granata       new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
4313467d80bSEnrico Granata   }
432061858ceSEnrico Granata 
433061858ceSEnrico Granata   SetSP(new_sp);
434061858ceSEnrico Granata 
435061858ceSEnrico Granata   return true;
436061858ceSEnrico Granata }
437