1 //====-- UserSettingsController.h --------------------------------*- C++-*-===//
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 #ifndef liblldb_UserSettingsController_h_
10 #define liblldb_UserSettingsController_h_
11 
12 #include "lldb/Utility/Status.h"
13 #include "lldb/lldb-forward.h"
14 #include "lldb/lldb-private-enumerations.h"
15 
16 #include "llvm/ADT/StringRef.h"
17 
18 #include <vector>
19 
20 #include <stddef.h>
21 #include <stdint.h>
22 
23 namespace lldb_private {
24 class CommandInterpreter;
25 class ConstString;
26 class ExecutionContext;
27 class Property;
28 class Stream;
29 }
30 
31 namespace lldb_private {
32 
33 class Properties {
34 public:
35   Properties() : m_collection_sp() {}
36 
37   Properties(const lldb::OptionValuePropertiesSP &collection_sp)
38       : m_collection_sp(collection_sp) {}
39 
40   virtual ~Properties() {}
41 
42   virtual lldb::OptionValuePropertiesSP GetValueProperties() const {
43     // This function is virtual in case subclasses want to lazily implement
44     // creating the properties.
45     return m_collection_sp;
46   }
47 
48   virtual lldb::OptionValueSP GetPropertyValue(const ExecutionContext *exe_ctx,
49                                                llvm::StringRef property_path,
50                                                bool will_modify,
51                                                Status &error) const;
52 
53   virtual Status SetPropertyValue(const ExecutionContext *exe_ctx,
54                                   VarSetOperationType op,
55                                   llvm::StringRef property_path,
56                                   llvm::StringRef value);
57 
58   virtual Status DumpPropertyValue(const ExecutionContext *exe_ctx,
59                                    Stream &strm, llvm::StringRef property_path,
60                                    uint32_t dump_mask);
61 
62   virtual void DumpAllPropertyValues(const ExecutionContext *exe_ctx,
63                                      Stream &strm, uint32_t dump_mask);
64 
65   virtual void DumpAllDescriptions(CommandInterpreter &interpreter,
66                                    Stream &strm) const;
67 
68   size_t Apropos(llvm::StringRef keyword,
69                  std::vector<const Property *> &matching_properties) const;
70 
71   lldb::OptionValuePropertiesSP GetSubProperty(const ExecutionContext *exe_ctx,
72                                                ConstString name);
73 
74   // We sometimes need to introduce a setting to enable experimental features,
75   // but then we don't want the setting for these to cause errors when the
76   // setting goes away.  Add a sub-topic of the settings using this
77   // experimental name, and two things will happen.  One is that settings that
78   // don't find the name will not be treated as errors.  Also, if you decide to
79   // keep the settings just move them into the containing properties, and we
80   // will auto-forward the experimental settings to the real one.
81   static const char *GetExperimentalSettingsName();
82 
83   static bool IsSettingExperimental(llvm::StringRef setting);
84 
85 protected:
86   lldb::OptionValuePropertiesSP m_collection_sp;
87 };
88 
89 } // namespace lldb_private
90 
91 #endif // liblldb_UserSettingsController_h_
92