1 //===-- UserSettingsController.cpp ----------------------------------------===// 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 #include "lldb/Core/UserSettingsController.h" 10 11 #include "lldb/Interpreter/OptionValueProperties.h" 12 #include "lldb/Utility/Status.h" 13 #include "lldb/Utility/Stream.h" 14 15 #include <memory> 16 17 namespace lldb_private { 18 class CommandInterpreter; 19 } 20 namespace lldb_private { 21 class ConstString; 22 } 23 namespace lldb_private { 24 class ExecutionContext; 25 } 26 namespace lldb_private { 27 class Property; 28 } 29 30 using namespace lldb; 31 using namespace lldb_private; 32 33 Properties::Properties() = default; 34 35 Properties::Properties(const lldb::OptionValuePropertiesSP &collection_sp) 36 : m_collection_sp(collection_sp) {} 37 38 Properties::~Properties() = default; 39 40 lldb::OptionValueSP 41 Properties::GetPropertyValue(const ExecutionContext *exe_ctx, 42 llvm::StringRef path, Status &error) const { 43 OptionValuePropertiesSP properties_sp(GetValueProperties()); 44 if (properties_sp) 45 return properties_sp->GetSubValue(exe_ctx, path, error); 46 return lldb::OptionValueSP(); 47 } 48 49 Status Properties::SetPropertyValue(const ExecutionContext *exe_ctx, 50 VarSetOperationType op, 51 llvm::StringRef path, 52 llvm::StringRef value) { 53 OptionValuePropertiesSP properties_sp(GetValueProperties()); 54 if (properties_sp) 55 return properties_sp->SetSubValue(exe_ctx, op, path, value); 56 return Status::FromErrorString("no properties"); 57 } 58 59 void Properties::DumpAllPropertyValues(const ExecutionContext *exe_ctx, 60 Stream &strm, uint32_t dump_mask, 61 bool is_json) { 62 OptionValuePropertiesSP properties_sp(GetValueProperties()); 63 if (!properties_sp) 64 return; 65 66 if (is_json) { 67 llvm::json::Value json = properties_sp->ToJSON(exe_ctx); 68 strm.Printf("%s", llvm::formatv("{0:2}", json).str().c_str()); 69 } else 70 properties_sp->DumpValue(exe_ctx, strm, dump_mask); 71 } 72 73 void Properties::DumpAllDescriptions(CommandInterpreter &interpreter, 74 Stream &strm) const { 75 strm.PutCString("Top level variables:\n\n"); 76 77 OptionValuePropertiesSP properties_sp(GetValueProperties()); 78 if (properties_sp) 79 return properties_sp->DumpAllDescriptions(interpreter, strm); 80 } 81 82 Status Properties::DumpPropertyValue(const ExecutionContext *exe_ctx, 83 Stream &strm, 84 llvm::StringRef property_path, 85 uint32_t dump_mask, bool is_json) { 86 OptionValuePropertiesSP properties_sp(GetValueProperties()); 87 if (properties_sp) { 88 return properties_sp->DumpPropertyValue(exe_ctx, strm, property_path, 89 dump_mask, is_json); 90 } 91 return Status::FromErrorString("empty property list"); 92 } 93 94 size_t 95 Properties::Apropos(llvm::StringRef keyword, 96 std::vector<const Property *> &matching_properties) const { 97 OptionValuePropertiesSP properties_sp(GetValueProperties()); 98 if (properties_sp) { 99 properties_sp->Apropos(keyword, matching_properties); 100 } 101 return matching_properties.size(); 102 } 103 104 llvm::StringRef Properties::GetExperimentalSettingsName() { 105 static constexpr llvm::StringLiteral g_experimental("experimental"); 106 return g_experimental; 107 } 108 109 bool Properties::IsSettingExperimental(llvm::StringRef setting) { 110 if (setting.empty()) 111 return false; 112 113 llvm::StringRef experimental = GetExperimentalSettingsName(); 114 size_t dot_pos = setting.find_first_of('.'); 115 return setting.take_front(dot_pos) == experimental; 116 } 117