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   Status error;
57   error.SetErrorString("no properties");
58   return error;
59 }
60 
61 void Properties::DumpAllPropertyValues(const ExecutionContext *exe_ctx,
62                                        Stream &strm, uint32_t dump_mask,
63                                        bool is_json) {
64   OptionValuePropertiesSP properties_sp(GetValueProperties());
65   if (!properties_sp)
66     return;
67 
68   if (is_json) {
69     llvm::json::Value json = properties_sp->ToJSON(exe_ctx);
70     strm.Printf("%s", llvm::formatv("{0:2}", json).str().c_str());
71   } else
72     properties_sp->DumpValue(exe_ctx, strm, dump_mask);
73 }
74 
75 void Properties::DumpAllDescriptions(CommandInterpreter &interpreter,
76                                      Stream &strm) const {
77   strm.PutCString("Top level variables:\n\n");
78 
79   OptionValuePropertiesSP properties_sp(GetValueProperties());
80   if (properties_sp)
81     return properties_sp->DumpAllDescriptions(interpreter, strm);
82 }
83 
84 Status Properties::DumpPropertyValue(const ExecutionContext *exe_ctx,
85                                      Stream &strm,
86                                      llvm::StringRef property_path,
87                                      uint32_t dump_mask, bool is_json) {
88   OptionValuePropertiesSP properties_sp(GetValueProperties());
89   if (properties_sp) {
90     return properties_sp->DumpPropertyValue(exe_ctx, strm, property_path,
91                                             dump_mask, is_json);
92   }
93   Status error;
94   error.SetErrorString("empty property list");
95   return error;
96 }
97 
98 size_t
99 Properties::Apropos(llvm::StringRef keyword,
100                     std::vector<const Property *> &matching_properties) const {
101   OptionValuePropertiesSP properties_sp(GetValueProperties());
102   if (properties_sp) {
103     properties_sp->Apropos(keyword, matching_properties);
104   }
105   return matching_properties.size();
106 }
107 
108 llvm::StringRef Properties::GetExperimentalSettingsName() {
109   static constexpr llvm::StringLiteral g_experimental("experimental");
110   return g_experimental;
111 }
112 
113 bool Properties::IsSettingExperimental(llvm::StringRef setting) {
114   if (setting.empty())
115     return false;
116 
117   llvm::StringRef experimental = GetExperimentalSettingsName();
118   size_t dot_pos = setting.find_first_of('.');
119   return setting.take_front(dot_pos) == experimental;
120 }
121