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