1 //===-- LanguageCategory.cpp ---------------------------------------*- C++
4 // The LLVM Compiler Infrastructure
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 #include "lldb/DataFormatters/LanguageCategory.h"
15 // Other libraries and framework includes
17 #include "lldb/DataFormatters/FormatManager.h"
18 #include "lldb/DataFormatters/TypeCategory.h"
19 #include "lldb/DataFormatters/TypeFormat.h"
20 #include "lldb/DataFormatters/TypeSummary.h"
21 #include "lldb/DataFormatters/TypeSynthetic.h"
22 #include "lldb/DataFormatters/TypeValidator.h"
23 #include "lldb/Target/Language.h"
26 using namespace lldb_private;
28 LanguageCategory::LanguageCategory(lldb::LanguageType lang_type)
29 : m_category_sp(), m_hardcoded_formats(), m_hardcoded_summaries(),
30 m_hardcoded_synthetics(), m_hardcoded_validators(), m_format_cache(),
32 if (Language *language_plugin = Language::FindPlugin(lang_type)) {
33 m_category_sp = language_plugin->GetFormatters();
34 m_hardcoded_formats = language_plugin->GetHardcodedFormats();
35 m_hardcoded_summaries = language_plugin->GetHardcodedSummaries();
36 m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics();
37 m_hardcoded_validators = language_plugin->GetHardcodedValidators();
42 bool LanguageCategory::Get(FormattersMatchData &match_data,
43 lldb::TypeFormatImplSP &format_sp) {
50 if (match_data.GetTypeForCache()) {
51 if (m_format_cache.GetFormat(match_data.GetTypeForCache(), format_sp))
52 return format_sp.get() != nullptr;
55 ValueObject &valobj(match_data.GetValueObject());
57 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
58 if (match_data.GetTypeForCache() &&
59 (!format_sp || !format_sp->NonCacheable())) {
60 m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
65 bool LanguageCategory::Get(FormattersMatchData &match_data,
66 lldb::TypeSummaryImplSP &format_sp) {
73 if (match_data.GetTypeForCache()) {
74 if (m_format_cache.GetSummary(match_data.GetTypeForCache(), format_sp))
75 return format_sp.get() != nullptr;
78 ValueObject &valobj(match_data.GetValueObject());
80 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
81 if (match_data.GetTypeForCache() &&
82 (!format_sp || !format_sp->NonCacheable())) {
83 m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
88 bool LanguageCategory::Get(FormattersMatchData &match_data,
89 lldb::SyntheticChildrenSP &format_sp) {
96 if (match_data.GetTypeForCache()) {
97 if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(), format_sp))
98 return format_sp.get() != nullptr;
101 ValueObject &valobj(match_data.GetValueObject());
103 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
104 if (match_data.GetTypeForCache() &&
105 (!format_sp || !format_sp->NonCacheable())) {
106 m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
111 bool LanguageCategory::Get(FormattersMatchData &match_data,
112 lldb::TypeValidatorImplSP &format_sp) {
119 if (match_data.GetTypeForCache()) {
120 if (m_format_cache.GetValidator(match_data.GetTypeForCache(), format_sp))
121 return format_sp.get() != nullptr;
124 ValueObject &valobj(match_data.GetValueObject());
126 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
127 if (match_data.GetTypeForCache() &&
128 (!format_sp || !format_sp->NonCacheable())) {
129 m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
134 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
135 FormattersMatchData &match_data,
136 lldb::TypeFormatImplSP &format_sp) {
140 ValueObject &valobj(match_data.GetValueObject());
141 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
143 for (auto &candidate : m_hardcoded_formats) {
144 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
147 if (match_data.GetTypeForCache() &&
148 (!format_sp || !format_sp->NonCacheable())) {
149 m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
151 return format_sp.get() != nullptr;
154 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
155 FormattersMatchData &match_data,
156 lldb::TypeSummaryImplSP &format_sp) {
160 ValueObject &valobj(match_data.GetValueObject());
161 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
163 for (auto &candidate : m_hardcoded_summaries) {
164 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
167 if (match_data.GetTypeForCache() &&
168 (!format_sp || !format_sp->NonCacheable())) {
169 m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
171 return format_sp.get() != nullptr;
174 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
175 FormattersMatchData &match_data,
176 lldb::SyntheticChildrenSP &format_sp) {
180 ValueObject &valobj(match_data.GetValueObject());
181 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
183 for (auto &candidate : m_hardcoded_synthetics) {
184 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
187 if (match_data.GetTypeForCache() &&
188 (!format_sp || !format_sp->NonCacheable())) {
189 m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
191 return format_sp.get() != nullptr;
194 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
195 FormattersMatchData &match_data,
196 lldb::TypeValidatorImplSP &format_sp) {
200 ValueObject &valobj(match_data.GetValueObject());
201 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
203 for (auto &candidate : m_hardcoded_validators) {
204 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
207 if (match_data.GetTypeForCache() &&
208 (!format_sp || !format_sp->NonCacheable())) {
209 m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
211 return format_sp.get() != nullptr;
214 lldb::TypeCategoryImplSP LanguageCategory::GetCategory() const {
215 return m_category_sp;
218 FormatCache &LanguageCategory::GetFormatCache() { return m_format_cache; }
220 void LanguageCategory::Enable() {
222 m_category_sp->Enable(true, TypeCategoryMap::Default);
226 void LanguageCategory::Disable() {
228 m_category_sp->Disable();
232 bool LanguageCategory::IsEnabled() { return m_enabled; }