1 | //===-- LanguageCategory.cpp ----------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "lldb/DataFormatters/LanguageCategory.h" |
10 | |
11 | #include "lldb/DataFormatters/FormatManager.h" |
12 | #include "lldb/DataFormatters/TypeCategory.h" |
13 | #include "lldb/DataFormatters/TypeFormat.h" |
14 | #include "lldb/DataFormatters/TypeSummary.h" |
15 | #include "lldb/DataFormatters/TypeSynthetic.h" |
16 | #include "lldb/Target/Language.h" |
17 | |
18 | using namespace lldb; |
19 | using namespace lldb_private; |
20 | |
21 | LanguageCategory::LanguageCategory(lldb::LanguageType lang_type) |
22 | : m_category_sp(), m_hardcoded_formats(), m_hardcoded_summaries(), |
23 | m_hardcoded_synthetics(), m_format_cache(), m_enabled(false) { |
24 | if (Language *language_plugin = Language::FindPlugin(language: lang_type)) { |
25 | m_category_sp = language_plugin->GetFormatters(); |
26 | m_hardcoded_formats = language_plugin->GetHardcodedFormats(); |
27 | m_hardcoded_summaries = language_plugin->GetHardcodedSummaries(); |
28 | m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics(); |
29 | } |
30 | Enable(); |
31 | } |
32 | |
33 | template<typename ImplSP> |
34 | bool LanguageCategory::Get(FormattersMatchData &match_data, |
35 | ImplSP &retval_sp) { |
36 | if (!m_category_sp) |
37 | return false; |
38 | |
39 | if (!IsEnabled()) |
40 | return false; |
41 | |
42 | if (match_data.GetTypeForCache()) { |
43 | if (m_format_cache.Get(match_data.GetTypeForCache(), retval_sp)) |
44 | return (bool)retval_sp; |
45 | } |
46 | |
47 | ValueObject &valobj(match_data.GetValueObject()); |
48 | bool result = m_category_sp->Get(valobj.GetObjectRuntimeLanguage(), |
49 | match_data.GetMatchesVector(), retval_sp); |
50 | if (match_data.GetTypeForCache() && |
51 | (!retval_sp || !retval_sp->NonCacheable())) { |
52 | m_format_cache.Set(match_data.GetTypeForCache(), retval_sp); |
53 | } |
54 | return result; |
55 | } |
56 | |
57 | namespace lldb_private { |
58 | |
59 | /// Explicit instantiations for the three types. |
60 | /// \{ |
61 | template bool |
62 | LanguageCategory::Get<lldb::TypeFormatImplSP>(FormattersMatchData &, |
63 | lldb::TypeFormatImplSP &); |
64 | template bool |
65 | LanguageCategory::Get<lldb::TypeSummaryImplSP>(FormattersMatchData &, |
66 | lldb::TypeSummaryImplSP &); |
67 | template bool |
68 | LanguageCategory::Get<lldb::SyntheticChildrenSP>(FormattersMatchData &, |
69 | lldb::SyntheticChildrenSP &); |
70 | /// \} |
71 | |
72 | template <> |
73 | auto &LanguageCategory::GetHardcodedFinder<lldb::TypeFormatImplSP>() { |
74 | return m_hardcoded_formats; |
75 | } |
76 | |
77 | template <> |
78 | auto &LanguageCategory::GetHardcodedFinder<lldb::TypeSummaryImplSP>() { |
79 | return m_hardcoded_summaries; |
80 | } |
81 | |
82 | template <> |
83 | auto &LanguageCategory::GetHardcodedFinder<lldb::SyntheticChildrenSP>() { |
84 | return m_hardcoded_synthetics; |
85 | } |
86 | |
87 | } // namespace lldb_private |
88 | |
89 | template <typename ImplSP> |
90 | bool LanguageCategory::GetHardcoded(FormatManager &fmt_mgr, |
91 | FormattersMatchData &match_data, |
92 | ImplSP &retval_sp) { |
93 | if (!IsEnabled()) |
94 | return false; |
95 | |
96 | ValueObject &valobj(match_data.GetValueObject()); |
97 | lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType()); |
98 | |
99 | for (auto &candidate : GetHardcodedFinder<ImplSP>()) { |
100 | if (auto result = candidate(valobj, use_dynamic, fmt_mgr)) { |
101 | retval_sp = result; |
102 | break; |
103 | } |
104 | } |
105 | return (bool)retval_sp; |
106 | } |
107 | |
108 | /// Explicit instantiations for the three types. |
109 | /// \{ |
110 | template bool LanguageCategory::GetHardcoded<lldb::TypeFormatImplSP>( |
111 | FormatManager &, FormattersMatchData &, lldb::TypeFormatImplSP &); |
112 | template bool LanguageCategory::GetHardcoded<lldb::TypeSummaryImplSP>( |
113 | FormatManager &, FormattersMatchData &, lldb::TypeSummaryImplSP &); |
114 | template bool LanguageCategory::GetHardcoded<lldb::SyntheticChildrenSP>( |
115 | FormatManager &, FormattersMatchData &, lldb::SyntheticChildrenSP &); |
116 | /// \} |
117 | |
118 | lldb::TypeCategoryImplSP LanguageCategory::GetCategory() const { |
119 | return m_category_sp; |
120 | } |
121 | |
122 | FormatCache &LanguageCategory::GetFormatCache() { return m_format_cache; } |
123 | |
124 | void LanguageCategory::Enable() { |
125 | if (m_category_sp) |
126 | m_category_sp->Enable(value: true, position: TypeCategoryMap::Default); |
127 | m_enabled = true; |
128 | } |
129 | |
130 | void LanguageCategory::Disable() { |
131 | if (m_category_sp) |
132 | m_category_sp->Disable(); |
133 | m_enabled = false; |
134 | } |
135 | |
136 | bool LanguageCategory::IsEnabled() { return m_enabled; } |
137 | |