Property.cpp revision 288943
1254721Semaste//===-- Property.cpp --------------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Interpreter/Property.h" 11254721Semaste 12254721Semaste// C Includes 13254721Semaste// C++ Includes 14254721Semaste// Other libraries and framework includes 15254721Semaste// Project includes 16254721Semaste#include "lldb/Core/UserSettingsController.h" 17288943Sdim#include "lldb/Host/StringConvert.h" 18254721Semaste#include "lldb/Interpreter/CommandInterpreter.h" 19254721Semaste#include "lldb/Interpreter/OptionValues.h" 20288943Sdim#include "lldb/Target/LanguageRuntime.h" 21254721Semaste 22254721Semasteusing namespace lldb; 23254721Semasteusing namespace lldb_private; 24254721Semaste 25254721SemasteProperty::Property (const PropertyDefinition &definition) : 26254721Semaste m_name (definition.name), 27254721Semaste m_description (definition.description), 28254721Semaste m_value_sp (), 29254721Semaste m_is_global (definition.global) 30254721Semaste{ 31254721Semaste switch (definition.type) 32254721Semaste { 33254721Semaste case OptionValue::eTypeInvalid: 34254721Semaste case OptionValue::eTypeProperties: 35254721Semaste break; 36254721Semaste case OptionValue::eTypeArch: 37254721Semaste // "definition.default_uint_value" is not used 38254721Semaste // "definition.default_cstr_value" as a string value that represents the default string value for the architecture/triple 39254721Semaste m_value_sp.reset (new OptionValueArch(definition.default_cstr_value)); 40254721Semaste break; 41254721Semaste 42254721Semaste case OptionValue::eTypeArgs: 43254721Semaste // "definition.default_uint_value" is always a OptionValue::Type 44254721Semaste m_value_sp.reset (new OptionValueArgs()); 45254721Semaste break; 46254721Semaste 47254721Semaste case OptionValue::eTypeArray: 48254721Semaste // "definition.default_uint_value" is always a OptionValue::Type 49254721Semaste m_value_sp.reset (new OptionValueArray(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value))); 50254721Semaste break; 51254721Semaste 52254721Semaste case OptionValue::eTypeBoolean: 53254721Semaste // "definition.default_uint_value" is the default boolean value if 54254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 55254721Semaste // "definition.default_cstr_value" as a string value that represents the default 56254721Semaste // value. 57254721Semaste if (definition.default_cstr_value) 58276479Sdim m_value_sp.reset (new OptionValueBoolean(Args::StringToBoolean (definition.default_cstr_value, false, nullptr))); 59254721Semaste else 60254721Semaste m_value_sp.reset (new OptionValueBoolean(definition.default_uint_value != 0)); 61254721Semaste break; 62280031Sdim 63280031Sdim case OptionValue::eTypeChar: 64280031Sdim m_value_sp.reset(new OptionValueChar(Args::StringToChar(definition.default_cstr_value, '\0', nullptr))); 65280031Sdim break; 66280031Sdim 67254721Semaste case OptionValue::eTypeDictionary: 68254721Semaste // "definition.default_uint_value" is always a OptionValue::Type 69254721Semaste m_value_sp.reset (new OptionValueDictionary(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value))); 70254721Semaste break; 71254721Semaste 72254721Semaste case OptionValue::eTypeEnum: 73254721Semaste // "definition.default_uint_value" is the default enumeration value if 74254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 75254721Semaste // "definition.default_cstr_value" as a string value that represents the default 76254721Semaste // value. 77254721Semaste { 78254721Semaste OptionValueEnumeration *enum_value = new OptionValueEnumeration(definition.enum_values, definition.default_uint_value); 79254721Semaste m_value_sp.reset (enum_value); 80254721Semaste if (definition.default_cstr_value) 81254721Semaste { 82288943Sdim if (enum_value->SetValueFromString(definition.default_cstr_value).Success()) 83254721Semaste { 84254721Semaste enum_value->SetDefaultValue(enum_value->GetCurrentValue()); 85254721Semaste // Call Clear() since we don't want the value to appear as 86288943Sdim // having been set since we called SetValueFromString() above. 87254721Semaste // Clear will set the current value to the default and clear 88254721Semaste // the boolean that says that the value has been set. 89254721Semaste enum_value->Clear(); 90254721Semaste } 91254721Semaste } 92254721Semaste } 93254721Semaste break; 94254721Semaste 95254721Semaste case OptionValue::eTypeFileSpec: 96288943Sdim { 97254721Semaste // "definition.default_uint_value" represents if the "definition.default_cstr_value" should 98254721Semaste // be resolved or not 99288943Sdim const bool resolve = definition.default_uint_value != 0; 100288943Sdim m_value_sp.reset (new OptionValueFileSpec(FileSpec(definition.default_cstr_value, resolve), resolve)); 101254721Semaste break; 102288943Sdim } 103254721Semaste 104254721Semaste case OptionValue::eTypeFileSpecList: 105254721Semaste // "definition.default_uint_value" is not used for a OptionValue::eTypeFileSpecList 106254721Semaste m_value_sp.reset (new OptionValueFileSpecList()); 107254721Semaste break; 108254721Semaste 109254721Semaste case OptionValue::eTypeFormat: 110254721Semaste // "definition.default_uint_value" is the default format enumeration value if 111254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 112254721Semaste // "definition.default_cstr_value" as a string value that represents the default 113254721Semaste // value. 114288943Sdim { 115288943Sdim Format new_format = eFormatInvalid; 116288943Sdim if (definition.default_cstr_value) 117288943Sdim Args::StringToFormat (definition.default_cstr_value, new_format, nullptr); 118288943Sdim else 119288943Sdim new_format = (Format)definition.default_uint_value; 120288943Sdim m_value_sp.reset (new OptionValueFormat(new_format)); 121288943Sdim } 122288943Sdim break; 123288943Sdim 124288943Sdim case OptionValue::eTypeLanguage: 125288943Sdim // "definition.default_uint_value" is the default language enumeration value if 126288943Sdim // "definition.default_cstr_value" is NULL, otherwise interpret 127288943Sdim // "definition.default_cstr_value" as a string value that represents the default 128288943Sdim // value. 129254721Semaste { 130288943Sdim LanguageType new_lang = eLanguageTypeUnknown; 131254721Semaste if (definition.default_cstr_value) 132288943Sdim LanguageRuntime::GetLanguageTypeFromString(definition.default_cstr_value); 133254721Semaste else 134288943Sdim new_lang = (LanguageType)definition.default_uint_value; 135288943Sdim m_value_sp.reset (new OptionValueLanguage(new_lang)); 136254721Semaste } 137254721Semaste break; 138254721Semaste 139288943Sdim case OptionValue::eTypeFormatEntity: 140288943Sdim // "definition.default_cstr_value" as a string value that represents the default 141288943Sdim m_value_sp.reset (new OptionValueFormatEntity(definition.default_cstr_value)); 142288943Sdim break; 143288943Sdim 144254721Semaste case OptionValue::eTypePathMap: 145254721Semaste // "definition.default_uint_value" tells us if notifications should occur for 146254721Semaste // path mappings 147254721Semaste m_value_sp.reset (new OptionValuePathMappings(definition.default_uint_value != 0)); 148254721Semaste break; 149254721Semaste 150254721Semaste case OptionValue::eTypeRegex: 151254721Semaste // "definition.default_uint_value" is used to the regular expression flags 152254721Semaste // "definition.default_cstr_value" the default regular expression value 153254721Semaste // value. 154288943Sdim m_value_sp.reset (new OptionValueRegex(definition.default_cstr_value)); 155254721Semaste break; 156254721Semaste 157254721Semaste case OptionValue::eTypeSInt64: 158254721Semaste // "definition.default_uint_value" is the default integer value if 159254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 160254721Semaste // "definition.default_cstr_value" as a string value that represents the default 161254721Semaste // value. 162288943Sdim m_value_sp.reset (new OptionValueSInt64(definition.default_cstr_value ? StringConvert::ToSInt64 (definition.default_cstr_value) : definition.default_uint_value)); 163254721Semaste break; 164254721Semaste 165254721Semaste case OptionValue::eTypeUInt64: 166254721Semaste // "definition.default_uint_value" is the default unsigned integer value if 167254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 168254721Semaste // "definition.default_cstr_value" as a string value that represents the default 169254721Semaste // value. 170288943Sdim m_value_sp.reset (new OptionValueUInt64(definition.default_cstr_value ? StringConvert::ToUInt64 (definition.default_cstr_value) : definition.default_uint_value)); 171254721Semaste break; 172254721Semaste 173254721Semaste case OptionValue::eTypeUUID: 174254721Semaste // "definition.default_uint_value" is not used for a OptionValue::eTypeUUID 175254721Semaste // "definition.default_cstr_value" can contain a default UUID value 176288943Sdim { 177288943Sdim UUID uuid; 178288943Sdim if (definition.default_cstr_value) 179288943Sdim uuid.SetFromCString (definition.default_cstr_value); 180288943Sdim m_value_sp.reset (new OptionValueUUID(uuid)); 181288943Sdim } 182254721Semaste break; 183254721Semaste 184254721Semaste case OptionValue::eTypeString: 185254721Semaste // "definition.default_uint_value" can contain the string option flags OR'ed together 186254721Semaste // "definition.default_cstr_value" can contain a default string value 187254721Semaste { 188254721Semaste OptionValueString *string_value = new OptionValueString(definition.default_cstr_value); 189254721Semaste if (definition.default_uint_value != 0) 190254721Semaste string_value->GetOptions().Reset(definition.default_uint_value); 191254721Semaste m_value_sp.reset (string_value); 192254721Semaste } 193254721Semaste break; 194254721Semaste } 195254721Semaste} 196254721Semaste 197254721SemasteProperty::Property (const ConstString &name, 198254721Semaste const ConstString &desc, 199254721Semaste bool is_global, 200254721Semaste const lldb::OptionValueSP &value_sp) : 201254721Semaste m_name (name), 202254721Semaste m_description (desc), 203254721Semaste m_value_sp (value_sp), 204254721Semaste m_is_global (is_global) 205254721Semaste{ 206254721Semaste} 207254721Semaste 208254721Semastebool 209254721SemasteProperty::DumpQualifiedName(Stream &strm) const 210254721Semaste{ 211254721Semaste if (m_name) 212254721Semaste { 213254721Semaste if (m_value_sp->DumpQualifiedName(strm)) 214254721Semaste strm.PutChar('.'); 215254721Semaste strm << m_name; 216254721Semaste return true; 217254721Semaste } 218254721Semaste return false; 219254721Semaste} 220254721Semaste 221254721Semaste 222254721Semastevoid 223254721SemasteProperty::Dump (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) const 224254721Semaste{ 225254721Semaste if (m_value_sp) 226254721Semaste { 227254721Semaste const bool dump_desc = dump_mask & OptionValue::eDumpOptionDescription; 228254721Semaste const bool transparent = m_value_sp->ValueIsTransparent (); 229254721Semaste if (dump_desc || !transparent) 230254721Semaste { 231254721Semaste if ((dump_mask & OptionValue::eDumpOptionName) && m_name) 232254721Semaste { 233254721Semaste DumpQualifiedName(strm); 234254721Semaste if (dump_mask & ~OptionValue::eDumpOptionName) 235254721Semaste strm.PutChar(' '); 236254721Semaste } 237254721Semaste } 238254721Semaste if (dump_desc) 239254721Semaste { 240254721Semaste const char *desc = GetDescription(); 241254721Semaste if (desc) 242254721Semaste strm.Printf ("-- %s", desc); 243254721Semaste 244254721Semaste if (transparent && (dump_mask == (OptionValue::eDumpOptionName | OptionValue::eDumpOptionDescription))) 245254721Semaste strm.EOL(); 246254721Semaste } 247254721Semaste m_value_sp->DumpValue(exe_ctx, strm, dump_mask); 248254721Semaste } 249254721Semaste} 250254721Semaste 251254721Semaste 252254721Semastevoid 253254721SemasteProperty::DumpDescription (CommandInterpreter &interpreter, 254254721Semaste Stream &strm, 255254721Semaste uint32_t output_width, 256254721Semaste bool display_qualified_name) const 257254721Semaste{ 258254721Semaste if (m_value_sp) 259254721Semaste { 260254721Semaste const char *desc = GetDescription(); 261254721Semaste 262254721Semaste if (desc) 263254721Semaste { 264254721Semaste StreamString qualified_name; 265254721Semaste const OptionValueProperties *sub_properties = m_value_sp->GetAsProperties(); 266254721Semaste if (sub_properties) 267254721Semaste { 268254721Semaste strm.EOL(); 269254721Semaste 270254721Semaste if (m_value_sp->DumpQualifiedName(qualified_name)) 271254721Semaste strm.Printf("'%s' variables:\n\n", qualified_name.GetString().c_str()); 272254721Semaste sub_properties->DumpAllDescriptions(interpreter, strm); 273254721Semaste } 274254721Semaste else 275254721Semaste { 276254721Semaste if (desc) 277254721Semaste { 278254721Semaste if (display_qualified_name) 279254721Semaste { 280254721Semaste StreamString qualified_name; 281254721Semaste DumpQualifiedName(qualified_name); 282254721Semaste interpreter.OutputFormattedHelpText (strm, 283254721Semaste qualified_name.GetString().c_str(), 284254721Semaste "--", 285254721Semaste desc, 286254721Semaste output_width); 287254721Semaste } 288254721Semaste else 289254721Semaste { 290254721Semaste interpreter.OutputFormattedHelpText (strm, 291254721Semaste m_name.GetCString(), 292254721Semaste "--", 293254721Semaste desc, 294254721Semaste output_width); 295254721Semaste } 296254721Semaste } 297254721Semaste } 298254721Semaste } 299254721Semaste } 300254721Semaste} 301254721Semaste 302280031Sdim 303280031Sdimvoid 304280031SdimProperty::SetValueChangedCallback (OptionValueChangedCallback callback, void *baton) 305280031Sdim{ 306280031Sdim if (m_value_sp) 307280031Sdim m_value_sp->SetValueChangedCallback (callback, baton); 308280031Sdim} 309280031Sdim 310280031Sdim 311