1*2f3df613SZachary Turner //====-- UserSettingsController.cpp ------------------------------*- C++-*-===//
23df9a8dfSCaroline Tice //
33df9a8dfSCaroline Tice //                     The LLVM Compiler Infrastructure
43df9a8dfSCaroline Tice //
53df9a8dfSCaroline Tice // This file is distributed under the University of Illinois Open Source
63df9a8dfSCaroline Tice // License. See LICENSE.TXT for details.
73df9a8dfSCaroline Tice //
83df9a8dfSCaroline Tice //===----------------------------------------------------------------------===//
93df9a8dfSCaroline Tice 
10b9c1b51eSKate Stone #include "lldb/Core/UserSettingsController.h"
11*2f3df613SZachary Turner 
12633a29cfSZachary Turner #include "lldb/Interpreter/OptionValueProperties.h"
13bf9a7730SZachary Turner #include "lldb/Utility/Error.h"
14bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
15*2f3df613SZachary Turner 
16*2f3df613SZachary Turner #include <memory> // for shared_ptr
17*2f3df613SZachary Turner 
18*2f3df613SZachary Turner namespace lldb_private {
19*2f3df613SZachary Turner class CommandInterpreter;
20*2f3df613SZachary Turner }
21*2f3df613SZachary Turner namespace lldb_private {
22*2f3df613SZachary Turner class ConstString;
23*2f3df613SZachary Turner }
24*2f3df613SZachary Turner namespace lldb_private {
25*2f3df613SZachary Turner class ExecutionContext;
26*2f3df613SZachary Turner }
27*2f3df613SZachary Turner namespace lldb_private {
28*2f3df613SZachary Turner class Property;
29*2f3df613SZachary Turner }
303df9a8dfSCaroline Tice 
31bfe5f3bfSGreg Clayton using namespace lldb;
323df9a8dfSCaroline Tice using namespace lldb_private;
333df9a8dfSCaroline Tice 
3467cc0636SGreg Clayton lldb::OptionValueSP
3531d97a5cSZachary Turner Properties::GetPropertyValue(const ExecutionContext *exe_ctx, llvm::StringRef path,
36b9c1b51eSKate Stone                              bool will_modify, Error &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 
43b9c1b51eSKate Stone Error Properties::SetPropertyValue(const ExecutionContext *exe_ctx,
4431d97a5cSZachary Turner                                    VarSetOperationType op, llvm::StringRef path,
4531d97a5cSZachary Turner   llvm::StringRef value) {
4667cc0636SGreg Clayton   OptionValuePropertiesSP properties_sp(GetValueProperties());
4767cc0636SGreg Clayton   if (properties_sp)
4867cc0636SGreg Clayton     return properties_sp->SetSubValue(exe_ctx, op, path, value);
4967cc0636SGreg Clayton   Error error;
5067cc0636SGreg Clayton   error.SetErrorString("no properties");
5167cc0636SGreg Clayton   return error;
5295852755SJim Ingham }
5395852755SJim Ingham 
54b9c1b51eSKate Stone void Properties::DumpAllPropertyValues(const ExecutionContext *exe_ctx,
55b9c1b51eSKate Stone                                        Stream &strm, uint32_t dump_mask) {
5667cc0636SGreg Clayton   OptionValuePropertiesSP properties_sp(GetValueProperties());
5767cc0636SGreg Clayton   if (properties_sp)
5867cc0636SGreg Clayton     return properties_sp->DumpValue(exe_ctx, strm, dump_mask);
5995852755SJim Ingham }
6095852755SJim Ingham 
61b9c1b51eSKate Stone void Properties::DumpAllDescriptions(CommandInterpreter &interpreter,
62b9c1b51eSKate Stone                                      Stream &strm) const {
6367cc0636SGreg Clayton   strm.PutCString("Top level variables:\n\n");
643df9a8dfSCaroline Tice 
6567cc0636SGreg Clayton   OptionValuePropertiesSP properties_sp(GetValueProperties());
6667cc0636SGreg Clayton   if (properties_sp)
6767cc0636SGreg Clayton     return properties_sp->DumpAllDescriptions(interpreter, strm);
683df9a8dfSCaroline Tice }
693df9a8dfSCaroline Tice 
70b9c1b51eSKate Stone Error Properties::DumpPropertyValue(const ExecutionContext *exe_ctx,
7131d97a5cSZachary Turner                                     Stream &strm, llvm::StringRef property_path,
72b9c1b51eSKate Stone                                     uint32_t dump_mask) {
7367cc0636SGreg Clayton   OptionValuePropertiesSP properties_sp(GetValueProperties());
74b9c1b51eSKate Stone   if (properties_sp) {
75b9c1b51eSKate Stone     return properties_sp->DumpPropertyValue(exe_ctx, strm, property_path,
7667cc0636SGreg Clayton                                             dump_mask);
7767cc0636SGreg Clayton   }
7867cc0636SGreg Clayton   Error error;
7967cc0636SGreg Clayton   error.SetErrorString("empty property list");
8067cc0636SGreg Clayton   return error;
813df9a8dfSCaroline Tice }
823df9a8dfSCaroline Tice 
833df9a8dfSCaroline Tice size_t
84067d1db1SZachary Turner Properties::Apropos(llvm::StringRef keyword,
85b9c1b51eSKate Stone                     std::vector<const Property *> &matching_properties) const {
8667cc0636SGreg Clayton   OptionValuePropertiesSP properties_sp(GetValueProperties());
87b9c1b51eSKate Stone   if (properties_sp) {
8867cc0636SGreg Clayton     properties_sp->Apropos(keyword, matching_properties);
893df9a8dfSCaroline Tice   }
9067cc0636SGreg Clayton   return matching_properties.size();
91ded2fa39SCaroline Tice }
92e8cd0c98SGreg Clayton 
93e8cd0c98SGreg Clayton lldb::OptionValuePropertiesSP
94e8cd0c98SGreg Clayton Properties::GetSubProperty(const ExecutionContext *exe_ctx,
95b9c1b51eSKate Stone                            const ConstString &name) {
96e8cd0c98SGreg Clayton   OptionValuePropertiesSP properties_sp(GetValueProperties());
97e8cd0c98SGreg Clayton   if (properties_sp)
98e8cd0c98SGreg Clayton     return properties_sp->GetSubProperty(exe_ctx, name);
99e8cd0c98SGreg Clayton   return lldb::OptionValuePropertiesSP();
100e8cd0c98SGreg Clayton }
101e8cd0c98SGreg Clayton 
102b9c1b51eSKate Stone const char *Properties::GetExperimentalSettingsName() { return "experimental"; }
1038b57dcf8SJim Ingham 
10431d97a5cSZachary Turner bool Properties::IsSettingExperimental(llvm::StringRef setting) {
10531d97a5cSZachary Turner   if (setting.empty())
1068b57dcf8SJim Ingham     return false;
1078b57dcf8SJim Ingham 
10831d97a5cSZachary Turner   llvm::StringRef experimental = GetExperimentalSettingsName();
10931d97a5cSZachary Turner   size_t dot_pos = setting.find_first_of('.');
11031d97a5cSZachary Turner   return setting.take_front(dot_pos) == experimental;
1118b57dcf8SJim Ingham }
112