blob: bc8e8e7c063002e5cadf8a850bde42bc88ef3171 [file] [log] [blame]
Greg Clayton4a33d312011-06-23 17:59:56 +00001//===-- FormatManager.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
Enrico Granata5548cb52013-01-28 23:47:25 +000010#include "lldb/DataFormatters/FormatManager.h"
Greg Clayton4a33d312011-06-23 17:59:56 +000011
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16
Enrico Granataf2bbf712011-07-15 02:26:42 +000017#include "lldb/Core/Debugger.h"
Enrico Granata419d7912015-09-04 00:33:51 +000018#include "lldb/DataFormatters/CF.h"
19#include "lldb/DataFormatters/Cocoa.h"
20#include "lldb/DataFormatters/CoreMedia.h"
21#include "lldb/DataFormatters/CXXFunctionPointer.h"
Enrico Granata419d7912015-09-04 00:33:51 +000022#include "lldb/DataFormatters/VectorType.h"
Enrico Granatadf7e79e2015-09-02 01:21:31 +000023#include "lldb/DataFormatters/FormattersHelpers.h"
Enrico Granata980c0482015-09-01 18:22:39 +000024#include "lldb/DataFormatters/LanguageCategory.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000025#include "lldb/Target/ExecutionContext.h"
Enrico Granata33e97e62015-09-04 21:01:18 +000026#include "lldb/Target/Language.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000027#include "lldb/Target/Platform.h"
Saleem Abdulrasool28606952014-06-27 05:17:41 +000028#include "llvm/ADT/STLExtras.h"
Enrico Granataf2bbf712011-07-15 02:26:42 +000029
Enrico Granata980c0482015-09-01 18:22:39 +000030#include <initializer_list>
31
Greg Clayton4a33d312011-06-23 17:59:56 +000032using namespace lldb;
33using namespace lldb_private;
Enrico Granatadf7e79e2015-09-02 01:21:31 +000034using namespace lldb_private::formatters;
Greg Claytonbb7f31f2011-06-23 21:22:24 +000035
36struct FormatInfo
37{
38 Format format;
39 const char format_char; // One or more format characters that can be used for this format.
40 const char *format_name; // Long format name that can be used to specify the current format
41};
42
43static FormatInfo
44g_format_infos[] =
45{
46 { eFormatDefault , '\0' , "default" },
47 { eFormatBoolean , 'B' , "boolean" },
48 { eFormatBinary , 'b' , "binary" },
49 { eFormatBytes , 'y' , "bytes" },
50 { eFormatBytesWithASCII , 'Y' , "bytes with ASCII" },
51 { eFormatChar , 'c' , "character" },
52 { eFormatCharPrintable , 'C' , "printable character" },
53 { eFormatComplexFloat , 'F' , "complex float" },
54 { eFormatCString , 's' , "c-string" },
Greg Clayton5009f9d2011-10-27 17:55:14 +000055 { eFormatDecimal , 'd' , "decimal" },
Greg Claytonbb7f31f2011-06-23 21:22:24 +000056 { eFormatEnum , 'E' , "enumeration" },
57 { eFormatHex , 'x' , "hex" },
Enrico Granata7ec18e32012-08-09 19:33:34 +000058 { eFormatHexUppercase , 'X' , "uppercase hex" },
Greg Claytonbb7f31f2011-06-23 21:22:24 +000059 { eFormatFloat , 'f' , "float" },
60 { eFormatOctal , 'o' , "octal" },
61 { eFormatOSType , 'O' , "OSType" },
62 { eFormatUnicode16 , 'U' , "unicode16" },
63 { eFormatUnicode32 , '\0' , "unicode32" },
64 { eFormatUnsigned , 'u' , "unsigned decimal" },
65 { eFormatPointer , 'p' , "pointer" },
66 { eFormatVectorOfChar , '\0' , "char[]" },
67 { eFormatVectorOfSInt8 , '\0' , "int8_t[]" },
68 { eFormatVectorOfUInt8 , '\0' , "uint8_t[]" },
69 { eFormatVectorOfSInt16 , '\0' , "int16_t[]" },
70 { eFormatVectorOfUInt16 , '\0' , "uint16_t[]" },
Enrico Granatae443ba72011-07-06 15:56:06 +000071 { eFormatVectorOfSInt32 , '\0' , "int32_t[]" },
72 { eFormatVectorOfUInt32 , '\0' , "uint32_t[]" },
73 { eFormatVectorOfSInt64 , '\0' , "int64_t[]" },
74 { eFormatVectorOfUInt64 , '\0' , "uint64_t[]" },
Greg Claytonbb7f31f2011-06-23 21:22:24 +000075 { eFormatVectorOfFloat32, '\0' , "float32[]" },
76 { eFormatVectorOfFloat64, '\0' , "float64[]" },
77 { eFormatVectorOfUInt128, '\0' , "uint128_t[]" },
78 { eFormatComplexInteger , 'I' , "complex integer" },
Greg Clayton5009f9d2011-10-27 17:55:14 +000079 { eFormatCharArray , 'a' , "character array" },
80 { eFormatAddressInfo , 'A' , "address" },
Enrico Granata7ec18e32012-08-09 19:33:34 +000081 { eFormatHexFloat , '\0' , "hex float" },
Sean Callananbf154da2012-08-08 17:35:10 +000082 { eFormatInstruction , 'i' , "instruction" },
83 { eFormatVoid , 'v' , "void" }
Greg Claytonbb7f31f2011-06-23 21:22:24 +000084};
85
Saleem Abdulrasool28606952014-06-27 05:17:41 +000086static uint32_t g_num_format_infos = llvm::array_lengthof(g_format_infos);
Greg Claytonbb7f31f2011-06-23 21:22:24 +000087
88static bool
89GetFormatFromFormatChar (char format_char, Format &format)
90{
91 for (uint32_t i=0; i<g_num_format_infos; ++i)
92 {
93 if (g_format_infos[i].format_char == format_char)
94 {
95 format = g_format_infos[i].format;
96 return true;
97 }
98 }
99 format = eFormatInvalid;
100 return false;
101}
102
103static bool
104GetFormatFromFormatName (const char *format_name, bool partial_match_ok, Format &format)
105{
106 uint32_t i;
107 for (i=0; i<g_num_format_infos; ++i)
108 {
109 if (strcasecmp (g_format_infos[i].format_name, format_name) == 0)
110 {
111 format = g_format_infos[i].format;
112 return true;
113 }
114 }
115
116 if (partial_match_ok)
117 {
118 for (i=0; i<g_num_format_infos; ++i)
119 {
120 if (strcasestr (g_format_infos[i].format_name, format_name) == g_format_infos[i].format_name)
121 {
122 format = g_format_infos[i].format;
123 return true;
124 }
125 }
126 }
127 format = eFormatInvalid;
128 return false;
129}
130
131bool
132FormatManager::GetFormatFromCString (const char *format_cstr,
133 bool partial_match_ok,
134 lldb::Format &format)
135{
136 bool success = false;
137 if (format_cstr && format_cstr[0])
138 {
139 if (format_cstr[1] == '\0')
140 {
141 success = GetFormatFromFormatChar (format_cstr[0], format);
142 if (success)
143 return true;
144 }
145
146 success = GetFormatFromFormatName (format_cstr, partial_match_ok, format);
147 }
148 if (!success)
149 format = eFormatInvalid;
150 return success;
151}
152
153char
154FormatManager::GetFormatAsFormatChar (lldb::Format format)
155{
156 for (uint32_t i=0; i<g_num_format_infos; ++i)
157 {
158 if (g_format_infos[i].format == format)
159 return g_format_infos[i].format_char;
160 }
161 return '\0';
162}
Greg Claytonbb7f31f2011-06-23 21:22:24 +0000163
164const char *
165FormatManager::GetFormatAsCString (Format format)
166{
167 if (format >= eFormatDefault && format < kNumFormats)
168 return g_format_infos[format].format_name;
169 return NULL;
170}
Enrico Granata0a3958e2011-07-02 00:25:22 +0000171
Enrico Granatade61cec2013-11-22 00:02:13 +0000172void
Enrico Granata33e97e62015-09-04 21:01:18 +0000173FormatManager::EnableAllCategories ()
174{
175 m_categories_map.EnableAllCategories ();
176 Mutex::Locker lang_locker(m_language_categories_mutex);
177 for (auto& iter : m_language_categories_map)
178 {
179 if (iter.second)
180 iter.second->Enable();
181 }
182}
183
184void
185FormatManager::DisableAllCategories ()
186{
187 m_categories_map.DisableAllCategories ();
188 Mutex::Locker lang_locker(m_language_categories_mutex);
189 for (auto& iter : m_language_categories_map)
190 {
191 if (iter.second)
192 iter.second->Disable();
193 }
194}
195
196void
Enrico Granatade61cec2013-11-22 00:02:13 +0000197FormatManager::GetPossibleMatches (ValueObject& valobj,
Greg Claytona1e5dc82015-08-11 22:53:00 +0000198 CompilerType clang_type,
Enrico Granatade61cec2013-11-22 00:02:13 +0000199 uint32_t reason,
200 lldb::DynamicValueType use_dynamic,
201 FormattersMatchVector& entries,
202 bool did_strip_ptr,
203 bool did_strip_ref,
204 bool did_strip_typedef,
205 bool root_level)
206{
Greg Claytond8d4a572015-08-11 21:38:15 +0000207 clang_type = ClangASTContext::RemoveFastQualifiers(clang_type);
Enrico Granatade61cec2013-11-22 00:02:13 +0000208 ConstString type_name(clang_type.GetConstTypeName());
209 if (valobj.GetBitfieldBitSize() > 0)
210 {
211 StreamString sstring;
212 sstring.Printf("%s:%d",type_name.AsCString(),valobj.GetBitfieldBitSize());
213 ConstString bitfieldname = ConstString(sstring.GetData());
214 entries.push_back({bitfieldname,0,did_strip_ptr,did_strip_ref,did_strip_typedef});
215 reason |= lldb_private::eFormatterChoiceCriterionStrippedBitField;
216 }
217 entries.push_back({type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef});
Enrico Granatae8daa2f2014-05-17 19:14:17 +0000218
219 ConstString display_type_name(clang_type.GetDisplayTypeName());
220 if (display_type_name != type_name)
221 entries.push_back({display_type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef});
222
Enrico Granata1ac62962014-04-10 00:14:07 +0000223 for (bool is_rvalue_ref = true, j = true; j && clang_type.IsReferenceType(nullptr, &is_rvalue_ref); j = false)
Enrico Granatade61cec2013-11-22 00:02:13 +0000224 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000225 CompilerType non_ref_type = clang_type.GetNonReferenceType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000226 GetPossibleMatches(valobj,
227 non_ref_type,
228 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference,
229 use_dynamic,
230 entries,
231 did_strip_ptr,
232 true,
233 did_strip_typedef);
Enrico Granata1ac62962014-04-10 00:14:07 +0000234 if (non_ref_type.IsTypedefType())
235 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000236 CompilerType deffed_referenced_type = non_ref_type.GetTypedefedType();
Greg Claytond8d4a572015-08-11 21:38:15 +0000237 deffed_referenced_type = is_rvalue_ref ? ClangASTContext::GetRValueReferenceType(deffed_referenced_type) : ClangASTContext::GetLValueReferenceType(deffed_referenced_type);
Enrico Granata1ac62962014-04-10 00:14:07 +0000238 GetPossibleMatches(valobj,
239 deffed_referenced_type,
240 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
241 use_dynamic,
242 entries,
243 did_strip_ptr,
244 did_strip_ref,
245 true); // this is not exactly the usual meaning of stripping typedefs
246 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000247 }
Enrico Granata1ac62962014-04-10 00:14:07 +0000248
249 if (clang_type.IsPointerType())
Enrico Granatade61cec2013-11-22 00:02:13 +0000250 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000251 CompilerType non_ptr_type = clang_type.GetPointeeType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000252 GetPossibleMatches(valobj,
253 non_ptr_type,
254 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference,
255 use_dynamic,
256 entries,
257 true,
258 did_strip_ref,
259 did_strip_typedef);
Enrico Granata1ac62962014-04-10 00:14:07 +0000260 if (non_ptr_type.IsTypedefType())
261 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000262 CompilerType deffed_pointed_type = non_ptr_type.GetTypedefedType().GetPointerType();
Enrico Granata1ac62962014-04-10 00:14:07 +0000263 GetPossibleMatches(valobj,
264 deffed_pointed_type,
265 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
266 use_dynamic,
267 entries,
268 did_strip_ptr,
269 did_strip_ref,
270 true); // this is not exactly the usual meaning of stripping typedefs
271 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000272 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000273
Enrico Granatad3233c12015-09-09 01:10:46 +0000274 for (lldb::LanguageType language_type : GetCandidateLanguages(valobj))
Enrico Granatade61cec2013-11-22 00:02:13 +0000275 {
Enrico Granatad3233c12015-09-09 01:10:46 +0000276 if (Language* language = Language::FindPlugin(language_type))
Enrico Granatade61cec2013-11-22 00:02:13 +0000277 {
Enrico Granatad3233c12015-09-09 01:10:46 +0000278 for (ConstString candidate : language->GetPossibleFormattersMatches(valobj, use_dynamic))
Enrico Granatade61cec2013-11-22 00:02:13 +0000279 {
Enrico Granatad3233c12015-09-09 01:10:46 +0000280 entries.push_back({candidate,
281 reason | lldb_private::eFormatterChoiceCriterionLanguagePlugin,
282 did_strip_ptr,
283 did_strip_ref,
284 did_strip_typedef});
285 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000286 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000287 }
Enrico Granatad3233c12015-09-09 01:10:46 +0000288
Enrico Granatade61cec2013-11-22 00:02:13 +0000289 // try to strip typedef chains
290 if (clang_type.IsTypedefType())
291 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000292 CompilerType deffed_type = clang_type.GetTypedefedType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000293 GetPossibleMatches(valobj,
294 deffed_type,
295 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
296 use_dynamic,
297 entries,
298 did_strip_ptr,
299 did_strip_ref,
300 true);
301 }
302
303 if (root_level)
304 {
305 do {
306 if (!clang_type.IsValid())
307 break;
308
Greg Claytona1e5dc82015-08-11 22:53:00 +0000309 CompilerType unqual_clang_ast_type = clang_type.GetFullyUnqualifiedType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000310 if (!unqual_clang_ast_type.IsValid())
311 break;
312 if (unqual_clang_ast_type.GetOpaqueQualType() != clang_type.GetOpaqueQualType())
313 GetPossibleMatches (valobj,
314 unqual_clang_ast_type,
315 reason,
316 use_dynamic,
317 entries,
318 did_strip_ptr,
319 did_strip_ref,
320 did_strip_typedef);
321 } while(false);
322
323
324 // if all else fails, go to static type
325 if (valobj.IsDynamic())
326 {
327 lldb::ValueObjectSP static_value_sp(valobj.GetStaticValue());
328 if (static_value_sp)
329 GetPossibleMatches(*static_value_sp.get(),
Greg Clayton99558cc42015-08-24 23:46:31 +0000330 static_value_sp->GetCompilerType(),
Enrico Granatade61cec2013-11-22 00:02:13 +0000331 reason | lldb_private::eFormatterChoiceCriterionWentToStaticValue,
332 use_dynamic,
333 entries,
334 did_strip_ptr,
335 did_strip_ref,
336 did_strip_typedef,
337 true);
338 }
339 }
340}
341
Enrico Granata852cc952013-10-08 19:03:22 +0000342lldb::TypeFormatImplSP
343FormatManager::GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp)
344{
345 if (!type_sp)
346 return lldb::TypeFormatImplSP();
347 lldb::TypeFormatImplSP format_chosen_sp;
348 uint32_t num_categories = m_categories_map.GetCount();
349 lldb::TypeCategoryImplSP category_sp;
350 uint32_t prio_category = UINT32_MAX;
351 for (uint32_t category_id = 0;
352 category_id < num_categories;
353 category_id++)
354 {
355 category_sp = GetCategoryAtIndex(category_id);
356 if (category_sp->IsEnabled() == false)
357 continue;
358 lldb::TypeFormatImplSP format_current_sp = category_sp->GetFormatForType(type_sp);
359 if (format_current_sp && (format_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
360 {
361 prio_category = category_sp->GetEnabledPosition();
362 format_chosen_sp = format_current_sp;
363 }
364 }
365 return format_chosen_sp;
366}
367
Enrico Granataa777dc22012-05-08 21:49:57 +0000368lldb::TypeSummaryImplSP
369FormatManager::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
370{
371 if (!type_sp)
372 return lldb::TypeSummaryImplSP();
373 lldb::TypeSummaryImplSP summary_chosen_sp;
374 uint32_t num_categories = m_categories_map.GetCount();
375 lldb::TypeCategoryImplSP category_sp;
376 uint32_t prio_category = UINT32_MAX;
377 for (uint32_t category_id = 0;
378 category_id < num_categories;
379 category_id++)
380 {
381 category_sp = GetCategoryAtIndex(category_id);
382 if (category_sp->IsEnabled() == false)
383 continue;
384 lldb::TypeSummaryImplSP summary_current_sp = category_sp->GetSummaryForType(type_sp);
385 if (summary_current_sp && (summary_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
386 {
387 prio_category = category_sp->GetEnabledPosition();
388 summary_chosen_sp = summary_current_sp;
389 }
390 }
391 return summary_chosen_sp;
392}
393
394lldb::TypeFilterImplSP
395FormatManager::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
396{
397 if (!type_sp)
398 return lldb::TypeFilterImplSP();
399 lldb::TypeFilterImplSP filter_chosen_sp;
400 uint32_t num_categories = m_categories_map.GetCount();
401 lldb::TypeCategoryImplSP category_sp;
402 uint32_t prio_category = UINT32_MAX;
403 for (uint32_t category_id = 0;
404 category_id < num_categories;
405 category_id++)
406 {
407 category_sp = GetCategoryAtIndex(category_id);
408 if (category_sp->IsEnabled() == false)
409 continue;
410 lldb::TypeFilterImplSP filter_current_sp((TypeFilterImpl*)category_sp->GetFilterForType(type_sp).get());
411 if (filter_current_sp && (filter_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
412 {
413 prio_category = category_sp->GetEnabledPosition();
414 filter_chosen_sp = filter_current_sp;
415 }
416 }
417 return filter_chosen_sp;
418}
419
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000420#ifndef LLDB_DISABLE_PYTHON
Enrico Granata5548cb52013-01-28 23:47:25 +0000421lldb::ScriptedSyntheticChildrenSP
Enrico Granataa777dc22012-05-08 21:49:57 +0000422FormatManager::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
423{
424 if (!type_sp)
Enrico Granata5548cb52013-01-28 23:47:25 +0000425 return lldb::ScriptedSyntheticChildrenSP();
426 lldb::ScriptedSyntheticChildrenSP synth_chosen_sp;
Enrico Granataa777dc22012-05-08 21:49:57 +0000427 uint32_t num_categories = m_categories_map.GetCount();
428 lldb::TypeCategoryImplSP category_sp;
429 uint32_t prio_category = UINT32_MAX;
430 for (uint32_t category_id = 0;
431 category_id < num_categories;
432 category_id++)
433 {
434 category_sp = GetCategoryAtIndex(category_id);
435 if (category_sp->IsEnabled() == false)
436 continue;
Enrico Granata5548cb52013-01-28 23:47:25 +0000437 lldb::ScriptedSyntheticChildrenSP synth_current_sp((ScriptedSyntheticChildren*)category_sp->GetSyntheticForType(type_sp).get());
Enrico Granataa777dc22012-05-08 21:49:57 +0000438 if (synth_current_sp && (synth_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
439 {
440 prio_category = category_sp->GetEnabledPosition();
441 synth_chosen_sp = synth_current_sp;
442 }
443 }
444 return synth_chosen_sp;
445}
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000446#endif
Enrico Granataa777dc22012-05-08 21:49:57 +0000447
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000448#ifndef LLDB_DISABLE_PYTHON
Enrico Granataa777dc22012-05-08 21:49:57 +0000449lldb::SyntheticChildrenSP
450FormatManager::GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp)
451{
452 if (!type_sp)
453 return lldb::SyntheticChildrenSP();
454 lldb::TypeFilterImplSP filter_sp = GetFilterForType(type_sp);
Enrico Granata5548cb52013-01-28 23:47:25 +0000455 lldb::ScriptedSyntheticChildrenSP synth_sp = GetSyntheticForType(type_sp);
Enrico Granataa777dc22012-05-08 21:49:57 +0000456 if (filter_sp->GetRevision() > synth_sp->GetRevision())
457 return lldb::SyntheticChildrenSP(filter_sp.get());
458 else
459 return lldb::SyntheticChildrenSP(synth_sp.get());
460}
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000461#endif
Enrico Granataa777dc22012-05-08 21:49:57 +0000462
Enrico Granatac5827132014-09-05 20:45:07 +0000463lldb::TypeValidatorImplSP
464FormatManager::GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp)
465{
466 if (!type_sp)
467 return lldb::TypeValidatorImplSP();
468 lldb::TypeValidatorImplSP validator_chosen_sp;
469 uint32_t num_categories = m_categories_map.GetCount();
470 lldb::TypeCategoryImplSP category_sp;
471 uint32_t prio_category = UINT32_MAX;
472 for (uint32_t category_id = 0;
473 category_id < num_categories;
474 category_id++)
475 {
476 category_sp = GetCategoryAtIndex(category_id);
477 if (category_sp->IsEnabled() == false)
478 continue;
479 lldb::TypeValidatorImplSP validator_current_sp(category_sp->GetValidatorForType(type_sp).get());
480 if (validator_current_sp && (validator_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
481 {
482 prio_category = category_sp->GetEnabledPosition();
483 validator_chosen_sp = validator_current_sp;
484 }
485 }
486 return validator_chosen_sp;
487}
488
Enrico Granata980c0482015-09-01 18:22:39 +0000489void
490FormatManager::LoopThroughCategories (CategoryCallback callback, void* param)
491{
492 m_categories_map.LoopThrough(callback, param);
493 Mutex::Locker locker(m_language_categories_mutex);
494 for (const auto& entry : m_language_categories_map)
495 {
496 if (auto category_sp = entry.second->GetCategory())
497 {
498 if (!callback(param, category_sp))
499 break;
500 }
501 }
502}
503
Enrico Granata061858c2012-02-15 02:34:21 +0000504lldb::TypeCategoryImplSP
Enrico Granata9128ee22011-09-06 19:20:51 +0000505FormatManager::GetCategory (const ConstString& category_name,
Enrico Granatadb595cd2015-03-06 19:37:57 +0000506 bool can_create)
Enrico Granatadc940732011-08-23 00:32:52 +0000507{
508 if (!category_name)
Enrico Granata9128ee22011-09-06 19:20:51 +0000509 return GetCategory(m_default_category_name);
Enrico Granata061858c2012-02-15 02:34:21 +0000510 lldb::TypeCategoryImplSP category;
Enrico Granatadc940732011-08-23 00:32:52 +0000511 if (m_categories_map.Get(category_name, category))
512 return category;
513
514 if (!can_create)
Enrico Granata061858c2012-02-15 02:34:21 +0000515 return lldb::TypeCategoryImplSP();
Enrico Granatadc940732011-08-23 00:32:52 +0000516
Enrico Granata061858c2012-02-15 02:34:21 +0000517 m_categories_map.Add(category_name,lldb::TypeCategoryImplSP(new TypeCategoryImpl(this, category_name)));
Enrico Granata9128ee22011-09-06 19:20:51 +0000518 return GetCategory(category_name);
Enrico Granatadc940732011-08-23 00:32:52 +0000519}
520
Enrico Granataf4efecd2011-07-12 22:56:10 +0000521lldb::Format
522FormatManager::GetSingleItemFormat(lldb::Format vector_format)
523{
524 switch(vector_format)
525 {
526 case eFormatVectorOfChar:
527 return eFormatCharArray;
528
529 case eFormatVectorOfSInt8:
530 case eFormatVectorOfSInt16:
531 case eFormatVectorOfSInt32:
532 case eFormatVectorOfSInt64:
533 return eFormatDecimal;
534
535 case eFormatVectorOfUInt8:
536 case eFormatVectorOfUInt16:
537 case eFormatVectorOfUInt32:
538 case eFormatVectorOfUInt64:
539 case eFormatVectorOfUInt128:
540 return eFormatHex;
541
542 case eFormatVectorOfFloat32:
543 case eFormatVectorOfFloat64:
544 return eFormatFloat;
545
546 default:
547 return lldb::eFormatInvalid;
548 }
Greg Clayton3418c852011-08-10 02:10:13 +0000549}
Enrico Granatac482a192011-08-17 22:13:59 +0000550
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000551bool
552FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj)
553{
Enrico Granata553fad52013-10-25 23:09:40 +0000554 // if settings say no oneline whatsoever
Enrico Granata90a8db32013-10-31 21:01:07 +0000555 if (valobj.GetTargetSP().get() && valobj.GetTargetSP()->GetDebugger().GetAutoOneLineSummaries() == false)
Enrico Granata553fad52013-10-25 23:09:40 +0000556 return false; // then don't oneline
557
Enrico Granata42fa4af2014-09-11 23:00:27 +0000558 // if this object has a summary, then ask the summary
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000559 if (valobj.GetSummaryFormat().get() != nullptr)
Enrico Granata42fa4af2014-09-11 23:00:27 +0000560 return valobj.GetSummaryFormat()->IsOneLiner();
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000561
562 // no children, no party
563 if (valobj.GetNumChildren() == 0)
564 return false;
565
566 size_t total_children_name_len = 0;
567
568 for (size_t idx = 0;
569 idx < valobj.GetNumChildren();
570 idx++)
571 {
Enrico Granataddac7612014-10-09 18:47:36 +0000572 bool is_synth_val = false;
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000573 ValueObjectSP child_sp(valobj.GetChildAtIndex(idx, true));
574 // something is wrong here - bail out
575 if (!child_sp)
576 return false;
577 // if we decided to define synthetic children for a type, we probably care enough
578 // to show them, but avoid nesting children in children
579 if (child_sp->GetSyntheticChildren().get() != nullptr)
Enrico Granataddac7612014-10-09 18:47:36 +0000580 {
581 ValueObjectSP synth_sp(child_sp->GetSyntheticValue());
582 // wait.. wat? just get out of here..
583 if (!synth_sp)
584 return false;
585 // but if we only have them to provide a value, keep going
586 if (synth_sp->MightHaveChildren() == false && synth_sp->DoesProvideSyntheticValue())
587 is_synth_val = true;
588 else
589 return false;
590 }
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000591
592 total_children_name_len += child_sp->GetName().GetLength();
593
594 // 50 itself is a "randomly" chosen number - the idea is that
595 // overly long structs should not get this treatment
596 // FIXME: maybe make this a user-tweakable setting?
597 if (total_children_name_len > 50)
598 return false;
599
600 // if a summary is there..
601 if (child_sp->GetSummaryFormat())
602 {
603 // and it wants children, then bail out
Enrico Granata8a068e62014-04-23 23:16:25 +0000604 if (child_sp->GetSummaryFormat()->DoesPrintChildren(child_sp.get()))
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000605 return false;
606 }
607
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000608 // if this child has children..
609 if (child_sp->GetNumChildren())
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000610 {
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000611 // ...and no summary...
612 // (if it had a summary and the summary wanted children, we would have bailed out anyway
613 // so this only makes us bail out if this has no summary and we would then print children)
Enrico Granataddac7612014-10-09 18:47:36 +0000614 if (!child_sp->GetSummaryFormat() && !is_synth_val) // but again only do that if not a synthetic valued child
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000615 return false; // then bail out
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000616 }
617 }
618 return true;
619}
620
Enrico Granata02b66762011-08-19 01:14:49 +0000621ConstString
622FormatManager::GetValidTypeName (const ConstString& type)
623{
624 return ::GetValidTypeName_Impl(type);
625}
626
Enrico Granata5548cb52013-01-28 23:47:25 +0000627ConstString
Enrico Granata980c0482015-09-01 18:22:39 +0000628FormatManager::GetTypeForCache (ValueObject& valobj,
629 lldb::DynamicValueType use_dynamic)
Enrico Granata5548cb52013-01-28 23:47:25 +0000630{
631 if (use_dynamic == lldb::eNoDynamicValues)
632 {
633 if (valobj.IsDynamic())
634 {
635 if (valobj.GetStaticValue())
636 return valobj.GetStaticValue()->GetQualifiedTypeName();
637 else
638 return ConstString();
639 }
640 else
641 return valobj.GetQualifiedTypeName();
642 }
643 if (valobj.IsDynamic())
644 return valobj.GetQualifiedTypeName();
645 if (valobj.GetDynamicValue(use_dynamic))
646 return valobj.GetDynamicValue(use_dynamic)->GetQualifiedTypeName();
647 return ConstString();
648}
649
Enrico Granatad3233c12015-09-09 01:10:46 +0000650std::vector<lldb::LanguageType>
651FormatManager::GetCandidateLanguages (ValueObject& valobj)
Enrico Granata980c0482015-09-01 18:22:39 +0000652{
653 lldb::LanguageType lang_type = valobj.GetObjectRuntimeLanguage();
654 switch (lang_type)
655 {
Enrico Granata33e97e62015-09-04 21:01:18 +0000656 case lldb::eLanguageTypeC:
657 case lldb::eLanguageTypeC89:
658 case lldb::eLanguageTypeC99:
659 case lldb::eLanguageTypeC11:
660 case lldb::eLanguageTypeC_plus_plus:
661 case lldb::eLanguageTypeC_plus_plus_03:
662 case lldb::eLanguageTypeC_plus_plus_11:
663 case lldb::eLanguageTypeC_plus_plus_14:
664 return {lldb::eLanguageTypeC_plus_plus};
Enrico Granata980c0482015-09-01 18:22:39 +0000665 default:
666 return {lang_type};
667 }
668}
669
670LanguageCategory*
671FormatManager::GetCategoryForLanguage (lldb::LanguageType lang_type)
672{
673 Mutex::Locker locker(m_language_categories_mutex);
674 auto iter = m_language_categories_map.find(lang_type), end = m_language_categories_map.end();
675 if (iter != end)
676 return iter->second.get();
677 LanguageCategory* lang_category = new LanguageCategory(lang_type);
678 m_language_categories_map[lang_type] = LanguageCategory::UniquePointer(lang_category);
679 return lang_category;
680}
681
Enrico Granataecd02bc2014-08-19 18:47:58 +0000682lldb::TypeFormatImplSP
683FormatManager::GetHardcodedFormat (ValueObject& valobj,
684 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000685{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000686 for (const auto& candidate: m_hardcoded_formats)
687 {
688 auto result = candidate(valobj,use_dynamic,*this);
689 if (result)
690 return result;
691 }
692 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000693}
694
Enrico Granata852cc952013-10-08 19:03:22 +0000695lldb::TypeFormatImplSP
696FormatManager::GetFormat (ValueObject& valobj,
697 lldb::DynamicValueType use_dynamic)
698{
699 TypeFormatImplSP retval;
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000700 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
701 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
702 if (valobj_type)
703 {
704 if (log)
705 log->Printf("\n\n[FormatManager::GetFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
706 if (m_format_cache.GetFormat(valobj_type,retval))
707 {
708 if (log)
709 {
710 log->Printf("[FormatManager::GetFormat] Cache search success. Returning.");
711 if (log->GetDebug())
712 log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
713 }
714 return retval;
715 }
716 if (log)
717 log->Printf("[FormatManager::GetFormat] Cache search failed. Going normal route");
718 }
Enrico Granata980c0482015-09-01 18:22:39 +0000719
720 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
721
722 retval = m_categories_map.GetFormat(valobj, use_dynamic, matches);
723 if (!retval)
724 {
725 if (log)
726 log->Printf("[FormatManager::GetFormat] Search failed. Giving language a chance.");
727 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
728 {
729 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
730 {
731 if (lang_category->Get(valobj, use_dynamic, matches, retval))
732 break;
733 }
734 }
735 if (retval)
736 {
737 if (log)
738 log->Printf("[FormatManager::GetFormat] Language search success. Returning.");
739 return retval;
740 }
741 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000742 if (!retval)
743 {
744 if (log)
745 log->Printf("[FormatManager::GetFormat] Search failed. Giving hardcoded a chance.");
746 retval = GetHardcodedFormat(valobj, use_dynamic);
747 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000748
749 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000750 {
751 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000752 log->Printf("[FormatManager::GetFormat] Caching %p for type %s",
753 static_cast<void*>(retval.get()),
754 valobj_type.AsCString("<invalid>"));
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000755 m_format_cache.SetFormat(valobj_type,retval);
756 }
757 if (log && log->GetDebug())
758 log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata852cc952013-10-08 19:03:22 +0000759 return retval;
760}
761
Enrico Granataecd02bc2014-08-19 18:47:58 +0000762lldb::TypeSummaryImplSP
763FormatManager::GetHardcodedSummaryFormat (ValueObject& valobj,
764 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000765{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000766 for (const auto& candidate: m_hardcoded_summaries)
767 {
768 auto result = candidate(valobj,use_dynamic,*this);
769 if (result)
770 return result;
771 }
772 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000773}
774
Enrico Granata5548cb52013-01-28 23:47:25 +0000775lldb::TypeSummaryImplSP
776FormatManager::GetSummaryFormat (ValueObject& valobj,
777 lldb::DynamicValueType use_dynamic)
778{
779 TypeSummaryImplSP retval;
Greg Clayton5160ce52013-03-27 23:08:40 +0000780 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
Enrico Granata5548cb52013-01-28 23:47:25 +0000781 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
782 if (valobj_type)
783 {
784 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000785 log->Printf("\n\n[FormatManager::GetSummaryFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000786 if (m_format_cache.GetSummary(valobj_type,retval))
Enrico Granata68ae4112013-06-18 18:23:07 +0000787 {
788 if (log)
789 {
790 log->Printf("[FormatManager::GetSummaryFormat] Cache search success. Returning.");
Enrico Granatac2a96402013-06-26 01:03:38 +0000791 if (log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000792 log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata68ae4112013-06-18 18:23:07 +0000793 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000794 return retval;
Enrico Granata68ae4112013-06-18 18:23:07 +0000795 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000796 if (log)
797 log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route");
798 }
Enrico Granata980c0482015-09-01 18:22:39 +0000799
800 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
801
802 retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic, matches);
803 if (!retval)
804 {
805 if (log)
806 log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving language a chance.");
807 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
808 {
809 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
810 {
811 if (lang_category->Get(valobj, use_dynamic, matches, retval))
812 break;
813 }
814 }
815 if (retval)
816 {
817 if (log)
818 log->Printf("[FormatManager::GetSummaryFormat] Language search success. Returning.");
819 return retval;
820 }
821 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000822 if (!retval)
823 {
824 if (log)
825 log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving hardcoded a chance.");
826 retval = GetHardcodedSummaryFormat(valobj, use_dynamic);
827 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000828
829 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata5548cb52013-01-28 23:47:25 +0000830 {
831 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000832 log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s",
833 static_cast<void*>(retval.get()),
834 valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000835 m_format_cache.SetSummary(valobj_type,retval);
836 }
Enrico Granatac2a96402013-06-26 01:03:38 +0000837 if (log && log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000838 log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata5548cb52013-01-28 23:47:25 +0000839 return retval;
840}
841
842#ifndef LLDB_DISABLE_PYTHON
Enrico Granataecd02bc2014-08-19 18:47:58 +0000843lldb::SyntheticChildrenSP
844FormatManager::GetHardcodedSyntheticChildren (ValueObject& valobj,
845 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000846{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000847 for (const auto& candidate: m_hardcoded_synthetics)
848 {
849 auto result = candidate(valobj,use_dynamic,*this);
850 if (result)
851 return result;
852 }
853 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000854}
855
Enrico Granata5548cb52013-01-28 23:47:25 +0000856lldb::SyntheticChildrenSP
857FormatManager::GetSyntheticChildren (ValueObject& valobj,
Enrico Granatac2a96402013-06-26 01:03:38 +0000858 lldb::DynamicValueType use_dynamic)
Enrico Granata5548cb52013-01-28 23:47:25 +0000859{
860 SyntheticChildrenSP retval;
Greg Clayton5160ce52013-03-27 23:08:40 +0000861 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
Enrico Granata5548cb52013-01-28 23:47:25 +0000862 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
863 if (valobj_type)
864 {
865 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000866 log->Printf("\n\n[FormatManager::GetSyntheticChildren] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000867 if (m_format_cache.GetSynthetic(valobj_type,retval))
Enrico Granata68ae4112013-06-18 18:23:07 +0000868 {
869 if (log)
870 {
871 log->Printf("[FormatManager::GetSyntheticChildren] Cache search success. Returning.");
Enrico Granatac2a96402013-06-26 01:03:38 +0000872 if (log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000873 log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata68ae4112013-06-18 18:23:07 +0000874 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000875 return retval;
Enrico Granata68ae4112013-06-18 18:23:07 +0000876 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000877 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000878 log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route");
Enrico Granata5548cb52013-01-28 23:47:25 +0000879 }
Enrico Granata980c0482015-09-01 18:22:39 +0000880
881 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
882
883 retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic, matches);
884 if (!retval)
885 {
886 if (log)
887 log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving language a chance.");
888 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
889 {
890 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
891 {
892 if (lang_category->Get(valobj, use_dynamic, matches, retval))
893 break;
894 }
895 }
896 if (retval)
897 {
898 if (log)
899 log->Printf("[FormatManager::GetSyntheticChildren] Language search success. Returning.");
900 return retval;
901 }
902 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000903 if (!retval)
904 {
905 if (log)
906 log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving hardcoded a chance.");
907 retval = GetHardcodedSyntheticChildren(valobj, use_dynamic);
908 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000909
910 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata5548cb52013-01-28 23:47:25 +0000911 {
912 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000913 log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s",
914 static_cast<void*>(retval.get()),
915 valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000916 m_format_cache.SetSynthetic(valobj_type,retval);
917 }
Enrico Granatac2a96402013-06-26 01:03:38 +0000918 if (log && log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000919 log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata5548cb52013-01-28 23:47:25 +0000920 return retval;
921}
922#endif
Enrico Granata5548cb52013-01-28 23:47:25 +0000923
Enrico Granatac5827132014-09-05 20:45:07 +0000924lldb::TypeValidatorImplSP
925FormatManager::GetValidator (ValueObject& valobj,
926 lldb::DynamicValueType use_dynamic)
927{
928 TypeValidatorImplSP retval;
929 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
930 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
931 if (valobj_type)
932 {
933 if (log)
934 log->Printf("\n\n[FormatManager::GetValidator] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
935 if (m_format_cache.GetValidator(valobj_type,retval))
936 {
937 if (log)
938 {
939 log->Printf("[FormatManager::GetValidator] Cache search success. Returning.");
940 if (log->GetDebug())
941 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
942 }
943 return retval;
944 }
945 if (log)
946 log->Printf("[FormatManager::GetValidator] Cache search failed. Going normal route");
947 }
Enrico Granata980c0482015-09-01 18:22:39 +0000948
949 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
950
951 retval = m_categories_map.GetValidator(valobj, use_dynamic, matches);
952 if (!retval)
953 {
954 if (log)
955 log->Printf("[FormatManager::GetValidator] Search failed. Giving language a chance.");
956 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
957 {
958 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
959 {
960 if (lang_category->Get(valobj, use_dynamic, matches, retval))
961 break;
962 }
963 }
964 if (retval)
965 {
966 if (log)
967 log->Printf("[FormatManager::GetValidator] Language search success. Returning.");
968 return retval;
969 }
970 }
Enrico Granatac5827132014-09-05 20:45:07 +0000971 if (!retval)
972 {
973 if (log)
974 log->Printf("[FormatManager::GetValidator] Search failed. Giving hardcoded a chance.");
975 retval = GetHardcodedValidator(valobj, use_dynamic);
976 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000977
978 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granatac5827132014-09-05 20:45:07 +0000979 {
980 if (log)
981 log->Printf("[FormatManager::GetValidator] Caching %p for type %s",
982 static_cast<void*>(retval.get()),
983 valobj_type.AsCString("<invalid>"));
984 m_format_cache.SetValidator(valobj_type,retval);
985 }
986 if (log && log->GetDebug())
987 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
988 return retval;
989}
990
991lldb::TypeValidatorImplSP
992FormatManager::GetHardcodedValidator (ValueObject& valobj,
993 lldb::DynamicValueType use_dynamic)
994{
995 for (const auto& candidate: m_hardcoded_validators)
996 {
997 auto result = candidate(valobj,use_dynamic,*this);
998 if (result)
999 return result;
1000 }
1001 return nullptr;
1002}
1003
Enrico Granata5548cb52013-01-28 23:47:25 +00001004FormatManager::FormatManager() :
1005 m_format_cache(),
Enrico Granatac482a192011-08-17 22:13:59 +00001006 m_named_summaries_map(this),
1007 m_last_revision(0),
1008 m_categories_map(this),
Enrico Granata980c0482015-09-01 18:22:39 +00001009 m_language_categories_map(),
1010 m_language_categories_mutex(Mutex::eMutexTypeRecursive),
Enrico Granata1d887492011-08-22 18:36:52 +00001011 m_default_category_name(ConstString("default")),
1012 m_system_category_name(ConstString("system")),
Enrico Granata864e3e82012-02-17 03:18:30 +00001013 m_objc_category_name(ConstString("objc")),
1014 m_corefoundation_category_name(ConstString("CoreFoundation")),
1015 m_coregraphics_category_name(ConstString("CoreGraphics")),
1016 m_coreservices_category_name(ConstString("CoreServices")),
Enrico Granatad3d444f2012-02-23 23:10:03 +00001017 m_vectortypes_category_name(ConstString("VectorTypes")),
Enrico Granataecd02bc2014-08-19 18:47:58 +00001018 m_appkit_category_name(ConstString("AppKit")),
Enrico Granatabb557062015-02-10 23:02:25 +00001019 m_coremedia_category_name(ConstString("CoreMedia")),
Enrico Granataecd02bc2014-08-19 18:47:58 +00001020 m_hardcoded_formats(),
1021 m_hardcoded_summaries(),
Enrico Granatac5827132014-09-05 20:45:07 +00001022 m_hardcoded_synthetics(),
1023 m_hardcoded_validators()
Enrico Granataecd02bc2014-08-19 18:47:58 +00001024
Enrico Granatac482a192011-08-17 22:13:59 +00001025{
Enrico Granata864e3e82012-02-17 03:18:30 +00001026 LoadSystemFormatters();
Enrico Granata864e3e82012-02-17 03:18:30 +00001027 LoadObjCFormatters();
Enrico Granatabb557062015-02-10 23:02:25 +00001028 LoadCoreMediaFormatters();
Enrico Granataecd02bc2014-08-19 18:47:58 +00001029 LoadHardcodedFormatters();
Enrico Granata864e3e82012-02-17 03:18:30 +00001030
Enrico Granata5548cb52013-01-28 23:47:25 +00001031 EnableCategory(m_objc_category_name,TypeCategoryMap::Last);
1032 EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last);
1033 EnableCategory(m_appkit_category_name,TypeCategoryMap::Last);
1034 EnableCategory(m_coreservices_category_name,TypeCategoryMap::Last);
1035 EnableCategory(m_coregraphics_category_name,TypeCategoryMap::Last);
Enrico Granata67391b62015-02-10 23:17:07 +00001036 EnableCategory(m_coremedia_category_name,TypeCategoryMap::Last);
Enrico Granata5548cb52013-01-28 23:47:25 +00001037 EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last);
1038 EnableCategory(m_system_category_name,TypeCategoryMap::Last);
Enrico Granata864e3e82012-02-17 03:18:30 +00001039}
1040
1041void
Enrico Granata864e3e82012-02-17 03:18:30 +00001042FormatManager::LoadSystemFormatters()
1043{
Enrico Granataf68df122013-01-10 22:08:35 +00001044
1045 TypeSummaryImpl::Flags string_flags;
Enrico Granata0337c272013-02-22 00:37:31 +00001046 string_flags.SetCascades(true)
Enrico Granataf68df122013-01-10 22:08:35 +00001047 .SetSkipPointers(true)
1048 .SetSkipReferences(false)
1049 .SetDontShowChildren(true)
1050 .SetDontShowValue(false)
1051 .SetShowMembersOneLiner(false)
1052 .SetHideItemNames(false);
1053
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001054 TypeSummaryImpl::Flags string_array_flags;
Enrico Granatad2911632015-07-28 02:13:03 +00001055 string_array_flags.SetCascades(true)
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001056 .SetSkipPointers(true)
1057 .SetSkipReferences(false)
1058 .SetDontShowChildren(true)
1059 .SetDontShowValue(true)
1060 .SetShowMembersOneLiner(false)
1061 .SetHideItemNames(false);
1062
Enrico Granataf68df122013-01-10 22:08:35 +00001063 lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(string_flags, "${var%s}"));
Enrico Granatac482a192011-08-17 22:13:59 +00001064
1065
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001066 lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(string_array_flags,
Enrico Granata061858c2012-02-15 02:34:21 +00001067 "${var%s}"));
Enrico Granatac482a192011-08-17 22:13:59 +00001068
1069 lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001070 lldb::RegularExpressionSP any_size_wchar_arr(new RegularExpression("wchar_t \\[[0-9]+\\]"));
Enrico Granatac482a192011-08-17 22:13:59 +00001071
Enrico Granata061858c2012-02-15 02:34:21 +00001072 TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name);
Enrico Granatac482a192011-08-17 22:13:59 +00001073
Enrico Granatab72a5012013-12-20 09:38:13 +00001074 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("char *"), string_format);
1075 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("unsigned char *"), string_format);
1076 sys_category_sp->GetRegexTypeSummariesContainer()->Add(any_size_char_arr, string_array_format);
Enrico Granataaff65652013-10-21 17:29:51 +00001077
Enrico Granata4ed7ef12012-07-13 18:54:40 +00001078 lldb::TypeSummaryImplSP ostype_summary(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
1079 .SetSkipPointers(true)
1080 .SetSkipReferences(true)
1081 .SetDontShowChildren(true)
1082 .SetDontShowValue(false)
1083 .SetShowMembersOneLiner(false)
1084 .SetHideItemNames(false),
1085 "${var%O}"));
1086
Enrico Granatab72a5012013-12-20 09:38:13 +00001087 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("OSType"), ostype_summary);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001088
Jason Molenda1a100cd2013-01-12 04:24:50 +00001089#ifndef LLDB_DISABLE_PYTHON
Enrico Granata4cc21772013-10-08 20:59:02 +00001090 TypeFormatImpl::Flags fourchar_flags;
1091 fourchar_flags.SetCascades(true).SetSkipPointers(true).SetSkipReferences(true);
1092
1093 AddFormat(sys_category_sp, lldb::eFormatOSType, ConstString("FourCharCode"), fourchar_flags);
Jason Molenda1a100cd2013-01-12 04:24:50 +00001094#endif
Enrico Granatad3d444f2012-02-23 23:10:03 +00001095}
Enrico Granatab2698cd2012-09-13 18:27:09 +00001096
Enrico Granata864e3e82012-02-17 03:18:30 +00001097void
1098FormatManager::LoadObjCFormatters()
1099{
1100 TypeSummaryImpl::Flags objc_flags;
1101 objc_flags.SetCascades(false)
Enrico Granata4b7b5aa2012-07-13 18:55:41 +00001102 .SetSkipPointers(true)
1103 .SetSkipReferences(true)
Enrico Granata864e3e82012-02-17 03:18:30 +00001104 .SetDontShowChildren(true)
1105 .SetDontShowValue(true)
1106 .SetShowMembersOneLiner(false)
1107 .SetHideItemNames(false);
Enrico Granata13643112012-09-04 22:04:50 +00001108
1109 TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001110 TypeCategoryImpl::SharedPointer appkit_category_sp = GetCategory(m_appkit_category_name);
1111 TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name);
1112 TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name);
1113 TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name);
Enrico Granata864e3e82012-02-17 03:18:30 +00001114
Enrico Granatab5887262012-10-29 21:18:03 +00001115 lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,""));
Enrico Granatab72a5012013-12-20 09:38:13 +00001116 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"),
Enrico Granatabac45f62012-01-31 17:01:51 +00001117 ObjC_BOOL_summary);
Enrico Granatab72a5012013-12-20 09:38:13 +00001118 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"),
Enrico Granatab5887262012-10-29 21:18:03 +00001119 ObjC_BOOL_summary);
Enrico Granatab72a5012013-12-20 09:38:13 +00001120 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"),
Enrico Granatab5887262012-10-29 21:18:03 +00001121 ObjC_BOOL_summary);
Enrico Granata4b7b5aa2012-07-13 18:55:41 +00001122
Jason Molendacc57a382012-11-01 23:35:19 +00001123#ifndef LLDB_DISABLE_PYTHON
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001124 // we need to skip pointers here since we are special casing a SEL* when retrieving its value
1125 objc_flags.SetSkipPointers(true);
Enrico Granataf68df122013-01-10 22:08:35 +00001126 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags);
1127 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
1128 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags);
1129 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags);
Enrico Granata75dfb432013-02-15 00:06:04 +00001130 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("SEL *"), objc_flags);
Enrico Granatab5887262012-10-29 21:18:03 +00001131
Enrico Granata55900862013-03-15 18:55:30 +00001132 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCClassSummaryProvider, "Class summary provider", ConstString("Class"), objc_flags);
Enrico Granatac76b97b2013-04-26 00:59:02 +00001133
1134 SyntheticChildren::Flags class_synth_flags;
1135 class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
1136
1137 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, "Class synthetic children", ConstString("Class"), class_synth_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001138#endif // LLDB_DISABLE_PYTHON
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001139
Enrico Granatab5887262012-10-29 21:18:03 +00001140 objc_flags.SetSkipPointers(false);
Enrico Granatae602fe12013-07-10 18:25:45 +00001141 objc_flags.SetCascades(true);
1142 objc_flags.SetSkipReferences(false);
1143
1144 AddStringSummary (objc_category_sp,
1145 "${var.__FuncPtr%A}",
1146 ConstString("__block_literal_generic"),
1147 objc_flags);
Enrico Granatab5887262012-10-29 21:18:03 +00001148
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001149 AddStringSummary(corefoundation_category_sp,
1150 "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds",
1151 ConstString("CFGregorianUnits"),
1152 objc_flags);
1153 AddStringSummary(corefoundation_category_sp,
1154 "location=${var.location} length=${var.length}",
1155 ConstString("CFRange"),
1156 objc_flags);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001157
1158 AddStringSummary(appkit_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001159 "location=${var.location}, length=${var.length}",
1160 ConstString("NSRange"),
1161 objc_flags);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001162 AddStringSummary(appkit_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001163 "(${var.origin}, ${var.size}), ...",
1164 ConstString("NSRectArray"),
1165 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001166
Enrico Granata944547d2014-11-11 19:52:12 +00001167 AddOneLineSummary (appkit_category_sp,
1168 ConstString("NSPoint"),
1169 objc_flags);
1170 AddOneLineSummary (appkit_category_sp,
1171 ConstString("NSSize"),
1172 objc_flags);
1173 AddOneLineSummary (appkit_category_sp,
1174 ConstString("NSRect"),
1175 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001176
Enrico Granata944547d2014-11-11 19:52:12 +00001177 AddOneLineSummary (coregraphics_category_sp,
1178 ConstString("CGSize"),
1179 objc_flags);
1180 AddOneLineSummary (coregraphics_category_sp,
1181 ConstString("CGPoint"),
1182 objc_flags);
1183 AddOneLineSummary (coregraphics_category_sp,
1184 ConstString("CGRect"),
1185 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001186
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001187 AddStringSummary(coreservices_category_sp,
1188 "red=${var.red} green=${var.green} blue=${var.blue}",
1189 ConstString("RGBColor"),
1190 objc_flags);
1191 AddStringSummary(coreservices_category_sp,
1192 "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
1193 ConstString("Rect"),
1194 objc_flags);
1195 AddStringSummary(coreservices_category_sp,
1196 "(v=${var.v}, h=${var.h})",
1197 ConstString("Point"),
1198 objc_flags);
1199 AddStringSummary(coreservices_category_sp,
1200 "${var.month}/${var.day}/${var.year} ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
1201 ConstString("DateTimeRect *"),
1202 objc_flags);
1203 AddStringSummary(coreservices_category_sp,
1204 "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}",
1205 ConstString("LongDateRect"),
1206 objc_flags);
1207 AddStringSummary(coreservices_category_sp,
1208 "(x=${var.x}, y=${var.y})",
1209 ConstString("HIPoint"),
1210 objc_flags);
1211 AddStringSummary(coreservices_category_sp,
1212 "origin=${var.origin} size=${var.size}",
1213 ConstString("HIRect"),
1214 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001215
Enrico Granatad3d444f2012-02-23 23:10:03 +00001216 TypeSummaryImpl::Flags appkit_flags;
1217 appkit_flags.SetCascades(true)
1218 .SetSkipPointers(false)
1219 .SetSkipReferences(false)
1220 .SetDontShowChildren(true)
1221 .SetDontShowValue(false)
1222 .SetShowMembersOneLiner(false)
1223 .SetHideItemNames(false);
1224
Enrico Granatab2698cd2012-09-13 18:27:09 +00001225 appkit_flags.SetDontShowChildren(false);
1226
Jason Molenda38f8bbe2012-09-15 01:59:02 +00001227
Jason Molenda5c4210be2012-09-20 06:06:59 +00001228#ifndef LLDB_DISABLE_PYTHON
Enrico Granatab2698cd2012-09-13 18:27:09 +00001229 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags);
1230 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
1231 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
1232 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
1233 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001234 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
1235 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags);
Enrico Granatab2698cd2012-09-13 18:27:09 +00001236
Enrico Granata97fca502012-09-18 17:43:16 +00001237 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags);
1238 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags);
1239 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags);
1240 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags);
1241 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001242 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags);
1243 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags);
Enrico Granata97fca502012-09-18 17:43:16 +00001244
Enrico Granata9f02e092013-02-18 23:16:23 +00001245 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSSet summary", ConstString("NSSet"), appkit_flags);
Enrico Granatacd67f972013-04-27 00:27:20 +00001246 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001247 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFSetRef summary", ConstString("CFSetRef"), appkit_flags);
1248 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags);
1249 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags);
Enrico Granata9f02e092013-02-18 23:16:23 +00001250 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetI summary", ConstString("__NSSetI"), appkit_flags);
1251 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetM summary", ConstString("__NSSetM"), appkit_flags);
1252 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags);
Enrico Granatacd67f972013-04-27 00:27:20 +00001253 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
1254 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags);
1255 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags);
1256 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags);
1257
Enrico Granata97fca502012-09-18 17:43:16 +00001258 // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags);
1259
Enrico Granatab2698cd2012-09-13 18:27:09 +00001260 appkit_flags.SetDontShowChildren(true);
1261
Enrico Granata5548cb52013-01-28 23:47:25 +00001262 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags());
1263 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags());
1264 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags());
1265 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags());
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001266 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags());
1267 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFMutableArrayRef"), ScriptedSyntheticChildren::Flags());
1268 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFArrayRef"), ScriptedSyntheticChildren::Flags());
Enrico Granatad3d444f2012-02-23 23:10:03 +00001269
Enrico Granata5548cb52013-01-28 23:47:25 +00001270 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags());
1271 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags());
Enrico Granata4419d532014-08-27 01:10:27 +00001272 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags());
Enrico Granata5548cb52013-01-28 23:47:25 +00001273 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags());
1274 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags());
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001275 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags());
1276 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags());
Enrico Granata97fca502012-09-18 17:43:16 +00001277
Enrico Granata9f02e092013-02-18 23:16:23 +00001278 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSSet synthetic children", ConstString("NSSet"), ScriptedSyntheticChildren::Flags());
Enrico Granatacd67f972013-04-27 00:27:20 +00001279 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetI synthetic children", ConstString("__NSSetI"), ScriptedSyntheticChildren::Flags());
1280 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetM synthetic children", ConstString("__NSSetM"), ScriptedSyntheticChildren::Flags());
1281 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSMutableSet synthetic children", ConstString("NSMutableSet"), ScriptedSyntheticChildren::Flags());
1282 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags());
1283 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags());
1284 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags());
Enrico Granata5510a572014-10-15 21:38:32 +00001285
1286 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags());
Enrico Granatacd67f972013-04-27 00:27:20 +00001287
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001288 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags);
1289 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags);
1290 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("const struct __CFBag"), appkit_flags);
1291 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001292
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001293 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), appkit_flags);
1294 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001295
Enrico Granatab2698cd2012-09-13 18:27:09 +00001296 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001297 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
Enrico Granata6b6ea7a2014-01-08 02:34:42 +00001298 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__CFString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001299 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags);
Enrico Granata5bfce362013-02-08 01:55:46 +00001300 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSMutableString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001301 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags);
1302 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
1303 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags);
1304 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags);
Enrico Granatab2698cd2012-09-13 18:27:09 +00001305 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
Enrico Granata3467d802012-09-04 18:47:54 +00001306
Enrico Granata5bfce362013-02-08 01:55:46 +00001307 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, "NSAttributedString summary provider", ConstString("NSAttributedString"), appkit_flags);
1308 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSMutableAttributedString"), appkit_flags);
1309 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSConcreteMutableAttributedString"), appkit_flags);
1310
Enrico Granataf68f7322013-03-15 18:44:08 +00001311 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSBundleSummaryProvider, "NSBundle summary provider", ConstString("NSBundle"), appkit_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001312
Enrico Granatab2698cd2012-09-13 18:27:09 +00001313 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags);
1314 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
1315 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags);
Enrico Granatafcd974a2014-03-20 01:15:44 +00001316 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSMutableData"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001317 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
1318 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
1319 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001320
Enrico Granata50b5ee52013-03-16 00:50:25 +00001321 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags);
1322
1323 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags);
1324 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001325
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001326 AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
Enrico Granata5548cb52013-01-28 23:47:25 +00001327 AddStringSummary(appkit_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags);
1328
Enrico Granatab2698cd2012-09-13 18:27:09 +00001329 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
Enrico Granatad8e45842014-02-03 19:46:31 +00001330 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001331 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
1332 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
1333 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
1334 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
Enrico Granataf175ad12012-10-03 23:53:45 +00001335
1336 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags);
1337 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags);
1338 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags);
1339 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags);
Enrico Granataf615b802013-02-15 23:38:37 +00001340
Enrico Granatae214a022013-02-08 19:28:04 +00001341 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("NSURL"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001342 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("CFURLRef"), appkit_flags);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001343
Enrico Granata6d37cc62013-03-19 00:27:22 +00001344 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSDate"), appkit_flags);
1345 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSDate"), appkit_flags);
1346 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags);
1347 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001348
Enrico Granata9f71ad42013-03-16 01:50:07 +00001349 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags);
Enrico Granatad8e45842014-02-03 19:46:31 +00001350 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), appkit_flags);
Enrico Granata9f71ad42013-03-16 01:50:07 +00001351 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001352
Enrico Granata896cd1d2012-03-01 19:32:33 +00001353 // CFAbsoluteTime is actually a double rather than a pointer to an object
1354 // we do not care about the numeric value, since it is probably meaningless to users
1355 appkit_flags.SetDontShowValue(true);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001356 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, "CFAbsoluteTime summary provider", ConstString("CFAbsoluteTime"), appkit_flags);
Enrico Granata896cd1d2012-03-01 19:32:33 +00001357 appkit_flags.SetDontShowValue(false);
1358
Enrico Granata6a925112013-03-16 01:18:00 +00001359 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags);
1360 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), appkit_flags);
Enrico Granata896cd1d2012-03-01 19:32:33 +00001361
Enrico Granatad8e45842014-02-03 19:46:31 +00001362 AddStringSummary(corefoundation_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001363 "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"",
1364 ConstString("CFGregorianDate"),
1365 appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001366
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001367 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFBitVectorRef"), appkit_flags);
1368 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFMutableBitVectorRef"), appkit_flags);
1369 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFBitVector"), appkit_flags);
1370 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFMutableBitVector"), appkit_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001371#endif // LLDB_DISABLE_PYTHON
1372
Enrico Granata864e3e82012-02-17 03:18:30 +00001373 TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name);
1374
1375 TypeSummaryImpl::Flags vector_flags;
1376 vector_flags.SetCascades(true)
1377 .SetSkipPointers(true)
1378 .SetSkipReferences(false)
1379 .SetDontShowChildren(true)
1380 .SetDontShowValue(false)
1381 .SetShowMembersOneLiner(true)
1382 .SetHideItemNames(true);
1383
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001384 AddStringSummary(vectors_category_sp,
1385 "${var.uint128}",
1386 ConstString("builtin_type_vec128"),
1387 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001388
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001389 AddStringSummary(vectors_category_sp,
1390 "",
1391 ConstString("float [4]"),
1392 vector_flags);
1393 AddStringSummary(vectors_category_sp,
1394 "",
1395 ConstString("int32_t [4]"),
1396 vector_flags);
1397 AddStringSummary(vectors_category_sp,
1398 "",
1399 ConstString("int16_t [8]"),
1400 vector_flags);
1401 AddStringSummary(vectors_category_sp,
1402 "",
1403 ConstString("vDouble"),
1404 vector_flags);
1405 AddStringSummary(vectors_category_sp,
1406 "",
1407 ConstString("vFloat"),
1408 vector_flags);
1409 AddStringSummary(vectors_category_sp,
1410 "",
1411 ConstString("vSInt8"),
1412 vector_flags);
1413 AddStringSummary(vectors_category_sp,
1414 "",
1415 ConstString("vSInt16"),
1416 vector_flags);
1417 AddStringSummary(vectors_category_sp,
1418 "",
1419 ConstString("vSInt32"),
1420 vector_flags);
1421 AddStringSummary(vectors_category_sp,
1422 "",
1423 ConstString("vUInt16"),
1424 vector_flags);
1425 AddStringSummary(vectors_category_sp,
1426 "",
1427 ConstString("vUInt8"),
1428 vector_flags);
1429 AddStringSummary(vectors_category_sp,
1430 "",
1431 ConstString("vUInt16"),
1432 vector_flags);
1433 AddStringSummary(vectors_category_sp,
1434 "",
1435 ConstString("vUInt32"),
1436 vector_flags);
1437 AddStringSummary(vectors_category_sp,
1438 "",
1439 ConstString("vBool32"),
1440 vector_flags);
Greg Claytond4e25522011-10-12 00:53:29 +00001441}
Enrico Granataecd02bc2014-08-19 18:47:58 +00001442
1443void
Enrico Granatabb557062015-02-10 23:02:25 +00001444FormatManager::LoadCoreMediaFormatters()
1445{
1446 TypeSummaryImpl::Flags cm_flags;
1447 cm_flags.SetCascades(true)
1448 .SetDontShowChildren(false)
1449 .SetDontShowValue(false)
1450 .SetHideItemNames(false)
1451 .SetShowMembersOneLiner(false)
1452 .SetSkipPointers(false)
1453 .SetSkipReferences(false);
1454
1455 TypeCategoryImpl::SharedPointer cm_category_sp = GetCategory(m_coremedia_category_name);
1456
Tamas Berghammerdd403fb2015-02-11 17:51:49 +00001457#ifndef LLDB_DISABLE_PYTHON
Enrico Granatabb557062015-02-10 23:02:25 +00001458 AddCXXSummary(cm_category_sp, lldb_private::formatters::CMTimeSummaryProvider, "CMTime summary provider", ConstString("CMTime"), cm_flags);
Tamas Berghammerdd403fb2015-02-11 17:51:49 +00001459#endif // LLDB_DISABLE_PYTHON
Enrico Granatabb557062015-02-10 23:02:25 +00001460}
1461
1462void
Enrico Granataecd02bc2014-08-19 18:47:58 +00001463FormatManager::LoadHardcodedFormatters()
1464{
1465 {
1466 // insert code to load formats here
1467 }
1468 {
1469 // insert code to load summaries here
Enrico Granataff0f23d2014-12-10 02:00:45 +00001470 m_hardcoded_summaries.push_back(
1471 [](lldb_private::ValueObject& valobj,
1472 lldb::DynamicValueType,
1473 FormatManager&) -> TypeSummaryImpl::SharedPointer {
Enrico Granata419d7912015-09-04 00:33:51 +00001474 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider"));
Greg Clayton99558cc42015-08-24 23:46:31 +00001475 if (valobj.GetCompilerType().IsFunctionPointerType())
Enrico Granataff0f23d2014-12-10 02:00:45 +00001476 {
1477 return formatter_sp;
1478 }
1479 return nullptr;
1480 });
Enrico Granatad529d042015-07-07 00:20:57 +00001481 m_hardcoded_summaries.push_back(
1482 [](lldb_private::ValueObject& valobj,
1483 lldb::DynamicValueType,
1484 FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer {
1485 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags()
1486 .SetCascades(true)
1487 .SetDontShowChildren(true)
1488 .SetHideItemNames(true)
1489 .SetShowMembersOneLiner(true)
1490 .SetSkipPointers(true)
1491 .SetSkipReferences(false),
1492 lldb_private::formatters::VectorTypeSummaryProvider,
1493 "vector_type pointer summary provider"));
Greg Clayton99558cc42015-08-24 23:46:31 +00001494 if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
Enrico Granatad529d042015-07-07 00:20:57 +00001495 {
1496 if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled())
1497 return formatter_sp;
1498 }
1499 return nullptr;
1500 });
Enrico Granataecd02bc2014-08-19 18:47:58 +00001501 }
1502 {
1503 // insert code to load synthetics here
Enrico Granatadb595cd2015-03-06 19:37:57 +00001504 m_hardcoded_synthetics.push_back(
1505 [](lldb_private::ValueObject& valobj,
1506 lldb::DynamicValueType,
1507 FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer {
Enrico Granatad4cb1dd2015-07-01 20:06:40 +00001508 static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true),
Enrico Granatadb595cd2015-03-06 19:37:57 +00001509 "vector_type synthetic children",
1510 lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));
Greg Clayton99558cc42015-08-24 23:46:31 +00001511 if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
Enrico Granatadb595cd2015-03-06 19:37:57 +00001512 {
1513 if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled())
1514 return formatter_sp;
1515 }
1516 return nullptr;
1517 });
Enrico Granataecd02bc2014-08-19 18:47:58 +00001518 }
Enrico Granatac5827132014-09-05 20:45:07 +00001519 {
1520 // insert code to load validators here
1521 }
Enrico Granataecd02bc2014-08-19 18:47:58 +00001522}