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"
13 #include "lldb/DataFormatters/FormatManager.h"
14 #include "lldb/DataFormatters/TypeCategory.h"
15 #include "lldb/DataFormatters/TypeFormat.h"
16 #include "lldb/DataFormatters/TypeSummary.h"
17 #include "lldb/DataFormatters/TypeSynthetic.h"
18 #include "lldb/DataFormatters/TypeValidator.h"
19 #include "lldb/Target/Language.h"
22 using namespace lldb_private;
24 LanguageCategory::LanguageCategory(lldb::LanguageType lang_type)
25 : m_category_sp(), m_hardcoded_formats(), m_hardcoded_summaries(),
26 m_hardcoded_synthetics(), m_hardcoded_validators(), m_format_cache(),
28 if (Language *language_plugin = Language::FindPlugin(lang_type)) {
29 m_category_sp = language_plugin->GetFormatters();
30 m_hardcoded_formats = language_plugin->GetHardcodedFormats();
31 m_hardcoded_summaries = language_plugin->GetHardcodedSummaries();
32 m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics();
33 m_hardcoded_validators = language_plugin->GetHardcodedValidators();
38 bool LanguageCategory::Get(FormattersMatchData &match_data,
39 lldb::TypeFormatImplSP &format_sp) {
46 if (match_data.GetTypeForCache()) {
47 if (m_format_cache.GetFormat(match_data.GetTypeForCache(), format_sp))
48 return format_sp.get() != nullptr;
51 ValueObject &valobj(match_data.GetValueObject());
53 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
54 if (match_data.GetTypeForCache() &&
55 (!format_sp || !format_sp->NonCacheable())) {
56 m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
61 bool LanguageCategory::Get(FormattersMatchData &match_data,
62 lldb::TypeSummaryImplSP &format_sp) {
69 if (match_data.GetTypeForCache()) {
70 if (m_format_cache.GetSummary(match_data.GetTypeForCache(), format_sp))
71 return format_sp.get() != nullptr;
74 ValueObject &valobj(match_data.GetValueObject());
76 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
77 if (match_data.GetTypeForCache() &&
78 (!format_sp || !format_sp->NonCacheable())) {
79 m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
84 bool LanguageCategory::Get(FormattersMatchData &match_data,
85 lldb::SyntheticChildrenSP &format_sp) {
92 if (match_data.GetTypeForCache()) {
93 if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(), format_sp))
94 return format_sp.get() != nullptr;
97 ValueObject &valobj(match_data.GetValueObject());
99 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
100 if (match_data.GetTypeForCache() &&
101 (!format_sp || !format_sp->NonCacheable())) {
102 m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
107 bool LanguageCategory::Get(FormattersMatchData &match_data,
108 lldb::TypeValidatorImplSP &format_sp) {
115 if (match_data.GetTypeForCache()) {
116 if (m_format_cache.GetValidator(match_data.GetTypeForCache(), format_sp))
117 return format_sp.get() != nullptr;
120 ValueObject &valobj(match_data.GetValueObject());
122 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
123 if (match_data.GetTypeForCache() &&
124 (!format_sp || !format_sp->NonCacheable())) {
125 m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
130 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
131 FormattersMatchData &match_data,
132 lldb::TypeFormatImplSP &format_sp) {
136 ValueObject &valobj(match_data.GetValueObject());
137 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
139 for (auto &candidate : m_hardcoded_formats) {
140 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
143 if (match_data.GetTypeForCache() &&
144 (!format_sp || !format_sp->NonCacheable())) {
145 m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
147 return format_sp.get() != nullptr;
150 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
151 FormattersMatchData &match_data,
152 lldb::TypeSummaryImplSP &format_sp) {
156 ValueObject &valobj(match_data.GetValueObject());
157 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
159 for (auto &candidate : m_hardcoded_summaries) {
160 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
163 if (match_data.GetTypeForCache() &&
164 (!format_sp || !format_sp->NonCacheable())) {
165 m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
167 return format_sp.get() != nullptr;
170 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
171 FormattersMatchData &match_data,
172 lldb::SyntheticChildrenSP &format_sp) {
176 ValueObject &valobj(match_data.GetValueObject());
177 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
179 for (auto &candidate : m_hardcoded_synthetics) {
180 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
183 if (match_data.GetTypeForCache() &&
184 (!format_sp || !format_sp->NonCacheable())) {
185 m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
187 return format_sp.get() != nullptr;
190 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
191 FormattersMatchData &match_data,
192 lldb::TypeValidatorImplSP &format_sp) {
196 ValueObject &valobj(match_data.GetValueObject());
197 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
199 for (auto &candidate : m_hardcoded_validators) {
200 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
203 if (match_data.GetTypeForCache() &&
204 (!format_sp || !format_sp->NonCacheable())) {
205 m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
207 return format_sp.get() != nullptr;
210 lldb::TypeCategoryImplSP LanguageCategory::GetCategory() const {
211 return m_category_sp;
214 FormatCache &LanguageCategory::GetFormatCache() { return m_format_cache; }
216 void LanguageCategory::Enable() {
218 m_category_sp->Enable(true, TypeCategoryMap::Default);
222 void LanguageCategory::Disable() {
224 m_category_sp->Disable();
228 bool LanguageCategory::IsEnabled() { return m_enabled; }