diff options
Diffstat (limited to 'include/lldb/DataFormatters/FormatManager.h')
-rw-r--r-- | include/lldb/DataFormatters/FormatManager.h | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/include/lldb/DataFormatters/FormatManager.h b/include/lldb/DataFormatters/FormatManager.h new file mode 100644 index 0000000..162e251 --- /dev/null +++ b/include/lldb/DataFormatters/FormatManager.h @@ -0,0 +1,251 @@ +//===-- FormatManager.h -------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef lldb_FormatManager_h_ +#define lldb_FormatManager_h_ + +// C Includes +// C++ Includes + +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-public.h" +#include "lldb/lldb-enumerations.h" + +#include "lldb/DataFormatters/FormatCache.h" +#include "lldb/DataFormatters/FormatNavigator.h" +#include "lldb/DataFormatters/TypeCategory.h" +#include "lldb/DataFormatters/TypeCategoryMap.h" + +namespace lldb_private { + +// this file (and its. cpp) contain the low-level implementation of LLDB Data Visualization +// class DataVisualization is the high-level front-end of this feature +// clients should refer to that class as the entry-point into the data formatters +// unless they have a good reason to bypass it and prefer to use this file's objects directly + +class FormatManager : public IFormatChangeListener +{ + typedef FormatNavigator<ConstString, TypeFormatImpl> ValueNavigator; + typedef ValueNavigator::MapType ValueMap; + typedef FormatMap<ConstString, TypeSummaryImpl> NamedSummariesMap; + typedef TypeCategoryMap::MapType::iterator CategoryMapIterator; +public: + + typedef TypeCategoryMap::CallbackType CategoryCallback; + + FormatManager (); + + ValueNavigator& + GetValueNavigator () + { + return m_value_nav; + } + + NamedSummariesMap& + GetNamedSummaryNavigator () + { + return m_named_summaries_map; + } + + void + EnableCategory (const ConstString& category_name, + TypeCategoryMap::Position pos = TypeCategoryMap::Default) + { + m_categories_map.Enable(category_name, + pos); + } + + void + DisableCategory (const ConstString& category_name) + { + m_categories_map.Disable(category_name); + } + + void + EnableCategory (const lldb::TypeCategoryImplSP& category, + TypeCategoryMap::Position pos = TypeCategoryMap::Default) + { + m_categories_map.Enable(category, + pos); + } + + void + DisableCategory (const lldb::TypeCategoryImplSP& category) + { + m_categories_map.Disable(category); + } + + bool + DeleteCategory (const ConstString& category_name) + { + return m_categories_map.Delete(category_name); + } + + void + ClearCategories () + { + return m_categories_map.Clear(); + } + + uint32_t + GetCategoriesCount () + { + return m_categories_map.GetCount(); + } + + lldb::TypeCategoryImplSP + GetCategoryAtIndex (size_t index) + { + return m_categories_map.GetAtIndex(index); + } + + void + LoopThroughCategories (CategoryCallback callback, void* param) + { + m_categories_map.LoopThrough(callback, param); + } + + lldb::TypeCategoryImplSP + GetCategory (const char* category_name = NULL, + bool can_create = true) + { + if (!category_name) + return GetCategory(m_default_category_name); + return GetCategory(ConstString(category_name)); + } + + lldb::TypeCategoryImplSP + GetCategory (const ConstString& category_name, + bool can_create = true); + + lldb::TypeSummaryImplSP + GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp); + + lldb::TypeFilterImplSP + GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp); + +#ifndef LLDB_DISABLE_PYTHON + lldb::ScriptedSyntheticChildrenSP + GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp); +#endif + +#ifndef LLDB_DISABLE_PYTHON + lldb::SyntheticChildrenSP + GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp); +#endif + + lldb::TypeSummaryImplSP + GetSummaryFormat (ValueObject& valobj, + lldb::DynamicValueType use_dynamic); + +#ifndef LLDB_DISABLE_PYTHON + lldb::SyntheticChildrenSP + GetSyntheticChildren (ValueObject& valobj, + lldb::DynamicValueType use_dynamic); +#endif + + bool + AnyMatches (ConstString type_name, + TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES, + bool only_enabled = true, + const char** matching_category = NULL, + TypeCategoryImpl::FormatCategoryItems* matching_type = NULL) + { + return m_categories_map.AnyMatches(type_name, + items, + only_enabled, + matching_category, + matching_type); + } + + static bool + GetFormatFromCString (const char *format_cstr, + bool partial_match_ok, + lldb::Format &format); + + static char + GetFormatAsFormatChar (lldb::Format format); + + static const char * + GetFormatAsCString (lldb::Format format); + + // if the user tries to add formatters for, say, "struct Foo" + // those will not match any type because of the way we strip qualifiers from typenames + // this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo + // and strips the unnecessary qualifier + static ConstString + GetValidTypeName (const ConstString& type); + + // when DataExtractor dumps a vectorOfT, it uses a predefined format for each item + // this method returns it, or eFormatInvalid if vector_format is not a vectorOf + static lldb::Format + GetSingleItemFormat (lldb::Format vector_format); + + void + Changed () + { + __sync_add_and_fetch(&m_last_revision, +1); + m_format_cache.Clear (); + } + + uint32_t + GetCurrentRevision () + { + return m_last_revision; + } + + ~FormatManager () + { + } + +private: + FormatCache m_format_cache; + ValueNavigator m_value_nav; + NamedSummariesMap m_named_summaries_map; + uint32_t m_last_revision; + TypeCategoryMap m_categories_map; + + ConstString m_default_category_name; + ConstString m_system_category_name; + ConstString m_gnu_cpp_category_name; + ConstString m_libcxx_category_name; + ConstString m_objc_category_name; + ConstString m_corefoundation_category_name; + ConstString m_coregraphics_category_name; + ConstString m_coreservices_category_name; + ConstString m_vectortypes_category_name; + ConstString m_appkit_category_name; + + TypeCategoryMap& + GetCategories () + { + return m_categories_map; + } + + // WARNING: these are temporary functions that setup formatters + // while a few of these actually should be globally available and setup by LLDB itself + // most would actually belong to the users' lldbinit file or to some other form of configurable + // storage + void + LoadLibStdcppFormatters (); + + void + LoadLibcxxFormatters (); + + void + LoadSystemFormatters (); + + void + LoadObjCFormatters (); +}; + +} // namespace lldb_private + +#endif // lldb_FormatManager_h_ |