Property.cpp revision 280031
1//===-- Property.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/lldb-python.h"
11
12#include "lldb/Interpreter/Property.h"
13
14// C Includes
15// C++ Includes
16// Other libraries and framework includes
17// Project includes
18#include "lldb/Core/UserSettingsController.h"
19#include "lldb/Interpreter/Args.h"
20#include "lldb/Interpreter/CommandInterpreter.h"
21#include "lldb/Interpreter/OptionValues.h"
22
23using namespace lldb;
24using namespace lldb_private;
25
26Property::Property (const PropertyDefinition &definition) :
27    m_name (definition.name),
28    m_description (definition.description),
29    m_value_sp (),
30    m_is_global (definition.global)
31{
32    switch (definition.type)
33    {
34        case OptionValue::eTypeInvalid:
35        case OptionValue::eTypeProperties:
36            break;
37        case OptionValue::eTypeArch:
38            // "definition.default_uint_value" is not used
39            // "definition.default_cstr_value" as a string value that represents the default string value for the architecture/triple
40            m_value_sp.reset (new OptionValueArch(definition.default_cstr_value));
41            break;
42
43        case OptionValue::eTypeArgs:
44            // "definition.default_uint_value" is always a OptionValue::Type
45            m_value_sp.reset (new OptionValueArgs());
46            break;
47
48        case OptionValue::eTypeArray:
49            // "definition.default_uint_value" is always a OptionValue::Type
50            m_value_sp.reset (new OptionValueArray(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value)));
51            break;
52
53        case OptionValue::eTypeBoolean:
54            // "definition.default_uint_value" is the default boolean value if
55            // "definition.default_cstr_value" is NULL, otherwise interpret
56            // "definition.default_cstr_value" as a string value that represents the default
57            // value.
58            if (definition.default_cstr_value)
59                m_value_sp.reset (new OptionValueBoolean(Args::StringToBoolean (definition.default_cstr_value, false, nullptr)));
60            else
61                m_value_sp.reset (new OptionValueBoolean(definition.default_uint_value != 0));
62            break;
63
64        case OptionValue::eTypeChar:
65            m_value_sp.reset(new OptionValueChar(Args::StringToChar(definition.default_cstr_value, '\0', nullptr)));
66            break;
67
68        case OptionValue::eTypeDictionary:
69            // "definition.default_uint_value" is always a OptionValue::Type
70            m_value_sp.reset (new OptionValueDictionary(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value)));
71            break;
72
73        case OptionValue::eTypeEnum:
74            // "definition.default_uint_value" is the default enumeration value if
75            // "definition.default_cstr_value" is NULL, otherwise interpret
76            // "definition.default_cstr_value" as a string value that represents the default
77            // value.
78        {
79            OptionValueEnumeration *enum_value = new OptionValueEnumeration(definition.enum_values, definition.default_uint_value);
80            m_value_sp.reset (enum_value);
81            if (definition.default_cstr_value)
82            {
83                if (enum_value->SetValueFromCString(definition.default_cstr_value).Success())
84                {
85                    enum_value->SetDefaultValue(enum_value->GetCurrentValue());
86                    // Call Clear() since we don't want the value to appear as
87                    // having been set since we called SetValueFromCString() above.
88                    // Clear will set the current value to the default and clear
89                    // the boolean that says that the value has been set.
90                    enum_value->Clear();
91                }
92            }
93        }
94            break;
95
96        case OptionValue::eTypeFileSpec:
97            // "definition.default_uint_value" represents if the "definition.default_cstr_value" should
98            // be resolved or not
99            m_value_sp.reset (new OptionValueFileSpec(FileSpec(definition.default_cstr_value, definition.default_uint_value != 0)));
100            break;
101
102        case OptionValue::eTypeFileSpecList:
103            // "definition.default_uint_value" is not used for a OptionValue::eTypeFileSpecList
104            m_value_sp.reset (new OptionValueFileSpecList());
105            break;
106
107        case OptionValue::eTypeFormat:
108            // "definition.default_uint_value" is the default format enumeration value if
109            // "definition.default_cstr_value" is NULL, otherwise interpret
110            // "definition.default_cstr_value" as a string value that represents the default
111            // value.
112        {
113            Format new_format = eFormatInvalid;
114            if (definition.default_cstr_value)
115                Args::StringToFormat (definition.default_cstr_value, new_format, nullptr);
116            else
117                new_format = (Format)definition.default_uint_value;
118            m_value_sp.reset (new OptionValueFormat(new_format));
119        }
120            break;
121
122        case OptionValue::eTypePathMap:
123            // "definition.default_uint_value" tells us if notifications should occur for
124            // path mappings
125            m_value_sp.reset (new OptionValuePathMappings(definition.default_uint_value != 0));
126            break;
127
128        case OptionValue::eTypeRegex:
129            // "definition.default_uint_value" is used to the regular expression flags
130            // "definition.default_cstr_value" the default regular expression value
131            // value.
132            m_value_sp.reset (new OptionValueRegex(definition.default_cstr_value, definition.default_uint_value));
133            break;
134
135        case OptionValue::eTypeSInt64:
136            // "definition.default_uint_value" is the default integer value if
137            // "definition.default_cstr_value" is NULL, otherwise interpret
138            // "definition.default_cstr_value" as a string value that represents the default
139            // value.
140            m_value_sp.reset (new OptionValueSInt64(definition.default_cstr_value ? Args::StringToSInt64 (definition.default_cstr_value) : definition.default_uint_value));
141            break;
142
143        case OptionValue::eTypeUInt64:
144            // "definition.default_uint_value" is the default unsigned integer value if
145            // "definition.default_cstr_value" is NULL, otherwise interpret
146            // "definition.default_cstr_value" as a string value that represents the default
147            // value.
148            m_value_sp.reset (new OptionValueUInt64(definition.default_cstr_value ? Args::StringToUInt64 (definition.default_cstr_value) : definition.default_uint_value));
149            break;
150
151        case OptionValue::eTypeUUID:
152            // "definition.default_uint_value" is not used for a OptionValue::eTypeUUID
153            // "definition.default_cstr_value" can contain a default UUID value
154        {
155            UUID uuid;
156            if (definition.default_cstr_value)
157                uuid.SetFromCString (definition.default_cstr_value);
158            m_value_sp.reset (new OptionValueUUID(uuid));
159        }
160            break;
161
162        case OptionValue::eTypeString:
163            // "definition.default_uint_value" can contain the string option flags OR'ed together
164            // "definition.default_cstr_value" can contain a default string value
165            {
166                OptionValueString *string_value = new OptionValueString(definition.default_cstr_value);
167                if (definition.default_uint_value != 0)
168                    string_value->GetOptions().Reset(definition.default_uint_value);
169                m_value_sp.reset (string_value);
170            }
171            break;
172    }
173}
174
175Property::Property (const ConstString &name,
176                    const ConstString &desc,
177                    bool is_global,
178                    const lldb::OptionValueSP &value_sp) :
179    m_name (name),
180    m_description (desc),
181    m_value_sp (value_sp),
182    m_is_global (is_global)
183{
184}
185
186bool
187Property::DumpQualifiedName(Stream &strm) const
188{
189    if (m_name)
190    {
191        if (m_value_sp->DumpQualifiedName(strm))
192            strm.PutChar('.');
193        strm << m_name;
194        return true;
195    }
196    return false;
197}
198
199
200void
201Property::Dump (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) const
202{
203    if (m_value_sp)
204    {
205        const bool dump_desc = dump_mask & OptionValue::eDumpOptionDescription;
206        const bool transparent = m_value_sp->ValueIsTransparent ();
207        if (dump_desc || !transparent)
208        {
209            if ((dump_mask & OptionValue::eDumpOptionName) && m_name)
210            {
211                DumpQualifiedName(strm);
212                if (dump_mask & ~OptionValue::eDumpOptionName)
213                    strm.PutChar(' ');
214            }
215        }
216        if (dump_desc)
217        {
218            const char *desc = GetDescription();
219            if (desc)
220                strm.Printf ("-- %s", desc);
221
222            if (transparent && (dump_mask == (OptionValue::eDumpOptionName | OptionValue::eDumpOptionDescription)))
223                strm.EOL();
224        }
225        m_value_sp->DumpValue(exe_ctx, strm, dump_mask);
226    }
227}
228
229
230void
231Property::DumpDescription (CommandInterpreter &interpreter,
232                           Stream &strm,
233                           uint32_t output_width,
234                           bool display_qualified_name) const
235{
236    if (m_value_sp)
237    {
238        const char *desc = GetDescription();
239
240        if (desc)
241        {
242            StreamString qualified_name;
243            const OptionValueProperties *sub_properties = m_value_sp->GetAsProperties();
244            if (sub_properties)
245            {
246                strm.EOL();
247
248                if (m_value_sp->DumpQualifiedName(qualified_name))
249                    strm.Printf("'%s' variables:\n\n", qualified_name.GetString().c_str());
250                sub_properties->DumpAllDescriptions(interpreter, strm);
251            }
252            else
253            {
254                if (desc)
255                {
256                    if (display_qualified_name)
257                    {
258                        StreamString qualified_name;
259                        DumpQualifiedName(qualified_name);
260                        interpreter.OutputFormattedHelpText (strm,
261                                                             qualified_name.GetString().c_str(),
262                                                             "--",
263                                                             desc,
264                                                             output_width);
265                    }
266                    else
267                    {
268                        interpreter.OutputFormattedHelpText (strm,
269                                                             m_name.GetCString(),
270                                                             "--",
271                                                             desc,
272                                                             output_width);
273                    }
274                }
275            }
276        }
277    }
278}
279
280
281void
282Property::SetValueChangedCallback (OptionValueChangedCallback callback, void *baton)
283{
284    if (m_value_sp)
285        m_value_sp->SetValueChangedCallback (callback, baton);
286}
287
288
289