FormatManager.h revision 269024
1//===-- FormatManager.h -------------------------------------------*- 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#ifndef lldb_FormatManager_h_
11#define lldb_FormatManager_h_
12
13// C Includes
14// C++ Includes
15
16// Other libraries and framework includes
17// Project includes
18#include "lldb/lldb-public.h"
19#include "lldb/lldb-enumerations.h"
20
21#include "lldb/DataFormatters/FormatCache.h"
22#include "lldb/DataFormatters/FormatClasses.h"
23#include "lldb/DataFormatters/FormattersContainer.h"
24#include "lldb/DataFormatters/TypeCategory.h"
25#include "lldb/DataFormatters/TypeCategoryMap.h"
26
27#include <atomic>
28
29namespace lldb_private {
30
31// this file (and its. cpp) contain the low-level implementation of LLDB Data Visualization
32// class DataVisualization is the high-level front-end of this feature
33// clients should refer to that class as the entry-point into the data formatters
34// unless they have a good reason to bypass it and prefer to use this file's objects directly
35
36class FormatManager : public IFormatChangeListener
37{
38    typedef FormatMap<ConstString, TypeSummaryImpl> NamedSummariesMap;
39    typedef TypeCategoryMap::MapType::iterator CategoryMapIterator;
40public:
41
42    typedef TypeCategoryMap::CallbackType CategoryCallback;
43
44    FormatManager ();
45
46    NamedSummariesMap&
47    GetNamedSummaryContainer ()
48    {
49        return m_named_summaries_map;
50    }
51
52    void
53    EnableCategory (const ConstString& category_name,
54                    TypeCategoryMap::Position pos = TypeCategoryMap::Default)
55    {
56        m_categories_map.Enable(category_name,
57                                pos);
58    }
59
60    void
61    DisableCategory (const ConstString& category_name)
62    {
63        m_categories_map.Disable(category_name);
64    }
65
66    void
67    EnableCategory (const lldb::TypeCategoryImplSP& category,
68                    TypeCategoryMap::Position pos = TypeCategoryMap::Default)
69    {
70        m_categories_map.Enable(category,
71                                pos);
72    }
73
74    void
75    DisableCategory (const lldb::TypeCategoryImplSP& category)
76    {
77        m_categories_map.Disable(category);
78    }
79
80    bool
81    DeleteCategory (const ConstString& category_name)
82    {
83        return m_categories_map.Delete(category_name);
84    }
85
86    void
87    ClearCategories ()
88    {
89        return m_categories_map.Clear();
90    }
91
92    uint32_t
93    GetCategoriesCount ()
94    {
95        return m_categories_map.GetCount();
96    }
97
98    lldb::TypeCategoryImplSP
99    GetCategoryAtIndex (size_t index)
100    {
101        return m_categories_map.GetAtIndex(index);
102    }
103
104    void
105    LoopThroughCategories (CategoryCallback callback, void* param)
106    {
107        m_categories_map.LoopThrough(callback, param);
108    }
109
110    lldb::TypeCategoryImplSP
111    GetCategory (const char* category_name = NULL,
112                 bool can_create = true)
113    {
114        if (!category_name)
115            return GetCategory(m_default_category_name);
116        return GetCategory(ConstString(category_name));
117    }
118
119    lldb::TypeCategoryImplSP
120    GetCategory (const ConstString& category_name,
121                 bool can_create = true);
122
123    lldb::TypeFormatImplSP
124    GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp);
125
126    lldb::TypeSummaryImplSP
127    GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
128
129    lldb::TypeFilterImplSP
130    GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
131
132#ifndef LLDB_DISABLE_PYTHON
133    lldb::ScriptedSyntheticChildrenSP
134    GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
135#endif
136
137#ifndef LLDB_DISABLE_PYTHON
138    lldb::SyntheticChildrenSP
139    GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp);
140#endif
141
142    lldb::TypeFormatImplSP
143    GetFormat (ValueObject& valobj,
144               lldb::DynamicValueType use_dynamic);
145
146    lldb::TypeSummaryImplSP
147    GetSummaryFormat (ValueObject& valobj,
148                      lldb::DynamicValueType use_dynamic);
149
150#ifndef LLDB_DISABLE_PYTHON
151    lldb::SyntheticChildrenSP
152    GetSyntheticChildren (ValueObject& valobj,
153                          lldb::DynamicValueType use_dynamic);
154#endif
155
156    bool
157    AnyMatches (ConstString type_name,
158                TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
159                bool only_enabled = true,
160                const char** matching_category = NULL,
161                TypeCategoryImpl::FormatCategoryItems* matching_type = NULL)
162    {
163        return m_categories_map.AnyMatches(type_name,
164                                           items,
165                                           only_enabled,
166                                           matching_category,
167                                           matching_type);
168    }
169
170    static bool
171    GetFormatFromCString (const char *format_cstr,
172                          bool partial_match_ok,
173                          lldb::Format &format);
174
175    static char
176    GetFormatAsFormatChar (lldb::Format format);
177
178    static const char *
179    GetFormatAsCString (lldb::Format format);
180
181    // if the user tries to add formatters for, say, "struct Foo"
182    // those will not match any type because of the way we strip qualifiers from typenames
183    // this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo
184    // and strips the unnecessary qualifier
185    static ConstString
186    GetValidTypeName (const ConstString& type);
187
188    // when DataExtractor dumps a vectorOfT, it uses a predefined format for each item
189    // this method returns it, or eFormatInvalid if vector_format is not a vectorOf
190    static lldb::Format
191    GetSingleItemFormat (lldb::Format vector_format);
192
193    // this returns true if the ValueObjectPrinter is *highly encouraged*
194    // to actually represent this ValueObject in one-liner format
195    // If this object has a summary formatter, however, we should not
196    // try and do one-lining, just let the summary do the right thing
197    bool
198    ShouldPrintAsOneLiner (ValueObject& valobj);
199
200    void
201    Changed ()
202    {
203        ++m_last_revision;
204        m_format_cache.Clear ();
205    }
206
207    uint32_t
208    GetCurrentRevision ()
209    {
210        return m_last_revision;
211    }
212
213    ~FormatManager ()
214    {
215    }
216
217    static FormattersMatchVector
218    GetPossibleMatches (ValueObject& valobj,
219                        lldb::DynamicValueType use_dynamic)
220    {
221        FormattersMatchVector matches;
222        GetPossibleMatches (valobj,
223                            valobj.GetClangType(),
224                            lldb_private::eFormatterChoiceCriterionDirectChoice,
225                            use_dynamic,
226                            matches,
227                            false,
228                            false,
229                            false,
230                            true);
231        return matches;
232    }
233
234private:
235
236    static void
237    GetPossibleMatches (ValueObject& valobj,
238                        ClangASTType clang_type,
239                        uint32_t reason,
240                        lldb::DynamicValueType use_dynamic,
241                        FormattersMatchVector& entries,
242                        bool did_strip_ptr,
243                        bool did_strip_ref,
244                        bool did_strip_typedef,
245                        bool root_level = false);
246
247    FormatCache m_format_cache;
248    NamedSummariesMap m_named_summaries_map;
249    std::atomic<uint32_t> m_last_revision;
250    TypeCategoryMap m_categories_map;
251
252    ConstString m_default_category_name;
253    ConstString m_system_category_name;
254    ConstString m_gnu_cpp_category_name;
255    ConstString m_libcxx_category_name;
256    ConstString m_objc_category_name;
257    ConstString m_corefoundation_category_name;
258    ConstString m_coregraphics_category_name;
259    ConstString m_coreservices_category_name;
260    ConstString m_vectortypes_category_name;
261    ConstString m_appkit_category_name;
262
263    TypeCategoryMap&
264    GetCategories ()
265    {
266        return m_categories_map;
267    }
268
269    // WARNING: these are temporary functions that setup formatters
270    // while a few of these actually should be globally available and setup by LLDB itself
271    // most would actually belong to the users' lldbinit file or to some other form of configurable
272    // storage
273    void
274    LoadLibStdcppFormatters ();
275
276    void
277    LoadLibcxxFormatters ();
278
279    void
280    LoadSystemFormatters ();
281
282    void
283    LoadObjCFormatters ();
284};
285
286} // namespace lldb_private
287
288#endif	// lldb_FormatManager_h_
289