Skip to content

Commit 105d084

Browse files
upgrade Swift plugin to use llvm::Expected for GetIndexOfChildWithName
1 parent c628e41 commit 105d084

12 files changed

+69
-43
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -635,10 +635,13 @@ class URLComponentsSyntheticChildrenFrontEnd
635635
m_synth_frontend_up->Update();
636636

637637
#define COMPONENT(Name, PrettyName, ID) \
638-
m_##Name = m_synth_frontend_up \
639-
->GetChildAtIndex( \
640-
m_synth_frontend_up->GetIndexOfChildWithName(g__##Name)) \
641-
.get(); \
638+
auto index_or_err = m_synth_frontend_up->GetIndexOfChildWithName(g__##Name); \
639+
if (!index_or_err) { \
640+
LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(), \
641+
"{0}"); \
642+
return ChildCacheState::eRefetch; \
643+
} \
644+
m_##Name = m_synth_frontend_up->GetChildAtIndex(*index_or_err).get(); \
642645
if (m_##Name) \
643646
m_##Name->SetName(GetNameFor##Name());
644647
#include "URLComponents.def"
@@ -650,12 +653,13 @@ class URLComponentsSyntheticChildrenFrontEnd
650653

651654
bool MightHaveChildren() override { return true; }
652655

653-
size_t GetIndexOfChildWithName(ConstString name) override {
656+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
654657
#define COMPONENT(Name, PrettyName, ID) \
655658
if (name == GetNameFor##Name()) \
656659
return ID;
657660
#include "URLComponents.def"
658-
return UINT32_MAX;
661+
return llvm::createStringError("Type has no child named '%s'",
662+
name.AsCString());
659663
}
660664

661665
private:

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,14 @@ ObjCRuntimeSyntheticProvider::FrontEnd::GetChildAtIndex(uint32_t idx) {
116116
return child_sp;
117117
}
118118

119-
size_t ObjCRuntimeSyntheticProvider::FrontEnd::GetIndexOfChildWithName(
119+
llvm::Expected<size_t>
120+
ObjCRuntimeSyntheticProvider::FrontEnd::GetIndexOfChildWithName(
120121
ConstString name) {
121122
for (size_t idx = 0; idx < CalculateNumChildrenIgnoringErrors(); idx++) {
122123
const auto &ivar_info(m_provider->GetIVarAtIndex(idx));
123124
if (name == ivar_info.m_name)
124125
return idx + GetNumBases();
125126
}
126-
return UINT32_MAX;
127+
return llvm::createStringError("Type has no child named '%s'",
128+
name.AsCString());
127129
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class ObjCRuntimeSyntheticProvider : public SyntheticChildren {
5454
return lldb::ChildCacheState::eRefetch;
5555
}
5656
bool MightHaveChildren() override { return true; }
57-
size_t GetIndexOfChildWithName(ConstString name) override;
57+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
5858

5959
typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer;
6060

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -508,14 +508,16 @@ bool lldb_private::formatters::swift::ArraySyntheticFrontEnd::
508508
return true;
509509
}
510510

511-
size_t lldb_private::formatters::swift::ArraySyntheticFrontEnd::
511+
llvm::Expected<size_t> lldb_private::formatters::swift::ArraySyntheticFrontEnd::
512512
GetIndexOfChildWithName(ConstString name) {
513513
if (!m_array_buffer)
514-
return UINT32_MAX;
514+
return llvm::createStringError("Type has no child named '%s'",
515+
name.AsCString());
515516
const char *item_name = name.GetCString();
516517
uint32_t idx = ExtractIndexFromString(item_name);
517-
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
518-
return UINT32_MAX;
518+
if (idx == UINT32_MAX || idx >= CalculateNumChildrenIgnoringErrors())
519+
return llvm::createStringError("Type has no child named '%s'",
520+
name.AsCString());
519521
return idx;
520522
}
521523

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class ArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd {
168168
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
169169
lldb::ChildCacheState Update() override;
170170
bool MightHaveChildren() override;
171-
size_t GetIndexOfChildWithName(ConstString name) override;
171+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
172172
bool IsValid();
173173

174174
private:

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

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ class EnumSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
749749
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
750750
lldb::ChildCacheState Update() override;
751751
bool MightHaveChildren() override;
752-
size_t GetIndexOfChildWithName(ConstString name) override;
752+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
753753

754754
private:
755755
ExecutionContextRef m_exe_ctx_ref;
@@ -959,11 +959,12 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
959959

960960
bool MightHaveChildren() override { return true; }
961961

962-
size_t GetIndexOfChildWithName(ConstString name) override {
962+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
963963
ArrayRef children = TaskChildren;
964964
const auto *it = llvm::find(children, name);
965965
if (it == children.end())
966-
return UINT32_MAX;
966+
return llvm::createStringError("Type has no child named '%s'",
967+
name.AsCString());
967968
return std::distance(children.begin(), it);
968969
}
969970

@@ -1027,14 +1028,15 @@ class UnsafeContinuationSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
10271028
return {};
10281029
}
10291030

1030-
size_t GetIndexOfChildWithName(ConstString name) override {
1031+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
10311032
if (!m_task_sp)
10321033
return m_backend.GetIndexOfChildWithName(name);
10331034

10341035
if (name == "task")
10351036
return 0;
10361037

1037-
return UINT32_MAX;
1038+
return llvm::createStringError("Type has no child named '%s'",
1039+
name.AsCString());
10381040
}
10391041

10401042
lldb::ChildCacheState Update() override {
@@ -1107,14 +1109,15 @@ class CheckedContinuationSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
11071109
return {};
11081110
}
11091111

1110-
size_t GetIndexOfChildWithName(ConstString name) override {
1112+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
11111113
if (!m_task_sp)
11121114
return m_backend.GetIndexOfChildWithName(name);
11131115

11141116
if (name == "task")
11151117
return 0;
11161118

1117-
return UINT32_MAX;
1119+
return llvm::createStringError("Type has no child named '%s'",
1120+
name.AsCString());
11181121
}
11191122

11201123
lldb::ChildCacheState Update() override {
@@ -1187,15 +1190,16 @@ class TaskGroupSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
11871190
return task_sp;
11881191
}
11891192

1190-
size_t GetIndexOfChildWithName(ConstString name) override {
1193+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
11911194
if (!m_is_supported_target)
11921195
return m_backend.GetIndexOfChildWithName(name);
11931196

11941197
StringRef buf = name.GetStringRef();
11951198
size_t idx = UINT32_MAX;
11961199
if (buf.consume_front("[") && !buf.consumeInteger(10, idx) && buf == "]")
11971200
return idx;
1198-
return UINT32_MAX;
1201+
return llvm::createStringError("Type has no child named '%s'",
1202+
name.AsCString());
11991203
}
12001204

12011205
lldb::ChildCacheState Update() override {
@@ -1394,10 +1398,11 @@ class ActorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
13941398
return m_unprioritised_jobs_sp;
13951399
}
13961400

1397-
size_t GetIndexOfChildWithName(ConstString name) override {
1401+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
13981402
if (m_is_supported_target && name == "unprioritised_jobs")
13991403
return 0;
1400-
return UINT32_MAX;
1404+
return llvm::createStringError("Type has no child named '%s'",
1405+
name.AsCString());
14011406
}
14021407

14031408
lldb::ChildCacheState Update() override {
@@ -1530,7 +1535,11 @@ lldb_private::formatters::swift::EnumSyntheticFrontEnd::Update() {
15301535
m_child_index = UINT32_MAX;
15311536
m_exe_ctx_ref = m_backend.GetExecutionContextRef();
15321537
m_element_name.SetCString(m_backend.GetValueAsCString());
1533-
m_child_index = m_backend.GetIndexOfChildWithName(m_element_name);
1538+
auto index_or_err = m_backend.GetIndexOfChildWithName(m_element_name);
1539+
if (!index_or_err)
1540+
llvm::consumeError(index_or_err.takeError());
1541+
else
1542+
m_child_index = *index_or_err;
15341543
return ChildCacheState::eRefetch;
15351544
}
15361545

@@ -1539,12 +1548,13 @@ bool lldb_private::formatters::swift::EnumSyntheticFrontEnd::
15391548
return m_child_index != UINT32_MAX;
15401549
}
15411550

1542-
size_t
1551+
llvm::Expected<size_t>
15431552
lldb_private::formatters::swift::EnumSyntheticFrontEnd::GetIndexOfChildWithName(
15441553
ConstString name) {
15451554
if (name == m_element_name)
15461555
return 0;
1547-
return UINT32_MAX;
1556+
return llvm::createStringError("Type has no child named '%s'",
1557+
name.AsCString());
15481558
}
15491559

15501560
SyntheticChildrenFrontEnd *

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -731,13 +731,15 @@ HashedSyntheticChildrenFrontEnd::MightHaveChildren() {
731731
return true;
732732
}
733733

734-
size_t
734+
llvm::Expected<size_t>
735735
HashedSyntheticChildrenFrontEnd::GetIndexOfChildWithName(ConstString name) {
736736
if (!m_buffer)
737-
return UINT32_MAX;
737+
return llvm::createStringError("Type has no child named '%s'",
738+
name.AsCString());
738739
const char *item_name = name.GetCString();
739740
uint32_t idx = ExtractIndexFromString(item_name);
740-
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
741-
return UINT32_MAX;
741+
if (idx == UINT32_MAX || idx >= CalculateNumChildrenIgnoringErrors())
742+
return llvm::createStringError("Type has no child named '%s'",
743+
name.AsCString());
742744
return idx;
743745
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class HashedSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd {
138138
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
139139
lldb::ChildCacheState Update() override;
140140
bool MightHaveChildren() override;
141-
size_t GetIndexOfChildWithName(ConstString name) override;
141+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
142142

143143
private:
144144
const HashedCollectionConfig &m_config;

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -920,8 +920,12 @@ class ValueObjectWrapperSyntheticChildren : public SyntheticChildren {
920920
return idx == 0 ? m_backend.GetSP() : nullptr;
921921
}
922922

923-
size_t GetIndexOfChildWithName(ConstString name) override {
924-
return m_backend.GetName() == name ? 0 : UINT32_MAX;
923+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
924+
if (m_backend.GetName() == name) {
925+
return 0;
926+
}
927+
return llvm::createStringError("Type has no child named '%s'",
928+
name.AsCString());
925929
}
926930

927931
lldb::ChildCacheState Update() override {

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,12 +271,13 @@ bool lldb_private::formatters::swift::SwiftOptionalSyntheticFrontEnd::
271271
return IsEmpty() ? false : true;
272272
}
273273

274-
size_t lldb_private::formatters::swift::SwiftOptionalSyntheticFrontEnd::
275-
GetIndexOfChildWithName(ConstString name) {
274+
llvm::Expected<size_t> lldb_private::formatters::swift::
275+
SwiftOptionalSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) {
276276
static ConstString g_Some("some");
277277

278278
if (IsEmpty())
279-
return UINT32_MAX;
279+
return llvm::createStringError("Type has no child named '%s'",
280+
name.AsCString());
280281

281282
return m_some->GetIndexOfChildWithName(name);
282283
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class SwiftOptionalSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
5050
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
5151
lldb::ChildCacheState Update() override;
5252
bool MightHaveChildren() override;
53-
size_t GetIndexOfChildWithName(ConstString name) override;
53+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
5454
lldb::ValueObjectSP GetSyntheticValue() override;
5555

5656
private:

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ class UnsafeTypeSyntheticFrontEnd : public SwiftBasicTypeSyntheticFrontEnd {
524524
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
525525
lldb::ChildCacheState Update() override;
526526
bool MightHaveChildren() override;
527-
size_t GetIndexOfChildWithName(ConstString name) override;
527+
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
528528

529529
private:
530530
std::unique_ptr<SwiftUnsafeType> m_unsafe_ptr;
@@ -592,11 +592,12 @@ bool lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::
592592
return m_unsafe_ptr && m_unsafe_ptr->GetCount();
593593
}
594594

595-
size_t lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::
596-
GetIndexOfChildWithName(ConstString name) {
595+
llvm::Expected<size_t> lldb_private::formatters::swift::
596+
UnsafeTypeSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) {
597597
if (m_unsafe_ptr && m_unsafe_ptr->HasPointee() && name == "pointee")
598598
return 0;
599-
return UINT32_MAX;
599+
return llvm::createStringError("Type has no child named '%s'",
600+
name.AsCString());
600601
}
601602

602603
SyntheticChildrenFrontEnd *

0 commit comments

Comments
 (0)