Warning: This file is not a C or C++ file. It does not have highlighting.
1 | //===-- OptionValue.h -------------------------------------------*- C++ -*-===// |
---|---|
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 | #ifndef LLDB_INTERPRETER_OPTIONVALUE_H |
10 | #define LLDB_INTERPRETER_OPTIONVALUE_H |
11 | |
12 | #include "lldb/Core/FormatEntity.h" |
13 | #include "lldb/Utility/Cloneable.h" |
14 | #include "lldb/Utility/CompletionRequest.h" |
15 | #include "lldb/Utility/ConstString.h" |
16 | #include "lldb/Utility/Status.h" |
17 | #include "lldb/lldb-defines.h" |
18 | #include "lldb/lldb-private-enumerations.h" |
19 | #include "lldb/lldb-private-interfaces.h" |
20 | #include "llvm/Support/JSON.h" |
21 | |
22 | namespace lldb_private { |
23 | |
24 | // OptionValue |
25 | class OptionValue { |
26 | public: |
27 | enum Type { |
28 | eTypeInvalid = 0, |
29 | eTypeArch, |
30 | eTypeArgs, |
31 | eTypeArray, |
32 | eTypeBoolean, |
33 | eTypeChar, |
34 | eTypeDictionary, |
35 | eTypeEnum, |
36 | eTypeFileLineColumn, |
37 | eTypeFileSpec, |
38 | eTypeFileSpecList, |
39 | eTypeFormat, |
40 | eTypeLanguage, |
41 | eTypePathMap, |
42 | eTypeProperties, |
43 | eTypeRegex, |
44 | eTypeSInt64, |
45 | eTypeString, |
46 | eTypeUInt64, |
47 | eTypeUUID, |
48 | eTypeFormatEntity |
49 | }; |
50 | |
51 | enum { |
52 | eDumpOptionName = (1u << 0), |
53 | eDumpOptionType = (1u << 1), |
54 | eDumpOptionValue = (1u << 2), |
55 | eDumpOptionDescription = (1u << 3), |
56 | eDumpOptionRaw = (1u << 4), |
57 | eDumpOptionCommand = (1u << 5), |
58 | eDumpGroupValue = (eDumpOptionName | eDumpOptionType | eDumpOptionValue), |
59 | eDumpGroupHelp = |
60 | (eDumpOptionName | eDumpOptionType | eDumpOptionDescription), |
61 | eDumpGroupExport = (eDumpOptionCommand | eDumpOptionName | eDumpOptionValue) |
62 | }; |
63 | |
64 | OptionValue() = default; |
65 | |
66 | virtual ~OptionValue() = default; |
67 | |
68 | // Subclasses should override these functions |
69 | virtual Type GetType() const = 0; |
70 | |
71 | // If this value is always hidden, the avoid showing any info on this value, |
72 | // just show the info for the child values. |
73 | virtual bool ValueIsTransparent() const { |
74 | return GetType() == eTypeProperties; |
75 | } |
76 | |
77 | virtual const char *GetTypeAsCString() const { |
78 | return GetBuiltinTypeAsCString(GetType()); |
79 | } |
80 | |
81 | static const char *GetBuiltinTypeAsCString(Type t); |
82 | |
83 | virtual void DumpValue(const ExecutionContext *exe_ctx, Stream &strm, |
84 | uint32_t dump_mask) = 0; |
85 | |
86 | // TODO: make this function pure virtual after implementing it in all |
87 | // child classes. |
88 | virtual llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) { |
89 | // Return nullptr which will create a llvm::json::Value() that is a NULL |
90 | // value. No setting should ever really have a NULL value in JSON. This |
91 | // indicates an error occurred and if/when we add a FromJSON() it will know |
92 | // to fail if someone tries to set it with a NULL JSON value. |
93 | return nullptr; |
94 | } |
95 | |
96 | virtual Status |
97 | SetValueFromString(llvm::StringRef value, |
98 | VarSetOperationType op = eVarSetOperationAssign); |
99 | |
100 | virtual void Clear() = 0; |
101 | |
102 | virtual lldb::OptionValueSP |
103 | DeepCopy(const lldb::OptionValueSP &new_parent) const; |
104 | |
105 | virtual void AutoComplete(CommandInterpreter &interpreter, |
106 | CompletionRequest &request); |
107 | |
108 | // Subclasses can override these functions |
109 | virtual lldb::OptionValueSP GetSubValue(const ExecutionContext *exe_ctx, |
110 | llvm::StringRef name, |
111 | bool will_modify, |
112 | Status &error) const { |
113 | error.SetErrorStringWithFormat("'%s' is not a value subvalue", name.str().c_str()); |
114 | return lldb::OptionValueSP(); |
115 | } |
116 | |
117 | virtual Status SetSubValue(const ExecutionContext *exe_ctx, |
118 | VarSetOperationType op, llvm::StringRef name, |
119 | llvm::StringRef value); |
120 | |
121 | virtual bool IsAggregateValue() const { return false; } |
122 | |
123 | virtual ConstString GetName() const { return ConstString(); } |
124 | |
125 | virtual bool DumpQualifiedName(Stream &strm) const; |
126 | |
127 | // Subclasses should NOT override these functions as they use the above |
128 | // functions to implement functionality |
129 | uint32_t GetTypeAsMask() { return 1u << GetType(); } |
130 | |
131 | static uint32_t ConvertTypeToMask(OptionValue::Type type) { |
132 | return 1u << type; |
133 | } |
134 | |
135 | static OptionValue::Type ConvertTypeMaskToType(uint32_t type_mask) { |
136 | // If only one bit is set, then return an appropriate enumeration |
137 | switch (type_mask) { |
138 | case 1u << eTypeArch: |
139 | return eTypeArch; |
140 | case 1u << eTypeArgs: |
141 | return eTypeArgs; |
142 | case 1u << eTypeArray: |
143 | return eTypeArray; |
144 | case 1u << eTypeBoolean: |
145 | return eTypeBoolean; |
146 | case 1u << eTypeChar: |
147 | return eTypeChar; |
148 | case 1u << eTypeDictionary: |
149 | return eTypeDictionary; |
150 | case 1u << eTypeEnum: |
151 | return eTypeEnum; |
152 | case 1u << eTypeFileLineColumn: |
153 | return eTypeFileLineColumn; |
154 | case 1u << eTypeFileSpec: |
155 | return eTypeFileSpec; |
156 | case 1u << eTypeFileSpecList: |
157 | return eTypeFileSpecList; |
158 | case 1u << eTypeFormat: |
159 | return eTypeFormat; |
160 | case 1u << eTypeLanguage: |
161 | return eTypeLanguage; |
162 | case 1u << eTypePathMap: |
163 | return eTypePathMap; |
164 | case 1u << eTypeProperties: |
165 | return eTypeProperties; |
166 | case 1u << eTypeRegex: |
167 | return eTypeRegex; |
168 | case 1u << eTypeSInt64: |
169 | return eTypeSInt64; |
170 | case 1u << eTypeString: |
171 | return eTypeString; |
172 | case 1u << eTypeUInt64: |
173 | return eTypeUInt64; |
174 | case 1u << eTypeUUID: |
175 | return eTypeUUID; |
176 | } |
177 | // Else return invalid |
178 | return eTypeInvalid; |
179 | } |
180 | |
181 | static lldb::OptionValueSP |
182 | CreateValueFromCStringForTypeMask(const char *value_cstr, uint32_t type_mask, |
183 | Status &error); |
184 | |
185 | // Get this value as a uint64_t value if it is encoded as a boolean, uint64_t |
186 | // or int64_t. Other types will cause "fail_value" to be returned |
187 | uint64_t GetUInt64Value(uint64_t fail_value, bool *success_ptr); |
188 | |
189 | OptionValueArch *GetAsArch(); |
190 | |
191 | const OptionValueArch *GetAsArch() const; |
192 | |
193 | OptionValueArray *GetAsArray(); |
194 | |
195 | const OptionValueArray *GetAsArray() const; |
196 | |
197 | OptionValueArgs *GetAsArgs(); |
198 | |
199 | const OptionValueArgs *GetAsArgs() const; |
200 | |
201 | OptionValueBoolean *GetAsBoolean(); |
202 | |
203 | OptionValueChar *GetAsChar(); |
204 | |
205 | const OptionValueBoolean *GetAsBoolean() const; |
206 | |
207 | const OptionValueChar *GetAsChar() const; |
208 | |
209 | OptionValueDictionary *GetAsDictionary(); |
210 | |
211 | const OptionValueDictionary *GetAsDictionary() const; |
212 | |
213 | OptionValueEnumeration *GetAsEnumeration(); |
214 | |
215 | const OptionValueEnumeration *GetAsEnumeration() const; |
216 | |
217 | OptionValueFileSpec *GetAsFileSpec(); |
218 | |
219 | const OptionValueFileSpec *GetAsFileSpec() const; |
220 | |
221 | OptionValueFileSpecList *GetAsFileSpecList(); |
222 | |
223 | const OptionValueFileSpecList *GetAsFileSpecList() const; |
224 | |
225 | OptionValueFormat *GetAsFormat(); |
226 | |
227 | const OptionValueFormat *GetAsFormat() const; |
228 | |
229 | OptionValueLanguage *GetAsLanguage(); |
230 | |
231 | const OptionValueLanguage *GetAsLanguage() const; |
232 | |
233 | OptionValuePathMappings *GetAsPathMappings(); |
234 | |
235 | const OptionValuePathMappings *GetAsPathMappings() const; |
236 | |
237 | OptionValueProperties *GetAsProperties(); |
238 | |
239 | const OptionValueProperties *GetAsProperties() const; |
240 | |
241 | OptionValueRegex *GetAsRegex(); |
242 | |
243 | const OptionValueRegex *GetAsRegex() const; |
244 | |
245 | OptionValueSInt64 *GetAsSInt64(); |
246 | |
247 | const OptionValueSInt64 *GetAsSInt64() const; |
248 | |
249 | OptionValueString *GetAsString(); |
250 | |
251 | const OptionValueString *GetAsString() const; |
252 | |
253 | OptionValueUInt64 *GetAsUInt64(); |
254 | |
255 | const OptionValueUInt64 *GetAsUInt64() const; |
256 | |
257 | OptionValueUUID *GetAsUUID(); |
258 | |
259 | const OptionValueUUID *GetAsUUID() const; |
260 | |
261 | OptionValueFormatEntity *GetAsFormatEntity(); |
262 | |
263 | const OptionValueFormatEntity *GetAsFormatEntity() const; |
264 | |
265 | bool GetBooleanValue(bool fail_value = false) const; |
266 | |
267 | bool SetBooleanValue(bool new_value); |
268 | |
269 | char GetCharValue(char fail_value) const; |
270 | |
271 | char SetCharValue(char new_value); |
272 | |
273 | int64_t GetEnumerationValue(int64_t fail_value = -1) const; |
274 | |
275 | bool SetEnumerationValue(int64_t value); |
276 | |
277 | FileSpec GetFileSpecValue() const; |
278 | |
279 | bool SetFileSpecValue(const FileSpec &file_spec); |
280 | |
281 | FileSpecList GetFileSpecListValue() const; |
282 | |
283 | lldb::Format |
284 | GetFormatValue(lldb::Format fail_value = lldb::eFormatDefault) const; |
285 | |
286 | bool SetFormatValue(lldb::Format new_value); |
287 | |
288 | lldb::LanguageType GetLanguageValue( |
289 | lldb::LanguageType fail_value = lldb::eLanguageTypeUnknown) const; |
290 | |
291 | bool SetLanguageValue(lldb::LanguageType new_language); |
292 | |
293 | const FormatEntity::Entry *GetFormatEntity() const; |
294 | |
295 | const RegularExpression *GetRegexValue() const; |
296 | |
297 | int64_t GetSInt64Value(int64_t fail_value = 0) const; |
298 | |
299 | bool SetSInt64Value(int64_t new_value); |
300 | |
301 | llvm::StringRef GetStringValue(llvm::StringRef fail_value) const; |
302 | llvm::StringRef GetStringValue() const { return GetStringValue(llvm::StringRef()); } |
303 | |
304 | bool SetStringValue(llvm::StringRef new_value); |
305 | |
306 | uint64_t GetUInt64Value(uint64_t fail_value = 0) const; |
307 | |
308 | bool SetUInt64Value(uint64_t new_value); |
309 | |
310 | UUID GetUUIDValue() const; |
311 | |
312 | bool SetUUIDValue(const UUID &uuid); |
313 | |
314 | bool OptionWasSet() const { return m_value_was_set; } |
315 | |
316 | void SetOptionWasSet() { m_value_was_set = true; } |
317 | |
318 | void SetParent(const lldb::OptionValueSP &parent_sp) { |
319 | m_parent_wp = parent_sp; |
320 | } |
321 | |
322 | lldb::OptionValueSP GetParent() const { return m_parent_wp.lock(); } |
323 | |
324 | void SetValueChangedCallback(std::function<void()> callback) { |
325 | m_callback = std::move(callback); |
326 | } |
327 | |
328 | void NotifyValueChanged() { |
329 | if (m_callback) |
330 | m_callback(); |
331 | } |
332 | |
333 | protected: |
334 | using TopmostBase = OptionValue; |
335 | |
336 | // Must be overriden by a derived class for correct downcasting the result of |
337 | // DeepCopy to it. Inherit from Cloneable to avoid doing this manually. |
338 | virtual lldb::OptionValueSP Clone() const = 0; |
339 | |
340 | lldb::OptionValueWP m_parent_wp; |
341 | std::function<void()> m_callback; |
342 | bool m_value_was_set = false; // This can be used to see if a value has been |
343 | // set by a call to SetValueFromCString(). It is |
344 | // often handy to know if an option value was |
345 | // set from the command line or as a setting, |
346 | // versus if we just have the default value that |
347 | // was already populated in the option value. |
348 | }; |
349 | |
350 | } // namespace lldb_private |
351 | |
352 | #endif // LLDB_INTERPRETER_OPTIONVALUE_H |
353 |
Warning: This file is not a C or C++ file. It does not have highlighting.