1*80814287SRaphael Isemann //===-- UserSettingsController.cpp ----------------------------------------===//
23df9a8dfSCaroline Tice //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63df9a8dfSCaroline Tice //
73df9a8dfSCaroline Tice //===----------------------------------------------------------------------===//
83df9a8dfSCaroline Tice
9b9c1b51eSKate Stone #include "lldb/Core/UserSettingsController.h"
102f3df613SZachary Turner
11633a29cfSZachary Turner #include "lldb/Interpreter/OptionValueProperties.h"
1297206d57SZachary Turner #include "lldb/Utility/Status.h"
13bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
142f3df613SZachary Turner
15672d2c12SJonas Devlieghere #include <memory>
162f3df613SZachary Turner
172f3df613SZachary Turner namespace lldb_private {
182f3df613SZachary Turner class CommandInterpreter;
192f3df613SZachary Turner }
202f3df613SZachary Turner namespace lldb_private {
212f3df613SZachary Turner class ConstString;
222f3df613SZachary Turner }
232f3df613SZachary Turner namespace lldb_private {
242f3df613SZachary Turner class ExecutionContext;
252f3df613SZachary Turner }
262f3df613SZachary Turner namespace lldb_private {
272f3df613SZachary Turner class Property;
282f3df613SZachary Turner }
293df9a8dfSCaroline Tice
30bfe5f3bfSGreg Clayton using namespace lldb;
313df9a8dfSCaroline Tice using namespace lldb_private;
323df9a8dfSCaroline Tice
3367cc0636SGreg Clayton lldb::OptionValueSP
GetPropertyValue(const ExecutionContext * exe_ctx,llvm::StringRef path,bool will_modify,Status & error) const3497206d57SZachary Turner Properties::GetPropertyValue(const ExecutionContext *exe_ctx,
3597206d57SZachary Turner llvm::StringRef path, bool will_modify,
3697206d57SZachary Turner Status &error) const {
3767cc0636SGreg Clayton OptionValuePropertiesSP properties_sp(GetValueProperties());
3867cc0636SGreg Clayton if (properties_sp)
3967cc0636SGreg Clayton return properties_sp->GetSubValue(exe_ctx, path, will_modify, error);
4067cc0636SGreg Clayton return lldb::OptionValueSP();
41bfe5f3bfSGreg Clayton }
42bfe5f3bfSGreg Clayton
SetPropertyValue(const ExecutionContext * exe_ctx,VarSetOperationType op,llvm::StringRef path,llvm::StringRef value)4397206d57SZachary Turner Status Properties::SetPropertyValue(const ExecutionContext *exe_ctx,
4497206d57SZachary Turner VarSetOperationType op,
4597206d57SZachary Turner llvm::StringRef path,
4631d97a5cSZachary Turner llvm::StringRef value) {
4767cc0636SGreg Clayton OptionValuePropertiesSP properties_sp(GetValueProperties());
4867cc0636SGreg Clayton if (properties_sp)
4967cc0636SGreg Clayton return properties_sp->SetSubValue(exe_ctx, op, path, value);
5097206d57SZachary Turner Status error;
5167cc0636SGreg Clayton error.SetErrorString("no properties");
5267cc0636SGreg Clayton return error;
5395852755SJim Ingham }
5495852755SJim Ingham
DumpAllPropertyValues(const ExecutionContext * exe_ctx,Stream & strm,uint32_t dump_mask)55b9c1b51eSKate Stone void Properties::DumpAllPropertyValues(const ExecutionContext *exe_ctx,
56b9c1b51eSKate Stone Stream &strm, uint32_t dump_mask) {
5767cc0636SGreg Clayton OptionValuePropertiesSP properties_sp(GetValueProperties());
5867cc0636SGreg Clayton if (properties_sp)
5967cc0636SGreg Clayton return properties_sp->DumpValue(exe_ctx, strm, dump_mask);
6095852755SJim Ingham }
6195852755SJim Ingham
DumpAllDescriptions(CommandInterpreter & interpreter,Stream & strm) const62b9c1b51eSKate Stone void Properties::DumpAllDescriptions(CommandInterpreter &interpreter,
63b9c1b51eSKate Stone Stream &strm) const {
6467cc0636SGreg Clayton strm.PutCString("Top level variables:\n\n");
653df9a8dfSCaroline Tice
6667cc0636SGreg Clayton OptionValuePropertiesSP properties_sp(GetValueProperties());
6767cc0636SGreg Clayton if (properties_sp)
6867cc0636SGreg Clayton return properties_sp->DumpAllDescriptions(interpreter, strm);
693df9a8dfSCaroline Tice }
703df9a8dfSCaroline Tice
DumpPropertyValue(const ExecutionContext * exe_ctx,Stream & strm,llvm::StringRef property_path,uint32_t dump_mask)7197206d57SZachary Turner Status Properties::DumpPropertyValue(const ExecutionContext *exe_ctx,
7297206d57SZachary Turner Stream &strm,
7397206d57SZachary Turner llvm::StringRef property_path,
74b9c1b51eSKate Stone uint32_t dump_mask) {
7567cc0636SGreg Clayton OptionValuePropertiesSP properties_sp(GetValueProperties());
76b9c1b51eSKate Stone if (properties_sp) {
77b9c1b51eSKate Stone return properties_sp->DumpPropertyValue(exe_ctx, strm, property_path,
7867cc0636SGreg Clayton dump_mask);
7967cc0636SGreg Clayton }
8097206d57SZachary Turner Status error;
8167cc0636SGreg Clayton error.SetErrorString("empty property list");
8267cc0636SGreg Clayton return error;
833df9a8dfSCaroline Tice }
843df9a8dfSCaroline Tice
853df9a8dfSCaroline Tice size_t
Apropos(llvm::StringRef keyword,std::vector<const Property * > & matching_properties) const86067d1db1SZachary Turner Properties::Apropos(llvm::StringRef keyword,
87b9c1b51eSKate Stone std::vector<const Property *> &matching_properties) const {
8867cc0636SGreg Clayton OptionValuePropertiesSP properties_sp(GetValueProperties());
89b9c1b51eSKate Stone if (properties_sp) {
9067cc0636SGreg Clayton properties_sp->Apropos(keyword, matching_properties);
913df9a8dfSCaroline Tice }
9267cc0636SGreg Clayton return matching_properties.size();
93ded2fa39SCaroline Tice }
94e8cd0c98SGreg Clayton
95e8cd0c98SGreg Clayton lldb::OptionValuePropertiesSP
GetSubProperty(const ExecutionContext * exe_ctx,ConstString name)96e8cd0c98SGreg Clayton Properties::GetSubProperty(const ExecutionContext *exe_ctx,
970e4c4821SAdrian Prantl ConstString name) {
98e8cd0c98SGreg Clayton OptionValuePropertiesSP properties_sp(GetValueProperties());
99e8cd0c98SGreg Clayton if (properties_sp)
100e8cd0c98SGreg Clayton return properties_sp->GetSubProperty(exe_ctx, name);
101e8cd0c98SGreg Clayton return lldb::OptionValuePropertiesSP();
102e8cd0c98SGreg Clayton }
103e8cd0c98SGreg Clayton
GetExperimentalSettingsName()104b9c1b51eSKate Stone const char *Properties::GetExperimentalSettingsName() { return "experimental"; }
1058b57dcf8SJim Ingham
IsSettingExperimental(llvm::StringRef setting)10631d97a5cSZachary Turner bool Properties::IsSettingExperimental(llvm::StringRef setting) {
10731d97a5cSZachary Turner if (setting.empty())
1088b57dcf8SJim Ingham return false;
1098b57dcf8SJim Ingham
11031d97a5cSZachary Turner llvm::StringRef experimental = GetExperimentalSettingsName();
11131d97a5cSZachary Turner size_t dot_pos = setting.find_first_of('.');
11231d97a5cSZachary Turner return setting.take_front(dot_pos) == experimental;
1138b57dcf8SJim Ingham }
114