1f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===-- TypeCategory.cpp -------------------------------------------*- C++ -*-===//
2f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
3f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//                     The LLVM Compiler Infrastructure
4f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
5f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// This file is distributed under the University of Illinois Open Source
6f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// License. See LICENSE.TXT for details.
7f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
8f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===----------------------------------------------------------------------===//
9f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
10fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec#include "lldb/lldb-python.h"
11fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec
12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/TypeCategory.h"
13f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
14f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C Includes
15f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C++ Includes
16f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Other libraries and framework includes
17f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Project includes
18f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
19f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb;
20f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb_private;
21f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
22f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::TypeCategoryImpl(IFormatChangeListener* clist,
23f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                                   ConstString name) :
24f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_summary_nav(new SummaryNavigator("summary",clist)),
25f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_regex_summary_nav(new RegexSummaryNavigator("regex-summary",clist)),
26f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_filter_nav(new FilterNavigator("filter",clist)),
27f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_regex_filter_nav(new RegexFilterNavigator("regex-filter",clist)),
28f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
29f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_synth_nav(new SynthNavigator("synth",clist)),
30f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_regex_synth_nav(new RegexSynthNavigator("regex-synth",clist)),
31f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
32f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_enabled(false),
33f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_change_listener(clist),
34f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_mutex(Mutex::eMutexTypeRecursive),
35f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_name(name)
36f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{}
37f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
38f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
39f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::Get (ValueObject& valobj,
40f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                       lldb::TypeSummaryImplSP& entry,
41f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                       lldb::DynamicValueType use_dynamic,
42f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                       uint32_t* reason)
43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
44f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (!IsEnabled())
45f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return false;
46f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (GetSummaryNavigator()->Get(valobj, entry, use_dynamic, reason))
47f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
48f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    bool regex = GetRegexSummaryNavigator()->Get(valobj, entry, use_dynamic, reason);
49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (regex && reason)
50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionSummary;
51f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return regex;
52f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
54f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
55f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::Get(ValueObject& valobj,
56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                      lldb::SyntheticChildrenSP& entry_sp,
57f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                      lldb::DynamicValueType use_dynamic,
58f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                      uint32_t* reason)
59f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
60f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (!IsEnabled())
61f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return false;
62f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    TypeFilterImpl::SharedPointer filter_sp;
63f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    uint32_t reason_filter = 0;
64f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    bool regex_filter = false;
65f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    // first find both Filter and Synth, and then check which is most recent
66f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
67f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (!GetFilterNavigator()->Get(valobj, filter_sp, use_dynamic, &reason_filter))
68f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        regex_filter = GetRegexFilterNavigator()->Get (valobj, filter_sp, use_dynamic, &reason_filter);
69f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
70f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
71f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    bool regex_synth = false;
72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    uint32_t reason_synth = 0;
73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    bool pick_synth = false;
74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    ScriptedSyntheticChildren::SharedPointer synth;
75f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (!GetSyntheticNavigator()->Get(valobj, synth, use_dynamic, &reason_synth))
76f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        regex_synth = GetRegexSyntheticNavigator()->Get (valobj, synth, use_dynamic, &reason_synth);
77f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (!filter_sp.get() && !synth.get())
78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return false;
79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else if (!filter_sp.get() && synth.get())
80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        pick_synth = true;
81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
82f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else if (filter_sp.get() && !synth.get())
83f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        pick_synth = false;
84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else /*if (filter_sp.get() && synth.get())*/
86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (filter_sp->GetRevision() > synth->GetRevision())
88f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            pick_synth = false;
89f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        else
90f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            pick_synth = true;
91f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (pick_synth)
93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
94f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (regex_synth && reason)
95f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        entry_sp = synth;
97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
98f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
99f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else
100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
101f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (regex_filter && reason)
102f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        entry_sp = filter_sp;
104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#else
108f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (filter_sp)
109f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
110f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        entry_sp = filter_sp;
111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return false;
116f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
117f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
118f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
119f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
120f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::Clear (FormatCategoryItems items)
121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_summary_nav->Clear();
124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
125f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_regex_summary_nav->Clear();
126f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_filter_nav->Clear();
128f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
129f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_regex_filter_nav->Clear();
130f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_synth_nav->Clear();
133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_regex_synth_nav->Clear();
135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
138f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
139f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::Delete (ConstString name,
140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                          FormatCategoryItems items)
141f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    bool success = false;
143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
144f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        success = m_summary_nav->Delete(name) || success;
145f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
146f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        success = m_regex_summary_nav->Delete(name) || success;
147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
148f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        success = m_filter_nav->Delete(name) || success;
149f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
150f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        success = m_regex_filter_nav->Delete(name) || success;
151f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
152f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
153f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        success = m_synth_nav->Delete(name) || success;
154f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
155f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        success = m_regex_synth_nav->Delete(name) || success;
156f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
157f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return success;
158f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
159f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
160f509c5ec066599a3399fced39ea36996184939e8Enrico Granatauint32_t
161f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetCount (FormatCategoryItems items)
162f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
163f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    uint32_t count = 0;
164f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        count += m_summary_nav->GetCount();
166f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
167f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        count += m_regex_summary_nav->GetCount();
168f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
169f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        count += m_filter_nav->GetCount();
170f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
171f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        count += m_regex_filter_nav->GetCount();
172f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
173f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
174f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        count += m_synth_nav->GetCount();
175f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
176f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        count += m_regex_synth_nav->GetCount();
177f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
178f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return count;
179f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
180f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
181f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
182f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::AnyMatches(ConstString type_name,
183f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                             FormatCategoryItems items,
184f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                             bool only_enabled,
185f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                             const char** matching_category,
186f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                             FormatCategoryItems* matching_type)
187f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
188f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (!IsEnabled() && only_enabled)
189f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return false;
190f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
191f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    lldb::TypeSummaryImplSP summary;
192f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    TypeFilterImpl::SharedPointer filter;
193f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
194f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    ScriptedSyntheticChildren::SharedPointer synth;
195f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
196f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
197f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
198f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
199f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (m_summary_nav->Get(type_name, summary))
200f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
201f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_category)
202f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_category = m_name.GetCString();
203f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_type)
204f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_type = eFormatCategoryItemSummary;
205f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return true;
206f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
207f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
208f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
209f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
210f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (m_regex_summary_nav->Get(type_name, summary))
211f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
212f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_category)
213f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_category = m_name.GetCString();
214f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_type)
215f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_type = eFormatCategoryItemRegexSummary;
216f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return true;
217f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
218f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
219f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
220f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
221f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (m_filter_nav->Get(type_name, filter))
222f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
223f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_category)
224f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_category = m_name.GetCString();
225f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_type)
226f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_type = eFormatCategoryItemFilter;
227f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return true;
228f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
229f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
230f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
231f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
232f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (m_regex_filter_nav->Get(type_name, filter))
233f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
234f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_category)
235f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_category = m_name.GetCString();
236f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_type)
237f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_type = eFormatCategoryItemRegexFilter;
238f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return true;
239f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
240f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
241f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
242f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
243f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
244f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (m_synth_nav->Get(type_name, synth))
245f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
246f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_category)
247f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_category = m_name.GetCString();
248f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_type)
249f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_type = eFormatCategoryItemSynth;
250f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return true;
251f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
252f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
253f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
254f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
255f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (m_regex_synth_nav->Get(type_name, synth))
256f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
257f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_category)
258f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_category = m_name.GetCString();
259f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (matching_type)
260f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                *matching_type = eFormatCategoryItemRegexSynth;
261f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return true;
262f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
263f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
264f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
265f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return false;
266f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
267f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
268f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::SummaryNavigator::MapValueType
269f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
270f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
271f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SummaryNavigator::MapValueType retval;
272f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
273f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (type_sp)
274f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
275f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (type_sp->IsRegex())
276f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            m_regex_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
277f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        else
278f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            m_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
279f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
280f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
281f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return retval;
282f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
283f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
284f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::FilterNavigator::MapValueType
285f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
286f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
287f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    FilterNavigator::MapValueType retval;
288f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
289f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (type_sp)
290f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
291f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (type_sp->IsRegex())
292f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            m_regex_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
293f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        else
294f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            m_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
295f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
296f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
297f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return retval;
298f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
299f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
300f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
301f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::SynthNavigator::MapValueType
302f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
303f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
304f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SynthNavigator::MapValueType retval;
305f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
306f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (type_sp)
307f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
308f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        if (type_sp->IsRegex())
309f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            m_regex_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
310f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        else
311f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            m_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
312f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
313f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
314f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return retval;
315f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
316f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
317f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
318f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::TypeNameSpecifierImplSP
319f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetTypeNameSpecifierForSummaryAtIndex (size_t index)
320f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
321f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (index < m_summary_nav->GetCount())
322f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_summary_nav->GetTypeNameSpecifierAtIndex(index);
323f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else
324f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_regex_summary_nav->GetTypeNameSpecifierAtIndex(index-m_summary_nav->GetCount());
325f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
326f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
327f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::SummaryNavigator::MapValueType
328f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetSummaryAtIndex (size_t index)
329f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
330f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (index < m_summary_nav->GetCount())
331f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_summary_nav->GetAtIndex(index);
332f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else
333f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_regex_summary_nav->GetAtIndex(index-m_summary_nav->GetCount());
334f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
335f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
336f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::FilterNavigator::MapValueType
337f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetFilterAtIndex (size_t index)
338f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
339f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (index < m_filter_nav->GetCount())
340f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_filter_nav->GetAtIndex(index);
341f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else
342f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_regex_filter_nav->GetAtIndex(index-m_filter_nav->GetCount());
343f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
344f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
345f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::TypeNameSpecifierImplSP
346f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetTypeNameSpecifierForFilterAtIndex (size_t index)
347f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
348f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (index < m_filter_nav->GetCount())
349f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_filter_nav->GetTypeNameSpecifierAtIndex(index);
350f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else
351f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_regex_filter_nav->GetTypeNameSpecifierAtIndex(index-m_filter_nav->GetCount());
352f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
353f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
354d9da5b0d0e3ea8a398679979b148df699c7215f6Enrico Granata#ifndef LLDB_DISABLE_PYTHON
355f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::SynthNavigator::MapValueType
356f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetSyntheticAtIndex (size_t index)
357f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
358f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (index < m_synth_nav->GetCount())
359f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_synth_nav->GetAtIndex(index);
360f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else
361f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_regex_synth_nav->GetAtIndex(index-m_synth_nav->GetCount());
362f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
363f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
364f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::TypeNameSpecifierImplSP
365f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::GetTypeNameSpecifierForSyntheticAtIndex (size_t index)
366f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
367f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (index < m_synth_nav->GetCount())
368f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_synth_nav->GetTypeNameSpecifierAtIndex(index);
369f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    else
370f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return m_regex_synth_nav->GetTypeNameSpecifierAtIndex(index - m_synth_nav->GetCount());
371f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
372d9da5b0d0e3ea8a398679979b148df699c7215f6Enrico Granata#endif
373f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
374f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
375f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeCategoryImpl::Enable (bool value, uint32_t position)
376f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
377f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker locker(m_mutex);
378f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_enabled = value;
379f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_enabled_position = position;
380f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (m_change_listener)
381f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_change_listener->Changed();
382f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
383