1 //===-- LanguageCategory.cpp ---------------------------------------*- C++
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #include "lldb/DataFormatters/LanguageCategory.h"
12 #include "lldb/DataFormatters/FormatManager.h"
13 #include "lldb/DataFormatters/TypeCategory.h"
14 #include "lldb/DataFormatters/TypeFormat.h"
15 #include "lldb/DataFormatters/TypeSummary.h"
16 #include "lldb/DataFormatters/TypeSynthetic.h"
17 #include "lldb/DataFormatters/TypeValidator.h"
18 #include "lldb/Target/Language.h"
21 using namespace lldb_private;
23 LanguageCategory::LanguageCategory(lldb::LanguageType lang_type)
24 : m_category_sp(), m_hardcoded_formats(), m_hardcoded_summaries(),
25 m_hardcoded_synthetics(), m_hardcoded_validators(), m_format_cache(),
27 if (Language *language_plugin = Language::FindPlugin(lang_type)) {
28 m_category_sp = language_plugin->GetFormatters();
29 m_hardcoded_formats = language_plugin->GetHardcodedFormats();
30 m_hardcoded_summaries = language_plugin->GetHardcodedSummaries();
31 m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics();
32 m_hardcoded_validators = language_plugin->GetHardcodedValidators();
37 bool LanguageCategory::Get(FormattersMatchData &match_data,
38 lldb::TypeFormatImplSP &format_sp) {
45 if (match_data.GetTypeForCache()) {
46 if (m_format_cache.GetFormat(match_data.GetTypeForCache(), format_sp))
47 return format_sp.get() != nullptr;
50 ValueObject &valobj(match_data.GetValueObject());
52 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
53 if (match_data.GetTypeForCache() &&
54 (!format_sp || !format_sp->NonCacheable())) {
55 m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
60 bool LanguageCategory::Get(FormattersMatchData &match_data,
61 lldb::TypeSummaryImplSP &format_sp) {
68 if (match_data.GetTypeForCache()) {
69 if (m_format_cache.GetSummary(match_data.GetTypeForCache(), format_sp))
70 return format_sp.get() != nullptr;
73 ValueObject &valobj(match_data.GetValueObject());
75 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
76 if (match_data.GetTypeForCache() &&
77 (!format_sp || !format_sp->NonCacheable())) {
78 m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
83 bool LanguageCategory::Get(FormattersMatchData &match_data,
84 lldb::SyntheticChildrenSP &format_sp) {
91 if (match_data.GetTypeForCache()) {
92 if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(), format_sp))
93 return format_sp.get() != nullptr;
96 ValueObject &valobj(match_data.GetValueObject());
98 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
99 if (match_data.GetTypeForCache() &&
100 (!format_sp || !format_sp->NonCacheable())) {
101 m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
106 bool LanguageCategory::Get(FormattersMatchData &match_data,
107 lldb::TypeValidatorImplSP &format_sp) {
114 if (match_data.GetTypeForCache()) {
115 if (m_format_cache.GetValidator(match_data.GetTypeForCache(), format_sp))
116 return format_sp.get() != nullptr;
119 ValueObject &valobj(match_data.GetValueObject());
121 m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp);
122 if (match_data.GetTypeForCache() &&
123 (!format_sp || !format_sp->NonCacheable())) {
124 m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
129 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
130 FormattersMatchData &match_data,
131 lldb::TypeFormatImplSP &format_sp) {
135 ValueObject &valobj(match_data.GetValueObject());
136 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
138 for (auto &candidate : m_hardcoded_formats) {
139 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
142 if (match_data.GetTypeForCache() &&
143 (!format_sp || !format_sp->NonCacheable())) {
144 m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp);
146 return format_sp.get() != nullptr;
149 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
150 FormattersMatchData &match_data,
151 lldb::TypeSummaryImplSP &format_sp) {
155 ValueObject &valobj(match_data.GetValueObject());
156 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
158 for (auto &candidate : m_hardcoded_summaries) {
159 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
162 if (match_data.GetTypeForCache() &&
163 (!format_sp || !format_sp->NonCacheable())) {
164 m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp);
166 return format_sp.get() != nullptr;
169 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
170 FormattersMatchData &match_data,
171 lldb::SyntheticChildrenSP &format_sp) {
175 ValueObject &valobj(match_data.GetValueObject());
176 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
178 for (auto &candidate : m_hardcoded_synthetics) {
179 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
182 if (match_data.GetTypeForCache() &&
183 (!format_sp || !format_sp->NonCacheable())) {
184 m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp);
186 return format_sp.get() != nullptr;
189 bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr,
190 FormattersMatchData &match_data,
191 lldb::TypeValidatorImplSP &format_sp) {
195 ValueObject &valobj(match_data.GetValueObject());
196 lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType());
198 for (auto &candidate : m_hardcoded_validators) {
199 if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr)))
202 if (match_data.GetTypeForCache() &&
203 (!format_sp || !format_sp->NonCacheable())) {
204 m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp);
206 return format_sp.get() != nullptr;
209 lldb::TypeCategoryImplSP LanguageCategory::GetCategory() const {
210 return m_category_sp;
213 FormatCache &LanguageCategory::GetFormatCache() { return m_format_cache; }
215 void LanguageCategory::Enable() {
217 m_category_sp->Enable(true, TypeCategoryMap::Default);
221 void LanguageCategory::Disable() {
223 m_category_sp->Disable();
227 bool LanguageCategory::IsEnabled() { return m_enabled; }