Skip to content

upgrade Swift plugin to use llvm::Expected for GetIndexOfChildWithName #10593

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -635,10 +635,13 @@ class URLComponentsSyntheticChildrenFrontEnd
m_synth_frontend_up->Update();

#define COMPONENT(Name, PrettyName, ID) \
m_##Name = m_synth_frontend_up \
->GetChildAtIndex( \
m_synth_frontend_up->GetIndexOfChildWithName(g__##Name)) \
.get(); \
auto index_or_err = m_synth_frontend_up->GetIndexOfChildWithName(g__##Name); \
if (!index_or_err) { \
LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), index_or_err.takeError(), \
"{0}"); \
return ChildCacheState::eRefetch; \
} \
m_##Name = m_synth_frontend_up->GetChildAtIndex(*index_or_err).get(); \
if (m_##Name) \
m_##Name->SetName(GetNameFor##Name());
#include "URLComponents.def"
Expand All @@ -650,12 +653,13 @@ class URLComponentsSyntheticChildrenFrontEnd

bool MightHaveChildren() override { return true; }

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
#define COMPONENT(Name, PrettyName, ID) \
if (name == GetNameFor##Name()) \
return ID;
#include "URLComponents.def"
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,14 @@ ObjCRuntimeSyntheticProvider::FrontEnd::GetChildAtIndex(uint32_t idx) {
return child_sp;
}

size_t ObjCRuntimeSyntheticProvider::FrontEnd::GetIndexOfChildWithName(
llvm::Expected<size_t>
ObjCRuntimeSyntheticProvider::FrontEnd::GetIndexOfChildWithName(
ConstString name) {
for (size_t idx = 0; idx < CalculateNumChildrenIgnoringErrors(); idx++) {
const auto &ivar_info(m_provider->GetIVarAtIndex(idx));
if (name == ivar_info.m_name)
return idx + GetNumBases();
}
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class ObjCRuntimeSyntheticProvider : public SyntheticChildren {
return lldb::ChildCacheState::eRefetch;
}
bool MightHaveChildren() override { return true; }
size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer;

Expand Down
10 changes: 6 additions & 4 deletions lldb/source/Plugins/Language/Swift/SwiftArray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,14 +508,16 @@ bool lldb_private::formatters::swift::ArraySyntheticFrontEnd::
return true;
}

size_t lldb_private::formatters::swift::ArraySyntheticFrontEnd::
llvm::Expected<size_t> lldb_private::formatters::swift::ArraySyntheticFrontEnd::
GetIndexOfChildWithName(ConstString name) {
if (!m_array_buffer)
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
const char *item_name = name.GetCString();
uint32_t idx = ExtractIndexFromString(item_name);
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
return UINT32_MAX;
if (idx == UINT32_MAX || idx >= CalculateNumChildrenIgnoringErrors())
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}

Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Plugins/Language/Swift/SwiftArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ class ArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd {
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
lldb::ChildCacheState Update() override;
bool MightHaveChildren() override;
size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
bool IsValid();

private:
Expand Down
38 changes: 24 additions & 14 deletions lldb/source/Plugins/Language/Swift/SwiftFormatters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ class EnumSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
lldb::ChildCacheState Update() override;
bool MightHaveChildren() override;
size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

private:
ExecutionContextRef m_exe_ctx_ref;
Expand Down Expand Up @@ -959,11 +959,12 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {

bool MightHaveChildren() override { return true; }

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

Expand Down Expand Up @@ -1027,14 +1028,15 @@ class UnsafeContinuationSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
return {};
}

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (!m_task_sp)
return m_backend.GetIndexOfChildWithName(name);

if (name == "task")
return 0;

return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

lldb::ChildCacheState Update() override {
Expand Down Expand Up @@ -1107,14 +1109,15 @@ class CheckedContinuationSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
return {};
}

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (!m_task_sp)
return m_backend.GetIndexOfChildWithName(name);

if (name == "task")
return 0;

return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

lldb::ChildCacheState Update() override {
Expand Down Expand Up @@ -1187,15 +1190,16 @@ class TaskGroupSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
return task_sp;
}

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (!m_is_supported_target)
return m_backend.GetIndexOfChildWithName(name);

StringRef buf = name.GetStringRef();
size_t idx = UINT32_MAX;
if (buf.consume_front("[") && !buf.consumeInteger(10, idx) && buf == "]")
return idx;
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

lldb::ChildCacheState Update() override {
Expand Down Expand Up @@ -1394,10 +1398,11 @@ class ActorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
return m_unprioritised_jobs_sp;
}

size_t GetIndexOfChildWithName(ConstString name) override {
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (m_is_supported_target && name == "unprioritised_jobs")
return 0;
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

lldb::ChildCacheState Update() override {
Expand Down Expand Up @@ -1530,7 +1535,11 @@ lldb_private::formatters::swift::EnumSyntheticFrontEnd::Update() {
m_child_index = UINT32_MAX;
m_exe_ctx_ref = m_backend.GetExecutionContextRef();
m_element_name.SetCString(m_backend.GetValueAsCString());
m_child_index = m_backend.GetIndexOfChildWithName(m_element_name);
auto index_or_err = m_backend.GetIndexOfChildWithName(m_element_name);
if (!index_or_err)
llvm::consumeError(index_or_err.takeError());
else
m_child_index = *index_or_err;
return ChildCacheState::eRefetch;
}

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

size_t
llvm::Expected<size_t>
lldb_private::formatters::swift::EnumSyntheticFrontEnd::GetIndexOfChildWithName(
ConstString name) {
if (name == m_element_name)
return 0;
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

SyntheticChildrenFrontEnd *
Expand Down
10 changes: 6 additions & 4 deletions lldb/source/Plugins/Language/Swift/SwiftHashedContainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -731,13 +731,15 @@ HashedSyntheticChildrenFrontEnd::MightHaveChildren() {
return true;
}

size_t
llvm::Expected<size_t>
HashedSyntheticChildrenFrontEnd::GetIndexOfChildWithName(ConstString name) {
if (!m_buffer)
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
const char *item_name = name.GetCString();
uint32_t idx = ExtractIndexFromString(item_name);
if (idx < UINT32_MAX && idx >= CalculateNumChildrenIgnoringErrors())
return UINT32_MAX;
if (idx == UINT32_MAX || idx >= CalculateNumChildrenIgnoringErrors())
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
return idx;
}
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ class HashedSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd {
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
lldb::ChildCacheState Update() override;
bool MightHaveChildren() override;
size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

private:
const HashedCollectionConfig &m_config;
Expand Down
8 changes: 6 additions & 2 deletions lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -920,8 +920,12 @@ class ValueObjectWrapperSyntheticChildren : public SyntheticChildren {
return idx == 0 ? m_backend.GetSP() : nullptr;
}

size_t GetIndexOfChildWithName(ConstString name) override {
return m_backend.GetName() == name ? 0 : UINT32_MAX;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override {
if (m_backend.GetName() == name) {
return 0;
}
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());
}

lldb::ChildCacheState Update() override {
Expand Down
7 changes: 4 additions & 3 deletions lldb/source/Plugins/Language/Swift/SwiftOptional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,12 +271,13 @@ bool lldb_private::formatters::swift::SwiftOptionalSyntheticFrontEnd::
return IsEmpty() ? false : true;
}

size_t lldb_private::formatters::swift::SwiftOptionalSyntheticFrontEnd::
GetIndexOfChildWithName(ConstString name) {
llvm::Expected<size_t> lldb_private::formatters::swift::
SwiftOptionalSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) {
static ConstString g_Some("some");

if (IsEmpty())
return UINT32_MAX;
return llvm::createStringError("Type has no child named '%s'",
name.AsCString());

return m_some->GetIndexOfChildWithName(name);
}
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Plugins/Language/Swift/SwiftOptional.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class SwiftOptionalSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
lldb::ChildCacheState Update() override;
bool MightHaveChildren() override;
size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
lldb::ValueObjectSP GetSyntheticValue() override;

private:
Expand Down
9 changes: 5 additions & 4 deletions lldb/source/Plugins/Language/Swift/SwiftUnsafeTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ class UnsafeTypeSyntheticFrontEnd : public SwiftBasicTypeSyntheticFrontEnd {
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
lldb::ChildCacheState Update() override;
bool MightHaveChildren() override;
size_t GetIndexOfChildWithName(ConstString name) override;
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;

private:
std::unique_ptr<SwiftUnsafeType> m_unsafe_ptr;
Expand Down Expand Up @@ -592,11 +592,12 @@ bool lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::
return m_unsafe_ptr && m_unsafe_ptr->GetCount();
}

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

SyntheticChildrenFrontEnd *
Expand Down