1*0b57cec5SDimitry Andric //===-- UserSettingsController.cpp ----------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "lldb/Core/UserSettingsController.h"
10*0b57cec5SDimitry Andric 
11*0b57cec5SDimitry Andric #include "lldb/Interpreter/OptionValueProperties.h"
12*0b57cec5SDimitry Andric #include "lldb/Utility/Status.h"
13*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
14*0b57cec5SDimitry Andric 
15*0b57cec5SDimitry Andric #include <memory>
16*0b57cec5SDimitry Andric 
17*0b57cec5SDimitry Andric namespace lldb_private {
18*0b57cec5SDimitry Andric class CommandInterpreter;
19*0b57cec5SDimitry Andric }
20*0b57cec5SDimitry Andric namespace lldb_private {
21*0b57cec5SDimitry Andric class ConstString;
22*0b57cec5SDimitry Andric }
23*0b57cec5SDimitry Andric namespace lldb_private {
24*0b57cec5SDimitry Andric class ExecutionContext;
25*0b57cec5SDimitry Andric }
26*0b57cec5SDimitry Andric namespace lldb_private {
27*0b57cec5SDimitry Andric class Property;
28*0b57cec5SDimitry Andric }
29*0b57cec5SDimitry Andric 
30*0b57cec5SDimitry Andric using namespace lldb;
31*0b57cec5SDimitry Andric using namespace lldb_private;
32*0b57cec5SDimitry Andric 
33*0b57cec5SDimitry Andric lldb::OptionValueSP
GetPropertyValue(const ExecutionContext * exe_ctx,llvm::StringRef path,bool will_modify,Status & error) const34*0b57cec5SDimitry Andric Properties::GetPropertyValue(const ExecutionContext *exe_ctx,
35*0b57cec5SDimitry Andric                              llvm::StringRef path, bool will_modify,
36*0b57cec5SDimitry Andric                              Status &error) const {
37*0b57cec5SDimitry Andric   OptionValuePropertiesSP properties_sp(GetValueProperties());
38*0b57cec5SDimitry Andric   if (properties_sp)
39*0b57cec5SDimitry Andric     return properties_sp->GetSubValue(exe_ctx, path, will_modify, error);
40*0b57cec5SDimitry Andric   return lldb::OptionValueSP();
41*0b57cec5SDimitry Andric }
42*0b57cec5SDimitry Andric 
SetPropertyValue(const ExecutionContext * exe_ctx,VarSetOperationType op,llvm::StringRef path,llvm::StringRef value)43*0b57cec5SDimitry Andric Status Properties::SetPropertyValue(const ExecutionContext *exe_ctx,
44*0b57cec5SDimitry Andric                                     VarSetOperationType op,
45*0b57cec5SDimitry Andric                                     llvm::StringRef path,
46*0b57cec5SDimitry Andric                                     llvm::StringRef value) {
47*0b57cec5SDimitry Andric   OptionValuePropertiesSP properties_sp(GetValueProperties());
48*0b57cec5SDimitry Andric   if (properties_sp)
49*0b57cec5SDimitry Andric     return properties_sp->SetSubValue(exe_ctx, op, path, value);
50*0b57cec5SDimitry Andric   Status error;
51*0b57cec5SDimitry Andric   error.SetErrorString("no properties");
52*0b57cec5SDimitry Andric   return error;
53*0b57cec5SDimitry Andric }
54*0b57cec5SDimitry Andric 
DumpAllPropertyValues(const ExecutionContext * exe_ctx,Stream & strm,uint32_t dump_mask)55*0b57cec5SDimitry Andric void Properties::DumpAllPropertyValues(const ExecutionContext *exe_ctx,
56*0b57cec5SDimitry Andric                                        Stream &strm, uint32_t dump_mask) {
57*0b57cec5SDimitry Andric   OptionValuePropertiesSP properties_sp(GetValueProperties());
58*0b57cec5SDimitry Andric   if (properties_sp)
59*0b57cec5SDimitry Andric     return properties_sp->DumpValue(exe_ctx, strm, dump_mask);
60*0b57cec5SDimitry Andric }
61*0b57cec5SDimitry Andric 
DumpAllDescriptions(CommandInterpreter & interpreter,Stream & strm) const62*0b57cec5SDimitry Andric void Properties::DumpAllDescriptions(CommandInterpreter &interpreter,
63*0b57cec5SDimitry Andric                                      Stream &strm) const {
64*0b57cec5SDimitry Andric   strm.PutCString("Top level variables:\n\n");
65*0b57cec5SDimitry Andric 
66*0b57cec5SDimitry Andric   OptionValuePropertiesSP properties_sp(GetValueProperties());
67*0b57cec5SDimitry Andric   if (properties_sp)
68*0b57cec5SDimitry Andric     return properties_sp->DumpAllDescriptions(interpreter, strm);
69*0b57cec5SDimitry Andric }
70*0b57cec5SDimitry Andric 
DumpPropertyValue(const ExecutionContext * exe_ctx,Stream & strm,llvm::StringRef property_path,uint32_t dump_mask)71*0b57cec5SDimitry Andric Status Properties::DumpPropertyValue(const ExecutionContext *exe_ctx,
72*0b57cec5SDimitry Andric                                      Stream &strm,
73*0b57cec5SDimitry Andric                                      llvm::StringRef property_path,
74*0b57cec5SDimitry Andric                                      uint32_t dump_mask) {
75*0b57cec5SDimitry Andric   OptionValuePropertiesSP properties_sp(GetValueProperties());
76*0b57cec5SDimitry Andric   if (properties_sp) {
77*0b57cec5SDimitry Andric     return properties_sp->DumpPropertyValue(exe_ctx, strm, property_path,
78*0b57cec5SDimitry Andric                                             dump_mask);
79*0b57cec5SDimitry Andric   }
80*0b57cec5SDimitry Andric   Status error;
81*0b57cec5SDimitry Andric   error.SetErrorString("empty property list");
82*0b57cec5SDimitry Andric   return error;
83*0b57cec5SDimitry Andric }
84*0b57cec5SDimitry Andric 
85*0b57cec5SDimitry Andric size_t
Apropos(llvm::StringRef keyword,std::vector<const Property * > & matching_properties) const86*0b57cec5SDimitry Andric Properties::Apropos(llvm::StringRef keyword,
87*0b57cec5SDimitry Andric                     std::vector<const Property *> &matching_properties) const {
88*0b57cec5SDimitry Andric   OptionValuePropertiesSP properties_sp(GetValueProperties());
89*0b57cec5SDimitry Andric   if (properties_sp) {
90*0b57cec5SDimitry Andric     properties_sp->Apropos(keyword, matching_properties);
91*0b57cec5SDimitry Andric   }
92*0b57cec5SDimitry Andric   return matching_properties.size();
93*0b57cec5SDimitry Andric }
94*0b57cec5SDimitry Andric 
95*0b57cec5SDimitry Andric lldb::OptionValuePropertiesSP
GetSubProperty(const ExecutionContext * exe_ctx,ConstString name)96*0b57cec5SDimitry Andric Properties::GetSubProperty(const ExecutionContext *exe_ctx,
97*0b57cec5SDimitry Andric                            ConstString name) {
98*0b57cec5SDimitry Andric   OptionValuePropertiesSP properties_sp(GetValueProperties());
99*0b57cec5SDimitry Andric   if (properties_sp)
100*0b57cec5SDimitry Andric     return properties_sp->GetSubProperty(exe_ctx, name);
101*0b57cec5SDimitry Andric   return lldb::OptionValuePropertiesSP();
102*0b57cec5SDimitry Andric }
103*0b57cec5SDimitry Andric 
GetExperimentalSettingsName()104*0b57cec5SDimitry Andric const char *Properties::GetExperimentalSettingsName() { return "experimental"; }
105*0b57cec5SDimitry Andric 
IsSettingExperimental(llvm::StringRef setting)106*0b57cec5SDimitry Andric bool Properties::IsSettingExperimental(llvm::StringRef setting) {
107*0b57cec5SDimitry Andric   if (setting.empty())
108*0b57cec5SDimitry Andric     return false;
109*0b57cec5SDimitry Andric 
110*0b57cec5SDimitry Andric   llvm::StringRef experimental = GetExperimentalSettingsName();
111*0b57cec5SDimitry Andric   size_t dot_pos = setting.find_first_of('.');
112*0b57cec5SDimitry Andric   return setting.take_front(dot_pos) == experimental;
113*0b57cec5SDimitry Andric }
114