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