Skip to content

Commit 54bd047

Browse files
committed
Surface errors in GetNumChildren.
This patch will allow displaying unresolved types in composite types as errors instead of "{}" empty types. rdar://123794838
1 parent 31e4366 commit 54bd047

24 files changed

+262
-151
lines changed

lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,12 @@ bool lldb_private::formatters::swift::IndexPath_SummaryProvider(
131131
stream.PutCString("2 indices");
132132
else if (value == g_array)
133133
{
134-
if (underlying_enum_sp->GetNumChildren() != 1)
134+
if (underlying_enum_sp->GetNumChildrenIgnoringErrors() != 1)
135135
return false;
136136

137137
underlying_enum_sp = underlying_enum_sp->GetChildAtIndex(0, true)
138138
->GetQualifiedRepresentationIfAvailable(lldb::eDynamicDontRunTarget, true);
139-
size_t num_children = underlying_enum_sp->GetNumChildren();
139+
size_t num_children = underlying_enum_sp->GetNumChildrenIgnoringErrors();
140140
stream.Printf("%zu indices", num_children);
141141
}
142142
return true;
@@ -214,7 +214,7 @@ bool lldb_private::formatters::swift::UUID_SummaryProvider(
214214
if (!uuid_sp)
215215
return false;
216216

217-
if (uuid_sp->GetNumChildren() < 16)
217+
if (uuid_sp->GetNumChildrenIgnoringErrors() < 16)
218218
return false;
219219

220220
ValueObjectSP children[] = {
@@ -300,7 +300,7 @@ bool lldb_private::formatters::swift::Data_SummaryProvider(
300300
// Do nothing; count is already 0.
301301
} else if (representation_case == g_inline) {
302302
// Grab the associated value from `case inline(InlineData)`.
303-
if (representation_enum_sp->GetNumChildren() != 1)
303+
if (representation_enum_sp->GetNumChildrenIgnoringErrors() != 1)
304304
return false;
305305

306306
ValueObjectSP inline_data_sp =
@@ -330,7 +330,7 @@ bool lldb_private::formatters::swift::Data_SummaryProvider(
330330
}
331331
} else if (representation_case == g_slice) {
332332
// Grab the associated value from `case slice(InlineSlice)`.
333-
if (representation_enum_sp->GetNumChildren() != 1)
333+
if (representation_enum_sp->GetNumChildrenIgnoringErrors() != 1)
334334
return false;
335335

336336
ValueObjectSP slice_data_sp =
@@ -392,7 +392,7 @@ bool lldb_private::formatters::swift::Data_SummaryProvider(
392392
count = upperBound - lowerBound;
393393
} else if (representation_case == g_large) {
394394
// Grab the associated value from `case large(LargeSlice)`.
395-
if (representation_enum_sp->GetNumChildren() != 1)
395+
if (representation_enum_sp->GetNumChildrenIgnoringErrors() != 1)
396396
return false;
397397

398398
ValueObjectSP large_data_sp =
@@ -521,7 +521,7 @@ bool lldb_private::formatters::swift::Decimal_SummaryProvider(
521521

522522
// Mantissa is represented as a tuple of 8 UInt16.
523523
const uint8_t num_children = 8;
524-
if (mantissa_sp->GetNumChildren() != num_children)
524+
if (mantissa_sp->GetNumChildrenIgnoringErrors() != num_children)
525525
return false;
526526

527527
std::vector<double> mantissa_elements;
@@ -570,13 +570,13 @@ class URLComponentsSyntheticChildrenFrontEnd
570570

571571
~URLComponentsSyntheticChildrenFrontEnd() override = default;
572572

573-
size_t CalculateNumChildren() override {
573+
llvm::Expected<uint32_t> CalculateNumChildren() override {
574574
if (IsValid())
575575
return 9;
576576
return 0;
577577
}
578578

579-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override {
579+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override {
580580
if (IsValid()) {
581581
switch (idx) {
582582
#define COMPONENT(Name, PrettyName, ID) \

lldb/source/Plugins/Language/Swift/ObjCRuntimeSyntheticProvider.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ size_t ObjCRuntimeSyntheticProvider::FrontEnd::GetNumBases() {
3434
return m_provider->m_descriptor_sp->GetSuperclass().get() ? 1 : 0;
3535
}
3636

37-
size_t ObjCRuntimeSyntheticProvider::FrontEnd::CalculateNumChildren() {
38-
size_t ivars = m_provider->GetNumIVars();
39-
size_t bases = GetNumBases();
37+
llvm::Expected<uint32_t>
38+
ObjCRuntimeSyntheticProvider::FrontEnd::CalculateNumChildren() {
39+
uint32_t ivars = m_provider->GetNumIVars();
40+
uint32_t bases = GetNumBases();
4041
return bases + ivars;
4142
}
4243

@@ -59,9 +60,9 @@ ObjCRuntimeSyntheticProvider::FrontEnd::FrontEnd(
5960
m_root_sp(::GetSuitableRootObject(backend.GetSP())) {}
6061

6162
lldb::ValueObjectSP
62-
ObjCRuntimeSyntheticProvider::FrontEnd::GetChildAtIndex(size_t idx) {
63+
ObjCRuntimeSyntheticProvider::FrontEnd::GetChildAtIndex(uint32_t idx) {
6364
lldb::ValueObjectSP child_sp(nullptr);
64-
if (idx < CalculateNumChildren()) {
65+
if (idx < CalculateNumChildrenIgnoringErrors()) {
6566
if (GetNumBases() == 1) {
6667
if (idx == 0) {
6768
do {
@@ -117,7 +118,7 @@ ObjCRuntimeSyntheticProvider::FrontEnd::GetChildAtIndex(size_t idx) {
117118

118119
size_t ObjCRuntimeSyntheticProvider::FrontEnd::GetIndexOfChildWithName(
119120
ConstString name) {
120-
for (size_t idx = 0; idx < CalculateNumChildren(); idx++) {
121+
for (size_t idx = 0; idx < CalculateNumChildrenIgnoringErrors(); idx++) {
121122
const auto &ivar_info(m_provider->GetIVarAtIndex(idx));
122123
if (name == ivar_info.m_name)
123124
return idx + GetNumBases();

lldb/source/Plugins/Language/Swift/ObjCRuntimeSyntheticProvider.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ class ObjCRuntimeSyntheticProvider : public SyntheticChildren {
4848
public:
4949
FrontEnd(ObjCRuntimeSyntheticProvider *prv, ValueObject &backend);
5050

51-
size_t CalculateNumChildren() override;
52-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
51+
llvm::Expected<uint32_t> CalculateNumChildren() override;
52+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
5353
lldb::ChildCacheState Update() override {
5454
return lldb::ChildCacheState::eRefetch;
5555
}

lldb/source/Plugins/Language/Swift/SwiftArray.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ bool SwiftArrayNativeBufferHandler::IsValid() {
120120
}
121121

122122
size_t SwiftArrayBridgedBufferHandler::GetCount() {
123-
return m_frontend->CalculateNumChildren();
123+
return m_frontend->CalculateNumChildrenIgnoringErrors();
124124
}
125125

126126
size_t SwiftArrayBridgedBufferHandler::GetCapacity() { return GetCount(); }
@@ -248,11 +248,11 @@ bool SwiftArraySliceBufferHandler::IsValid() {
248248
}
249249

250250
size_t SwiftSyntheticFrontEndBufferHandler::GetCount() {
251-
return m_frontend->CalculateNumChildren();
251+
return m_frontend->CalculateNumChildrenIgnoringErrors();
252252
}
253253

254254
size_t SwiftSyntheticFrontEndBufferHandler::GetCapacity() {
255-
return m_frontend->CalculateNumChildren();
255+
return m_frontend->CalculateNumChildrenIgnoringErrors();
256256
}
257257

258258
lldb_private::CompilerType
@@ -471,14 +471,17 @@ lldb_private::formatters::swift::ArraySyntheticFrontEnd::ArraySyntheticFrontEnd(
471471
Update();
472472
}
473473

474-
size_t lldb_private::formatters::swift::ArraySyntheticFrontEnd::
475-
CalculateNumChildren() {
476-
return m_array_buffer ? m_array_buffer->GetCount() : 0;
474+
llvm::Expected<uint32_t> lldb_private::formatters::swift::
475+
ArraySyntheticFrontEnd::CalculateNumChildren() {
476+
if (m_array_buffer)
477+
return m_array_buffer->GetCount();
478+
return llvm::make_error<llvm::StringError>("failed to update array data",
479+
llvm::inconvertibleErrorCode());
477480
}
478481

479482
lldb::ValueObjectSP
480483
lldb_private::formatters::swift::ArraySyntheticFrontEnd::GetChildAtIndex(
481-
size_t idx) {
484+
uint32_t idx) {
482485
if (!m_array_buffer)
483486
return ValueObjectSP();
484487

@@ -511,7 +514,7 @@ size_t lldb_private::formatters::swift::ArraySyntheticFrontEnd::
511514
return UINT32_MAX;
512515
const char *item_name = name.GetCString();
513516
uint32_t idx = ExtractIndexFromString(item_name);
514-
if (idx < UINT32_MAX && idx >= CalculateNumChildren())
517+
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
515518
return UINT32_MAX;
516519
return idx;
517520
}

lldb/source/Plugins/Language/Swift/SwiftArray.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ bool Array_SummaryProvider(ValueObject &valobj, Stream &stream,
164164
class ArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd {
165165
public:
166166
ArraySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
167-
size_t CalculateNumChildren() override;
168-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
167+
llvm::Expected<uint32_t> CalculateNumChildren() override;
168+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
169169
lldb::ChildCacheState Update() override;
170170
bool MightHaveChildren() override;
171171
size_t GetIndexOfChildWithName(ConstString name) override;

lldb/source/Plugins/Language/Swift/SwiftFormatters.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -711,8 +711,8 @@ class EnumSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
711711
public:
712712
EnumSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
713713

714-
size_t CalculateNumChildren() override;
715-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
714+
llvm::Expected<uint32_t> CalculateNumChildren() override;
715+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
716716
lldb::ChildCacheState Update() override;
717717
bool MightHaveChildren() override;
718718
size_t GetIndexOfChildWithName(ConstString name) override;
@@ -734,14 +734,14 @@ lldb_private::formatters::swift::EnumSyntheticFrontEnd::EnumSyntheticFrontEnd(
734734
Update();
735735
}
736736

737-
size_t
737+
llvm::Expected<uint32_t>
738738
lldb_private::formatters::swift::EnumSyntheticFrontEnd::CalculateNumChildren() {
739739
return m_child_index != UINT32_MAX ? 1 : 0;
740740
}
741741

742742
lldb::ValueObjectSP
743743
lldb_private::formatters::swift::EnumSyntheticFrontEnd::GetChildAtIndex(
744-
size_t idx) {
744+
uint32_t idx) {
745745
if (idx)
746746
return ValueObjectSP();
747747
if (m_child_index == UINT32_MAX)

lldb/source/Plugins/Language/Swift/SwiftHashedContainer.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class CocoaHashedStorageHandler: public HashedStorageHandler {
153153
: m_cocoaObject_sp(cocoaObject_sp), m_frontend(frontend) {}
154154

155155
virtual size_t GetCount() override {
156-
return m_frontend->CalculateNumChildren();
156+
return m_frontend->CalculateNumChildrenIgnoringErrors();
157157
}
158158

159159
virtual CompilerType GetElementType() override {
@@ -702,13 +702,15 @@ HashedSyntheticChildrenFrontEnd::HashedSyntheticChildrenFrontEnd(
702702
m_buffer()
703703
{}
704704

705-
size_t
705+
llvm::Expected<uint32_t>
706706
HashedSyntheticChildrenFrontEnd::CalculateNumChildren() {
707-
return m_buffer ? m_buffer->GetCount() : 0;
707+
if (m_buffer)
708+
return m_buffer->GetCount();
709+
return llvm::make_error<llvm::StringError>(
710+
"failed to update hashed container", llvm::inconvertibleErrorCode());
708711
}
709712

710-
ValueObjectSP
711-
HashedSyntheticChildrenFrontEnd::GetChildAtIndex(size_t idx) {
713+
ValueObjectSP HashedSyntheticChildrenFrontEnd::GetChildAtIndex(uint32_t idx) {
712714
if (!m_buffer)
713715
return ValueObjectSP();
714716

@@ -737,7 +739,7 @@ HashedSyntheticChildrenFrontEnd::GetIndexOfChildWithName(ConstString name) {
737739
return UINT32_MAX;
738740
const char *item_name = name.GetCString();
739741
uint32_t idx = ExtractIndexFromString(item_name);
740-
if (idx < UINT32_MAX && idx >= CalculateNumChildren())
742+
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
741743
return UINT32_MAX;
742744
return idx;
743745
}

lldb/source/Plugins/Language/Swift/SwiftHashedContainer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ class HashedSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd {
134134
HashedSyntheticChildrenFrontEnd(const HashedCollectionConfig &config,
135135
lldb::ValueObjectSP valobj_sp);
136136

137-
size_t CalculateNumChildren() override;
138-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
137+
llvm::Expected<uint32_t> CalculateNumChildren() override;
138+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
139139
lldb::ChildCacheState Update() override;
140140
bool MightHaveChildren() override;
141141
size_t GetIndexOfChildWithName(ConstString name) override;

lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -839,11 +839,9 @@ class ValueObjectWrapperSyntheticChildren : public SyntheticChildren {
839839
ValueObjectWrapperFrontEndProvider(ValueObject &backend)
840840
: SyntheticChildrenFrontEnd(backend) {}
841841

842-
size_t CalculateNumChildren() override {
843-
return 1;
844-
}
842+
llvm::Expected<uint32_t> CalculateNumChildren() override { return 1; }
845843

846-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override {
844+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override {
847845
return idx == 0 ? m_backend.GetSP() : nullptr;
848846
}
849847

lldb/source/Plugins/Language/Swift/SwiftOptional.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,9 @@ bool lldb_private::formatters::swift::SwiftOptionalSummaryProvider::
189189
if (!summary_sp) {
190190
if (lldb_private::DataVisualization::ShouldPrintAsOneLiner(*some))
191191
return false;
192-
else
193-
return (some->GetNumChildren() > 0);
194-
} else
195-
return (some->GetNumChildren() > 0) &&
196-
(summary_sp->DoesPrintChildren(some));
192+
return some->HasChildren();
193+
}
194+
return some->HasChildren() && summary_sp->DoesPrintChildren(some);
197195
}
198196

199197
bool lldb_private::formatters::swift::SwiftOptionalSummaryProvider::
@@ -211,15 +209,15 @@ bool lldb_private::formatters::swift::SwiftOptionalSyntheticFrontEnd::IsEmpty()
211209
return (m_is_none == true || m_children == false || m_some == nullptr);
212210
}
213211

214-
size_t lldb_private::formatters::swift::SwiftOptionalSyntheticFrontEnd::
215-
CalculateNumChildren() {
212+
llvm::Expected<uint32_t> lldb_private::formatters::swift::
213+
SwiftOptionalSyntheticFrontEnd::CalculateNumChildren() {
216214
if (IsEmpty())
217215
return 0;
218216
return m_some->GetNumChildren();
219217
}
220218

221219
lldb::ValueObjectSP lldb_private::formatters::swift::
222-
SwiftOptionalSyntheticFrontEnd::GetChildAtIndex(size_t idx) {
220+
SwiftOptionalSyntheticFrontEnd::GetChildAtIndex(uint32_t idx) {
223221
if (IsEmpty())
224222
return nullptr;
225223
auto child = m_some->GetChildAtIndex(idx, true);
@@ -243,7 +241,7 @@ lldb::ChildCacheState lldb_private::formatters::swift::SwiftOptionalSyntheticFro
243241

244242
m_is_none = false;
245243

246-
m_children = (m_some->GetNumChildren() > 0);
244+
m_children = m_some->HasChildren();
247245

248246
return ChildCacheState::eRefetch;
249247
}

lldb/source/Plugins/Language/Swift/SwiftOptional.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ class SwiftOptionalSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
8282
public:
8383
SwiftOptionalSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
8484

85-
size_t CalculateNumChildren() override;
86-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
85+
llvm::Expected<uint32_t> CalculateNumChildren() override;
86+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
8787
lldb::ChildCacheState Update() override;
8888
bool MightHaveChildren() override;
8989
size_t GetIndexOfChildWithName(ConstString name) override;

lldb/source/Plugins/Language/Swift/SwiftUnsafeTypes.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,8 @@ class UnsafeTypeSyntheticFrontEnd : public SwiftBasicTypeSyntheticFrontEnd {
514514
public:
515515
UnsafeTypeSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
516516

517-
size_t CalculateNumChildren() override;
518-
lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
517+
llvm::Expected<uint32_t> CalculateNumChildren() override;
518+
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
519519
lldb::ChildCacheState Update() override;
520520
bool MightHaveChildren() override;
521521
size_t GetIndexOfChildWithName(ConstString name) override;
@@ -547,15 +547,15 @@ lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::
547547
Update();
548548
}
549549

550-
size_t lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::
551-
CalculateNumChildren() {
550+
llvm::Expected<uint32_t> lldb_private::formatters::swift::
551+
UnsafeTypeSyntheticFrontEnd::CalculateNumChildren() {
552552
return m_unsafe_ptr->GetCount();
553553
}
554554

555555
lldb::ValueObjectSP
556556
lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::GetChildAtIndex(
557-
size_t idx) {
558-
const size_t num_children = CalculateNumChildren();
557+
uint32_t idx) {
558+
const uint32_t num_children = CalculateNumChildrenIgnoringErrors();
559559

560560
if (idx >= num_children || idx >= m_children.size())
561561
return lldb::ValueObjectSP();
@@ -575,7 +575,7 @@ lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::Update() {
575575
if (m_unsafe_ptr->Update() == ChildCacheState::eRefetch)
576576
return ChildCacheState::eRefetch;
577577

578-
const size_t num_children = CalculateNumChildren();
578+
const uint32_t num_children = CalculateNumChildrenIgnoringErrors();
579579
m_children = ::ExtractChildrenFromSwiftPointerValueObject(valobj_sp,
580580
*m_unsafe_ptr.get());
581581
return m_children.size() == num_children ? ChildCacheState::eReuse

0 commit comments

Comments
 (0)