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
22namespace lldb_private {
23
24// OptionValue
25class OptionValue {
26public:
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
333protected:
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.

source code of lldb/include/lldb/Interpreter/OptionValue.h