From 618970f91ea1459b5857bd6173156c0a01ee5238 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Thu, 8 May 2025 14:41:54 -0700 Subject: [PATCH] [lldb] Add a data formatter for Foundation._SwiftURL https://github.com/swiftlang/swift-foundation/blob/main/Sources/FoundationEssentials/URL/URL_Swift.swift rdar://150951857 --- .../Language/Swift/FoundationValueTypes.cpp | 44 ++++++++++++++++++- .../Language/Swift/FoundationValueTypes.h | 3 ++ .../Plugins/Language/Swift/SwiftLanguage.cpp | 6 +++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp b/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp index 461492a82206c..d83c116b2e8b7 100644 --- a/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp +++ b/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp @@ -96,13 +96,53 @@ bool lldb_private::formatters::swift::URL_SummaryProvider( return false; std::string summary; - if (!underlying_url_sp->GetSummaryAsCString(summary, options)) + auto try_format = [&]() { + if (underlying_url_sp->GetSummaryAsCString(summary, options)) + return true; + auto dynval_sp = + underlying_url_sp->GetDynamicValue(lldb::eDynamicCanRunTarget); + if (!dynval_sp) + return false; + return dynval_sp->GetSummaryAsCString(summary, options); + }; + if (!try_format()) return false; - stream.PutCString(summary.c_str()); return true; } +bool lldb_private::formatters::swift::SwiftURL_SummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + static ConstString g__baseURL("_baseURL"); + static ConstString g__parseInfo("_parseInfo"); + static ConstString g_urlString("urlString"); + + ValueObjectSP rel_str_sp( + valobj.GetChildAtNamePath({g__parseInfo, g_urlString})); + if (!rel_str_sp) + return false; + + std::string base; + ValueObjectSP base_url_sp(valobj.GetChildAtNamePath({g__baseURL})); + if (base_url_sp) + if (ValueObjectSP non_synth_valobj = base_url_sp->GetNonSyntheticValue()) { + const char *value = non_synth_valobj->GetValueAsCString(); + if (value && llvm::StringRef(value) != "none") + if (!base_url_sp->GetSummaryAsCString(base, options)) + return false; + } + + std::string summary; + if (!rel_str_sp->GetSummaryAsCString(summary, options)) + return false; + + // This format matches the implementastion of _SwiftURL.description. + stream << summary; + if (!base.empty()) + stream << " -- " << base; + return true; +} + bool lldb_private::formatters::swift::IndexPath_SummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { static ConstString g__indexes("_indexes"); diff --git a/lldb/source/Plugins/Language/Swift/FoundationValueTypes.h b/lldb/source/Plugins/Language/Swift/FoundationValueTypes.h index 9fd188e438fed..69439a2cdaf5f 100644 --- a/lldb/source/Plugins/Language/Swift/FoundationValueTypes.h +++ b/lldb/source/Plugins/Language/Swift/FoundationValueTypes.h @@ -34,6 +34,9 @@ bool NotificationName_SummaryProvider(ValueObject &valobj, Stream &stream, bool URL_SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); +bool SwiftURL_SummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + bool IndexPath_SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); diff --git a/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp b/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp index 355d8d64123d6..938eb646d2574 100644 --- a/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp +++ b/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp @@ -675,6 +675,12 @@ LoadFoundationValueTypesFormatters(lldb::TypeCategoryImplSP swift_category_sp) { "URL summary provider", ConstString("Foundation.URL"), TypeSummaryImpl::Flags(summary_flags).SetDontShowChildren(true)); + lldb_private::formatters::AddCXXSummary( + swift_category_sp, + lldb_private::formatters::swift::SwiftURL_SummaryProvider, + "URL summary provider", ConstString("Foundation._SwiftURL"), + TypeSummaryImpl::Flags(summary_flags).SetDontShowChildren(true)); + lldb_private::formatters::AddCXXSummary( swift_category_sp, lldb_private::formatters::swift::IndexPath_SummaryProvider,