Skip to content

Commit 7f20e18

Browse files
Merge pull request #10658 from adrian-prantl/150951857
[lldb] Add a data formatter for Foundation._SwiftURL
2 parents 0b000c4 + 618970f commit 7f20e18

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

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

+42-2
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,53 @@ bool lldb_private::formatters::swift::URL_SummaryProvider(
9696
return false;
9797

9898
std::string summary;
99-
if (!underlying_url_sp->GetSummaryAsCString(summary, options))
99+
auto try_format = [&]() {
100+
if (underlying_url_sp->GetSummaryAsCString(summary, options))
101+
return true;
102+
auto dynval_sp =
103+
underlying_url_sp->GetDynamicValue(lldb::eDynamicCanRunTarget);
104+
if (!dynval_sp)
105+
return false;
106+
return dynval_sp->GetSummaryAsCString(summary, options);
107+
};
108+
if (!try_format())
100109
return false;
101-
102110
stream.PutCString(summary.c_str());
103111
return true;
104112
}
105113

114+
bool lldb_private::formatters::swift::SwiftURL_SummaryProvider(
115+
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
116+
static ConstString g__baseURL("_baseURL");
117+
static ConstString g__parseInfo("_parseInfo");
118+
static ConstString g_urlString("urlString");
119+
120+
ValueObjectSP rel_str_sp(
121+
valobj.GetChildAtNamePath({g__parseInfo, g_urlString}));
122+
if (!rel_str_sp)
123+
return false;
124+
125+
std::string base;
126+
ValueObjectSP base_url_sp(valobj.GetChildAtNamePath({g__baseURL}));
127+
if (base_url_sp)
128+
if (ValueObjectSP non_synth_valobj = base_url_sp->GetNonSyntheticValue()) {
129+
const char *value = non_synth_valobj->GetValueAsCString();
130+
if (value && llvm::StringRef(value) != "none")
131+
if (!base_url_sp->GetSummaryAsCString(base, options))
132+
return false;
133+
}
134+
135+
std::string summary;
136+
if (!rel_str_sp->GetSummaryAsCString(summary, options))
137+
return false;
138+
139+
// This format matches the implementastion of _SwiftURL.description.
140+
stream << summary;
141+
if (!base.empty())
142+
stream << " -- " << base;
143+
return true;
144+
}
145+
106146
bool lldb_private::formatters::swift::IndexPath_SummaryProvider(
107147
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
108148
static ConstString g__indexes("_indexes");

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

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ bool NotificationName_SummaryProvider(ValueObject &valobj, Stream &stream,
3434
bool URL_SummaryProvider(ValueObject &valobj, Stream &stream,
3535
const TypeSummaryOptions &options);
3636

37+
bool SwiftURL_SummaryProvider(ValueObject &valobj, Stream &stream,
38+
const TypeSummaryOptions &options);
39+
3740
bool IndexPath_SummaryProvider(ValueObject &valobj, Stream &stream,
3841
const TypeSummaryOptions &options);
3942

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

+6
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,12 @@ LoadFoundationValueTypesFormatters(lldb::TypeCategoryImplSP swift_category_sp) {
675675
"URL summary provider", ConstString("Foundation.URL"),
676676
TypeSummaryImpl::Flags(summary_flags).SetDontShowChildren(true));
677677

678+
lldb_private::formatters::AddCXXSummary(
679+
swift_category_sp,
680+
lldb_private::formatters::swift::SwiftURL_SummaryProvider,
681+
"URL summary provider", ConstString("Foundation._SwiftURL"),
682+
TypeSummaryImpl::Flags(summary_flags).SetDontShowChildren(true));
683+
678684
lldb_private::formatters::AddCXXSummary(
679685
swift_category_sp,
680686
lldb_private::formatters::swift::IndexPath_SummaryProvider,

0 commit comments

Comments
 (0)