1 //===-- LanguageCategory.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 10 #include "lldb/DataFormatters/LanguageCategory.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/DataFormatters/FormatManager.h" 17 #include "lldb/DataFormatters/TypeCategory.h" 18 #include "lldb/DataFormatters/TypeFormat.h" 19 #include "lldb/DataFormatters/TypeSummary.h" 20 #include "lldb/DataFormatters/TypeSynthetic.h" 21 #include "lldb/DataFormatters/TypeValidator.h" 22 #include "lldb/Target/Language.h" 23 24 using namespace lldb; 25 using namespace lldb_private; 26 27 LanguageCategory::LanguageCategory (lldb::LanguageType lang_type) : 28 m_category_sp(), 29 m_format_cache() 30 { 31 if (Language* language_plugin = Language::FindPlugin(lang_type)) 32 m_category_sp = language_plugin->GetFormatters(); 33 if (m_category_sp) 34 m_category_sp->Enable(true, 1); 35 } 36 37 bool 38 LanguageCategory::Get (ValueObject& valobj, 39 lldb::DynamicValueType dynamic, 40 FormattersMatchVector matches, 41 lldb::TypeFormatImplSP& format_sp) 42 { 43 if (!m_category_sp) 44 return false; 45 46 ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); 47 if (type_name) 48 { 49 if (m_format_cache.GetFormat(type_name, format_sp)) 50 return true; 51 } 52 bool result = m_category_sp->Get(valobj, matches, format_sp); 53 if (type_name && (!format_sp || !format_sp->NonCacheable())) 54 { 55 m_format_cache.SetFormat(type_name, format_sp); 56 } 57 return result; 58 } 59 60 bool 61 LanguageCategory::Get (ValueObject& valobj, 62 lldb::DynamicValueType dynamic, 63 FormattersMatchVector matches, 64 lldb::TypeSummaryImplSP& format_sp) 65 { 66 if (!m_category_sp) 67 return false; 68 69 ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); 70 if (type_name) 71 { 72 if (m_format_cache.GetSummary(type_name, format_sp)) 73 return true; 74 } 75 bool result = m_category_sp->Get(valobj, matches, format_sp); 76 if (type_name && (!format_sp || !format_sp->NonCacheable())) 77 { 78 m_format_cache.SetSummary(type_name, format_sp); 79 } 80 return result; 81 } 82 83 bool 84 LanguageCategory::Get (ValueObject& valobj, 85 lldb::DynamicValueType dynamic, 86 FormattersMatchVector matches, 87 lldb::SyntheticChildrenSP& format_sp) 88 { 89 if (!m_category_sp) 90 return false; 91 92 ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); 93 if (type_name) 94 { 95 if (m_format_cache.GetSynthetic(type_name, format_sp)) 96 return true; 97 } 98 bool result = m_category_sp->Get(valobj, matches, format_sp); 99 if (type_name && (!format_sp || !format_sp->NonCacheable())) 100 { 101 m_format_cache.SetSynthetic(type_name, format_sp); 102 } 103 return result; 104 } 105 106 bool 107 LanguageCategory::Get (ValueObject& valobj, 108 lldb::DynamicValueType dynamic, 109 FormattersMatchVector matches, 110 lldb::TypeValidatorImplSP& format_sp) 111 { 112 if (!m_category_sp) 113 return false; 114 115 ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); 116 if (type_name) 117 { 118 if (m_format_cache.GetValidator(type_name, format_sp)) 119 return true; 120 } 121 bool result = m_category_sp->Get(valobj, matches, format_sp); 122 if (type_name && (!format_sp || !format_sp->NonCacheable())) 123 { 124 m_format_cache.SetValidator(type_name, format_sp); 125 } 126 return result; 127 } 128 129 lldb::TypeCategoryImplSP 130 LanguageCategory::GetCategory () const 131 { 132 return m_category_sp; 133 } 134