xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- ObjCLanguage.cpp --------------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include <mutex>
10061da546Spatrick 
11061da546Spatrick #include "ObjCLanguage.h"
12061da546Spatrick 
13dda28197Spatrick #include "Plugins/ExpressionParser/Clang/ClangUtil.h"
14dda28197Spatrick #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
15*f6aab3d8Srobert #include "lldb/Core/Debugger.h"
16061da546Spatrick #include "lldb/Core/PluginManager.h"
17061da546Spatrick #include "lldb/Core/ValueObject.h"
18061da546Spatrick #include "lldb/DataFormatters/DataVisualization.h"
19061da546Spatrick #include "lldb/DataFormatters/FormattersHelpers.h"
20061da546Spatrick #include "lldb/Symbol/CompilerType.h"
21061da546Spatrick #include "lldb/Target/Target.h"
22061da546Spatrick #include "lldb/Utility/ConstString.h"
23061da546Spatrick #include "lldb/Utility/StreamString.h"
24061da546Spatrick 
25061da546Spatrick #include "llvm/Support/Threading.h"
26061da546Spatrick 
27061da546Spatrick #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h"
28061da546Spatrick #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
29061da546Spatrick 
30061da546Spatrick #include "CF.h"
31061da546Spatrick #include "Cocoa.h"
32061da546Spatrick #include "CoreMedia.h"
33061da546Spatrick #include "NSDictionary.h"
34061da546Spatrick #include "NSSet.h"
35061da546Spatrick #include "NSString.h"
36061da546Spatrick 
37061da546Spatrick using namespace lldb;
38061da546Spatrick using namespace lldb_private;
39061da546Spatrick using namespace lldb_private::formatters;
40061da546Spatrick 
LLDB_PLUGIN_DEFINE(ObjCLanguage)41dda28197Spatrick LLDB_PLUGIN_DEFINE(ObjCLanguage)
42dda28197Spatrick 
43061da546Spatrick void ObjCLanguage::Initialize() {
44061da546Spatrick   PluginManager::RegisterPlugin(GetPluginNameStatic(), "Objective-C Language",
45061da546Spatrick                                 CreateInstance);
46061da546Spatrick }
47061da546Spatrick 
Terminate()48061da546Spatrick void ObjCLanguage::Terminate() {
49061da546Spatrick   PluginManager::UnregisterPlugin(CreateInstance);
50061da546Spatrick }
51061da546Spatrick 
52061da546Spatrick // Static Functions
53061da546Spatrick 
CreateInstance(lldb::LanguageType language)54061da546Spatrick Language *ObjCLanguage::CreateInstance(lldb::LanguageType language) {
55061da546Spatrick   switch (language) {
56061da546Spatrick   case lldb::eLanguageTypeObjC:
57061da546Spatrick     return new ObjCLanguage();
58061da546Spatrick   default:
59061da546Spatrick     return nullptr;
60061da546Spatrick   }
61061da546Spatrick }
62061da546Spatrick 
Clear()63061da546Spatrick void ObjCLanguage::MethodName::Clear() {
64061da546Spatrick   m_full.Clear();
65061da546Spatrick   m_class.Clear();
66061da546Spatrick   m_category.Clear();
67061da546Spatrick   m_selector.Clear();
68061da546Spatrick   m_type = eTypeUnspecified;
69061da546Spatrick   m_category_is_valid = false;
70061da546Spatrick }
71061da546Spatrick 
SetName(llvm::StringRef name,bool strict)72061da546Spatrick bool ObjCLanguage::MethodName::SetName(llvm::StringRef name, bool strict) {
73061da546Spatrick   Clear();
74061da546Spatrick   if (name.empty())
75061da546Spatrick     return IsValid(strict);
76061da546Spatrick 
77061da546Spatrick   // If "strict" is true. then the method must be specified with a '+' or '-'
78061da546Spatrick   // at the beginning. If "strict" is false, then the '+' or '-' can be omitted
79061da546Spatrick   bool valid_prefix = false;
80061da546Spatrick 
81061da546Spatrick   if (name.size() > 1 && (name[0] == '+' || name[0] == '-')) {
82061da546Spatrick     valid_prefix = name[1] == '[';
83061da546Spatrick     if (name[0] == '+')
84061da546Spatrick       m_type = eTypeClassMethod;
85061da546Spatrick     else
86061da546Spatrick       m_type = eTypeInstanceMethod;
87061da546Spatrick   } else if (!strict) {
88061da546Spatrick     // "strict" is false, the name just needs to start with '['
89061da546Spatrick     valid_prefix = name[0] == '[';
90061da546Spatrick   }
91061da546Spatrick 
92061da546Spatrick   if (valid_prefix) {
93061da546Spatrick     int name_len = name.size();
94061da546Spatrick     // Objective-C methods must have at least:
95061da546Spatrick     //      "-[" or "+[" prefix
96061da546Spatrick     //      One character for a class name
97061da546Spatrick     //      One character for the space between the class name
98061da546Spatrick     //      One character for the method name
99061da546Spatrick     //      "]" suffix
100061da546Spatrick     if (name_len >= (5 + (strict ? 1 : 0)) && name.back() == ']') {
101061da546Spatrick       m_full.SetString(name);
102061da546Spatrick     }
103061da546Spatrick   }
104061da546Spatrick   return IsValid(strict);
105061da546Spatrick }
106061da546Spatrick 
SetName(const char * name,bool strict)107061da546Spatrick bool ObjCLanguage::MethodName::SetName(const char *name, bool strict) {
108061da546Spatrick   return SetName(llvm::StringRef(name), strict);
109061da546Spatrick }
110061da546Spatrick 
GetClassName()111061da546Spatrick ConstString ObjCLanguage::MethodName::GetClassName() {
112061da546Spatrick   if (!m_class) {
113061da546Spatrick     if (IsValid(false)) {
114061da546Spatrick       const char *full = m_full.GetCString();
115061da546Spatrick       const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
116061da546Spatrick       const char *paren_pos = strchr(class_start, '(');
117061da546Spatrick       if (paren_pos) {
118061da546Spatrick         m_class.SetCStringWithLength(class_start, paren_pos - class_start);
119061da546Spatrick       } else {
120061da546Spatrick         // No '(' was found in the full name, we can definitively say that our
121061da546Spatrick         // category was valid (and empty).
122061da546Spatrick         m_category_is_valid = true;
123061da546Spatrick         const char *space_pos = strchr(full, ' ');
124061da546Spatrick         if (space_pos) {
125061da546Spatrick           m_class.SetCStringWithLength(class_start, space_pos - class_start);
126061da546Spatrick           if (!m_class_category) {
127061da546Spatrick             // No category in name, so we can also fill in the m_class_category
128061da546Spatrick             m_class_category = m_class;
129061da546Spatrick           }
130061da546Spatrick         }
131061da546Spatrick       }
132061da546Spatrick     }
133061da546Spatrick   }
134061da546Spatrick   return m_class;
135061da546Spatrick }
136061da546Spatrick 
GetClassNameWithCategory()137061da546Spatrick ConstString ObjCLanguage::MethodName::GetClassNameWithCategory() {
138061da546Spatrick   if (!m_class_category) {
139061da546Spatrick     if (IsValid(false)) {
140061da546Spatrick       const char *full = m_full.GetCString();
141061da546Spatrick       const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
142061da546Spatrick       const char *space_pos = strchr(full, ' ');
143061da546Spatrick       if (space_pos) {
144061da546Spatrick         m_class_category.SetCStringWithLength(class_start,
145061da546Spatrick                                               space_pos - class_start);
146061da546Spatrick         // If m_class hasn't been filled in and the class with category doesn't
147061da546Spatrick         // contain a '(', then we can also fill in the m_class
148061da546Spatrick         if (!m_class && strchr(m_class_category.GetCString(), '(') == nullptr) {
149061da546Spatrick           m_class = m_class_category;
150061da546Spatrick           // No '(' was found in the full name, we can definitively say that
151061da546Spatrick           // our category was valid (and empty).
152061da546Spatrick           m_category_is_valid = true;
153061da546Spatrick         }
154061da546Spatrick       }
155061da546Spatrick     }
156061da546Spatrick   }
157061da546Spatrick   return m_class_category;
158061da546Spatrick }
159061da546Spatrick 
GetSelector()160061da546Spatrick ConstString ObjCLanguage::MethodName::GetSelector() {
161061da546Spatrick   if (!m_selector) {
162061da546Spatrick     if (IsValid(false)) {
163061da546Spatrick       const char *full = m_full.GetCString();
164061da546Spatrick       const char *space_pos = strchr(full, ' ');
165061da546Spatrick       if (space_pos) {
166061da546Spatrick         ++space_pos; // skip the space
167061da546Spatrick         m_selector.SetCStringWithLength(space_pos, m_full.GetLength() -
168061da546Spatrick                                                        (space_pos - full) - 1);
169061da546Spatrick       }
170061da546Spatrick     }
171061da546Spatrick   }
172061da546Spatrick   return m_selector;
173061da546Spatrick }
174061da546Spatrick 
GetCategory()175061da546Spatrick ConstString ObjCLanguage::MethodName::GetCategory() {
176061da546Spatrick   if (!m_category_is_valid && !m_category) {
177061da546Spatrick     if (IsValid(false)) {
178061da546Spatrick       m_category_is_valid = true;
179061da546Spatrick       const char *full = m_full.GetCString();
180061da546Spatrick       const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
181061da546Spatrick       const char *open_paren_pos = strchr(class_start, '(');
182061da546Spatrick       if (open_paren_pos) {
183061da546Spatrick         ++open_paren_pos; // Skip the open paren
184061da546Spatrick         const char *close_paren_pos = strchr(open_paren_pos, ')');
185061da546Spatrick         if (close_paren_pos)
186061da546Spatrick           m_category.SetCStringWithLength(open_paren_pos,
187061da546Spatrick                                           close_paren_pos - open_paren_pos);
188061da546Spatrick       }
189061da546Spatrick     }
190061da546Spatrick   }
191061da546Spatrick   return m_category;
192061da546Spatrick }
193061da546Spatrick 
GetFullNameWithoutCategory(bool empty_if_no_category)194061da546Spatrick ConstString ObjCLanguage::MethodName::GetFullNameWithoutCategory(
195061da546Spatrick     bool empty_if_no_category) {
196061da546Spatrick   if (IsValid(false)) {
197061da546Spatrick     if (HasCategory()) {
198061da546Spatrick       StreamString strm;
199061da546Spatrick       if (m_type == eTypeClassMethod)
200061da546Spatrick         strm.PutChar('+');
201061da546Spatrick       else if (m_type == eTypeInstanceMethod)
202061da546Spatrick         strm.PutChar('-');
203061da546Spatrick       strm.Printf("[%s %s]", GetClassName().GetCString(),
204061da546Spatrick                   GetSelector().GetCString());
205061da546Spatrick       return ConstString(strm.GetString());
206061da546Spatrick     }
207061da546Spatrick 
208061da546Spatrick     if (!empty_if_no_category) {
209061da546Spatrick       // Just return the full name since it doesn't have a category
210061da546Spatrick       return GetFullName();
211061da546Spatrick     }
212061da546Spatrick   }
213061da546Spatrick   return ConstString();
214061da546Spatrick }
215061da546Spatrick 
216be691f3bSpatrick std::vector<Language::MethodNameVariant>
GetMethodNameVariants(ConstString method_name) const217061da546Spatrick ObjCLanguage::GetMethodNameVariants(ConstString method_name) const {
218be691f3bSpatrick   std::vector<Language::MethodNameVariant> variant_names;
219061da546Spatrick   ObjCLanguage::MethodName objc_method(method_name.GetCString(), false);
220061da546Spatrick   if (!objc_method.IsValid(false)) {
221061da546Spatrick     return variant_names;
222061da546Spatrick   }
223061da546Spatrick 
224be691f3bSpatrick   variant_names.emplace_back(objc_method.GetSelector(),
225be691f3bSpatrick                              lldb::eFunctionNameTypeSelector);
226be691f3bSpatrick 
227061da546Spatrick   const bool is_class_method =
228061da546Spatrick       objc_method.GetType() == MethodName::eTypeClassMethod;
229061da546Spatrick   const bool is_instance_method =
230061da546Spatrick       objc_method.GetType() == MethodName::eTypeInstanceMethod;
231061da546Spatrick   ConstString name_sans_category =
232061da546Spatrick       objc_method.GetFullNameWithoutCategory(/*empty_if_no_category*/ true);
233061da546Spatrick 
234061da546Spatrick   if (is_class_method || is_instance_method) {
235061da546Spatrick     if (name_sans_category)
236be691f3bSpatrick       variant_names.emplace_back(name_sans_category,
237be691f3bSpatrick                                  lldb::eFunctionNameTypeFull);
238061da546Spatrick   } else {
239061da546Spatrick     StreamString strm;
240061da546Spatrick 
241061da546Spatrick     strm.Printf("+%s", objc_method.GetFullName().GetCString());
242be691f3bSpatrick     variant_names.emplace_back(ConstString(strm.GetString()),
243be691f3bSpatrick                                lldb::eFunctionNameTypeFull);
244061da546Spatrick     strm.Clear();
245061da546Spatrick 
246061da546Spatrick     strm.Printf("-%s", objc_method.GetFullName().GetCString());
247be691f3bSpatrick     variant_names.emplace_back(ConstString(strm.GetString()),
248be691f3bSpatrick                                lldb::eFunctionNameTypeFull);
249061da546Spatrick     strm.Clear();
250061da546Spatrick 
251061da546Spatrick     if (name_sans_category) {
252061da546Spatrick       strm.Printf("+%s", name_sans_category.GetCString());
253be691f3bSpatrick       variant_names.emplace_back(ConstString(strm.GetString()),
254be691f3bSpatrick                                  lldb::eFunctionNameTypeFull);
255061da546Spatrick       strm.Clear();
256061da546Spatrick 
257061da546Spatrick       strm.Printf("-%s", name_sans_category.GetCString());
258be691f3bSpatrick       variant_names.emplace_back(ConstString(strm.GetString()),
259be691f3bSpatrick                                  lldb::eFunctionNameTypeFull);
260061da546Spatrick     }
261061da546Spatrick   }
262061da546Spatrick 
263061da546Spatrick   return variant_names;
264061da546Spatrick }
265061da546Spatrick 
SymbolNameFitsToLanguage(Mangled mangled) const266be691f3bSpatrick bool ObjCLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
267be691f3bSpatrick   ConstString demangled_name = mangled.GetDemangledName();
268be691f3bSpatrick   if (!demangled_name)
269be691f3bSpatrick     return false;
270be691f3bSpatrick   return ObjCLanguage::IsPossibleObjCMethodName(demangled_name.GetCString());
271be691f3bSpatrick }
272be691f3bSpatrick 
LoadObjCFormatters(TypeCategoryImplSP objc_category_sp)273061da546Spatrick static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
274061da546Spatrick   if (!objc_category_sp)
275061da546Spatrick     return;
276061da546Spatrick 
277061da546Spatrick   TypeSummaryImpl::Flags objc_flags;
278061da546Spatrick   objc_flags.SetCascades(false)
279061da546Spatrick       .SetSkipPointers(true)
280061da546Spatrick       .SetSkipReferences(true)
281061da546Spatrick       .SetDontShowChildren(true)
282061da546Spatrick       .SetDontShowValue(true)
283061da546Spatrick       .SetShowMembersOneLiner(false)
284061da546Spatrick       .SetHideItemNames(false);
285061da546Spatrick 
286061da546Spatrick   lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(
287061da546Spatrick       objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider, ""));
288*f6aab3d8Srobert   objc_category_sp->AddTypeSummary("BOOL", eFormatterMatchExact,
289061da546Spatrick                                    ObjC_BOOL_summary);
290*f6aab3d8Srobert   objc_category_sp->AddTypeSummary("BOOL &", eFormatterMatchExact,
291061da546Spatrick                                    ObjC_BOOL_summary);
292*f6aab3d8Srobert   objc_category_sp->AddTypeSummary("BOOL *", eFormatterMatchExact,
293061da546Spatrick                                    ObjC_BOOL_summary);
294061da546Spatrick 
295061da546Spatrick   // we need to skip pointers here since we are special casing a SEL* when
296061da546Spatrick   // retrieving its value
297061da546Spatrick   objc_flags.SetSkipPointers(true);
298061da546Spatrick   AddCXXSummary(objc_category_sp,
299061da546Spatrick                 lldb_private::formatters::ObjCSELSummaryProvider<false>,
300061da546Spatrick                 "SEL summary provider", ConstString("SEL"), objc_flags);
301061da546Spatrick   AddCXXSummary(
302061da546Spatrick       objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>,
303061da546Spatrick       "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
304061da546Spatrick   AddCXXSummary(
305061da546Spatrick       objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>,
306061da546Spatrick       "SEL summary provider", ConstString("objc_selector"), objc_flags);
307061da546Spatrick   AddCXXSummary(
308061da546Spatrick       objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>,
309061da546Spatrick       "SEL summary provider", ConstString("objc_selector *"), objc_flags);
310061da546Spatrick   AddCXXSummary(objc_category_sp,
311061da546Spatrick                 lldb_private::formatters::ObjCSELSummaryProvider<true>,
312061da546Spatrick                 "SEL summary provider", ConstString("SEL *"), objc_flags);
313061da546Spatrick 
314061da546Spatrick   AddCXXSummary(objc_category_sp,
315061da546Spatrick                 lldb_private::formatters::ObjCClassSummaryProvider,
316061da546Spatrick                 "Class summary provider", ConstString("Class"), objc_flags);
317061da546Spatrick 
318061da546Spatrick   SyntheticChildren::Flags class_synth_flags;
319061da546Spatrick   class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
320061da546Spatrick       false);
321061da546Spatrick 
322061da546Spatrick   AddCXXSynthetic(objc_category_sp,
323061da546Spatrick                   lldb_private::formatters::ObjCClassSyntheticFrontEndCreator,
324061da546Spatrick                   "Class synthetic children", ConstString("Class"),
325061da546Spatrick                   class_synth_flags);
326061da546Spatrick 
327061da546Spatrick   objc_flags.SetSkipPointers(false);
328061da546Spatrick   objc_flags.SetCascades(true);
329061da546Spatrick   objc_flags.SetSkipReferences(false);
330061da546Spatrick 
331061da546Spatrick   AddStringSummary(objc_category_sp, "${var.__FuncPtr%A}",
332061da546Spatrick                    ConstString("__block_literal_generic"), objc_flags);
333061da546Spatrick 
334061da546Spatrick   AddStringSummary(objc_category_sp, "${var.years} years, ${var.months} "
335061da546Spatrick                                      "months, ${var.days} days, ${var.hours} "
336061da546Spatrick                                      "hours, ${var.minutes} minutes "
337061da546Spatrick                                      "${var.seconds} seconds",
338061da546Spatrick                    ConstString("CFGregorianUnits"), objc_flags);
339061da546Spatrick   AddStringSummary(objc_category_sp,
340061da546Spatrick                    "location=${var.location} length=${var.length}",
341061da546Spatrick                    ConstString("CFRange"), objc_flags);
342061da546Spatrick 
343061da546Spatrick   AddStringSummary(objc_category_sp,
344061da546Spatrick                    "location=${var.location}, length=${var.length}",
345061da546Spatrick                    ConstString("NSRange"), objc_flags);
346061da546Spatrick   AddStringSummary(objc_category_sp, "(${var.origin}, ${var.size}), ...",
347061da546Spatrick                    ConstString("NSRectArray"), objc_flags);
348061da546Spatrick 
349061da546Spatrick   AddOneLineSummary(objc_category_sp, ConstString("NSPoint"), objc_flags);
350061da546Spatrick   AddOneLineSummary(objc_category_sp, ConstString("NSSize"), objc_flags);
351061da546Spatrick   AddOneLineSummary(objc_category_sp, ConstString("NSRect"), objc_flags);
352061da546Spatrick 
353061da546Spatrick   AddOneLineSummary(objc_category_sp, ConstString("CGSize"), objc_flags);
354061da546Spatrick   AddOneLineSummary(objc_category_sp, ConstString("CGPoint"), objc_flags);
355061da546Spatrick   AddOneLineSummary(objc_category_sp, ConstString("CGRect"), objc_flags);
356061da546Spatrick 
357061da546Spatrick   AddStringSummary(objc_category_sp,
358061da546Spatrick                    "red=${var.red} green=${var.green} blue=${var.blue}",
359061da546Spatrick                    ConstString("RGBColor"), objc_flags);
360061da546Spatrick   AddStringSummary(
361061da546Spatrick       objc_category_sp,
362061da546Spatrick       "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
363061da546Spatrick       ConstString("Rect"), objc_flags);
364061da546Spatrick   AddStringSummary(objc_category_sp, "{(v=${var.v}, h=${var.h})}",
365061da546Spatrick                    ConstString("Point"), objc_flags);
366061da546Spatrick   AddStringSummary(objc_category_sp,
367061da546Spatrick                    "${var.month}/${var.day}/${var.year}  ${var.hour} "
368061da546Spatrick                    ":${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
369061da546Spatrick                    ConstString("DateTimeRect *"), objc_flags);
370061da546Spatrick   AddStringSummary(objc_category_sp, "${var.ld.month}/${var.ld.day}/"
371061da546Spatrick                                      "${var.ld.year} ${var.ld.hour} "
372061da546Spatrick                                      ":${var.ld.minute} :${var.ld.second} "
373061da546Spatrick                                      "dayOfWeek:${var.ld.dayOfWeek}",
374061da546Spatrick                    ConstString("LongDateRect"), objc_flags);
375061da546Spatrick   AddStringSummary(objc_category_sp, "(x=${var.x}, y=${var.y})",
376061da546Spatrick                    ConstString("HIPoint"), objc_flags);
377061da546Spatrick   AddStringSummary(objc_category_sp, "origin=${var.origin} size=${var.size}",
378061da546Spatrick                    ConstString("HIRect"), objc_flags);
379061da546Spatrick 
380061da546Spatrick   TypeSummaryImpl::Flags appkit_flags;
381061da546Spatrick   appkit_flags.SetCascades(true)
382061da546Spatrick       .SetSkipPointers(false)
383061da546Spatrick       .SetSkipReferences(false)
384061da546Spatrick       .SetDontShowChildren(true)
385061da546Spatrick       .SetDontShowValue(false)
386061da546Spatrick       .SetShowMembersOneLiner(false)
387061da546Spatrick       .SetHideItemNames(false);
388061da546Spatrick 
389061da546Spatrick   appkit_flags.SetDontShowChildren(false);
390061da546Spatrick 
391061da546Spatrick   AddCXXSummary(
392061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
393061da546Spatrick       "NSArray summary provider", ConstString("NSArray"), appkit_flags);
394061da546Spatrick   AddCXXSummary(
395061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
396*f6aab3d8Srobert       "NSArray summary provider", ConstString("NSConstantArray"), appkit_flags);
397*f6aab3d8Srobert   AddCXXSummary(
398*f6aab3d8Srobert       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
399061da546Spatrick       "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
400061da546Spatrick   AddCXXSummary(
401061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
402061da546Spatrick       "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
403061da546Spatrick   AddCXXSummary(
404061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
405061da546Spatrick       "NSArray summary provider", ConstString("__NSArray0"), appkit_flags);
406061da546Spatrick   AddCXXSummary(objc_category_sp,
407061da546Spatrick                 lldb_private::formatters::NSArraySummaryProvider,
408061da546Spatrick                 "NSArray summary provider",
409061da546Spatrick                 ConstString("__NSSingleObjectArrayI"), appkit_flags);
410061da546Spatrick   AddCXXSummary(
411061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
412061da546Spatrick       "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
413061da546Spatrick   AddCXXSummary(
414061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
415061da546Spatrick       "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
416061da546Spatrick   AddCXXSummary(
417061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
418061da546Spatrick       "NSArray summary provider", ConstString("_NSCallStackArray"), appkit_flags);
419061da546Spatrick   AddCXXSummary(
420061da546Spatrick       objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
421061da546Spatrick       "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
422061da546Spatrick   AddCXXSummary(objc_category_sp,
423061da546Spatrick                 lldb_private::formatters::NSArraySummaryProvider,
424061da546Spatrick                 "NSArray summary provider", ConstString("CFMutableArrayRef"),
425061da546Spatrick                 appkit_flags);
426061da546Spatrick 
427061da546Spatrick   AddCXXSummary(objc_category_sp,
428061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
429061da546Spatrick                 "NSDictionary summary provider", ConstString("NSDictionary"),
430061da546Spatrick                 appkit_flags);
431061da546Spatrick   AddCXXSummary(objc_category_sp,
432061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
433061da546Spatrick                 "NSDictionary summary provider",
434*f6aab3d8Srobert                 ConstString("NSConstantDictionary"), appkit_flags);
435*f6aab3d8Srobert   AddCXXSummary(objc_category_sp,
436*f6aab3d8Srobert                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
437*f6aab3d8Srobert                 "NSDictionary summary provider",
438061da546Spatrick                 ConstString("NSMutableDictionary"), appkit_flags);
439061da546Spatrick   AddCXXSummary(objc_category_sp,
440061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
441061da546Spatrick                 "NSDictionary summary provider",
442061da546Spatrick                 ConstString("__NSCFDictionary"), appkit_flags);
443061da546Spatrick   AddCXXSummary(objc_category_sp,
444061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
445061da546Spatrick                 "NSDictionary summary provider", ConstString("__NSDictionaryI"),
446061da546Spatrick                 appkit_flags);
447061da546Spatrick   AddCXXSummary(objc_category_sp,
448061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
449061da546Spatrick                 "NSDictionary summary provider",
450061da546Spatrick                 ConstString("__NSSingleEntryDictionaryI"), appkit_flags);
451061da546Spatrick   AddCXXSummary(objc_category_sp,
452061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<false>,
453061da546Spatrick                 "NSDictionary summary provider", ConstString("__NSDictionaryM"),
454061da546Spatrick                 appkit_flags);
455061da546Spatrick   AddCXXSummary(objc_category_sp,
456061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<true>,
457061da546Spatrick                 "NSDictionary summary provider", ConstString("CFDictionaryRef"),
458061da546Spatrick                 appkit_flags);
459061da546Spatrick   AddCXXSummary(objc_category_sp,
460061da546Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<true>,
461dda28197Spatrick                 "NSDictionary summary provider", ConstString("__CFDictionary"),
462dda28197Spatrick                 appkit_flags);
463dda28197Spatrick   AddCXXSummary(objc_category_sp,
464dda28197Spatrick                 lldb_private::formatters::NSDictionarySummaryProvider<true>,
465061da546Spatrick                 "NSDictionary summary provider",
466061da546Spatrick                 ConstString("CFMutableDictionaryRef"), appkit_flags);
467061da546Spatrick 
468061da546Spatrick   AddCXXSummary(objc_category_sp,
469061da546Spatrick                 lldb_private::formatters::NSSetSummaryProvider<false>,
470061da546Spatrick                 "NSSet summary", ConstString("NSSet"), appkit_flags);
471061da546Spatrick   AddCXXSummary(
472061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
473061da546Spatrick       "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
474061da546Spatrick   AddCXXSummary(objc_category_sp,
475061da546Spatrick                 lldb_private::formatters::NSSetSummaryProvider<true>,
476061da546Spatrick                 "CFSetRef summary", ConstString("CFSetRef"), appkit_flags);
477061da546Spatrick   AddCXXSummary(
478061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>,
479061da546Spatrick       "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags);
480061da546Spatrick   AddCXXSummary(objc_category_sp,
481061da546Spatrick                 lldb_private::formatters::NSSetSummaryProvider<false>,
482061da546Spatrick                 "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags);
483061da546Spatrick   AddCXXSummary(objc_category_sp,
484061da546Spatrick                 lldb_private::formatters::NSSetSummaryProvider<false>,
485dda28197Spatrick                 "__CFSet summary", ConstString("__CFSet"), appkit_flags);
486dda28197Spatrick   AddCXXSummary(objc_category_sp,
487dda28197Spatrick                 lldb_private::formatters::NSSetSummaryProvider<false>,
488061da546Spatrick                 "__NSSetI summary", ConstString("__NSSetI"), appkit_flags);
489061da546Spatrick   AddCXXSummary(objc_category_sp,
490061da546Spatrick                 lldb_private::formatters::NSSetSummaryProvider<false>,
491061da546Spatrick                 "__NSSetM summary", ConstString("__NSSetM"), appkit_flags);
492061da546Spatrick   AddCXXSummary(
493061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
494061da546Spatrick       "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags);
495061da546Spatrick   AddCXXSummary(
496061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
497061da546Spatrick       "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
498061da546Spatrick   AddCXXSummary(
499061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
500061da546Spatrick       "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags);
501061da546Spatrick   AddCXXSummary(
502061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
503061da546Spatrick       "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags);
504061da546Spatrick   AddCXXSummary(
505061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>,
506061da546Spatrick       "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags);
507061da546Spatrick 
508061da546Spatrick   AddCXXSummary(
509061da546Spatrick       objc_category_sp, lldb_private::formatters::NSError_SummaryProvider,
510061da546Spatrick       "NSError summary provider", ConstString("NSError"), appkit_flags);
511061da546Spatrick   AddCXXSummary(
512061da546Spatrick       objc_category_sp, lldb_private::formatters::NSException_SummaryProvider,
513061da546Spatrick       "NSException summary provider", ConstString("NSException"), appkit_flags);
514061da546Spatrick 
515061da546Spatrick   // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}",
516061da546Spatrick   // ConstString("$_lldb_typegen_nspair"), appkit_flags);
517061da546Spatrick 
518061da546Spatrick   appkit_flags.SetDontShowChildren(true);
519061da546Spatrick 
520061da546Spatrick   AddCXXSynthetic(objc_category_sp,
521061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
522061da546Spatrick                   "NSArray synthetic children", ConstString("__NSArrayM"),
523061da546Spatrick                   ScriptedSyntheticChildren::Flags());
524061da546Spatrick   AddCXXSynthetic(objc_category_sp,
525061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
526061da546Spatrick                   "NSArray synthetic children", ConstString("__NSArrayI"),
527061da546Spatrick                   ScriptedSyntheticChildren::Flags());
528061da546Spatrick   AddCXXSynthetic(objc_category_sp,
529061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
530061da546Spatrick                   "NSArray synthetic children", ConstString("__NSArray0"),
531061da546Spatrick                   ScriptedSyntheticChildren::Flags());
532061da546Spatrick   AddCXXSynthetic(objc_category_sp,
533061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
534061da546Spatrick                   "NSArray synthetic children",
535061da546Spatrick                   ConstString("__NSSingleObjectArrayI"),
536061da546Spatrick                   ScriptedSyntheticChildren::Flags());
537061da546Spatrick   AddCXXSynthetic(objc_category_sp,
538061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
539061da546Spatrick                   "NSArray synthetic children", ConstString("NSArray"),
540061da546Spatrick                   ScriptedSyntheticChildren::Flags());
541061da546Spatrick   AddCXXSynthetic(objc_category_sp,
542061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
543*f6aab3d8Srobert                   "NSArray synthetic children", ConstString("NSConstantArray"),
544*f6aab3d8Srobert                   ScriptedSyntheticChildren::Flags());
545*f6aab3d8Srobert   AddCXXSynthetic(objc_category_sp,
546*f6aab3d8Srobert                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
547061da546Spatrick                   "NSArray synthetic children", ConstString("NSMutableArray"),
548061da546Spatrick                   ScriptedSyntheticChildren::Flags());
549061da546Spatrick   AddCXXSynthetic(objc_category_sp,
550061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
551061da546Spatrick                   "NSArray synthetic children", ConstString("__NSCFArray"),
552061da546Spatrick                   ScriptedSyntheticChildren::Flags());
553061da546Spatrick   AddCXXSynthetic(objc_category_sp,
554061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
555061da546Spatrick                   "NSArray synthetic children", ConstString("_NSCallStackArray"),
556061da546Spatrick                   ScriptedSyntheticChildren::Flags());
557061da546Spatrick   AddCXXSynthetic(objc_category_sp,
558061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
559061da546Spatrick                   "NSArray synthetic children",
560061da546Spatrick                   ConstString("CFMutableArrayRef"),
561061da546Spatrick                   ScriptedSyntheticChildren::Flags());
562061da546Spatrick   AddCXXSynthetic(objc_category_sp,
563061da546Spatrick                   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
564061da546Spatrick                   "NSArray synthetic children", ConstString("CFArrayRef"),
565061da546Spatrick                   ScriptedSyntheticChildren::Flags());
566061da546Spatrick 
567061da546Spatrick   AddCXXSynthetic(
568061da546Spatrick       objc_category_sp,
569061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
570061da546Spatrick       "NSDictionary synthetic children", ConstString("__NSDictionaryM"),
571061da546Spatrick       ScriptedSyntheticChildren::Flags());
572061da546Spatrick   AddCXXSynthetic(
573061da546Spatrick       objc_category_sp,
574061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
575*f6aab3d8Srobert       "NSDictionary synthetic children", ConstString("NSConstantDictionary"),
576*f6aab3d8Srobert       ScriptedSyntheticChildren::Flags());
577*f6aab3d8Srobert   AddCXXSynthetic(
578*f6aab3d8Srobert       objc_category_sp,
579*f6aab3d8Srobert       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
580061da546Spatrick       "NSDictionary synthetic children", ConstString("__NSDictionaryI"),
581061da546Spatrick       ScriptedSyntheticChildren::Flags());
582061da546Spatrick   AddCXXSynthetic(
583061da546Spatrick       objc_category_sp,
584061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
585061da546Spatrick       "NSDictionary synthetic children",
586061da546Spatrick       ConstString("__NSSingleEntryDictionaryI"),
587061da546Spatrick       ScriptedSyntheticChildren::Flags());
588061da546Spatrick   AddCXXSynthetic(
589061da546Spatrick       objc_category_sp,
590061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
591061da546Spatrick       "NSDictionary synthetic children", ConstString("__NSCFDictionary"),
592061da546Spatrick       ScriptedSyntheticChildren::Flags());
593061da546Spatrick   AddCXXSynthetic(
594061da546Spatrick       objc_category_sp,
595061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
596061da546Spatrick       "NSDictionary synthetic children", ConstString("NSDictionary"),
597061da546Spatrick       ScriptedSyntheticChildren::Flags());
598061da546Spatrick   AddCXXSynthetic(
599061da546Spatrick       objc_category_sp,
600061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
601061da546Spatrick       "NSDictionary synthetic children", ConstString("NSMutableDictionary"),
602061da546Spatrick       ScriptedSyntheticChildren::Flags());
603061da546Spatrick   AddCXXSynthetic(
604061da546Spatrick       objc_category_sp,
605061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
606061da546Spatrick       "NSDictionary synthetic children", ConstString("CFDictionaryRef"),
607061da546Spatrick       ScriptedSyntheticChildren::Flags());
608061da546Spatrick   AddCXXSynthetic(
609061da546Spatrick       objc_category_sp,
610061da546Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
611061da546Spatrick       "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"),
612061da546Spatrick       ScriptedSyntheticChildren::Flags());
613dda28197Spatrick   AddCXXSynthetic(
614dda28197Spatrick       objc_category_sp,
615dda28197Spatrick       lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
616dda28197Spatrick       "NSDictionary synthetic children", ConstString("__CFDictionary"),
617dda28197Spatrick       ScriptedSyntheticChildren::Flags());
618061da546Spatrick 
619061da546Spatrick   AddCXXSynthetic(objc_category_sp,
620061da546Spatrick                   lldb_private::formatters::NSErrorSyntheticFrontEndCreator,
621061da546Spatrick                   "NSError synthetic children", ConstString("NSError"),
622061da546Spatrick                   ScriptedSyntheticChildren::Flags());
623061da546Spatrick   AddCXXSynthetic(objc_category_sp,
624061da546Spatrick                   lldb_private::formatters::NSExceptionSyntheticFrontEndCreator,
625061da546Spatrick                   "NSException synthetic children", ConstString("NSException"),
626061da546Spatrick                   ScriptedSyntheticChildren::Flags());
627061da546Spatrick 
628061da546Spatrick   AddCXXSynthetic(objc_category_sp,
629061da546Spatrick                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
630061da546Spatrick                   "NSSet synthetic children", ConstString("NSSet"),
631061da546Spatrick                   ScriptedSyntheticChildren::Flags());
632061da546Spatrick   AddCXXSynthetic(objc_category_sp,
633061da546Spatrick                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
634061da546Spatrick                   "__NSSetI synthetic children", ConstString("__NSSetI"),
635061da546Spatrick                   ScriptedSyntheticChildren::Flags());
636061da546Spatrick   AddCXXSynthetic(objc_category_sp,
637061da546Spatrick                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
638061da546Spatrick                   "__NSSetM synthetic children", ConstString("__NSSetM"),
639061da546Spatrick                   ScriptedSyntheticChildren::Flags());
640dda28197Spatrick   AddCXXSynthetic(objc_category_sp,
641dda28197Spatrick                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
642dda28197Spatrick                   "__NSCFSet synthetic children", ConstString("__NSCFSet"),
643dda28197Spatrick                   ScriptedSyntheticChildren::Flags());
644dda28197Spatrick   AddCXXSynthetic(objc_category_sp,
645dda28197Spatrick                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
646dda28197Spatrick                   "CFSetRef synthetic children", ConstString("CFSetRef"),
647dda28197Spatrick                   ScriptedSyntheticChildren::Flags());
648dda28197Spatrick 
649061da546Spatrick   AddCXXSynthetic(
650061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
651061da546Spatrick       "NSMutableSet synthetic children", ConstString("NSMutableSet"),
652061da546Spatrick       ScriptedSyntheticChildren::Flags());
653061da546Spatrick   AddCXXSynthetic(
654061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
655061da546Spatrick       "NSOrderedSet synthetic children", ConstString("NSOrderedSet"),
656061da546Spatrick       ScriptedSyntheticChildren::Flags());
657061da546Spatrick   AddCXXSynthetic(
658061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
659061da546Spatrick       "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"),
660061da546Spatrick       ScriptedSyntheticChildren::Flags());
661061da546Spatrick   AddCXXSynthetic(
662061da546Spatrick       objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator,
663061da546Spatrick       "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"),
664061da546Spatrick       ScriptedSyntheticChildren::Flags());
665dda28197Spatrick   AddCXXSynthetic(objc_category_sp,
666dda28197Spatrick                   lldb_private::formatters::NSSetSyntheticFrontEndCreator,
667dda28197Spatrick                   "__CFSet synthetic children", ConstString("__CFSet"),
668dda28197Spatrick                   ScriptedSyntheticChildren::Flags());
669061da546Spatrick 
670061da546Spatrick   AddCXXSynthetic(objc_category_sp,
671061da546Spatrick                   lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator,
672061da546Spatrick                   "NSIndexPath synthetic children", ConstString("NSIndexPath"),
673061da546Spatrick                   ScriptedSyntheticChildren::Flags());
674061da546Spatrick 
675061da546Spatrick   AddCXXSummary(
676061da546Spatrick       objc_category_sp, lldb_private::formatters::CFBagSummaryProvider,
677061da546Spatrick       "CFBag summary provider", ConstString("CFBagRef"), appkit_flags);
678061da546Spatrick   AddCXXSummary(objc_category_sp,
679061da546Spatrick                 lldb_private::formatters::CFBagSummaryProvider,
680061da546Spatrick                 "CFBag summary provider", ConstString("__CFBag"), appkit_flags);
681061da546Spatrick   AddCXXSummary(objc_category_sp,
682061da546Spatrick                 lldb_private::formatters::CFBagSummaryProvider,
683061da546Spatrick                 "CFBag summary provider", ConstString("const struct __CFBag"),
684061da546Spatrick                 appkit_flags);
685061da546Spatrick   AddCXXSummary(
686061da546Spatrick       objc_category_sp, lldb_private::formatters::CFBagSummaryProvider,
687061da546Spatrick       "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags);
688061da546Spatrick 
689061da546Spatrick   AddCXXSummary(objc_category_sp,
690061da546Spatrick                 lldb_private::formatters::CFBinaryHeapSummaryProvider,
691061da546Spatrick                 "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"),
692061da546Spatrick                 appkit_flags);
693061da546Spatrick   AddCXXSummary(objc_category_sp,
694061da546Spatrick                 lldb_private::formatters::CFBinaryHeapSummaryProvider,
695061da546Spatrick                 "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"),
696061da546Spatrick                 appkit_flags);
697061da546Spatrick 
698061da546Spatrick   AddCXXSummary(
699061da546Spatrick       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
700061da546Spatrick       "NSString summary provider", ConstString("NSString"), appkit_flags);
701061da546Spatrick   AddCXXSummary(
702061da546Spatrick       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
703061da546Spatrick       "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
704061da546Spatrick   AddCXXSummary(
705061da546Spatrick       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
706061da546Spatrick       "NSString summary provider", ConstString("__CFString"), appkit_flags);
707061da546Spatrick   AddCXXSummary(objc_category_sp,
708061da546Spatrick                 lldb_private::formatters::NSStringSummaryProvider,
709061da546Spatrick                 "NSString summary provider", ConstString("CFMutableStringRef"),
710061da546Spatrick                 appkit_flags);
711061da546Spatrick   AddCXXSummary(objc_category_sp,
712061da546Spatrick                 lldb_private::formatters::NSStringSummaryProvider,
713061da546Spatrick                 "NSString summary provider", ConstString("NSMutableString"),
714061da546Spatrick                 appkit_flags);
715061da546Spatrick   AddCXXSummary(objc_category_sp,
716061da546Spatrick                 lldb_private::formatters::NSStringSummaryProvider,
717061da546Spatrick                 "NSString summary provider",
718061da546Spatrick                 ConstString("__NSCFConstantString"), appkit_flags);
719061da546Spatrick   AddCXXSummary(
720061da546Spatrick       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
721061da546Spatrick       "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
722061da546Spatrick   AddCXXSummary(objc_category_sp,
723061da546Spatrick                 lldb_private::formatters::NSStringSummaryProvider,
724061da546Spatrick                 "NSString summary provider", ConstString("NSCFConstantString"),
725061da546Spatrick                 appkit_flags);
726061da546Spatrick   AddCXXSummary(
727061da546Spatrick       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
728061da546Spatrick       "NSString summary provider", ConstString("NSCFString"), appkit_flags);
729061da546Spatrick   AddCXXSummary(
730061da546Spatrick       objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
731061da546Spatrick       "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
732061da546Spatrick   AddCXXSummary(objc_category_sp,
733061da546Spatrick                 lldb_private::formatters::NSStringSummaryProvider,
734061da546Spatrick                 "NSString summary provider",
735061da546Spatrick                 ConstString("NSTaggedPointerString"), appkit_flags);
736061da546Spatrick 
737061da546Spatrick   AddCXXSummary(objc_category_sp,
738061da546Spatrick                 lldb_private::formatters::NSAttributedStringSummaryProvider,
739061da546Spatrick                 "NSAttributedString summary provider",
740061da546Spatrick                 ConstString("NSAttributedString"), appkit_flags);
741061da546Spatrick   AddCXXSummary(
742061da546Spatrick       objc_category_sp,
743061da546Spatrick       lldb_private::formatters::NSMutableAttributedStringSummaryProvider,
744061da546Spatrick       "NSMutableAttributedString summary provider",
745061da546Spatrick       ConstString("NSMutableAttributedString"), appkit_flags);
746061da546Spatrick   AddCXXSummary(
747061da546Spatrick       objc_category_sp,
748061da546Spatrick       lldb_private::formatters::NSMutableAttributedStringSummaryProvider,
749061da546Spatrick       "NSMutableAttributedString summary provider",
750061da546Spatrick       ConstString("NSConcreteMutableAttributedString"), appkit_flags);
751061da546Spatrick 
752061da546Spatrick   AddCXXSummary(
753061da546Spatrick       objc_category_sp, lldb_private::formatters::NSBundleSummaryProvider,
754061da546Spatrick       "NSBundle summary provider", ConstString("NSBundle"), appkit_flags);
755061da546Spatrick 
756061da546Spatrick   AddCXXSummary(objc_category_sp,
757061da546Spatrick                 lldb_private::formatters::NSDataSummaryProvider<false>,
758061da546Spatrick                 "NSData summary provider", ConstString("NSData"), appkit_flags);
759061da546Spatrick   AddCXXSummary(
760061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
761061da546Spatrick       "NSData summary provider", ConstString("_NSInlineData"), appkit_flags);
762061da546Spatrick   AddCXXSummary(
763061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
764061da546Spatrick       "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
765061da546Spatrick   AddCXXSummary(objc_category_sp,
766061da546Spatrick                 lldb_private::formatters::NSDataSummaryProvider<false>,
767061da546Spatrick                 "NSData summary provider", ConstString("NSConcreteMutableData"),
768061da546Spatrick                 appkit_flags);
769061da546Spatrick   AddCXXSummary(
770061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
771061da546Spatrick       "NSData summary provider", ConstString("NSMutableData"), appkit_flags);
772061da546Spatrick   AddCXXSummary(
773061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>,
774061da546Spatrick       "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
775061da546Spatrick   AddCXXSummary(
776061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>,
777061da546Spatrick       "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
778061da546Spatrick   AddCXXSummary(
779061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>,
780061da546Spatrick       "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
781061da546Spatrick 
782061da546Spatrick   AddCXXSummary(
783061da546Spatrick       objc_category_sp, lldb_private::formatters::NSMachPortSummaryProvider,
784061da546Spatrick       "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags);
785061da546Spatrick 
786061da546Spatrick   AddCXXSummary(objc_category_sp,
787061da546Spatrick                 lldb_private::formatters::NSNotificationSummaryProvider,
788061da546Spatrick                 "NSNotification summary provider",
789061da546Spatrick                 ConstString("NSNotification"), appkit_flags);
790061da546Spatrick   AddCXXSummary(objc_category_sp,
791061da546Spatrick                 lldb_private::formatters::NSNotificationSummaryProvider,
792061da546Spatrick                 "NSNotification summary provider",
793061da546Spatrick                 ConstString("NSConcreteNotification"), appkit_flags);
794061da546Spatrick 
795061da546Spatrick   AddCXXSummary(
796061da546Spatrick       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
797061da546Spatrick       "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
798*f6aab3d8Srobert   AddCXXSummary(objc_category_sp,
799*f6aab3d8Srobert                 lldb_private::formatters::NSNumberSummaryProvider,
800*f6aab3d8Srobert                 "NSNumber summary provider",
801*f6aab3d8Srobert                 ConstString("NSConstantIntegerNumber"), appkit_flags);
802*f6aab3d8Srobert   AddCXXSummary(objc_category_sp,
803*f6aab3d8Srobert                 lldb_private::formatters::NSNumberSummaryProvider,
804*f6aab3d8Srobert                 "NSNumber summary provider",
805*f6aab3d8Srobert                 ConstString("NSConstantDoubleNumber"), appkit_flags);
806*f6aab3d8Srobert   AddCXXSummary(objc_category_sp,
807*f6aab3d8Srobert                 lldb_private::formatters::NSNumberSummaryProvider,
808*f6aab3d8Srobert                 "NSNumber summary provider",
809*f6aab3d8Srobert                 ConstString("NSConstantFloatNumber"), appkit_flags);
810061da546Spatrick   AddCXXSummary(
811061da546Spatrick       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
812061da546Spatrick       "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
813061da546Spatrick   AddCXXSummary(
814061da546Spatrick       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
815061da546Spatrick       "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
816061da546Spatrick   AddCXXSummary(
817061da546Spatrick       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
818061da546Spatrick       "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
819061da546Spatrick   AddCXXSummary(
820061da546Spatrick       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
821061da546Spatrick       "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
822061da546Spatrick   AddCXXSummary(
823061da546Spatrick       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
824061da546Spatrick       "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
825061da546Spatrick   AddCXXSummary(objc_category_sp,
826061da546Spatrick                 lldb_private::formatters::NSNumberSummaryProvider,
827061da546Spatrick                 "NSDecimalNumber summary provider",
828061da546Spatrick                 ConstString("NSDecimalNumber"), appkit_flags);
829061da546Spatrick 
830061da546Spatrick   AddCXXSummary(objc_category_sp,
831061da546Spatrick                 lldb_private::formatters::NSURLSummaryProvider,
832061da546Spatrick                 "NSURL summary provider", ConstString("NSURL"), appkit_flags);
833061da546Spatrick   AddCXXSummary(
834061da546Spatrick       objc_category_sp, lldb_private::formatters::NSURLSummaryProvider,
835061da546Spatrick       "NSURL summary provider", ConstString("CFURLRef"), appkit_flags);
836061da546Spatrick 
837061da546Spatrick   AddCXXSummary(objc_category_sp,
838061da546Spatrick                 lldb_private::formatters::NSDateSummaryProvider,
839061da546Spatrick                 "NSDate summary provider", ConstString("NSDate"), appkit_flags);
840061da546Spatrick   AddCXXSummary(
841061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDateSummaryProvider,
842061da546Spatrick       "NSDate summary provider", ConstString("__NSDate"), appkit_flags);
843061da546Spatrick   AddCXXSummary(
844061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDateSummaryProvider,
845061da546Spatrick       "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags);
846061da546Spatrick   AddCXXSummary(
847061da546Spatrick       objc_category_sp, lldb_private::formatters::NSDateSummaryProvider,
848061da546Spatrick       "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags);
849061da546Spatrick 
850061da546Spatrick   AddCXXSummary(
851061da546Spatrick       objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider,
852061da546Spatrick       "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags);
853061da546Spatrick   AddCXXSummary(objc_category_sp,
854061da546Spatrick                 lldb_private::formatters::NSTimeZoneSummaryProvider,
855061da546Spatrick                 "NSTimeZone summary provider", ConstString("CFTimeZoneRef"),
856061da546Spatrick                 appkit_flags);
857061da546Spatrick   AddCXXSummary(
858061da546Spatrick       objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider,
859061da546Spatrick       "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags);
860061da546Spatrick 
861061da546Spatrick   // CFAbsoluteTime is actually a double rather than a pointer to an object we
862061da546Spatrick   // do not care about the numeric value, since it is probably meaningless to
863061da546Spatrick   // users
864061da546Spatrick   appkit_flags.SetDontShowValue(true);
865061da546Spatrick   AddCXXSummary(objc_category_sp,
866061da546Spatrick                 lldb_private::formatters::CFAbsoluteTimeSummaryProvider,
867061da546Spatrick                 "CFAbsoluteTime summary provider",
868061da546Spatrick                 ConstString("CFAbsoluteTime"), appkit_flags);
869061da546Spatrick   appkit_flags.SetDontShowValue(false);
870061da546Spatrick 
871061da546Spatrick   AddCXXSummary(
872061da546Spatrick       objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider,
873061da546Spatrick       "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags);
874061da546Spatrick   AddCXXSummary(objc_category_sp,
875061da546Spatrick                 lldb_private::formatters::NSIndexSetSummaryProvider,
876061da546Spatrick                 "NSIndexSet summary provider", ConstString("NSMutableIndexSet"),
877061da546Spatrick                 appkit_flags);
878061da546Spatrick 
879061da546Spatrick   AddStringSummary(objc_category_sp,
880061da546Spatrick                    "@\"${var.month%d}/${var.day%d}/${var.year%d} "
881061da546Spatrick                    "${var.hour%d}:${var.minute%d}:${var.second}\"",
882061da546Spatrick                    ConstString("CFGregorianDate"), appkit_flags);
883061da546Spatrick 
884061da546Spatrick   AddCXXSummary(objc_category_sp,
885061da546Spatrick                 lldb_private::formatters::CFBitVectorSummaryProvider,
886061da546Spatrick                 "CFBitVector summary provider", ConstString("CFBitVectorRef"),
887061da546Spatrick                 appkit_flags);
888061da546Spatrick   AddCXXSummary(objc_category_sp,
889061da546Spatrick                 lldb_private::formatters::CFBitVectorSummaryProvider,
890061da546Spatrick                 "CFBitVector summary provider",
891061da546Spatrick                 ConstString("CFMutableBitVectorRef"), appkit_flags);
892061da546Spatrick   AddCXXSummary(objc_category_sp,
893061da546Spatrick                 lldb_private::formatters::CFBitVectorSummaryProvider,
894061da546Spatrick                 "CFBitVector summary provider", ConstString("__CFBitVector"),
895061da546Spatrick                 appkit_flags);
896061da546Spatrick   AddCXXSummary(objc_category_sp,
897061da546Spatrick                 lldb_private::formatters::CFBitVectorSummaryProvider,
898061da546Spatrick                 "CFBitVector summary provider",
899061da546Spatrick                 ConstString("__CFMutableBitVector"), appkit_flags);
900061da546Spatrick }
901061da546Spatrick 
LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp)902061da546Spatrick static void LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp) {
903061da546Spatrick   if (!objc_category_sp)
904061da546Spatrick     return;
905061da546Spatrick 
906061da546Spatrick   TypeSummaryImpl::Flags cm_flags;
907061da546Spatrick   cm_flags.SetCascades(true)
908061da546Spatrick       .SetDontShowChildren(false)
909061da546Spatrick       .SetDontShowValue(false)
910061da546Spatrick       .SetHideItemNames(false)
911061da546Spatrick       .SetShowMembersOneLiner(false)
912061da546Spatrick       .SetSkipPointers(false)
913061da546Spatrick       .SetSkipReferences(false);
914061da546Spatrick 
915061da546Spatrick   AddCXXSummary(objc_category_sp,
916061da546Spatrick                 lldb_private::formatters::CMTimeSummaryProvider,
917061da546Spatrick                 "CMTime summary provider", ConstString("CMTime"), cm_flags);
918061da546Spatrick }
919061da546Spatrick 
GetFormatters()920061da546Spatrick lldb::TypeCategoryImplSP ObjCLanguage::GetFormatters() {
921061da546Spatrick   static llvm::once_flag g_initialize;
922061da546Spatrick   static TypeCategoryImplSP g_category;
923061da546Spatrick 
924061da546Spatrick   llvm::call_once(g_initialize, [this]() -> void {
925*f6aab3d8Srobert     DataVisualization::Categories::GetCategory(ConstString(GetPluginName()),
926*f6aab3d8Srobert                                                g_category);
927061da546Spatrick     if (g_category) {
928061da546Spatrick       LoadCoreMediaFormatters(g_category);
929061da546Spatrick       LoadObjCFormatters(g_category);
930061da546Spatrick     }
931061da546Spatrick   });
932061da546Spatrick   return g_category;
933061da546Spatrick }
934061da546Spatrick 
935*f6aab3d8Srobert std::vector<FormattersMatchCandidate>
GetPossibleFormattersMatches(ValueObject & valobj,lldb::DynamicValueType use_dynamic)936061da546Spatrick ObjCLanguage::GetPossibleFormattersMatches(ValueObject &valobj,
937061da546Spatrick                                            lldb::DynamicValueType use_dynamic) {
938*f6aab3d8Srobert   std::vector<FormattersMatchCandidate> result;
939061da546Spatrick 
940061da546Spatrick   if (use_dynamic == lldb::eNoDynamicValues)
941061da546Spatrick     return result;
942061da546Spatrick 
943061da546Spatrick   CompilerType compiler_type(valobj.GetCompilerType());
944061da546Spatrick 
945061da546Spatrick   const bool check_cpp = false;
946061da546Spatrick   const bool check_objc = true;
947061da546Spatrick   bool canBeObjCDynamic =
948061da546Spatrick       compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc);
949061da546Spatrick 
950061da546Spatrick   if (canBeObjCDynamic && ClangUtil::IsClangType(compiler_type)) {
951061da546Spatrick     do {
952061da546Spatrick       lldb::ProcessSP process_sp = valobj.GetProcessSP();
953061da546Spatrick       if (!process_sp)
954061da546Spatrick         break;
955061da546Spatrick       ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
956061da546Spatrick       if (runtime == nullptr)
957061da546Spatrick         break;
958061da546Spatrick       ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp(
959061da546Spatrick           runtime->GetClassDescriptor(valobj));
960061da546Spatrick       if (!objc_class_sp)
961061da546Spatrick         break;
962061da546Spatrick       if (ConstString name = objc_class_sp->GetClassName())
963*f6aab3d8Srobert         result.push_back(
964*f6aab3d8Srobert             {name, valobj.GetTargetSP()->GetDebugger().GetScriptInterpreter(),
965*f6aab3d8Srobert              TypeImpl(objc_class_sp->GetType()),
966*f6aab3d8Srobert              FormattersMatchCandidate::Flags{}});
967061da546Spatrick     } while (false);
968061da546Spatrick   }
969061da546Spatrick 
970061da546Spatrick   return result;
971061da546Spatrick }
972061da546Spatrick 
GetTypeScavenger()973061da546Spatrick std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() {
974061da546Spatrick   class ObjCScavengerResult : public Language::TypeScavenger::Result {
975061da546Spatrick   public:
976061da546Spatrick     ObjCScavengerResult(CompilerType type)
977061da546Spatrick         : Language::TypeScavenger::Result(), m_compiler_type(type) {}
978061da546Spatrick 
979061da546Spatrick     bool IsValid() override { return m_compiler_type.IsValid(); }
980061da546Spatrick 
981061da546Spatrick     bool DumpToStream(Stream &stream, bool print_help_if_available) override {
982061da546Spatrick       if (IsValid()) {
983061da546Spatrick         m_compiler_type.DumpTypeDescription(&stream);
984061da546Spatrick         stream.EOL();
985061da546Spatrick         return true;
986061da546Spatrick       }
987061da546Spatrick       return false;
988061da546Spatrick     }
989061da546Spatrick 
990061da546Spatrick   private:
991061da546Spatrick     CompilerType m_compiler_type;
992061da546Spatrick   };
993061da546Spatrick 
994061da546Spatrick   class ObjCRuntimeScavenger : public Language::TypeScavenger {
995061da546Spatrick   protected:
996061da546Spatrick     bool Find_Impl(ExecutionContextScope *exe_scope, const char *key,
997061da546Spatrick                    ResultSet &results) override {
998061da546Spatrick       bool result = false;
999061da546Spatrick 
1000061da546Spatrick       if (auto *process = exe_scope->CalculateProcess().get()) {
1001061da546Spatrick         if (auto *objc_runtime = ObjCLanguageRuntime::Get(*process)) {
1002061da546Spatrick           if (auto *decl_vendor = objc_runtime->GetDeclVendor()) {
1003061da546Spatrick             ConstString name(key);
1004061da546Spatrick             for (const CompilerType &type :
1005061da546Spatrick                  decl_vendor->FindTypes(name, /*max_matches*/ UINT32_MAX)) {
1006061da546Spatrick               result = true;
1007061da546Spatrick               std::unique_ptr<Language::TypeScavenger::Result> result(
1008061da546Spatrick                   new ObjCScavengerResult(type));
1009061da546Spatrick               results.insert(std::move(result));
1010061da546Spatrick             }
1011061da546Spatrick           }
1012061da546Spatrick         }
1013061da546Spatrick       }
1014061da546Spatrick 
1015061da546Spatrick       return result;
1016061da546Spatrick     }
1017061da546Spatrick 
1018061da546Spatrick     friend class lldb_private::ObjCLanguage;
1019061da546Spatrick   };
1020061da546Spatrick 
1021061da546Spatrick   class ObjCModulesScavenger : public Language::TypeScavenger {
1022061da546Spatrick   protected:
1023061da546Spatrick     bool Find_Impl(ExecutionContextScope *exe_scope, const char *key,
1024061da546Spatrick                    ResultSet &results) override {
1025061da546Spatrick       bool result = false;
1026061da546Spatrick 
1027061da546Spatrick       if (auto *target = exe_scope->CalculateTarget().get()) {
1028be691f3bSpatrick         auto *persistent_vars = llvm::cast<ClangPersistentVariables>(
1029be691f3bSpatrick             target->GetPersistentExpressionStateForLanguage(
1030be691f3bSpatrick                 lldb::eLanguageTypeC));
1031be691f3bSpatrick         if (std::shared_ptr<ClangModulesDeclVendor> clang_modules_decl_vendor =
1032be691f3bSpatrick                 persistent_vars->GetClangModulesDeclVendor()) {
1033061da546Spatrick           ConstString key_cs(key);
1034061da546Spatrick           auto types = clang_modules_decl_vendor->FindTypes(
1035061da546Spatrick               key_cs, /*max_matches*/ UINT32_MAX);
1036061da546Spatrick           if (!types.empty()) {
1037061da546Spatrick             result = true;
1038061da546Spatrick             std::unique_ptr<Language::TypeScavenger::Result> result(
1039061da546Spatrick                 new ObjCScavengerResult(types.front()));
1040061da546Spatrick             results.insert(std::move(result));
1041061da546Spatrick           }
1042061da546Spatrick         }
1043061da546Spatrick       }
1044061da546Spatrick 
1045061da546Spatrick       return result;
1046061da546Spatrick     }
1047061da546Spatrick 
1048061da546Spatrick     friend class lldb_private::ObjCLanguage;
1049061da546Spatrick   };
1050061da546Spatrick 
1051061da546Spatrick   class ObjCDebugInfoScavenger : public Language::ImageListTypeScavenger {
1052061da546Spatrick   public:
1053061da546Spatrick     CompilerType AdjustForInclusion(CompilerType &candidate) override {
1054061da546Spatrick       LanguageType lang_type(candidate.GetMinimumLanguage());
1055061da546Spatrick       if (!Language::LanguageIsObjC(lang_type))
1056061da546Spatrick         return CompilerType();
1057061da546Spatrick       if (candidate.IsTypedefType())
1058061da546Spatrick         return candidate.GetTypedefedType();
1059061da546Spatrick       return candidate;
1060061da546Spatrick     }
1061061da546Spatrick   };
1062061da546Spatrick 
1063061da546Spatrick   return std::unique_ptr<TypeScavenger>(
1064061da546Spatrick       new Language::EitherTypeScavenger<ObjCModulesScavenger,
1065061da546Spatrick                                         ObjCRuntimeScavenger,
1066061da546Spatrick                                         ObjCDebugInfoScavenger>());
1067061da546Spatrick }
1068061da546Spatrick 
GetFormatterPrefixSuffix(ValueObject & valobj,ConstString type_hint,std::string & prefix,std::string & suffix)1069061da546Spatrick bool ObjCLanguage::GetFormatterPrefixSuffix(ValueObject &valobj,
1070061da546Spatrick                                             ConstString type_hint,
1071061da546Spatrick                                             std::string &prefix,
1072061da546Spatrick                                             std::string &suffix) {
1073061da546Spatrick   static ConstString g_CFBag("CFBag");
1074061da546Spatrick   static ConstString g_CFBinaryHeap("CFBinaryHeap");
1075061da546Spatrick 
1076061da546Spatrick   static ConstString g_NSNumberChar("NSNumber:char");
1077061da546Spatrick   static ConstString g_NSNumberShort("NSNumber:short");
1078061da546Spatrick   static ConstString g_NSNumberInt("NSNumber:int");
1079061da546Spatrick   static ConstString g_NSNumberLong("NSNumber:long");
1080061da546Spatrick   static ConstString g_NSNumberInt128("NSNumber:int128_t");
1081061da546Spatrick   static ConstString g_NSNumberFloat("NSNumber:float");
1082061da546Spatrick   static ConstString g_NSNumberDouble("NSNumber:double");
1083061da546Spatrick 
1084061da546Spatrick   static ConstString g_NSData("NSData");
1085061da546Spatrick   static ConstString g_NSArray("NSArray");
1086061da546Spatrick   static ConstString g_NSString("NSString");
1087061da546Spatrick   static ConstString g_NSStringStar("NSString*");
1088061da546Spatrick 
1089061da546Spatrick   if (type_hint.IsEmpty())
1090061da546Spatrick     return false;
1091061da546Spatrick 
1092061da546Spatrick   prefix.clear();
1093061da546Spatrick   suffix.clear();
1094061da546Spatrick 
1095061da546Spatrick   if (type_hint == g_CFBag || type_hint == g_CFBinaryHeap) {
1096061da546Spatrick     prefix = "@";
1097061da546Spatrick     return true;
1098061da546Spatrick   }
1099061da546Spatrick 
1100061da546Spatrick   if (type_hint == g_NSNumberChar) {
1101061da546Spatrick     prefix = "(char)";
1102061da546Spatrick     return true;
1103061da546Spatrick   }
1104061da546Spatrick   if (type_hint == g_NSNumberShort) {
1105061da546Spatrick     prefix = "(short)";
1106061da546Spatrick     return true;
1107061da546Spatrick   }
1108061da546Spatrick   if (type_hint == g_NSNumberInt) {
1109061da546Spatrick     prefix = "(int)";
1110061da546Spatrick     return true;
1111061da546Spatrick   }
1112061da546Spatrick   if (type_hint == g_NSNumberLong) {
1113061da546Spatrick     prefix = "(long)";
1114061da546Spatrick     return true;
1115061da546Spatrick   }
1116061da546Spatrick   if (type_hint == g_NSNumberInt128) {
1117061da546Spatrick     prefix = "(int128_t)";
1118061da546Spatrick     return true;
1119061da546Spatrick   }
1120061da546Spatrick   if (type_hint == g_NSNumberFloat) {
1121061da546Spatrick     prefix = "(float)";
1122061da546Spatrick     return true;
1123061da546Spatrick   }
1124061da546Spatrick   if (type_hint == g_NSNumberDouble) {
1125061da546Spatrick     prefix = "(double)";
1126061da546Spatrick     return true;
1127061da546Spatrick   }
1128061da546Spatrick 
1129061da546Spatrick   if (type_hint == g_NSData || type_hint == g_NSArray) {
1130061da546Spatrick     prefix = "@\"";
1131061da546Spatrick     suffix = "\"";
1132061da546Spatrick     return true;
1133061da546Spatrick   }
1134061da546Spatrick 
1135061da546Spatrick   if (type_hint == g_NSString || type_hint == g_NSStringStar) {
1136061da546Spatrick     prefix = "@";
1137061da546Spatrick     return true;
1138061da546Spatrick   }
1139061da546Spatrick 
1140061da546Spatrick   return false;
1141061da546Spatrick }
1142061da546Spatrick 
IsNilReference(ValueObject & valobj)1143061da546Spatrick bool ObjCLanguage::IsNilReference(ValueObject &valobj) {
1144061da546Spatrick   const uint32_t mask = eTypeIsObjC | eTypeIsPointer;
1145061da546Spatrick   bool isObjCpointer =
1146061da546Spatrick       (((valobj.GetCompilerType().GetTypeInfo(nullptr)) & mask) == mask);
1147061da546Spatrick   if (!isObjCpointer)
1148061da546Spatrick     return false;
1149061da546Spatrick   bool canReadValue = true;
1150061da546Spatrick   bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
1151061da546Spatrick   return canReadValue && isZero;
1152061da546Spatrick }
1153061da546Spatrick 
IsSourceFile(llvm::StringRef file_path) const1154061da546Spatrick bool ObjCLanguage::IsSourceFile(llvm::StringRef file_path) const {
1155061da546Spatrick   const auto suffixes = {".h", ".m", ".M"};
1156061da546Spatrick   for (auto suffix : suffixes) {
1157be691f3bSpatrick     if (file_path.endswith_insensitive(suffix))
1158061da546Spatrick       return true;
1159061da546Spatrick   }
1160061da546Spatrick   return false;
1161061da546Spatrick }
1162