Property.cpp revision 341825
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" 19341825Sdim#include "lldb/Interpreter/OptionArgParser.h" 20254721Semaste#include "lldb/Interpreter/OptionValues.h" 21296417Sdim#include "lldb/Target/Language.h" 22254721Semaste 23254721Semasteusing namespace lldb; 24254721Semasteusing namespace lldb_private; 25254721Semaste 26314564SdimProperty::Property(const PropertyDefinition &definition) 27314564Sdim : m_name(definition.name), m_description(definition.description), 28314564Sdim m_value_sp(), m_is_global(definition.global) { 29314564Sdim switch (definition.type) { 30314564Sdim case OptionValue::eTypeInvalid: 31314564Sdim case OptionValue::eTypeProperties: 32314564Sdim break; 33314564Sdim case OptionValue::eTypeArch: 34314564Sdim // "definition.default_uint_value" is not used 35314564Sdim // "definition.default_cstr_value" as a string value that represents the 36314564Sdim // default string value for the architecture/triple 37314564Sdim m_value_sp.reset(new OptionValueArch(definition.default_cstr_value)); 38314564Sdim break; 39280031Sdim 40314564Sdim case OptionValue::eTypeArgs: 41314564Sdim // "definition.default_uint_value" is always a OptionValue::Type 42314564Sdim m_value_sp.reset(new OptionValueArgs()); 43314564Sdim break; 44280031Sdim 45314564Sdim case OptionValue::eTypeArray: 46314564Sdim // "definition.default_uint_value" is always a OptionValue::Type 47314564Sdim m_value_sp.reset(new OptionValueArray(OptionValue::ConvertTypeToMask( 48314564Sdim (OptionValue::Type)definition.default_uint_value))); 49314564Sdim break; 50314564Sdim 51314564Sdim case OptionValue::eTypeBoolean: 52314564Sdim // "definition.default_uint_value" is the default boolean value if 53314564Sdim // "definition.default_cstr_value" is NULL, otherwise interpret 54314564Sdim // "definition.default_cstr_value" as a string value that represents the 55314564Sdim // default value. 56314564Sdim if (definition.default_cstr_value) 57341825Sdim m_value_sp.reset(new OptionValueBoolean(OptionArgParser::ToBoolean( 58314564Sdim llvm::StringRef(definition.default_cstr_value), false, nullptr))); 59314564Sdim else 60314564Sdim m_value_sp.reset( 61314564Sdim new OptionValueBoolean(definition.default_uint_value != 0)); 62314564Sdim break; 63314564Sdim 64314564Sdim case OptionValue::eTypeChar: { 65314564Sdim llvm::StringRef s(definition.default_cstr_value ? definition.default_cstr_value : ""); 66341825Sdim m_value_sp = std::make_shared<OptionValueChar>( 67341825Sdim OptionArgParser::ToChar(s, '\0', nullptr)); 68314564Sdim break; 69314564Sdim } 70314564Sdim case OptionValue::eTypeDictionary: 71314564Sdim // "definition.default_uint_value" is always a OptionValue::Type 72314564Sdim m_value_sp.reset(new OptionValueDictionary(OptionValue::ConvertTypeToMask( 73314564Sdim (OptionValue::Type)definition.default_uint_value))); 74314564Sdim break; 75314564Sdim 76314564Sdim case OptionValue::eTypeEnum: 77314564Sdim // "definition.default_uint_value" is the default enumeration value if 78314564Sdim // "definition.default_cstr_value" is NULL, otherwise interpret 79314564Sdim // "definition.default_cstr_value" as a string value that represents the 80341825Sdim // default value. 81314564Sdim { 82314564Sdim OptionValueEnumeration *enum_value = new OptionValueEnumeration( 83314564Sdim definition.enum_values, definition.default_uint_value); 84314564Sdim m_value_sp.reset(enum_value); 85314564Sdim if (definition.default_cstr_value) { 86314564Sdim if (enum_value 87314564Sdim ->SetValueFromString( 88314564Sdim llvm::StringRef(definition.default_cstr_value)) 89314564Sdim .Success()) { 90314564Sdim enum_value->SetDefaultValue(enum_value->GetCurrentValue()); 91341825Sdim // Call Clear() since we don't want the value to appear as having 92341825Sdim // been set since we called SetValueFromString() above. Clear will 93341825Sdim // set the current value to the default and clear the boolean that 94341825Sdim // says that the value has been set. 95314564Sdim enum_value->Clear(); 96254721Semaste } 97314564Sdim } 98254721Semaste } 99314564Sdim break; 100254721Semaste 101314564Sdim case OptionValue::eTypeFileSpec: { 102314564Sdim // "definition.default_uint_value" represents if the 103341825Sdim // "definition.default_cstr_value" should be resolved or not 104314564Sdim const bool resolve = definition.default_uint_value != 0; 105314564Sdim m_value_sp.reset(new OptionValueFileSpec( 106314564Sdim FileSpec(definition.default_cstr_value, resolve), resolve)); 107314564Sdim break; 108314564Sdim } 109254721Semaste 110314564Sdim case OptionValue::eTypeFileSpecList: 111314564Sdim // "definition.default_uint_value" is not used for a 112314564Sdim // OptionValue::eTypeFileSpecList 113314564Sdim m_value_sp.reset(new OptionValueFileSpecList()); 114314564Sdim break; 115314564Sdim 116314564Sdim case OptionValue::eTypeFormat: 117314564Sdim // "definition.default_uint_value" is the default format enumeration value 118341825Sdim // if "definition.default_cstr_value" is NULL, otherwise interpret 119314564Sdim // "definition.default_cstr_value" as a string value that represents the 120341825Sdim // default value. 121254721Semaste { 122314564Sdim Format new_format = eFormatInvalid; 123314564Sdim if (definition.default_cstr_value) 124341825Sdim OptionArgParser::ToFormat(definition.default_cstr_value, new_format, 125341825Sdim nullptr); 126314564Sdim else 127314564Sdim new_format = (Format)definition.default_uint_value; 128314564Sdim m_value_sp.reset(new OptionValueFormat(new_format)); 129254721Semaste } 130314564Sdim break; 131254721Semaste 132314564Sdim case OptionValue::eTypeLanguage: 133341825Sdim // "definition.default_uint_value" is the default language enumeration 134341825Sdim // value if "definition.default_cstr_value" is NULL, otherwise interpret 135314564Sdim // "definition.default_cstr_value" as a string value that represents the 136341825Sdim // default value. 137314564Sdim { 138314564Sdim LanguageType new_lang = eLanguageTypeUnknown; 139314564Sdim if (definition.default_cstr_value) 140314564Sdim Language::GetLanguageTypeFromString( 141314564Sdim llvm::StringRef(definition.default_cstr_value)); 142314564Sdim else 143314564Sdim new_lang = (LanguageType)definition.default_uint_value; 144314564Sdim m_value_sp.reset(new OptionValueLanguage(new_lang)); 145314564Sdim } 146314564Sdim break; 147254721Semaste 148314564Sdim case OptionValue::eTypeFormatEntity: 149314564Sdim // "definition.default_cstr_value" as a string value that represents the 150314564Sdim // default 151314564Sdim m_value_sp.reset( 152314564Sdim new OptionValueFormatEntity(definition.default_cstr_value)); 153314564Sdim break; 154314564Sdim 155314564Sdim case OptionValue::eTypePathMap: 156314564Sdim // "definition.default_uint_value" tells us if notifications should occur 157341825Sdim // for path mappings 158314564Sdim m_value_sp.reset( 159314564Sdim new OptionValuePathMappings(definition.default_uint_value != 0)); 160314564Sdim break; 161314564Sdim 162314564Sdim case OptionValue::eTypeRegex: 163314564Sdim // "definition.default_uint_value" is used to the regular expression flags 164314564Sdim // "definition.default_cstr_value" the default regular expression value 165314564Sdim // value. 166314564Sdim m_value_sp.reset(new OptionValueRegex(definition.default_cstr_value)); 167314564Sdim break; 168314564Sdim 169314564Sdim case OptionValue::eTypeSInt64: 170314564Sdim // "definition.default_uint_value" is the default integer value if 171314564Sdim // "definition.default_cstr_value" is NULL, otherwise interpret 172314564Sdim // "definition.default_cstr_value" as a string value that represents the 173341825Sdim // default value. 174314564Sdim m_value_sp.reset(new OptionValueSInt64( 175314564Sdim definition.default_cstr_value 176314564Sdim ? StringConvert::ToSInt64(definition.default_cstr_value) 177314564Sdim : definition.default_uint_value)); 178314564Sdim break; 179314564Sdim 180314564Sdim case OptionValue::eTypeUInt64: 181314564Sdim // "definition.default_uint_value" is the default unsigned integer value if 182314564Sdim // "definition.default_cstr_value" is NULL, otherwise interpret 183314564Sdim // "definition.default_cstr_value" as a string value that represents the 184341825Sdim // default value. 185314564Sdim m_value_sp.reset(new OptionValueUInt64( 186314564Sdim definition.default_cstr_value 187314564Sdim ? StringConvert::ToUInt64(definition.default_cstr_value) 188314564Sdim : definition.default_uint_value)); 189314564Sdim break; 190314564Sdim 191314564Sdim case OptionValue::eTypeUUID: 192314564Sdim // "definition.default_uint_value" is not used for a OptionValue::eTypeUUID 193314564Sdim // "definition.default_cstr_value" can contain a default UUID value 194254721Semaste { 195314564Sdim UUID uuid; 196314564Sdim if (definition.default_cstr_value) 197341825Sdim uuid.SetFromStringRef(definition.default_cstr_value); 198314564Sdim m_value_sp.reset(new OptionValueUUID(uuid)); 199254721Semaste } 200314564Sdim break; 201314564Sdim 202314564Sdim case OptionValue::eTypeString: 203341825Sdim // "definition.default_uint_value" can contain the string option flags 204341825Sdim // OR'ed together "definition.default_cstr_value" can contain a default 205341825Sdim // string value 206314564Sdim { 207314564Sdim OptionValueString *string_value = 208314564Sdim new OptionValueString(definition.default_cstr_value); 209314564Sdim if (definition.default_uint_value != 0) 210314564Sdim string_value->GetOptions().Reset(definition.default_uint_value); 211314564Sdim m_value_sp.reset(string_value); 212314564Sdim } 213314564Sdim break; 214314564Sdim } 215254721Semaste} 216254721Semaste 217314564SdimProperty::Property(const ConstString &name, const ConstString &desc, 218314564Sdim bool is_global, const lldb::OptionValueSP &value_sp) 219314564Sdim : m_name(name), m_description(desc), m_value_sp(value_sp), 220314564Sdim m_is_global(is_global) {} 221254721Semaste 222314564Sdimbool Property::DumpQualifiedName(Stream &strm) const { 223314564Sdim if (m_name) { 224314564Sdim if (m_value_sp->DumpQualifiedName(strm)) 225314564Sdim strm.PutChar('.'); 226314564Sdim strm << m_name; 227314564Sdim return true; 228314564Sdim } 229314564Sdim return false; 230314564Sdim} 231254721Semaste 232314564Sdimvoid Property::Dump(const ExecutionContext *exe_ctx, Stream &strm, 233314564Sdim uint32_t dump_mask) const { 234314564Sdim if (m_value_sp) { 235314564Sdim const bool dump_desc = dump_mask & OptionValue::eDumpOptionDescription; 236314564Sdim const bool transparent = m_value_sp->ValueIsTransparent(); 237314564Sdim if (dump_desc || !transparent) { 238314564Sdim if ((dump_mask & OptionValue::eDumpOptionName) && m_name) { 239314564Sdim DumpQualifiedName(strm); 240314564Sdim if (dump_mask & ~OptionValue::eDumpOptionName) 241314564Sdim strm.PutChar(' '); 242314564Sdim } 243254721Semaste } 244314564Sdim if (dump_desc) { 245314564Sdim llvm::StringRef desc = GetDescription(); 246314564Sdim if (!desc.empty()) 247314564Sdim strm << "-- " << desc; 248314564Sdim 249314564Sdim if (transparent && (dump_mask == (OptionValue::eDumpOptionName | 250314564Sdim OptionValue::eDumpOptionDescription))) 251314564Sdim strm.EOL(); 252314564Sdim } 253314564Sdim m_value_sp->DumpValue(exe_ctx, strm, dump_mask); 254314564Sdim } 255254721Semaste} 256254721Semaste 257314564Sdimvoid Property::DumpDescription(CommandInterpreter &interpreter, Stream &strm, 258314564Sdim uint32_t output_width, 259314564Sdim bool display_qualified_name) const { 260314564Sdim if (!m_value_sp) 261314564Sdim return; 262314564Sdim llvm::StringRef desc = GetDescription(); 263280031Sdim 264314564Sdim if (desc.empty()) 265314564Sdim return; 266314564Sdim 267314564Sdim StreamString qualified_name; 268314564Sdim const OptionValueProperties *sub_properties = m_value_sp->GetAsProperties(); 269314564Sdim if (sub_properties) { 270314564Sdim strm.EOL(); 271314564Sdim 272314564Sdim if (m_value_sp->DumpQualifiedName(qualified_name)) 273314564Sdim strm.Printf("'%s' variables:\n\n", qualified_name.GetData()); 274314564Sdim sub_properties->DumpAllDescriptions(interpreter, strm); 275314564Sdim } else { 276314564Sdim if (display_qualified_name) { 277314564Sdim StreamString qualified_name; 278314564Sdim DumpQualifiedName(qualified_name); 279314564Sdim interpreter.OutputFormattedHelpText(strm, qualified_name.GetString(), 280314564Sdim "--", desc, output_width); 281314564Sdim } else { 282314564Sdim interpreter.OutputFormattedHelpText(strm, m_name.GetStringRef(), "--", 283314564Sdim desc, output_width); 284314564Sdim } 285314564Sdim } 286280031Sdim} 287280031Sdim 288314564Sdimvoid Property::SetValueChangedCallback(OptionValueChangedCallback callback, 289314564Sdim void *baton) { 290314564Sdim if (m_value_sp) 291314564Sdim m_value_sp->SetValueChangedCallback(callback, baton); 292314564Sdim} 293