blob: 6c1aee9be6d9a2ff399c5061f12f7332b95e2ce7 [file] [log] [blame]
Enrico Granata5f9d3102015-08-27 21:33:50 +00001//===-- ObjCLanguage.cpp --------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ObjCLanguage.h"
11
Chaoren Lin3e130052015-09-14 22:39:34 +000012#include <mutex>
13
Enrico Granata5f9d3102015-08-27 21:33:50 +000014#include "lldb/Core/ConstString.h"
15#include "lldb/Core/PluginManager.h"
Jim Inghamaa816b82015-09-02 01:59:14 +000016#include "lldb/Core/StreamString.h"
Enrico Granatad3233c12015-09-09 01:10:46 +000017#include "lldb/Core/ValueObject.h"
Enrico Granata170c3952015-09-14 22:18:32 +000018#include "lldb/DataFormatters/DataVisualization.h"
19#include "lldb/DataFormatters/FormattersHelpers.h"
Enrico Granatad3233c12015-09-09 01:10:46 +000020#include "lldb/Symbol/CompilerType.h"
21#include "lldb/Target/ObjCLanguageRuntime.h"
Enrico Granata5f9d3102015-08-27 21:33:50 +000022
Enrico Granata170c3952015-09-14 22:18:32 +000023#include "CF.h"
24#include "Cocoa.h"
25#include "CoreMedia.h"
26
Enrico Granata5f9d3102015-08-27 21:33:50 +000027using namespace lldb;
28using namespace lldb_private;
Enrico Granata170c3952015-09-14 22:18:32 +000029using namespace lldb_private::formatters;
Enrico Granata5f9d3102015-08-27 21:33:50 +000030
31void
32ObjCLanguage::Initialize()
33{
34 PluginManager::RegisterPlugin (GetPluginNameStatic(),
35 "Objective-C Language",
36 CreateInstance);
37}
38
39void
40ObjCLanguage::Terminate()
41{
42 PluginManager::UnregisterPlugin (CreateInstance);
43}
44
45lldb_private::ConstString
46ObjCLanguage::GetPluginNameStatic()
47{
48 static ConstString g_name("objc");
49 return g_name;
50}
51
52
53//------------------------------------------------------------------
54// PluginInterface protocol
55//------------------------------------------------------------------
56lldb_private::ConstString
57ObjCLanguage::GetPluginName()
58{
59 return GetPluginNameStatic();
60}
61
62uint32_t
63ObjCLanguage::GetPluginVersion()
64{
65 return 1;
66}
67
68//------------------------------------------------------------------
69// Static Functions
70//------------------------------------------------------------------
71Language *
72ObjCLanguage::CreateInstance (lldb::LanguageType language)
73{
74 switch (language)
75 {
76 case lldb::eLanguageTypeObjC:
77 return new ObjCLanguage();
78 default:
79 return nullptr;
80 }
81}
Jim Inghamaa816b82015-09-02 01:59:14 +000082
83void
84ObjCLanguage::MethodName::Clear()
85{
86 m_full.Clear();
87 m_class.Clear();
88 m_category.Clear();
89 m_selector.Clear();
90 m_type = eTypeUnspecified;
91 m_category_is_valid = false;
92}
93
94bool
95ObjCLanguage::MethodName::SetName (const char *name, bool strict)
96{
97 Clear();
98 if (name && name[0])
99 {
100 // If "strict" is true. then the method must be specified with a
101 // '+' or '-' at the beginning. If "strict" is false, then the '+'
102 // or '-' can be omitted
103 bool valid_prefix = false;
104
105 if (name[0] == '+' || name[0] == '-')
106 {
107 valid_prefix = name[1] == '[';
108 if (name[0] == '+')
109 m_type = eTypeClassMethod;
110 else
111 m_type = eTypeInstanceMethod;
112 }
113 else if (!strict)
114 {
115 // "strict" is false, the name just needs to start with '['
116 valid_prefix = name[0] == '[';
117 }
118
119 if (valid_prefix)
120 {
121 int name_len = strlen (name);
122 // Objective C methods must have at least:
123 // "-[" or "+[" prefix
124 // One character for a class name
125 // One character for the space between the class name
126 // One character for the method name
127 // "]" suffix
128 if (name_len >= (5 + (strict ? 1 : 0)) && name[name_len - 1] == ']')
129 {
130 m_full.SetCStringWithLength(name, name_len);
131 }
132 }
133 }
134 return IsValid(strict);
135}
136
137const ConstString &
138ObjCLanguage::MethodName::GetClassName ()
139{
140 if (!m_class)
141 {
142 if (IsValid(false))
143 {
144 const char *full = m_full.GetCString();
145 const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
146 const char *paren_pos = strchr (class_start, '(');
147 if (paren_pos)
148 {
149 m_class.SetCStringWithLength (class_start, paren_pos - class_start);
150 }
151 else
152 {
153 // No '(' was found in the full name, we can definitively say
154 // that our category was valid (and empty).
155 m_category_is_valid = true;
156 const char *space_pos = strchr (full, ' ');
157 if (space_pos)
158 {
159 m_class.SetCStringWithLength (class_start, space_pos - class_start);
160 if (!m_class_category)
161 {
162 // No category in name, so we can also fill in the m_class_category
163 m_class_category = m_class;
164 }
165 }
166 }
167 }
168 }
169 return m_class;
170}
171
172const ConstString &
173ObjCLanguage::MethodName::GetClassNameWithCategory ()
174{
175 if (!m_class_category)
176 {
177 if (IsValid(false))
178 {
179 const char *full = m_full.GetCString();
180 const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
181 const char *space_pos = strchr (full, ' ');
182 if (space_pos)
183 {
184 m_class_category.SetCStringWithLength (class_start, space_pos - class_start);
185 // If m_class hasn't been filled in and the class with category doesn't
186 // contain a '(', then we can also fill in the m_class
187 if (!m_class && strchr (m_class_category.GetCString(), '(') == NULL)
188 {
189 m_class = m_class_category;
190 // No '(' was found in the full name, we can definitively say
191 // that our category was valid (and empty).
192 m_category_is_valid = true;
193
194 }
195 }
196 }
197 }
198 return m_class_category;
199}
200
201const ConstString &
202ObjCLanguage::MethodName::GetSelector ()
203{
204 if (!m_selector)
205 {
206 if (IsValid(false))
207 {
208 const char *full = m_full.GetCString();
209 const char *space_pos = strchr (full, ' ');
210 if (space_pos)
211 {
212 ++space_pos; // skip the space
213 m_selector.SetCStringWithLength (space_pos, m_full.GetLength() - (space_pos - full) - 1);
214 }
215 }
216 }
217 return m_selector;
218}
219
220const ConstString &
221ObjCLanguage::MethodName::GetCategory ()
222{
223 if (!m_category_is_valid && !m_category)
224 {
225 if (IsValid(false))
226 {
227 m_category_is_valid = true;
228 const char *full = m_full.GetCString();
229 const char *class_start = (full[0] == '[' ? full + 1 : full + 2);
230 const char *open_paren_pos = strchr (class_start, '(');
231 if (open_paren_pos)
232 {
233 ++open_paren_pos; // Skip the open paren
234 const char *close_paren_pos = strchr (open_paren_pos, ')');
235 if (close_paren_pos)
236 m_category.SetCStringWithLength (open_paren_pos, close_paren_pos - open_paren_pos);
237 }
238 }
239 }
240 return m_category;
241}
242
243ConstString
244ObjCLanguage::MethodName::GetFullNameWithoutCategory (bool empty_if_no_category)
245{
246 if (IsValid(false))
247 {
248 if (HasCategory())
249 {
250 StreamString strm;
251 if (m_type == eTypeClassMethod)
252 strm.PutChar('+');
253 else if (m_type == eTypeInstanceMethod)
254 strm.PutChar('-');
255 strm.Printf("[%s %s]", GetClassName().GetCString(), GetSelector().GetCString());
256 return ConstString(strm.GetString().c_str());
257 }
258
259 if (!empty_if_no_category)
260 {
261 // Just return the full name since it doesn't have a category
262 return GetFullName();
263 }
264 }
265 return ConstString();
266}
267
268size_t
269ObjCLanguage::MethodName::GetFullNames (std::vector<ConstString> &names, bool append)
270{
271 if (!append)
272 names.clear();
273 if (IsValid(false))
274 {
275 StreamString strm;
276 const bool is_class_method = m_type == eTypeClassMethod;
277 const bool is_instance_method = m_type == eTypeInstanceMethod;
278 const ConstString &category = GetCategory();
279 if (is_class_method || is_instance_method)
280 {
281 names.push_back (m_full);
282 if (category)
283 {
284 strm.Printf("%c[%s %s]",
285 is_class_method ? '+' : '-',
286 GetClassName().GetCString(),
287 GetSelector().GetCString());
288 names.push_back(ConstString(strm.GetString().c_str()));
289 }
290 }
291 else
292 {
293 const ConstString &class_name = GetClassName();
294 const ConstString &selector = GetSelector();
295 strm.Printf("+[%s %s]", class_name.GetCString(), selector.GetCString());
296 names.push_back(ConstString(strm.GetString().c_str()));
297 strm.Clear();
298 strm.Printf("-[%s %s]", class_name.GetCString(), selector.GetCString());
299 names.push_back(ConstString(strm.GetString().c_str()));
300 strm.Clear();
301 if (category)
302 {
303 strm.Printf("+[%s(%s) %s]", class_name.GetCString(), category.GetCString(), selector.GetCString());
304 names.push_back(ConstString(strm.GetString().c_str()));
305 strm.Clear();
306 strm.Printf("-[%s(%s) %s]", class_name.GetCString(), category.GetCString(), selector.GetCString());
307 names.push_back(ConstString(strm.GetString().c_str()));
308 }
309 }
310 }
311 return names.size();
312}
Enrico Granatad3233c12015-09-09 01:10:46 +0000313
Enrico Granata170c3952015-09-14 22:18:32 +0000314static void
315LoadObjCFormatters(TypeCategoryImplSP objc_category_sp)
316{
317 if (!objc_category_sp)
318 return;
319
320 TypeSummaryImpl::Flags objc_flags;
321 objc_flags.SetCascades(false)
322 .SetSkipPointers(true)
323 .SetSkipReferences(true)
324 .SetDontShowChildren(true)
325 .SetDontShowValue(true)
326 .SetShowMembersOneLiner(false)
327 .SetHideItemNames(false);
328
329 lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,""));
330 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"),
331 ObjC_BOOL_summary);
332 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"),
333 ObjC_BOOL_summary);
334 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"),
335 ObjC_BOOL_summary);
336
337#ifndef LLDB_DISABLE_PYTHON
338 // we need to skip pointers here since we are special casing a SEL* when retrieving its value
339 objc_flags.SetSkipPointers(true);
340 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags);
341 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
342 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags);
343 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags);
344 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("SEL *"), objc_flags);
345
346 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCClassSummaryProvider, "Class summary provider", ConstString("Class"), objc_flags);
347
348 SyntheticChildren::Flags class_synth_flags;
349 class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
350
351 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, "Class synthetic children", ConstString("Class"), class_synth_flags);
352#endif // LLDB_DISABLE_PYTHON
353
354 objc_flags.SetSkipPointers(false);
355 objc_flags.SetCascades(true);
356 objc_flags.SetSkipReferences(false);
357
358 AddStringSummary (objc_category_sp,
359 "${var.__FuncPtr%A}",
360 ConstString("__block_literal_generic"),
361 objc_flags);
362
363 AddStringSummary(objc_category_sp,
364 "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds",
365 ConstString("CFGregorianUnits"),
366 objc_flags);
367 AddStringSummary(objc_category_sp,
368 "location=${var.location} length=${var.length}",
369 ConstString("CFRange"),
370 objc_flags);
371
372 AddStringSummary(objc_category_sp,
373 "location=${var.location}, length=${var.length}",
374 ConstString("NSRange"),
375 objc_flags);
376 AddStringSummary(objc_category_sp,
377 "(${var.origin}, ${var.size}), ...",
378 ConstString("NSRectArray"),
379 objc_flags);
380
381 AddOneLineSummary (objc_category_sp,
382 ConstString("NSPoint"),
383 objc_flags);
384 AddOneLineSummary (objc_category_sp,
385 ConstString("NSSize"),
386 objc_flags);
387 AddOneLineSummary (objc_category_sp,
388 ConstString("NSRect"),
389 objc_flags);
390
391 AddOneLineSummary (objc_category_sp,
392 ConstString("CGSize"),
393 objc_flags);
394 AddOneLineSummary (objc_category_sp,
395 ConstString("CGPoint"),
396 objc_flags);
397 AddOneLineSummary (objc_category_sp,
398 ConstString("CGRect"),
399 objc_flags);
400
401 AddStringSummary(objc_category_sp,
402 "red=${var.red} green=${var.green} blue=${var.blue}",
403 ConstString("RGBColor"),
404 objc_flags);
405 AddStringSummary(objc_category_sp,
406 "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
407 ConstString("Rect"),
408 objc_flags);
409 AddStringSummary(objc_category_sp,
410 "(v=${var.v}, h=${var.h})",
411 ConstString("Point"),
412 objc_flags);
413 AddStringSummary(objc_category_sp,
414 "${var.month}/${var.day}/${var.year} ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
415 ConstString("DateTimeRect *"),
416 objc_flags);
417 AddStringSummary(objc_category_sp,
418 "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}",
419 ConstString("LongDateRect"),
420 objc_flags);
421 AddStringSummary(objc_category_sp,
422 "(x=${var.x}, y=${var.y})",
423 ConstString("HIPoint"),
424 objc_flags);
425 AddStringSummary(objc_category_sp,
426 "origin=${var.origin} size=${var.size}",
427 ConstString("HIRect"),
428 objc_flags);
429
430 TypeSummaryImpl::Flags appkit_flags;
431 appkit_flags.SetCascades(true)
432 .SetSkipPointers(false)
433 .SetSkipReferences(false)
434 .SetDontShowChildren(true)
435 .SetDontShowValue(false)
436 .SetShowMembersOneLiner(false)
437 .SetHideItemNames(false);
438
439 appkit_flags.SetDontShowChildren(false);
440
441
442#ifndef LLDB_DISABLE_PYTHON
443 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags);
444 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
445 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
446 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
447 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
448 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
449 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags);
450
451 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags);
452 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags);
453 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags);
454 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags);
455 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags);
456 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags);
457 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags);
458
459 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSSet summary", ConstString("NSSet"), appkit_flags);
460 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
461 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFSetRef summary", ConstString("CFSetRef"), appkit_flags);
462 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags);
463 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags);
464 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetI summary", ConstString("__NSSetI"), appkit_flags);
465 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetM summary", ConstString("__NSSetM"), appkit_flags);
466 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags);
467 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
468 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags);
469 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags);
470 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags);
471
472 // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags);
473
474 appkit_flags.SetDontShowChildren(true);
475
476 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags());
477 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags());
478 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags());
479 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags());
480 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags());
481 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFMutableArrayRef"), ScriptedSyntheticChildren::Flags());
482 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFArrayRef"), ScriptedSyntheticChildren::Flags());
483
484 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags());
485 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags());
486 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags());
487 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags());
488 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags());
489 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags());
490 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags());
491
492 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSSet synthetic children", ConstString("NSSet"), ScriptedSyntheticChildren::Flags());
493 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetI synthetic children", ConstString("__NSSetI"), ScriptedSyntheticChildren::Flags());
494 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetM synthetic children", ConstString("__NSSetM"), ScriptedSyntheticChildren::Flags());
495 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSMutableSet synthetic children", ConstString("NSMutableSet"), ScriptedSyntheticChildren::Flags());
496 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags());
497 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags());
498 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags());
499
500 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags());
501
502 AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags);
503 AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags);
504 AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("const struct __CFBag"), appkit_flags);
505 AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags);
506
507 AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), appkit_flags);
508 AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), appkit_flags);
509
510 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags);
511 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
512 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__CFString"), appkit_flags);
513 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags);
514 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSMutableString"), appkit_flags);
515 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags);
516 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
517 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags);
518 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags);
519 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
520
521 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, "NSAttributedString summary provider", ConstString("NSAttributedString"), appkit_flags);
522 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSMutableAttributedString"), appkit_flags);
523 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSConcreteMutableAttributedString"), appkit_flags);
524
525 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSBundleSummaryProvider, "NSBundle summary provider", ConstString("NSBundle"), appkit_flags);
526
527 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags);
528 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
529 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags);
530 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSMutableData"), appkit_flags);
531 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
532 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
533 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
534
535 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags);
536
537 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags);
538 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags);
539
540 AddStringSummary(objc_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
541 AddStringSummary(objc_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags);
542
543 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
544 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
545 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
546 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
547 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
548 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
549
550 AddCXXSummary(objc_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags);
551 AddCXXSummary(objc_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags);
552 AddCXXSummary(objc_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags);
553 AddCXXSummary(objc_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags);
554
555 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("NSURL"), appkit_flags);
556 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("CFURLRef"), appkit_flags);
557
558 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSDate"), appkit_flags);
559 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSDate"), appkit_flags);
560 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags);
561 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags);
562
563 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags);
564 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), appkit_flags);
565 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags);
566
567 // CFAbsoluteTime is actually a double rather than a pointer to an object
568 // we do not care about the numeric value, since it is probably meaningless to users
569 appkit_flags.SetDontShowValue(true);
570 AddCXXSummary(objc_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, "CFAbsoluteTime summary provider", ConstString("CFAbsoluteTime"), appkit_flags);
571 appkit_flags.SetDontShowValue(false);
572
573 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags);
574 AddCXXSummary(objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), appkit_flags);
575
576 AddStringSummary(objc_category_sp,
577 "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"",
578 ConstString("CFGregorianDate"),
579 appkit_flags);
580
581 AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFBitVectorRef"), appkit_flags);
582 AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFMutableBitVectorRef"), appkit_flags);
583 AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFBitVector"), appkit_flags);
584 AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFMutableBitVector"), appkit_flags);
585#endif // LLDB_DISABLE_PYTHON
586}
587
588static void
589LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp)
590{
591 if (!objc_category_sp)
592 return;
593
594 TypeSummaryImpl::Flags cm_flags;
595 cm_flags.SetCascades(true)
596 .SetDontShowChildren(false)
597 .SetDontShowValue(false)
598 .SetHideItemNames(false)
599 .SetShowMembersOneLiner(false)
600 .SetSkipPointers(false)
601 .SetSkipReferences(false);
602
603#ifndef LLDB_DISABLE_PYTHON
604 AddCXXSummary(objc_category_sp, lldb_private::formatters::CMTimeSummaryProvider, "CMTime summary provider", ConstString("CMTime"), cm_flags);
605#endif // LLDB_DISABLE_PYTHON
606}
607
608
609lldb::TypeCategoryImplSP
610ObjCLanguage::GetFormatters ()
611{
612 static std::once_flag g_initialize;
613 static TypeCategoryImplSP g_category;
614
615 std::call_once(g_initialize, [this] () -> void {
616 DataVisualization::Categories::GetCategory(GetPluginName(), g_category);
617 if (g_category)
618 {
619 LoadCoreMediaFormatters(g_category);
620 LoadObjCFormatters(g_category);
621 }
622 });
623 return g_category;
624}
625
Enrico Granatad3233c12015-09-09 01:10:46 +0000626std::vector<ConstString>
627ObjCLanguage::GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic)
628{
629 std::vector<ConstString> result;
630
631 if (use_dynamic == lldb::eNoDynamicValues)
632 return result;
633
634 CompilerType compiler_type(valobj.GetCompilerType());
635
636 const bool check_cpp = false;
637 const bool check_objc = true;
638 bool canBeObjCDynamic = compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc);
639
640 if (canBeObjCDynamic)
641 {
642 do {
643 lldb::ProcessSP process_sp = valobj.GetProcessSP();
644 if (!process_sp)
645 break;
646 ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime();
647 if (runtime == nullptr)
648 break;
649 ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj));
650 if (!objc_class_sp)
651 break;
652 if (ConstString name = objc_class_sp->GetClassName())
653 result.push_back(name);
654 } while (false);
655 }
656
657 return result;
658}
Enrico Granata9b0af1b2015-10-01 18:16:18 +0000659
660std::unique_ptr<Language::TypeScavenger>
661ObjCLanguage::GetTypeScavenger ()
662{
663 class ObjCTypeScavenger : public Language::TypeScavenger
664 {
665 private:
666 class ObjCScavengerResult : public Language::TypeScavenger::Result
667 {
668 public:
669 ObjCScavengerResult (CompilerType type) :
670 Language::TypeScavenger::Result(),
671 m_compiler_type(type)
672 {
673 }
674
675 bool
676 IsValid () override
677 {
678 return m_compiler_type.IsValid();
679 }
680
681 bool
682 DumpToStream (Stream& stream,
683 bool print_help_if_available) override
684 {
685 if (IsValid())
686 {
687 m_compiler_type.DumpTypeDescription(&stream);
688 stream.EOL();
689 return true;
690 }
691 return false;
692 }
693
694 virtual ~ObjCScavengerResult() = default;
695 private:
696 CompilerType m_compiler_type;
697 };
698
699 protected:
700 ObjCTypeScavenger() = default;
701
702 virtual ~ObjCTypeScavenger() = default;
703
704 bool
705 Find_Impl (ExecutionContextScope *exe_scope,
706 const char *key,
707 ResultSet &results) override
708 {
709 bool result = false;
710
711 Process* process = exe_scope->CalculateProcess().get();
712 if (process)
713 {
714 const bool create_on_demand = false;
715 auto objc_runtime = process->GetObjCLanguageRuntime(create_on_demand);
716 if (objc_runtime)
717 {
718 auto decl_vendor = objc_runtime->GetDeclVendor();
719 if (decl_vendor)
720 {
721 std::vector<clang::NamedDecl *> decls;
722 ConstString name(key);
723 decl_vendor->FindDecls(name, true, UINT32_MAX, decls);
724 for (auto decl : decls)
725 {
726 if (decl)
727 {
728 if (CompilerType candidate = ClangASTContext::GetTypeForDecl(decl))
729 {
730 result = true;
731 std::unique_ptr<Language::TypeScavenger::Result> result(new ObjCScavengerResult(candidate));
732 results.insert(std::move(result));
733 }
734 }
735 }
736 }
737 }
738 }
739 return result;
740 }
741
742 friend class ObjCLanguage;
743 };
744
745 return std::unique_ptr<TypeScavenger>(new ObjCTypeScavenger());
746}