1b9c1b51eSKate Stone //===-- LanguageCategory.cpp ---------------------------------------*- C++ 2b9c1b51eSKate Stone //-*-===// 3980c0484SEnrico Granata // 42946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 52946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 62946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7980c0484SEnrico Granata // 8980c0484SEnrico Granata //===----------------------------------------------------------------------===// 9980c0484SEnrico Granata 10980c0484SEnrico Granata #include "lldb/DataFormatters/LanguageCategory.h" 11980c0484SEnrico Granata 12980c0484SEnrico Granata #include "lldb/DataFormatters/FormatManager.h" 13980c0484SEnrico Granata #include "lldb/DataFormatters/TypeCategory.h" 14980c0484SEnrico Granata #include "lldb/DataFormatters/TypeFormat.h" 15980c0484SEnrico Granata #include "lldb/DataFormatters/TypeSummary.h" 16980c0484SEnrico Granata #include "lldb/DataFormatters/TypeSynthetic.h" 17980c0484SEnrico Granata #include "lldb/Target/Language.h" 18980c0484SEnrico Granata 19980c0484SEnrico Granata using namespace lldb; 20980c0484SEnrico Granata using namespace lldb_private; 21980c0484SEnrico Granata 22b9c1b51eSKate Stone LanguageCategory::LanguageCategory(lldb::LanguageType lang_type) 23b9c1b51eSKate Stone : m_category_sp(), m_hardcoded_formats(), m_hardcoded_summaries(), 24*ee64dfd9SAdrian Prantl m_hardcoded_synthetics(), m_format_cache(), m_enabled(false) { 25b9c1b51eSKate Stone if (Language *language_plugin = Language::FindPlugin(lang_type)) { 26980c0484SEnrico Granata m_category_sp = language_plugin->GetFormatters(); 277cb59e1aSEnrico Granata m_hardcoded_formats = language_plugin->GetHardcodedFormats(); 287cb59e1aSEnrico Granata m_hardcoded_summaries = language_plugin->GetHardcodedSummaries(); 297cb59e1aSEnrico Granata m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics(); 307cb59e1aSEnrico Granata } 317cb59e1aSEnrico Granata Enable(); 32980c0484SEnrico Granata } 33980c0484SEnrico Granata 34b3801de7SAdrian Prantl template<typename ImplSP> 35b9c1b51eSKate Stone bool LanguageCategory::Get(FormattersMatchData &match_data, 36b3801de7SAdrian Prantl ImplSP &retval_sp) { 37980c0484SEnrico Granata if (!m_category_sp) 38980c0484SEnrico Granata return false; 39980c0484SEnrico Granata 407cb59e1aSEnrico Granata if (!IsEnabled()) 4133e97e63SEnrico Granata return false; 4233e97e63SEnrico Granata 43b9c1b51eSKate Stone if (match_data.GetTypeForCache()) { 44b3801de7SAdrian Prantl if (m_format_cache.Get(match_data.GetTypeForCache(), retval_sp)) 45b3801de7SAdrian Prantl return (bool)retval_sp; 46980c0484SEnrico Granata } 478a9a8f39SEnrico Granata 488a9a8f39SEnrico Granata ValueObject &valobj(match_data.GetValueObject()); 49f387b997SDavide Italiano bool result = m_category_sp->Get(valobj.GetObjectRuntimeLanguage(), 50b3801de7SAdrian Prantl match_data.GetMatchesVector(), retval_sp); 51b9c1b51eSKate Stone if (match_data.GetTypeForCache() && 52b3801de7SAdrian Prantl (!retval_sp || !retval_sp->NonCacheable())) { 53b3801de7SAdrian Prantl m_format_cache.Set(match_data.GetTypeForCache(), retval_sp); 54980c0484SEnrico Granata } 55980c0484SEnrico Granata return result; 56980c0484SEnrico Granata } 57980c0484SEnrico Granata 58*ee64dfd9SAdrian Prantl /// Explicit instantiations for the three types. 59b3801de7SAdrian Prantl /// \{ 60b3801de7SAdrian Prantl template bool 61b3801de7SAdrian Prantl LanguageCategory::Get<lldb::TypeFormatImplSP>(FormattersMatchData &, 62b3801de7SAdrian Prantl lldb::TypeFormatImplSP &); 63b3801de7SAdrian Prantl template bool 64b3801de7SAdrian Prantl LanguageCategory::Get<lldb::TypeSummaryImplSP>(FormattersMatchData &, 65b3801de7SAdrian Prantl lldb::TypeSummaryImplSP &); 66b3801de7SAdrian Prantl template bool 67b3801de7SAdrian Prantl LanguageCategory::Get<lldb::SyntheticChildrenSP>(FormattersMatchData &, 68b3801de7SAdrian Prantl lldb::SyntheticChildrenSP &); 69b3801de7SAdrian Prantl /// \} 70980c0484SEnrico Granata 71b3801de7SAdrian Prantl template <> 72b3801de7SAdrian Prantl auto &LanguageCategory::GetHardcodedFinder<lldb::TypeFormatImplSP>() { 73b3801de7SAdrian Prantl return m_hardcoded_formats; 74980c0484SEnrico Granata } 758a9a8f39SEnrico Granata 76b3801de7SAdrian Prantl template <> 77b3801de7SAdrian Prantl auto &LanguageCategory::GetHardcodedFinder<lldb::TypeSummaryImplSP>() { 78b3801de7SAdrian Prantl return m_hardcoded_summaries; 79980c0484SEnrico Granata } 80980c0484SEnrico Granata 81b3801de7SAdrian Prantl template <> 82b3801de7SAdrian Prantl auto &LanguageCategory::GetHardcodedFinder<lldb::SyntheticChildrenSP>() { 83b3801de7SAdrian Prantl return m_hardcoded_synthetics; 84980c0484SEnrico Granata } 858a9a8f39SEnrico Granata 86b3801de7SAdrian Prantl template <typename ImplSP> 87b9c1b51eSKate Stone bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr, 888a9a8f39SEnrico Granata FormattersMatchData &match_data, 89b3801de7SAdrian Prantl ImplSP &retval_sp) { 907cb59e1aSEnrico Granata if (!IsEnabled()) 917cb59e1aSEnrico Granata return false; 927cb59e1aSEnrico Granata 938a9a8f39SEnrico Granata ValueObject &valobj(match_data.GetValueObject()); 948a9a8f39SEnrico Granata lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType()); 957cb59e1aSEnrico Granata 96b3801de7SAdrian Prantl for (auto &candidate : GetHardcodedFinder<ImplSP>()) { 97b3801de7SAdrian Prantl if (auto result = candidate(valobj, use_dynamic, fmt_mgr)) { 98b3801de7SAdrian Prantl retval_sp = result; 997cb59e1aSEnrico Granata break; 1007cb59e1aSEnrico Granata } 1017cb59e1aSEnrico Granata } 102b3801de7SAdrian Prantl return (bool)retval_sp; 1037cb59e1aSEnrico Granata } 1047cb59e1aSEnrico Granata 105*ee64dfd9SAdrian Prantl /// Explicit instantiations for the three types. 106b3801de7SAdrian Prantl /// \{ 107b3801de7SAdrian Prantl template bool LanguageCategory::GetHardcoded<lldb::TypeFormatImplSP>( 108b3801de7SAdrian Prantl FormatManager &, FormattersMatchData &, lldb::TypeFormatImplSP &); 109b3801de7SAdrian Prantl template bool LanguageCategory::GetHardcoded<lldb::TypeSummaryImplSP>( 110b3801de7SAdrian Prantl FormatManager &, FormattersMatchData &, lldb::TypeSummaryImplSP &); 111b3801de7SAdrian Prantl template bool LanguageCategory::GetHardcoded<lldb::SyntheticChildrenSP>( 112b3801de7SAdrian Prantl FormatManager &, FormattersMatchData &, lldb::SyntheticChildrenSP &); 113b3801de7SAdrian Prantl /// \} 1147cb59e1aSEnrico Granata 115b9c1b51eSKate Stone lldb::TypeCategoryImplSP LanguageCategory::GetCategory() const { 116980c0484SEnrico Granata return m_category_sp; 117980c0484SEnrico Granata } 11833e97e63SEnrico Granata 119b9c1b51eSKate Stone FormatCache &LanguageCategory::GetFormatCache() { return m_format_cache; } 120bd5eab82SEnrico Granata 121b9c1b51eSKate Stone void LanguageCategory::Enable() { 12233e97e63SEnrico Granata if (m_category_sp) 12333e97e63SEnrico Granata m_category_sp->Enable(true, TypeCategoryMap::Default); 1247cb59e1aSEnrico Granata m_enabled = true; 12533e97e63SEnrico Granata } 12633e97e63SEnrico Granata 127b9c1b51eSKate Stone void LanguageCategory::Disable() { 12833e97e63SEnrico Granata if (m_category_sp) 12933e97e63SEnrico Granata m_category_sp->Disable(); 1307cb59e1aSEnrico Granata m_enabled = false; 1317cb59e1aSEnrico Granata } 1327cb59e1aSEnrico Granata 133b9c1b51eSKate Stone bool LanguageCategory::IsEnabled() { return m_enabled; } 134