180814287SRaphael Isemann //===-- ObjCLanguage.cpp --------------------------------------------------===//
25f9d3106SEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f9d3106SEnrico Granata //
75f9d3106SEnrico Granata //===----------------------------------------------------------------------===//
85f9d3106SEnrico Granata 
93e130050SChaoren Lin #include <mutex>
103e130050SChaoren Lin 
118d15f33bSEugene Zelenko #include "ObjCLanguage.h"
128d15f33bSEugene Zelenko 
138be30215SAlex Langford #include "Plugins/ExpressionParser/Clang/ClangUtil.h"
148be30215SAlex Langford #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
155f9d3106SEnrico Granata #include "lldb/Core/PluginManager.h"
16d3233c1eSEnrico Granata #include "lldb/Core/ValueObject.h"
17170c395eSEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
18170c395eSEnrico Granata #include "lldb/DataFormatters/FormattersHelpers.h"
19b9c1b51eSKate Stone #include "lldb/Symbol/CompilerType.h"
20b9c1b51eSKate Stone #include "lldb/Target/Target.h"
21bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
22bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
235f9d3106SEnrico Granata 
24c5f28e2aSKamil Rytarowski #include "llvm/Support/Threading.h"
25c5f28e2aSKamil Rytarowski 
269e865618SAlex Langford #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h"
27b5701710SAlex Langford #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
28b5701710SAlex Langford 
29170c395eSEnrico Granata #include "CF.h"
30170c395eSEnrico Granata #include "Cocoa.h"
31170c395eSEnrico Granata #include "CoreMedia.h"
327de855c6SEnrico Granata #include "NSDictionary.h"
337de855c6SEnrico Granata #include "NSSet.h"
347de855c6SEnrico Granata #include "NSString.h"
35170c395eSEnrico Granata 
365f9d3106SEnrico Granata using namespace lldb;
375f9d3106SEnrico Granata using namespace lldb_private;
38170c395eSEnrico Granata using namespace lldb_private::formatters;
395f9d3106SEnrico Granata 
LLDB_PLUGIN_DEFINE(ObjCLanguage)40bba9ba8dSJonas Devlieghere LLDB_PLUGIN_DEFINE(ObjCLanguage)
41fbb4d1e4SJonas Devlieghere 
42b9c1b51eSKate Stone void ObjCLanguage::Initialize() {
43b9c1b51eSKate Stone   PluginManager::RegisterPlugin(GetPluginNameStatic(), "Objective-C Language",
445f9d3106SEnrico Granata                                 CreateInstance);
455f9d3106SEnrico Granata }
465f9d3106SEnrico Granata 
Terminate()47b9c1b51eSKate Stone void ObjCLanguage::Terminate() {
485f9d3106SEnrico Granata   PluginManager::UnregisterPlugin(CreateInstance);
495f9d3106SEnrico Granata }
505f9d3106SEnrico Granata 
515f9d3106SEnrico Granata // Static Functions
52bbd16815SEugene Zelenko 
CreateInstance(lldb::LanguageType language)53b9c1b51eSKate Stone Language *ObjCLanguage::CreateInstance(lldb::LanguageType language) {
54b9c1b51eSKate Stone   switch (language) {
555f9d3106SEnrico Granata   case lldb::eLanguageTypeObjC:
565f9d3106SEnrico Granata     return new ObjCLanguage();
575f9d3106SEnrico Granata   default:
585f9d3106SEnrico Granata     return nullptr;
595f9d3106SEnrico Granata   }
605f9d3106SEnrico Granata }
61aa816b8fSJim Ingham 
Clear()62b9c1b51eSKate Stone void ObjCLanguage::MethodName::Clear() {
63aa816b8fSJim Ingham   m_full.Clear();
64aa816b8fSJim Ingham   m_class.Clear();
65aa816b8fSJim Ingham   m_category.Clear();
66aa816b8fSJim Ingham   m_selector.Clear();
67aa816b8fSJim Ingham   m_type = eTypeUnspecified;
68aa816b8fSJim Ingham   m_category_is_valid = false;
69aa816b8fSJim Ingham }
70aa816b8fSJim Ingham 
SetName(llvm::StringRef name,bool strict)714fa098a5SZachary Turner bool ObjCLanguage::MethodName::SetName(llvm::StringRef name, bool strict) {
72aa816b8fSJim Ingham   Clear();
734fa098a5SZachary Turner   if (name.empty())
744fa098a5SZachary Turner     return IsValid(strict);
754fa098a5SZachary Turner 
7605097246SAdrian Prantl   // If "strict" is true. then the method must be specified with a '+' or '-'
7705097246SAdrian Prantl   // at the beginning. If "strict" is false, then the '+' or '-' can be omitted
78aa816b8fSJim Ingham   bool valid_prefix = false;
79aa816b8fSJim Ingham 
80ca5e153fSStephane Sezer   if (name.size() > 1 && (name[0] == '+' || name[0] == '-')) {
81aa816b8fSJim Ingham     valid_prefix = name[1] == '[';
82aa816b8fSJim Ingham     if (name[0] == '+')
83aa816b8fSJim Ingham       m_type = eTypeClassMethod;
84aa816b8fSJim Ingham     else
85aa816b8fSJim Ingham       m_type = eTypeInstanceMethod;
86b9c1b51eSKate Stone   } else if (!strict) {
87aa816b8fSJim Ingham     // "strict" is false, the name just needs to start with '['
88aa816b8fSJim Ingham     valid_prefix = name[0] == '[';
89aa816b8fSJim Ingham   }
90aa816b8fSJim Ingham 
91b9c1b51eSKate Stone   if (valid_prefix) {
924fa098a5SZachary Turner     int name_len = name.size();
934e8be2c9SAdrian Prantl     // Objective-C methods must have at least:
94aa816b8fSJim Ingham     //      "-[" or "+[" prefix
95aa816b8fSJim Ingham     //      One character for a class name
96aa816b8fSJim Ingham     //      One character for the space between the class name
97aa816b8fSJim Ingham     //      One character for the method name
98aa816b8fSJim Ingham     //      "]" suffix
994fa098a5SZachary Turner     if (name_len >= (5 + (strict ? 1 : 0)) && name.back() == ']') {
1004fa098a5SZachary Turner       m_full.SetString(name);
101aa816b8fSJim Ingham     }
102aa816b8fSJim Ingham   }
103aa816b8fSJim Ingham   return IsValid(strict);
104aa816b8fSJim Ingham }
105aa816b8fSJim Ingham 
SetName(const char * name,bool strict)1064fa098a5SZachary Turner bool ObjCLanguage::MethodName::SetName(const char *name, bool strict) {
1074fa098a5SZachary Turner   return SetName(llvm::StringRef(name), strict);
1084fa098a5SZachary Turner }
1094fa098a5SZachary Turner 
GetClassName()1100e4c4821SAdrian Prantl ConstString ObjCLanguage::MethodName::GetClassName() {
111b9c1b51eSKate Stone   if (!m_class) {
112b9c1b51eSKate Stone     if (IsValid(false)) {
113aa816b8fSJim Ingham       const char *full = m_full.GetCString();
114aa816b8fSJim Ingham       const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
115aa816b8fSJim Ingham       const char *paren_pos = strchr(class_start, '(');
116b9c1b51eSKate Stone       if (paren_pos) {
117aa816b8fSJim Ingham         m_class.SetCStringWithLength(class_start, paren_pos - class_start);
118b9c1b51eSKate Stone       } else {
11905097246SAdrian Prantl         // No '(' was found in the full name, we can definitively say that our
12005097246SAdrian Prantl         // category was valid (and empty).
121aa816b8fSJim Ingham         m_category_is_valid = true;
122aa816b8fSJim Ingham         const char *space_pos = strchr(full, ' ');
123b9c1b51eSKate Stone         if (space_pos) {
124aa816b8fSJim Ingham           m_class.SetCStringWithLength(class_start, space_pos - class_start);
125b9c1b51eSKate Stone           if (!m_class_category) {
126aa816b8fSJim Ingham             // No category in name, so we can also fill in the m_class_category
127aa816b8fSJim Ingham             m_class_category = m_class;
128aa816b8fSJim Ingham           }
129aa816b8fSJim Ingham         }
130aa816b8fSJim Ingham       }
131aa816b8fSJim Ingham     }
132aa816b8fSJim Ingham   }
133aa816b8fSJim Ingham   return m_class;
134aa816b8fSJim Ingham }
135aa816b8fSJim Ingham 
GetClassNameWithCategory()1360e4c4821SAdrian Prantl ConstString ObjCLanguage::MethodName::GetClassNameWithCategory() {
137b9c1b51eSKate Stone   if (!m_class_category) {
138b9c1b51eSKate Stone     if (IsValid(false)) {
139aa816b8fSJim Ingham       const char *full = m_full.GetCString();
140aa816b8fSJim Ingham       const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
141aa816b8fSJim Ingham       const char *space_pos = strchr(full, ' ');
142b9c1b51eSKate Stone       if (space_pos) {
143b9c1b51eSKate Stone         m_class_category.SetCStringWithLength(class_start,
144b9c1b51eSKate Stone                                               space_pos - class_start);
145aa816b8fSJim Ingham         // If m_class hasn't been filled in and the class with category doesn't
146aa816b8fSJim Ingham         // contain a '(', then we can also fill in the m_class
147b9c1b51eSKate Stone         if (!m_class && strchr(m_class_category.GetCString(), '(') == nullptr) {
148aa816b8fSJim Ingham           m_class = m_class_category;
14905097246SAdrian Prantl           // No '(' was found in the full name, we can definitively say that
15005097246SAdrian Prantl           // our category was valid (and empty).
151aa816b8fSJim Ingham           m_category_is_valid = true;
152aa816b8fSJim Ingham         }
153aa816b8fSJim Ingham       }
154aa816b8fSJim Ingham     }
155aa816b8fSJim Ingham   }
156aa816b8fSJim Ingham   return m_class_category;
157aa816b8fSJim Ingham }
158aa816b8fSJim Ingham 
GetSelector()1590e4c4821SAdrian Prantl ConstString ObjCLanguage::MethodName::GetSelector() {
160b9c1b51eSKate Stone   if (!m_selector) {
161b9c1b51eSKate Stone     if (IsValid(false)) {
162aa816b8fSJim Ingham       const char *full = m_full.GetCString();
163aa816b8fSJim Ingham       const char *space_pos = strchr(full, ' ');
164b9c1b51eSKate Stone       if (space_pos) {
165aa816b8fSJim Ingham         ++space_pos; // skip the space
166b9c1b51eSKate Stone         m_selector.SetCStringWithLength(space_pos, m_full.GetLength() -
167b9c1b51eSKate Stone                                                        (space_pos - full) - 1);
168aa816b8fSJim Ingham       }
169aa816b8fSJim Ingham     }
170aa816b8fSJim Ingham   }
171aa816b8fSJim Ingham   return m_selector;
172aa816b8fSJim Ingham }
173aa816b8fSJim Ingham 
GetCategory()1740e4c4821SAdrian Prantl ConstString ObjCLanguage::MethodName::GetCategory() {
175b9c1b51eSKate Stone   if (!m_category_is_valid && !m_category) {
176b9c1b51eSKate Stone     if (IsValid(false)) {
177aa816b8fSJim Ingham       m_category_is_valid = true;
178aa816b8fSJim Ingham       const char *full = m_full.GetCString();
179aa816b8fSJim Ingham       const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
180aa816b8fSJim Ingham       const char *open_paren_pos = strchr(class_start, '(');
181b9c1b51eSKate Stone       if (open_paren_pos) {
182aa816b8fSJim Ingham         ++open_paren_pos; // Skip the open paren
183aa816b8fSJim Ingham         const char *close_paren_pos = strchr(open_paren_pos, ')');
184aa816b8fSJim Ingham         if (close_paren_pos)
185b9c1b51eSKate Stone           m_category.SetCStringWithLength(open_paren_pos,
186b9c1b51eSKate Stone                                           close_paren_pos - open_paren_pos);
187aa816b8fSJim Ingham       }
188aa816b8fSJim Ingham     }
189aa816b8fSJim Ingham   }
190aa816b8fSJim Ingham   return m_category;
191aa816b8fSJim Ingham }
192aa816b8fSJim Ingham 
GetFullNameWithoutCategory(bool empty_if_no_category)193b9c1b51eSKate Stone ConstString ObjCLanguage::MethodName::GetFullNameWithoutCategory(
194b9c1b51eSKate Stone     bool empty_if_no_category) {
195b9c1b51eSKate Stone   if (IsValid(false)) {
196b9c1b51eSKate Stone     if (HasCategory()) {
197aa816b8fSJim Ingham       StreamString strm;
198aa816b8fSJim Ingham       if (m_type == eTypeClassMethod)
199aa816b8fSJim Ingham         strm.PutChar('+');
200aa816b8fSJim Ingham       else if (m_type == eTypeInstanceMethod)
201aa816b8fSJim Ingham         strm.PutChar('-');
202b9c1b51eSKate Stone       strm.Printf("[%s %s]", GetClassName().GetCString(),
203b9c1b51eSKate Stone                   GetSelector().GetCString());
204c156427dSZachary Turner       return ConstString(strm.GetString());
205aa816b8fSJim Ingham     }
206aa816b8fSJim Ingham 
207b9c1b51eSKate Stone     if (!empty_if_no_category) {
208aa816b8fSJim Ingham       // Just return the full name since it doesn't have a category
209aa816b8fSJim Ingham       return GetFullName();
210aa816b8fSJim Ingham     }
211aa816b8fSJim Ingham   }
212aa816b8fSJim Ingham   return ConstString();
213aa816b8fSJim Ingham }
214aa816b8fSJim Ingham 
2155bebc0b1SAlex Langford std::vector<Language::MethodNameVariant>
GetMethodNameVariants(ConstString method_name) const21658a638b7SAlex Langford ObjCLanguage::GetMethodNameVariants(ConstString method_name) const {
2175bebc0b1SAlex Langford   std::vector<Language::MethodNameVariant> variant_names;
21858a638b7SAlex Langford   ObjCLanguage::MethodName objc_method(method_name.GetCString(), false);
21958a638b7SAlex Langford   if (!objc_method.IsValid(false)) {
22058a638b7SAlex Langford     return variant_names;
22158a638b7SAlex Langford   }
22258a638b7SAlex Langford 
2235bebc0b1SAlex Langford   variant_names.emplace_back(objc_method.GetSelector(),
2245bebc0b1SAlex Langford                              lldb::eFunctionNameTypeSelector);
2255bebc0b1SAlex Langford 
22658a638b7SAlex Langford   const bool is_class_method =
22758a638b7SAlex Langford       objc_method.GetType() == MethodName::eTypeClassMethod;
22858a638b7SAlex Langford   const bool is_instance_method =
22958a638b7SAlex Langford       objc_method.GetType() == MethodName::eTypeInstanceMethod;
23058a638b7SAlex Langford   ConstString name_sans_category =
23158a638b7SAlex Langford       objc_method.GetFullNameWithoutCategory(/*empty_if_no_category*/ true);
23258a638b7SAlex Langford 
233b9c1b51eSKate Stone   if (is_class_method || is_instance_method) {
23458a638b7SAlex Langford     if (name_sans_category)
2355bebc0b1SAlex Langford       variant_names.emplace_back(name_sans_category,
2365bebc0b1SAlex Langford                                  lldb::eFunctionNameTypeFull);
237b9c1b51eSKate Stone   } else {
23858a638b7SAlex Langford     StreamString strm;
23958a638b7SAlex Langford 
24058a638b7SAlex Langford     strm.Printf("+%s", objc_method.GetFullName().GetCString());
2415bebc0b1SAlex Langford     variant_names.emplace_back(ConstString(strm.GetString()),
2425bebc0b1SAlex Langford                                lldb::eFunctionNameTypeFull);
243aa816b8fSJim Ingham     strm.Clear();
24458a638b7SAlex Langford 
24558a638b7SAlex Langford     strm.Printf("-%s", objc_method.GetFullName().GetCString());
2465bebc0b1SAlex Langford     variant_names.emplace_back(ConstString(strm.GetString()),
2475bebc0b1SAlex Langford                                lldb::eFunctionNameTypeFull);
248aa816b8fSJim Ingham     strm.Clear();
24958a638b7SAlex Langford 
25058a638b7SAlex Langford     if (name_sans_category) {
25158a638b7SAlex Langford       strm.Printf("+%s", name_sans_category.GetCString());
2525bebc0b1SAlex Langford       variant_names.emplace_back(ConstString(strm.GetString()),
2535bebc0b1SAlex Langford                                  lldb::eFunctionNameTypeFull);
254aa816b8fSJim Ingham       strm.Clear();
25558a638b7SAlex Langford 
25658a638b7SAlex Langford       strm.Printf("-%s", name_sans_category.GetCString());
2575bebc0b1SAlex Langford       variant_names.emplace_back(ConstString(strm.GetString()),
2585bebc0b1SAlex Langford                                  lldb::eFunctionNameTypeFull);
259aa816b8fSJim Ingham     }
260aa816b8fSJim Ingham   }
26158a638b7SAlex Langford 
26258a638b7SAlex Langford   return variant_names;
263aa816b8fSJim Ingham }
264d3233c1eSEnrico Granata 
SymbolNameFitsToLanguage(Mangled mangled) const265ecfca427SRaphael Isemann bool ObjCLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
266ecfca427SRaphael Isemann   ConstString demangled_name = mangled.GetDemangledName();
267ecfca427SRaphael Isemann   if (!demangled_name)
268ecfca427SRaphael Isemann     return false;
269ecfca427SRaphael Isemann   return ObjCLanguage::IsPossibleObjCMethodName(demangled_name.GetCString());
270ecfca427SRaphael Isemann }
271ecfca427SRaphael Isemann 
LoadObjCFormatters(TypeCategoryImplSP objc_category_sp)272b9c1b51eSKate Stone static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
273170c395eSEnrico Granata   if (!objc_category_sp)
274170c395eSEnrico Granata     return;
275170c395eSEnrico Granata 
276170c395eSEnrico Granata   TypeSummaryImpl::Flags objc_flags;
277170c395eSEnrico Granata   objc_flags.SetCascades(false)
278170c395eSEnrico Granata       .SetSkipPointers(true)
279170c395eSEnrico Granata       .SetSkipReferences(true)
280170c395eSEnrico Granata       .SetDontShowChildren(true)
281170c395eSEnrico Granata       .SetDontShowValue(true)
282170c395eSEnrico Granata       .SetShowMembersOneLiner(false)
283170c395eSEnrico Granata       .SetHideItemNames(false);
284170c395eSEnrico Granata 
285b9c1b51eSKate Stone   lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(
286b9c1b51eSKate Stone       objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider, ""));
287170c395eSEnrico Granata   objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"),
288170c395eSEnrico Granata                                                      ObjC_BOOL_summary);
289170c395eSEnrico Granata   objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"),
290170c395eSEnrico Granata                                                      ObjC_BOOL_summary);
291170c395eSEnrico Granata   objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"),
292170c395eSEnrico Granata                                                      ObjC_BOOL_summary);
293170c395eSEnrico Granata 
294b9c1b51eSKate Stone   // we need to skip pointers here since we are special casing a SEL* when
295b9c1b51eSKate Stone   // retrieving its value
296170c395eSEnrico Granata   objc_flags.SetSkipPointers(true);
297b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
298b9c1b51eSKate Stone                 lldb_private::formatters::ObjCSELSummaryProvider<false>,
299b9c1b51eSKate Stone                 "SEL summary provider", ConstString("SEL"), objc_flags);
300b9c1b51eSKate Stone   AddCXXSummary(
301b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>,
302b9c1b51eSKate Stone       "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
303b9c1b51eSKate Stone   AddCXXSummary(
304b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>,
305b9c1b51eSKate Stone       "SEL summary provider", ConstString("objc_selector"), objc_flags);
306b9c1b51eSKate Stone   AddCXXSummary(
307b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>,
308b9c1b51eSKate Stone       "SEL summary provider", ConstString("objc_selector *"), objc_flags);
309b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
310b9c1b51eSKate Stone                 lldb_private::formatters::ObjCSELSummaryProvider<true>,
311b9c1b51eSKate Stone                 "SEL summary provider", ConstString("SEL *"), objc_flags);
312170c395eSEnrico Granata 
313b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
314b9c1b51eSKate Stone                 lldb_private::formatters::ObjCClassSummaryProvider,
315b9c1b51eSKate Stone                 "Class summary provider", ConstString("Class"), objc_flags);
316170c395eSEnrico Granata 
317170c395eSEnrico Granata   SyntheticChildren::Flags class_synth_flags;
318b9c1b51eSKate Stone   class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
319b9c1b51eSKate Stone       false);
320170c395eSEnrico Granata 
321b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
322b9c1b51eSKate Stone                   lldb_private::formatters::ObjCClassSyntheticFrontEndCreator,
323b9c1b51eSKate Stone                   "Class synthetic children", ConstString("Class"),
324b9c1b51eSKate Stone                   class_synth_flags);
325170c395eSEnrico Granata 
326170c395eSEnrico Granata   objc_flags.SetSkipPointers(false);
327170c395eSEnrico Granata   objc_flags.SetCascades(true);
328170c395eSEnrico Granata   objc_flags.SetSkipReferences(false);
329170c395eSEnrico Granata 
330b9c1b51eSKate Stone   AddStringSummary(objc_category_sp, "${var.__FuncPtr%A}",
331b9c1b51eSKate Stone                    ConstString("__block_literal_generic"), objc_flags);
332170c395eSEnrico Granata 
333b9c1b51eSKate Stone   AddStringSummary(objc_category_sp, "${var.years} years, ${var.months} "
334b9c1b51eSKate Stone                                      "months, ${var.days} days, ${var.hours} "
335b9c1b51eSKate Stone                                      "hours, ${var.minutes} minutes "
336b9c1b51eSKate Stone                                      "${var.seconds} seconds",
337b9c1b51eSKate Stone                    ConstString("CFGregorianUnits"), objc_flags);
338170c395eSEnrico Granata   AddStringSummary(objc_category_sp,
339170c395eSEnrico Granata                    "location=${var.location} length=${var.length}",
340b9c1b51eSKate Stone                    ConstString("CFRange"), objc_flags);
341170c395eSEnrico Granata 
342170c395eSEnrico Granata   AddStringSummary(objc_category_sp,
343170c395eSEnrico Granata                    "location=${var.location}, length=${var.length}",
344b9c1b51eSKate Stone                    ConstString("NSRange"), objc_flags);
345b9c1b51eSKate Stone   AddStringSummary(objc_category_sp, "(${var.origin}, ${var.size}), ...",
346b9c1b51eSKate Stone                    ConstString("NSRectArray"), objc_flags);
347170c395eSEnrico Granata 
348b9c1b51eSKate Stone   AddOneLineSummary(objc_category_sp, ConstString("NSPoint"), objc_flags);
349b9c1b51eSKate Stone   AddOneLineSummary(objc_category_sp, ConstString("NSSize"), objc_flags);
350b9c1b51eSKate Stone   AddOneLineSummary(objc_category_sp, ConstString("NSRect"), objc_flags);
351170c395eSEnrico Granata 
352b9c1b51eSKate Stone   AddOneLineSummary(objc_category_sp, ConstString("CGSize"), objc_flags);
353b9c1b51eSKate Stone   AddOneLineSummary(objc_category_sp, ConstString("CGPoint"), objc_flags);
354b9c1b51eSKate Stone   AddOneLineSummary(objc_category_sp, ConstString("CGRect"), objc_flags);
355170c395eSEnrico Granata 
356170c395eSEnrico Granata   AddStringSummary(objc_category_sp,
357170c395eSEnrico Granata                    "red=${var.red} green=${var.green} blue=${var.blue}",
358b9c1b51eSKate Stone                    ConstString("RGBColor"), objc_flags);
359b9c1b51eSKate Stone   AddStringSummary(
360b9c1b51eSKate Stone       objc_category_sp,
361170c395eSEnrico Granata       "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
362b9c1b51eSKate Stone       ConstString("Rect"), objc_flags);
363b9c1b51eSKate Stone   AddStringSummary(objc_category_sp, "{(v=${var.v}, h=${var.h})}",
364b9c1b51eSKate Stone                    ConstString("Point"), objc_flags);
365170c395eSEnrico Granata   AddStringSummary(objc_category_sp,
366b9c1b51eSKate Stone                    "${var.month}/${var.day}/${var.year}  ${var.hour} "
367b9c1b51eSKate Stone                    ":${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
368b9c1b51eSKate Stone                    ConstString("DateTimeRect *"), objc_flags);
369b9c1b51eSKate Stone   AddStringSummary(objc_category_sp, "${var.ld.month}/${var.ld.day}/"
370b9c1b51eSKate Stone                                      "${var.ld.year} ${var.ld.hour} "
371b9c1b51eSKate Stone                                      ":${var.ld.minute} :${var.ld.second} "
372b9c1b51eSKate Stone                                      "dayOfWeek:${var.ld.dayOfWeek}",
373b9c1b51eSKate Stone                    ConstString("LongDateRect"), objc_flags);
374b9c1b51eSKate Stone   AddStringSummary(objc_category_sp, "(x=${var.x}, y=${var.y})",
375b9c1b51eSKate Stone                    ConstString("HIPoint"), objc_flags);
376b9c1b51eSKate Stone   AddStringSummary(objc_category_sp, "origin=${var.origin} size=${var.size}",
377b9c1b51eSKate Stone                    ConstString("HIRect"), objc_flags);
378170c395eSEnrico Granata 
379170c395eSEnrico Granata   TypeSummaryImpl::Flags appkit_flags;
380170c395eSEnrico Granata   appkit_flags.SetCascades(true)
381170c395eSEnrico Granata       .SetSkipPointers(false)
382170c395eSEnrico Granata       .SetSkipReferences(false)
383170c395eSEnrico Granata       .SetDontShowChildren(true)
384170c395eSEnrico Granata       .SetDontShowValue(false)
385170c395eSEnrico Granata       .SetShowMembersOneLiner(false)
386170c395eSEnrico Granata       .SetHideItemNames(false);
387170c395eSEnrico Granata 
388170c395eSEnrico Granata   appkit_flags.SetDontShowChildren(false);
389170c395eSEnrico Granata 
390b9c1b51eSKate Stone   AddCXXSummary(
391b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
392b9c1b51eSKate Stone       "NSArray summary provider", ConstString("NSArray"), appkit_flags);
393b9c1b51eSKate Stone   AddCXXSummary(
394b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
3959d5e95d0SJonas Devlieghere       "NSArray summary provider", ConstString("NSConstantArray"), appkit_flags);
3969d5e95d0SJonas Devlieghere   AddCXXSummary(
3979d5e95d0SJonas Devlieghere       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
398b9c1b51eSKate Stone       "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
399b9c1b51eSKate Stone   AddCXXSummary(
400b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
401b9c1b51eSKate Stone       "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
402b9c1b51eSKate Stone   AddCXXSummary(
403b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
404b9c1b51eSKate Stone       "NSArray summary provider", ConstString("__NSArray0"), appkit_flags);
405b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
406b9c1b51eSKate Stone                 lldb_private::formatters::NSArraySummaryProvider,
407b9c1b51eSKate Stone                 "NSArray summary provider",
408b9c1b51eSKate Stone                 ConstString("__NSSingleObjectArrayI"), appkit_flags);
409b9c1b51eSKate Stone   AddCXXSummary(
410b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
411b9c1b51eSKate Stone       "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
412b9c1b51eSKate Stone   AddCXXSummary(
413b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
414b9c1b51eSKate Stone       "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
415b9c1b51eSKate Stone   AddCXXSummary(
416b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
41737791284SKuba Mracek       "NSArray summary provider", ConstString("_NSCallStackArray"), appkit_flags);
41837791284SKuba Mracek   AddCXXSummary(
41937791284SKuba Mracek       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
420b9c1b51eSKate Stone       "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
421b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
422b9c1b51eSKate Stone                 lldb_private::formatters::NSArraySummaryProvider,
423b9c1b51eSKate Stone                 "NSArray summary provider", ConstString("CFMutableArrayRef"),
424b9c1b51eSKate Stone                 appkit_flags);
425170c395eSEnrico Granata 
426b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
427b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
428b9c1b51eSKate Stone                 "NSDictionary summary provider", ConstString("NSDictionary"),
429b9c1b51eSKate Stone                 appkit_flags);
430b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
431b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
432b9c1b51eSKate Stone                 "NSDictionary summary provider",
4339d5e95d0SJonas Devlieghere                 ConstString("NSConstantDictionary"), appkit_flags);
4349d5e95d0SJonas Devlieghere   AddCXXSummary(objc_category_sp,
4359d5e95d0SJonas Devlieghere                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
4369d5e95d0SJonas Devlieghere                 "NSDictionary summary provider",
437b9c1b51eSKate Stone                 ConstString("NSMutableDictionary"), appkit_flags);
438b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
439b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
440b9c1b51eSKate Stone                 "NSDictionary summary provider",
441b9c1b51eSKate Stone                 ConstString("__NSCFDictionary"), appkit_flags);
442b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
443b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
444b9c1b51eSKate Stone                 "NSDictionary summary provider", ConstString("__NSDictionaryI"),
445b9c1b51eSKate Stone                 appkit_flags);
446b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
447b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
448b9c1b51eSKate Stone                 "NSDictionary summary provider",
449b9c1b51eSKate Stone                 ConstString("__NSSingleEntryDictionaryI"), appkit_flags);
450b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
451b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
452b9c1b51eSKate Stone                 "NSDictionary summary provider", ConstString("__NSDictionaryM"),
453b9c1b51eSKate Stone                 appkit_flags);
454b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
455b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<true>,
456b9c1b51eSKate Stone                 "NSDictionary summary provider", ConstString("CFDictionaryRef"),
457b9c1b51eSKate Stone                 appkit_flags);
458b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
459b9c1b51eSKate Stone                 lldb_private::formatters::NSDictionarySummaryProvider<true>,
4600eba9de7SMed Ismail Bennani                 "NSDictionary summary provider", ConstString("__CFDictionary"),
4610eba9de7SMed Ismail Bennani                 appkit_flags);
4620eba9de7SMed Ismail Bennani   AddCXXSummary(objc_category_sp,
4630eba9de7SMed Ismail Bennani                 lldb_private::formatters::NSDictionarySummaryProvider<true>,
464b9c1b51eSKate Stone                 "NSDictionary summary provider",
465b9c1b51eSKate Stone                 ConstString("CFMutableDictionaryRef"), appkit_flags);
466170c395eSEnrico Granata 
467b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
468b9c1b51eSKate Stone                 lldb_private::formatters::NSSetSummaryProvider<false>,
469b9c1b51eSKate Stone                 "NSSet summary", ConstString("NSSet"), appkit_flags);
470b9c1b51eSKate Stone   AddCXXSummary(
471b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
472b9c1b51eSKate Stone       "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
473b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
474b9c1b51eSKate Stone                 lldb_private::formatters::NSSetSummaryProvider<true>,
475b9c1b51eSKate Stone                 "CFSetRef summary", ConstString("CFSetRef"), appkit_flags);
476b9c1b51eSKate Stone   AddCXXSummary(
477b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>,
478b9c1b51eSKate Stone       "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags);
479b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
480b9c1b51eSKate Stone                 lldb_private::formatters::NSSetSummaryProvider<false>,
481b9c1b51eSKate Stone                 "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags);
482b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
483b9c1b51eSKate Stone                 lldb_private::formatters::NSSetSummaryProvider<false>,
4840eba9de7SMed Ismail Bennani                 "__CFSet summary", ConstString("__CFSet"), appkit_flags);
4850eba9de7SMed Ismail Bennani   AddCXXSummary(objc_category_sp,
4860eba9de7SMed Ismail Bennani                 lldb_private::formatters::NSSetSummaryProvider<false>,
487b9c1b51eSKate Stone                 "__NSSetI summary", ConstString("__NSSetI"), appkit_flags);
488b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
489b9c1b51eSKate Stone                 lldb_private::formatters::NSSetSummaryProvider<false>,
490b9c1b51eSKate Stone                 "__NSSetM summary", ConstString("__NSSetM"), appkit_flags);
491b9c1b51eSKate Stone   AddCXXSummary(
492b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
493b9c1b51eSKate Stone       "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags);
494b9c1b51eSKate Stone   AddCXXSummary(
495b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
496b9c1b51eSKate Stone       "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
497b9c1b51eSKate Stone   AddCXXSummary(
498b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
499b9c1b51eSKate Stone       "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags);
500b9c1b51eSKate Stone   AddCXXSummary(
501b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
502b9c1b51eSKate Stone       "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags);
503b9c1b51eSKate Stone   AddCXXSummary(
504b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
505b9c1b51eSKate Stone       "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags);
506170c395eSEnrico Granata 
507b9c1b51eSKate Stone   AddCXXSummary(
508b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSError_SummaryProvider,
509b9c1b51eSKate Stone       "NSError summary provider", ConstString("NSError"), appkit_flags);
510b9c1b51eSKate Stone   AddCXXSummary(
511b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSException_SummaryProvider,
512b9c1b51eSKate Stone       "NSException summary provider", ConstString("NSException"), appkit_flags);
51316709ef9SEnrico Granata 
514b9c1b51eSKate Stone   // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}",
515b9c1b51eSKate Stone   // ConstString("$_lldb_typegen_nspair"), appkit_flags);
516170c395eSEnrico Granata 
517170c395eSEnrico Granata   appkit_flags.SetDontShowChildren(true);
518170c395eSEnrico Granata 
519b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
520b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
521b9c1b51eSKate Stone                   "NSArray synthetic children", ConstString("__NSArrayM"),
522b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
523b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
524b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
525b9c1b51eSKate Stone                   "NSArray synthetic children", ConstString("__NSArrayI"),
526b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
527b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
528b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
529b9c1b51eSKate Stone                   "NSArray synthetic children", ConstString("__NSArray0"),
530b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
531b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
532b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
533b9c1b51eSKate Stone                   "NSArray synthetic children",
534b9c1b51eSKate Stone                   ConstString("__NSSingleObjectArrayI"),
535b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
536b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
537b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
538b9c1b51eSKate Stone                   "NSArray synthetic children", ConstString("NSArray"),
539b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
540b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
541b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
5429d5e95d0SJonas Devlieghere                   "NSArray synthetic children", ConstString("NSConstantArray"),
5439d5e95d0SJonas Devlieghere                   ScriptedSyntheticChildren::Flags());
5449d5e95d0SJonas Devlieghere   AddCXXSynthetic(objc_category_sp,
5459d5e95d0SJonas Devlieghere                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
546b9c1b51eSKate Stone                   "NSArray synthetic children", ConstString("NSMutableArray"),
547b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
548b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
549b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
550b9c1b51eSKate Stone                   "NSArray synthetic children", ConstString("__NSCFArray"),
551b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
552b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
553b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
55437791284SKuba Mracek                   "NSArray synthetic children", ConstString("_NSCallStackArray"),
55537791284SKuba Mracek                   ScriptedSyntheticChildren::Flags());
55637791284SKuba Mracek   AddCXXSynthetic(objc_category_sp,
55737791284SKuba Mracek                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
558b9c1b51eSKate Stone                   "NSArray synthetic children",
559b9c1b51eSKate Stone                   ConstString("CFMutableArrayRef"),
560b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
561b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
562b9c1b51eSKate Stone                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
563b9c1b51eSKate Stone                   "NSArray synthetic children", ConstString("CFArrayRef"),
564b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
565170c395eSEnrico Granata 
566b9c1b51eSKate Stone   AddCXXSynthetic(
567b9c1b51eSKate Stone       objc_category_sp,
568b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
569b9c1b51eSKate Stone       "NSDictionary synthetic children", ConstString("__NSDictionaryM"),
570b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
571b9c1b51eSKate Stone   AddCXXSynthetic(
572b9c1b51eSKate Stone       objc_category_sp,
573b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
5749d5e95d0SJonas Devlieghere       "NSDictionary synthetic children", ConstString("NSConstantDictionary"),
5759d5e95d0SJonas Devlieghere       ScriptedSyntheticChildren::Flags());
5769d5e95d0SJonas Devlieghere   AddCXXSynthetic(
5779d5e95d0SJonas Devlieghere       objc_category_sp,
5789d5e95d0SJonas Devlieghere       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
579b9c1b51eSKate Stone       "NSDictionary synthetic children", ConstString("__NSDictionaryI"),
580b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
581b9c1b51eSKate Stone   AddCXXSynthetic(
582b9c1b51eSKate Stone       objc_category_sp,
583b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
584b9c1b51eSKate Stone       "NSDictionary synthetic children",
585b9c1b51eSKate Stone       ConstString("__NSSingleEntryDictionaryI"),
586b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
587b9c1b51eSKate Stone   AddCXXSynthetic(
588b9c1b51eSKate Stone       objc_category_sp,
589b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
590b9c1b51eSKate Stone       "NSDictionary synthetic children", ConstString("__NSCFDictionary"),
591b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
592b9c1b51eSKate Stone   AddCXXSynthetic(
593b9c1b51eSKate Stone       objc_category_sp,
594b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
595b9c1b51eSKate Stone       "NSDictionary synthetic children", ConstString("NSDictionary"),
596b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
597b9c1b51eSKate Stone   AddCXXSynthetic(
598b9c1b51eSKate Stone       objc_category_sp,
599b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
600b9c1b51eSKate Stone       "NSDictionary synthetic children", ConstString("NSMutableDictionary"),
601b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
602b9c1b51eSKate Stone   AddCXXSynthetic(
603b9c1b51eSKate Stone       objc_category_sp,
604b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
605b9c1b51eSKate Stone       "NSDictionary synthetic children", ConstString("CFDictionaryRef"),
606b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
607b9c1b51eSKate Stone   AddCXXSynthetic(
608b9c1b51eSKate Stone       objc_category_sp,
609b9c1b51eSKate Stone       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
610b9c1b51eSKate Stone       "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"),
611b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
6120eba9de7SMed Ismail Bennani   AddCXXSynthetic(
6130eba9de7SMed Ismail Bennani       objc_category_sp,
6140eba9de7SMed Ismail Bennani       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
6150eba9de7SMed Ismail Bennani       "NSDictionary synthetic children", ConstString("__CFDictionary"),
6160eba9de7SMed Ismail Bennani       ScriptedSyntheticChildren::Flags());
617170c395eSEnrico Granata 
618b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
619b9c1b51eSKate Stone                   lldb_private::formatters::NSErrorSyntheticFrontEndCreator,
620b9c1b51eSKate Stone                   "NSError synthetic children", ConstString("NSError"),
621b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
622b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
623b9c1b51eSKate Stone                   lldb_private::formatters::NSExceptionSyntheticFrontEndCreator,
624b9c1b51eSKate Stone                   "NSException synthetic children", ConstString("NSException"),
625b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
62616709ef9SEnrico Granata 
627b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
628b9c1b51eSKate Stone                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
629b9c1b51eSKate Stone                   "NSSet synthetic children", ConstString("NSSet"),
630b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
631b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
632b9c1b51eSKate Stone                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
633b9c1b51eSKate Stone                   "__NSSetI synthetic children", ConstString("__NSSetI"),
634b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
635b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
636b9c1b51eSKate Stone                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
637b9c1b51eSKate Stone                   "__NSSetM synthetic children", ConstString("__NSSetM"),
638b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
6398f5beb4cSMed Ismail Bennani   AddCXXSynthetic(objc_category_sp,
6408f5beb4cSMed Ismail Bennani                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
6418f5beb4cSMed Ismail Bennani                   "__NSCFSet synthetic children", ConstString("__NSCFSet"),
6428f5beb4cSMed Ismail Bennani                   ScriptedSyntheticChildren::Flags());
6430eba9de7SMed Ismail Bennani   AddCXXSynthetic(objc_category_sp,
6440eba9de7SMed Ismail Bennani                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
6450eba9de7SMed Ismail Bennani                   "CFSetRef synthetic children", ConstString("CFSetRef"),
6460eba9de7SMed Ismail Bennani                   ScriptedSyntheticChildren::Flags());
6478f5beb4cSMed Ismail Bennani 
648b9c1b51eSKate Stone   AddCXXSynthetic(
649b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
650b9c1b51eSKate Stone       "NSMutableSet synthetic children", ConstString("NSMutableSet"),
651b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
652b9c1b51eSKate Stone   AddCXXSynthetic(
653b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
654b9c1b51eSKate Stone       "NSOrderedSet synthetic children", ConstString("NSOrderedSet"),
655b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
656b9c1b51eSKate Stone   AddCXXSynthetic(
657b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
658b9c1b51eSKate Stone       "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"),
659b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
660b9c1b51eSKate Stone   AddCXXSynthetic(
661b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
662b9c1b51eSKate Stone       "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"),
663b9c1b51eSKate Stone       ScriptedSyntheticChildren::Flags());
6640eba9de7SMed Ismail Bennani   AddCXXSynthetic(objc_category_sp,
6650eba9de7SMed Ismail Bennani                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
6660eba9de7SMed Ismail Bennani                   "__CFSet synthetic children", ConstString("__CFSet"),
6670eba9de7SMed Ismail Bennani                   ScriptedSyntheticChildren::Flags());
668170c395eSEnrico Granata 
669b9c1b51eSKate Stone   AddCXXSynthetic(objc_category_sp,
670b9c1b51eSKate Stone                   lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator,
671b9c1b51eSKate Stone                   "NSIndexPath synthetic children", ConstString("NSIndexPath"),
672b9c1b51eSKate Stone                   ScriptedSyntheticChildren::Flags());
673170c395eSEnrico Granata 
674b9c1b51eSKate Stone   AddCXXSummary(
675b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::CFBagSummaryProvider,
676b9c1b51eSKate Stone       "CFBag summary provider", ConstString("CFBagRef"), appkit_flags);
677b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
678b9c1b51eSKate Stone                 lldb_private::formatters::CFBagSummaryProvider,
679b9c1b51eSKate Stone                 "CFBag summary provider", ConstString("__CFBag"), appkit_flags);
680b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
681b9c1b51eSKate Stone                 lldb_private::formatters::CFBagSummaryProvider,
682b9c1b51eSKate Stone                 "CFBag summary provider", ConstString("const struct __CFBag"),
683b9c1b51eSKate Stone                 appkit_flags);
684b9c1b51eSKate Stone   AddCXXSummary(
685b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::CFBagSummaryProvider,
686b9c1b51eSKate Stone       "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags);
687170c395eSEnrico Granata 
688b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
689b9c1b51eSKate Stone                 lldb_private::formatters::CFBinaryHeapSummaryProvider,
690b9c1b51eSKate Stone                 "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"),
691b9c1b51eSKate Stone                 appkit_flags);
692b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
693b9c1b51eSKate Stone                 lldb_private::formatters::CFBinaryHeapSummaryProvider,
694b9c1b51eSKate Stone                 "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"),
695170c395eSEnrico Granata                 appkit_flags);
696170c395eSEnrico Granata 
697b9c1b51eSKate Stone   AddCXXSummary(
698b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
699b9c1b51eSKate Stone       "NSString summary provider", ConstString("NSString"), appkit_flags);
700b9c1b51eSKate Stone   AddCXXSummary(
701b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
702b9c1b51eSKate Stone       "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
703b9c1b51eSKate Stone   AddCXXSummary(
704b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
705b9c1b51eSKate Stone       "NSString summary provider", ConstString("__CFString"), appkit_flags);
706b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
707b9c1b51eSKate Stone                 lldb_private::formatters::NSStringSummaryProvider,
708b9c1b51eSKate Stone                 "NSString summary provider", ConstString("CFMutableStringRef"),
709b9c1b51eSKate Stone                 appkit_flags);
710b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
711b9c1b51eSKate Stone                 lldb_private::formatters::NSStringSummaryProvider,
712b9c1b51eSKate Stone                 "NSString summary provider", ConstString("NSMutableString"),
713b9c1b51eSKate Stone                 appkit_flags);
714b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
715b9c1b51eSKate Stone                 lldb_private::formatters::NSStringSummaryProvider,
716b9c1b51eSKate Stone                 "NSString summary provider",
717b9c1b51eSKate Stone                 ConstString("__NSCFConstantString"), appkit_flags);
718b9c1b51eSKate Stone   AddCXXSummary(
719b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
720b9c1b51eSKate Stone       "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
721b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
722b9c1b51eSKate Stone                 lldb_private::formatters::NSStringSummaryProvider,
723b9c1b51eSKate Stone                 "NSString summary provider", ConstString("NSCFConstantString"),
724b9c1b51eSKate Stone                 appkit_flags);
725b9c1b51eSKate Stone   AddCXXSummary(
726b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
727b9c1b51eSKate Stone       "NSString summary provider", ConstString("NSCFString"), appkit_flags);
728b9c1b51eSKate Stone   AddCXXSummary(
729b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
730b9c1b51eSKate Stone       "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
731b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
732b9c1b51eSKate Stone                 lldb_private::formatters::NSStringSummaryProvider,
733b9c1b51eSKate Stone                 "NSString summary provider",
734b9c1b51eSKate Stone                 ConstString("NSTaggedPointerString"), appkit_flags);
735b9c1b51eSKate Stone 
736b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
737b9c1b51eSKate Stone                 lldb_private::formatters::NSAttributedStringSummaryProvider,
738b9c1b51eSKate Stone                 "NSAttributedString summary provider",
739b9c1b51eSKate Stone                 ConstString("NSAttributedString"), appkit_flags);
740b9c1b51eSKate Stone   AddCXXSummary(
741b9c1b51eSKate Stone       objc_category_sp,
742b9c1b51eSKate Stone       lldb_private::formatters::NSMutableAttributedStringSummaryProvider,
743b9c1b51eSKate Stone       "NSMutableAttributedString summary provider",
744b9c1b51eSKate Stone       ConstString("NSMutableAttributedString"), appkit_flags);
745b9c1b51eSKate Stone   AddCXXSummary(
746b9c1b51eSKate Stone       objc_category_sp,
747b9c1b51eSKate Stone       lldb_private::formatters::NSMutableAttributedStringSummaryProvider,
748b9c1b51eSKate Stone       "NSMutableAttributedString summary provider",
749b9c1b51eSKate Stone       ConstString("NSConcreteMutableAttributedString"), appkit_flags);
750b9c1b51eSKate Stone 
751b9c1b51eSKate Stone   AddCXXSummary(
752b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSBundleSummaryProvider,
753b9c1b51eSKate Stone       "NSBundle summary provider", ConstString("NSBundle"), appkit_flags);
754b9c1b51eSKate Stone 
755b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
756b9c1b51eSKate Stone                 lldb_private::formatters::NSDataSummaryProvider<false>,
757b9c1b51eSKate Stone                 "NSData summary provider", ConstString("NSData"), appkit_flags);
758b9c1b51eSKate Stone   AddCXXSummary(
759b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
760b9c1b51eSKate Stone       "NSData summary provider", ConstString("_NSInlineData"), appkit_flags);
761b9c1b51eSKate Stone   AddCXXSummary(
762b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
763b9c1b51eSKate Stone       "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
764b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
765b9c1b51eSKate Stone                 lldb_private::formatters::NSDataSummaryProvider<false>,
766b9c1b51eSKate Stone                 "NSData summary provider", ConstString("NSConcreteMutableData"),
767b9c1b51eSKate Stone                 appkit_flags);
768b9c1b51eSKate Stone   AddCXXSummary(
769b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
770b9c1b51eSKate Stone       "NSData summary provider", ConstString("NSMutableData"), appkit_flags);
771b9c1b51eSKate Stone   AddCXXSummary(
772b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
773b9c1b51eSKate Stone       "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
774b9c1b51eSKate Stone   AddCXXSummary(
775b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>,
776b9c1b51eSKate Stone       "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
777b9c1b51eSKate Stone   AddCXXSummary(
778b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>,
779b9c1b51eSKate Stone       "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
780b9c1b51eSKate Stone 
781b9c1b51eSKate Stone   AddCXXSummary(
782b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSMachPortSummaryProvider,
783b9c1b51eSKate Stone       "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags);
784b9c1b51eSKate Stone 
785b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
786b9c1b51eSKate Stone                 lldb_private::formatters::NSNotificationSummaryProvider,
787b9c1b51eSKate Stone                 "NSNotification summary provider",
788b9c1b51eSKate Stone                 ConstString("NSNotification"), appkit_flags);
789b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
790b9c1b51eSKate Stone                 lldb_private::formatters::NSNotificationSummaryProvider,
791b9c1b51eSKate Stone                 "NSNotification summary provider",
792b9c1b51eSKate Stone                 ConstString("NSConcreteNotification"), appkit_flags);
793b9c1b51eSKate Stone 
794b9c1b51eSKate Stone   AddCXXSummary(
795b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
796b9c1b51eSKate Stone       "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
7979d5e95d0SJonas Devlieghere   AddCXXSummary(objc_category_sp,
7989d5e95d0SJonas Devlieghere                 lldb_private::formatters::NSNumberSummaryProvider,
7999d5e95d0SJonas Devlieghere                 "NSNumber summary provider",
8009d5e95d0SJonas Devlieghere                 ConstString("NSConstantIntegerNumber"), appkit_flags);
8019d5e95d0SJonas Devlieghere   AddCXXSummary(objc_category_sp,
8029d5e95d0SJonas Devlieghere                 lldb_private::formatters::NSNumberSummaryProvider,
8039d5e95d0SJonas Devlieghere                 "NSNumber summary provider",
8049d5e95d0SJonas Devlieghere                 ConstString("NSConstantDoubleNumber"), appkit_flags);
8059d5e95d0SJonas Devlieghere   AddCXXSummary(objc_category_sp,
8069d5e95d0SJonas Devlieghere                 lldb_private::formatters::NSNumberSummaryProvider,
8079d5e95d0SJonas Devlieghere                 "NSNumber summary provider",
8089d5e95d0SJonas Devlieghere                 ConstString("NSConstantFloatNumber"), appkit_flags);
809b9c1b51eSKate Stone   AddCXXSummary(
810b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
811b9c1b51eSKate Stone       "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
812b9c1b51eSKate Stone   AddCXXSummary(
813b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
814b9c1b51eSKate Stone       "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
815b9c1b51eSKate Stone   AddCXXSummary(
816b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
817b9c1b51eSKate Stone       "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
818b9c1b51eSKate Stone   AddCXXSummary(
819b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
820b9c1b51eSKate Stone       "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
821b9c1b51eSKate Stone   AddCXXSummary(
822b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
823b9c1b51eSKate Stone       "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
82420b051baSJonas Devlieghere   AddCXXSummary(objc_category_sp,
82520b051baSJonas Devlieghere                 lldb_private::formatters::NSNumberSummaryProvider,
82620b051baSJonas Devlieghere                 "NSDecimalNumber summary provider",
82720b051baSJonas Devlieghere                 ConstString("NSDecimalNumber"), appkit_flags);
828b9c1b51eSKate Stone 
829b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
830b9c1b51eSKate Stone                 lldb_private::formatters::NSURLSummaryProvider,
831b9c1b51eSKate Stone                 "NSURL summary provider", ConstString("NSURL"), appkit_flags);
832b9c1b51eSKate Stone   AddCXXSummary(
833b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSURLSummaryProvider,
834b9c1b51eSKate Stone       "NSURL summary provider", ConstString("CFURLRef"), appkit_flags);
835b9c1b51eSKate Stone 
836b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
837b9c1b51eSKate Stone                 lldb_private::formatters::NSDateSummaryProvider,
838b9c1b51eSKate Stone                 "NSDate summary provider", ConstString("NSDate"), appkit_flags);
839b9c1b51eSKate Stone   AddCXXSummary(
840b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDateSummaryProvider,
841b9c1b51eSKate Stone       "NSDate summary provider", ConstString("__NSDate"), appkit_flags);
842b9c1b51eSKate Stone   AddCXXSummary(
843b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDateSummaryProvider,
844b9c1b51eSKate Stone       "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags);
845b9c1b51eSKate Stone   AddCXXSummary(
846b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSDateSummaryProvider,
847b9c1b51eSKate Stone       "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags);
848b9c1b51eSKate Stone 
849b9c1b51eSKate Stone   AddCXXSummary(
850b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider,
851b9c1b51eSKate Stone       "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags);
852b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
853b9c1b51eSKate Stone                 lldb_private::formatters::NSTimeZoneSummaryProvider,
854b9c1b51eSKate Stone                 "NSTimeZone summary provider", ConstString("CFTimeZoneRef"),
855b9c1b51eSKate Stone                 appkit_flags);
856b9c1b51eSKate Stone   AddCXXSummary(
857b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider,
858b9c1b51eSKate Stone       "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags);
859b9c1b51eSKate Stone 
86005097246SAdrian Prantl   // CFAbsoluteTime is actually a double rather than a pointer to an object we
86105097246SAdrian Prantl   // do not care about the numeric value, since it is probably meaningless to
862b9c1b51eSKate Stone   // users
863b9c1b51eSKate Stone   appkit_flags.SetDontShowValue(true);
864b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
865b9c1b51eSKate Stone                 lldb_private::formatters::CFAbsoluteTimeSummaryProvider,
866b9c1b51eSKate Stone                 "CFAbsoluteTime summary provider",
867b9c1b51eSKate Stone                 ConstString("CFAbsoluteTime"), appkit_flags);
868b9c1b51eSKate Stone   appkit_flags.SetDontShowValue(false);
869b9c1b51eSKate Stone 
870b9c1b51eSKate Stone   AddCXXSummary(
871b9c1b51eSKate Stone       objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider,
872b9c1b51eSKate Stone       "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags);
873b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
874b9c1b51eSKate Stone                 lldb_private::formatters::NSIndexSetSummaryProvider,
875b9c1b51eSKate Stone                 "NSIndexSet summary provider", ConstString("NSMutableIndexSet"),
876b9c1b51eSKate Stone                 appkit_flags);
877b9c1b51eSKate Stone 
878b9c1b51eSKate Stone   AddStringSummary(objc_category_sp,
879b9c1b51eSKate Stone                    "@\"${var.month%d}/${var.day%d}/${var.year%d} "
880b9c1b51eSKate Stone                    "${var.hour%d}:${var.minute%d}:${var.second}\"",
881b9c1b51eSKate Stone                    ConstString("CFGregorianDate"), appkit_flags);
882b9c1b51eSKate Stone 
883b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
884b9c1b51eSKate Stone                 lldb_private::formatters::CFBitVectorSummaryProvider,
885b9c1b51eSKate Stone                 "CFBitVector summary provider", ConstString("CFBitVectorRef"),
886b9c1b51eSKate Stone                 appkit_flags);
887b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
888b9c1b51eSKate Stone                 lldb_private::formatters::CFBitVectorSummaryProvider,
889b9c1b51eSKate Stone                 "CFBitVector summary provider",
890b9c1b51eSKate Stone                 ConstString("CFMutableBitVectorRef"), appkit_flags);
891b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
892b9c1b51eSKate Stone                 lldb_private::formatters::CFBitVectorSummaryProvider,
893b9c1b51eSKate Stone                 "CFBitVector summary provider", ConstString("__CFBitVector"),
894b9c1b51eSKate Stone                 appkit_flags);
895b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
896b9c1b51eSKate Stone                 lldb_private::formatters::CFBitVectorSummaryProvider,
897b9c1b51eSKate Stone                 "CFBitVector summary provider",
898b9c1b51eSKate Stone                 ConstString("__CFMutableBitVector"), appkit_flags);
899170c395eSEnrico Granata }
900170c395eSEnrico Granata 
LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp)901b9c1b51eSKate Stone static void LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp) {
902170c395eSEnrico Granata   if (!objc_category_sp)
903170c395eSEnrico Granata     return;
904170c395eSEnrico Granata 
905170c395eSEnrico Granata   TypeSummaryImpl::Flags cm_flags;
906170c395eSEnrico Granata   cm_flags.SetCascades(true)
907170c395eSEnrico Granata       .SetDontShowChildren(false)
908170c395eSEnrico Granata       .SetDontShowValue(false)
909170c395eSEnrico Granata       .SetHideItemNames(false)
910170c395eSEnrico Granata       .SetShowMembersOneLiner(false)
911170c395eSEnrico Granata       .SetSkipPointers(false)
912170c395eSEnrico Granata       .SetSkipReferences(false);
913170c395eSEnrico Granata 
914b9c1b51eSKate Stone   AddCXXSummary(objc_category_sp,
915b9c1b51eSKate Stone                 lldb_private::formatters::CMTimeSummaryProvider,
916b9c1b51eSKate Stone                 "CMTime summary provider", ConstString("CMTime"), cm_flags);
917170c395eSEnrico Granata }
918170c395eSEnrico Granata 
GetFormatters()919b9c1b51eSKate Stone lldb::TypeCategoryImplSP ObjCLanguage::GetFormatters() {
920c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
921170c395eSEnrico Granata   static TypeCategoryImplSP g_category;
922170c395eSEnrico Granata 
923c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, [this]() -> void {
924*a3939e15SPavel Labath     DataVisualization::Categories::GetCategory(ConstString(GetPluginName()),
925*a3939e15SPavel Labath                                                g_category);
926b9c1b51eSKate Stone     if (g_category) {
927170c395eSEnrico Granata       LoadCoreMediaFormatters(g_category);
928170c395eSEnrico Granata       LoadObjCFormatters(g_category);
929170c395eSEnrico Granata     }
930170c395eSEnrico Granata   });
931170c395eSEnrico Granata   return g_category;
932170c395eSEnrico Granata }
933170c395eSEnrico Granata 
934d3233c1eSEnrico Granata std::vector<ConstString>
GetPossibleFormattersMatches(ValueObject & valobj,lldb::DynamicValueType use_dynamic)935b9c1b51eSKate Stone ObjCLanguage::GetPossibleFormattersMatches(ValueObject &valobj,
936b9c1b51eSKate Stone                                            lldb::DynamicValueType use_dynamic) {
937d3233c1eSEnrico Granata   std::vector<ConstString> result;
938d3233c1eSEnrico Granata 
939d3233c1eSEnrico Granata   if (use_dynamic == lldb::eNoDynamicValues)
940d3233c1eSEnrico Granata     return result;
941d3233c1eSEnrico Granata 
942d3233c1eSEnrico Granata   CompilerType compiler_type(valobj.GetCompilerType());
943d3233c1eSEnrico Granata 
944d3233c1eSEnrico Granata   const bool check_cpp = false;
945d3233c1eSEnrico Granata   const bool check_objc = true;
946b9c1b51eSKate Stone   bool canBeObjCDynamic =
947b9c1b51eSKate Stone       compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc);
948d3233c1eSEnrico Granata 
949bd7d9a85SRaphael Isemann   if (canBeObjCDynamic && ClangUtil::IsClangType(compiler_type)) {
950d3233c1eSEnrico Granata     do {
951d3233c1eSEnrico Granata       lldb::ProcessSP process_sp = valobj.GetProcessSP();
952d3233c1eSEnrico Granata       if (!process_sp)
953d3233c1eSEnrico Granata         break;
954e823bbe8SAlex Langford       ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
955d3233c1eSEnrico Granata       if (runtime == nullptr)
956d3233c1eSEnrico Granata         break;
957b9c1b51eSKate Stone       ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp(
958b9c1b51eSKate Stone           runtime->GetClassDescriptor(valobj));
959d3233c1eSEnrico Granata       if (!objc_class_sp)
960d3233c1eSEnrico Granata         break;
961d3233c1eSEnrico Granata       if (ConstString name = objc_class_sp->GetClassName())
962d3233c1eSEnrico Granata         result.push_back(name);
963d3233c1eSEnrico Granata     } while (false);
964d3233c1eSEnrico Granata   }
965d3233c1eSEnrico Granata 
966d3233c1eSEnrico Granata   return result;
967d3233c1eSEnrico Granata }
9689b0af1b8SEnrico Granata 
GetTypeScavenger()969b9c1b51eSKate Stone std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() {
970b9c1b51eSKate Stone   class ObjCScavengerResult : public Language::TypeScavenger::Result {
9719b0af1b8SEnrico Granata   public:
972b9c1b51eSKate Stone     ObjCScavengerResult(CompilerType type)
973b9c1b51eSKate Stone         : Language::TypeScavenger::Result(), m_compiler_type(type) {}
9749b0af1b8SEnrico Granata 
975b9c1b51eSKate Stone     bool IsValid() override { return m_compiler_type.IsValid(); }
9769b0af1b8SEnrico Granata 
977b9c1b51eSKate Stone     bool DumpToStream(Stream &stream, bool print_help_if_available) override {
978b9c1b51eSKate Stone       if (IsValid()) {
9799b0af1b8SEnrico Granata         m_compiler_type.DumpTypeDescription(&stream);
9809b0af1b8SEnrico Granata         stream.EOL();
9819b0af1b8SEnrico Granata         return true;
9829b0af1b8SEnrico Granata       }
9839b0af1b8SEnrico Granata       return false;
9849b0af1b8SEnrico Granata     }
9859b0af1b8SEnrico Granata 
9869b0af1b8SEnrico Granata   private:
9879b0af1b8SEnrico Granata     CompilerType m_compiler_type;
9889b0af1b8SEnrico Granata   };
9899b0af1b8SEnrico Granata 
990f6021673SEnrico Granata   class ObjCRuntimeScavenger : public Language::TypeScavenger {
9919b0af1b8SEnrico Granata   protected:
992b9c1b51eSKate Stone     bool Find_Impl(ExecutionContextScope *exe_scope, const char *key,
993b9c1b51eSKate Stone                    ResultSet &results) override {
9949b0af1b8SEnrico Granata       bool result = false;
9959b0af1b8SEnrico Granata 
9968055cbc4SAlex Langford       if (auto *process = exe_scope->CalculateProcess().get()) {
9978055cbc4SAlex Langford         if (auto *objc_runtime = ObjCLanguageRuntime::Get(*process)) {
9988055cbc4SAlex Langford           if (auto *decl_vendor = objc_runtime->GetDeclVendor()) {
9999b0af1b8SEnrico Granata             ConstString name(key);
10008055cbc4SAlex Langford             for (const CompilerType &type :
10018055cbc4SAlex Langford                  decl_vendor->FindTypes(name, /*max_matches*/ UINT32_MAX)) {
10029b0af1b8SEnrico Granata               result = true;
1003b9c1b51eSKate Stone               std::unique_ptr<Language::TypeScavenger::Result> result(
10048055cbc4SAlex Langford                   new ObjCScavengerResult(type));
10059b0af1b8SEnrico Granata               results.insert(std::move(result));
10069b0af1b8SEnrico Granata             }
10079b0af1b8SEnrico Granata           }
10089b0af1b8SEnrico Granata         }
10099b0af1b8SEnrico Granata       }
1010f6021673SEnrico Granata 
1011f6021673SEnrico Granata       return result;
1012f6021673SEnrico Granata     }
1013f6021673SEnrico Granata 
1014f6021673SEnrico Granata     friend class lldb_private::ObjCLanguage;
1015f6021673SEnrico Granata   };
1016f6021673SEnrico Granata 
1017f6021673SEnrico Granata   class ObjCModulesScavenger : public Language::TypeScavenger {
1018f6021673SEnrico Granata   protected:
1019f6021673SEnrico Granata     bool Find_Impl(ExecutionContextScope *exe_scope, const char *key,
1020f6021673SEnrico Granata                    ResultSet &results) override {
1021f6021673SEnrico Granata       bool result = false;
1022f6021673SEnrico Granata 
10238055cbc4SAlex Langford       if (auto *target = exe_scope->CalculateTarget().get()) {
10244c0b0de9SAlex Langford         auto *persistent_vars = llvm::cast<ClangPersistentVariables>(
10254c0b0de9SAlex Langford             target->GetPersistentExpressionStateForLanguage(
10264c0b0de9SAlex Langford                 lldb::eLanguageTypeC));
10274c0b0de9SAlex Langford         if (std::shared_ptr<ClangModulesDeclVendor> clang_modules_decl_vendor =
10284c0b0de9SAlex Langford                 persistent_vars->GetClangModulesDeclVendor()) {
1029f6021673SEnrico Granata           ConstString key_cs(key);
10308055cbc4SAlex Langford           auto types = clang_modules_decl_vendor->FindTypes(
10318055cbc4SAlex Langford               key_cs, /*max_matches*/ UINT32_MAX);
10328055cbc4SAlex Langford           if (!types.empty()) {
1033f6021673SEnrico Granata             result = true;
1034f6021673SEnrico Granata             std::unique_ptr<Language::TypeScavenger::Result> result(
10358055cbc4SAlex Langford                 new ObjCScavengerResult(types.front()));
1036f6021673SEnrico Granata             results.insert(std::move(result));
1037f6021673SEnrico Granata           }
1038f6021673SEnrico Granata         }
103972d8a722SEnrico Granata       }
104072d8a722SEnrico Granata 
10419b0af1b8SEnrico Granata       return result;
10429b0af1b8SEnrico Granata     }
10439b0af1b8SEnrico Granata 
1044af87713aSOleksiy Vyalov     friend class lldb_private::ObjCLanguage;
10459b0af1b8SEnrico Granata   };
10469b0af1b8SEnrico Granata 
10477700de8cSEnrico Granata   class ObjCDebugInfoScavenger : public Language::ImageListTypeScavenger {
10487700de8cSEnrico Granata   public:
10491756630dSRaphael Isemann     CompilerType AdjustForInclusion(CompilerType &candidate) override {
10507700de8cSEnrico Granata       LanguageType lang_type(candidate.GetMinimumLanguage());
10517700de8cSEnrico Granata       if (!Language::LanguageIsObjC(lang_type))
10527700de8cSEnrico Granata         return CompilerType();
10537700de8cSEnrico Granata       if (candidate.IsTypedefType())
10547700de8cSEnrico Granata         return candidate.GetTypedefedType();
10557700de8cSEnrico Granata       return candidate;
10567700de8cSEnrico Granata     }
10577700de8cSEnrico Granata   };
10587700de8cSEnrico Granata 
1059f6021673SEnrico Granata   return std::unique_ptr<TypeScavenger>(
1060f6021673SEnrico Granata       new Language::EitherTypeScavenger<ObjCModulesScavenger,
10617700de8cSEnrico Granata                                         ObjCRuntimeScavenger,
10627700de8cSEnrico Granata                                         ObjCDebugInfoScavenger>());
10639b0af1b8SEnrico Granata }
1064675f49bbSEnrico Granata 
GetFormatterPrefixSuffix(ValueObject & valobj,ConstString type_hint,std::string & prefix,std::string & suffix)1065b9c1b51eSKate Stone bool ObjCLanguage::GetFormatterPrefixSuffix(ValueObject &valobj,
1066b9c1b51eSKate Stone                                             ConstString type_hint,
1067b9c1b51eSKate Stone                                             std::string &prefix,
1068b9c1b51eSKate Stone                                             std::string &suffix) {
1069675f49bbSEnrico Granata   static ConstString g_CFBag("CFBag");
1070675f49bbSEnrico Granata   static ConstString g_CFBinaryHeap("CFBinaryHeap");
1071675f49bbSEnrico Granata 
1072675f49bbSEnrico Granata   static ConstString g_NSNumberChar("NSNumber:char");
1073675f49bbSEnrico Granata   static ConstString g_NSNumberShort("NSNumber:short");
1074675f49bbSEnrico Granata   static ConstString g_NSNumberInt("NSNumber:int");
1075675f49bbSEnrico Granata   static ConstString g_NSNumberLong("NSNumber:long");
107618b5d926SSean Callanan   static ConstString g_NSNumberInt128("NSNumber:int128_t");
1077675f49bbSEnrico Granata   static ConstString g_NSNumberFloat("NSNumber:float");
1078675f49bbSEnrico Granata   static ConstString g_NSNumberDouble("NSNumber:double");
1079675f49bbSEnrico Granata 
1080675f49bbSEnrico Granata   static ConstString g_NSData("NSData");
1081675f49bbSEnrico Granata   static ConstString g_NSArray("NSArray");
1082675f49bbSEnrico Granata   static ConstString g_NSString("NSString");
1083675f49bbSEnrico Granata   static ConstString g_NSStringStar("NSString*");
1084675f49bbSEnrico Granata 
1085675f49bbSEnrico Granata   if (type_hint.IsEmpty())
1086675f49bbSEnrico Granata     return false;
1087675f49bbSEnrico Granata 
1088675f49bbSEnrico Granata   prefix.clear();
1089675f49bbSEnrico Granata   suffix.clear();
1090675f49bbSEnrico Granata 
1091b9c1b51eSKate Stone   if (type_hint == g_CFBag || type_hint == g_CFBinaryHeap) {
1092675f49bbSEnrico Granata     prefix = "@";
1093675f49bbSEnrico Granata     return true;
1094675f49bbSEnrico Granata   }
1095675f49bbSEnrico Granata 
1096b9c1b51eSKate Stone   if (type_hint == g_NSNumberChar) {
1097675f49bbSEnrico Granata     prefix = "(char)";
1098675f49bbSEnrico Granata     return true;
1099675f49bbSEnrico Granata   }
1100b9c1b51eSKate Stone   if (type_hint == g_NSNumberShort) {
1101675f49bbSEnrico Granata     prefix = "(short)";
1102675f49bbSEnrico Granata     return true;
1103675f49bbSEnrico Granata   }
1104b9c1b51eSKate Stone   if (type_hint == g_NSNumberInt) {
1105675f49bbSEnrico Granata     prefix = "(int)";
1106675f49bbSEnrico Granata     return true;
1107675f49bbSEnrico Granata   }
1108b9c1b51eSKate Stone   if (type_hint == g_NSNumberLong) {
1109675f49bbSEnrico Granata     prefix = "(long)";
1110675f49bbSEnrico Granata     return true;
1111675f49bbSEnrico Granata   }
111218b5d926SSean Callanan   if (type_hint == g_NSNumberInt128) {
111318b5d926SSean Callanan     prefix = "(int128_t)";
111418b5d926SSean Callanan     return true;
111518b5d926SSean Callanan   }
1116b9c1b51eSKate Stone   if (type_hint == g_NSNumberFloat) {
1117675f49bbSEnrico Granata     prefix = "(float)";
1118675f49bbSEnrico Granata     return true;
1119675f49bbSEnrico Granata   }
1120b9c1b51eSKate Stone   if (type_hint == g_NSNumberDouble) {
1121675f49bbSEnrico Granata     prefix = "(double)";
1122675f49bbSEnrico Granata     return true;
1123675f49bbSEnrico Granata   }
1124675f49bbSEnrico Granata 
1125b9c1b51eSKate Stone   if (type_hint == g_NSData || type_hint == g_NSArray) {
1126675f49bbSEnrico Granata     prefix = "@\"";
1127675f49bbSEnrico Granata     suffix = "\"";
1128675f49bbSEnrico Granata     return true;
1129675f49bbSEnrico Granata   }
1130675f49bbSEnrico Granata 
1131b9c1b51eSKate Stone   if (type_hint == g_NSString || type_hint == g_NSStringStar) {
1132675f49bbSEnrico Granata     prefix = "@";
1133675f49bbSEnrico Granata     return true;
1134675f49bbSEnrico Granata   }
1135675f49bbSEnrico Granata 
1136675f49bbSEnrico Granata   return false;
1137675f49bbSEnrico Granata }
1138608d67c1SEnrico Granata 
IsNilReference(ValueObject & valobj)1139b9c1b51eSKate Stone bool ObjCLanguage::IsNilReference(ValueObject &valobj) {
1140608d67c1SEnrico Granata   const uint32_t mask = eTypeIsObjC | eTypeIsPointer;
1141b9c1b51eSKate Stone   bool isObjCpointer =
1142b9c1b51eSKate Stone       (((valobj.GetCompilerType().GetTypeInfo(nullptr)) & mask) == mask);
1143608d67c1SEnrico Granata   if (!isObjCpointer)
1144608d67c1SEnrico Granata     return false;
1145608d67c1SEnrico Granata   bool canReadValue = true;
1146608d67c1SEnrico Granata   bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
1147608d67c1SEnrico Granata   return canReadValue && isZero;
1148608d67c1SEnrico Granata }
1149566afa0aSRaphael Isemann 
IsSourceFile(llvm::StringRef file_path) const1150566afa0aSRaphael Isemann bool ObjCLanguage::IsSourceFile(llvm::StringRef file_path) const {
1151566afa0aSRaphael Isemann   const auto suffixes = {".h", ".m", ".M"};
1152566afa0aSRaphael Isemann   for (auto suffix : suffixes) {
1153e50f9c41SMartin Storsjö     if (file_path.endswith_insensitive(suffix))
1154566afa0aSRaphael Isemann       return true;
1155566afa0aSRaphael Isemann   }
1156566afa0aSRaphael Isemann   return false;
1157566afa0aSRaphael Isemann }
1158