//===-- 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 ValueNavigator; typedef ValueNavigator::MapType ValueMap; typedef FormatMap 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_