1 //===-- LanguageCategory.cpp ---------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/DataFormatters/LanguageCategory.h"
11 
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/DataFormatters/FormatManager.h"
17 #include "lldb/DataFormatters/TypeCategory.h"
18 #include "lldb/DataFormatters/TypeFormat.h"
19 #include "lldb/DataFormatters/TypeSummary.h"
20 #include "lldb/DataFormatters/TypeSynthetic.h"
21 #include "lldb/DataFormatters/TypeValidator.h"
22 #include "lldb/Target/Language.h"
23 
24 using namespace lldb;
25 using namespace lldb_private;
26 
27 LanguageCategory::LanguageCategory (lldb::LanguageType lang_type) :
28     m_category_sp(),
29     m_format_cache()
30 {
31     if (Language* language_plugin = Language::FindPlugin(lang_type))
32         m_category_sp = language_plugin->GetFormatters();
33     if (m_category_sp)
34         m_category_sp->Enable(true, 1);
35 }
36 
37 bool
38 LanguageCategory::Get (ValueObject& valobj,
39                        lldb::DynamicValueType dynamic,
40                        FormattersMatchVector matches,
41                        lldb::TypeFormatImplSP& format_sp)
42 {
43     if (!m_category_sp)
44         return false;
45 
46     ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic);
47     if (type_name)
48     {
49         if (m_format_cache.GetFormat(type_name, format_sp))
50             return true;
51     }
52     bool result = m_category_sp->Get(valobj, matches, format_sp);
53     if (type_name && (!format_sp || !format_sp->NonCacheable()))
54     {
55         m_format_cache.SetFormat(type_name, format_sp);
56     }
57     return result;
58 }
59 
60 bool
61 LanguageCategory::Get (ValueObject& valobj,
62                        lldb::DynamicValueType dynamic,
63                        FormattersMatchVector matches,
64                        lldb::TypeSummaryImplSP& format_sp)
65 {
66     if (!m_category_sp)
67         return false;
68 
69     ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic);
70     if (type_name)
71     {
72         if (m_format_cache.GetSummary(type_name, format_sp))
73             return true;
74     }
75     bool result = m_category_sp->Get(valobj, matches, format_sp);
76     if (type_name && (!format_sp || !format_sp->NonCacheable()))
77     {
78         m_format_cache.SetSummary(type_name, format_sp);
79     }
80     return result;
81 }
82 
83 bool
84 LanguageCategory::Get (ValueObject& valobj,
85                        lldb::DynamicValueType dynamic,
86                        FormattersMatchVector matches,
87                        lldb::SyntheticChildrenSP& format_sp)
88 {
89     if (!m_category_sp)
90         return false;
91 
92     ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic);
93     if (type_name)
94     {
95         if (m_format_cache.GetSynthetic(type_name, format_sp))
96             return true;
97     }
98     bool result = m_category_sp->Get(valobj, matches, format_sp);
99     if (type_name && (!format_sp || !format_sp->NonCacheable()))
100     {
101         m_format_cache.SetSynthetic(type_name, format_sp);
102     }
103     return result;
104 }
105 
106 bool
107 LanguageCategory::Get (ValueObject& valobj,
108                        lldb::DynamicValueType dynamic,
109                        FormattersMatchVector matches,
110                        lldb::TypeValidatorImplSP& format_sp)
111 {
112     if (!m_category_sp)
113         return false;
114 
115     ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic);
116     if (type_name)
117     {
118         if (m_format_cache.GetValidator(type_name, format_sp))
119             return true;
120     }
121     bool result = m_category_sp->Get(valobj, matches, format_sp);
122     if (type_name && (!format_sp || !format_sp->NonCacheable()))
123     {
124         m_format_cache.SetValidator(type_name, format_sp);
125     }
126     return result;
127 }
128 
129 lldb::TypeCategoryImplSP
130 LanguageCategory::GetCategory () const
131 {
132     return m_category_sp;
133 }
134