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 LLDB_CORE_USERSETTINGSCONTROLLER_H
10 #define LLDB_CORE_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 <cstddef>
21 #include <cstdint>
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() = default;
36 
37   Properties(const lldb::OptionValuePropertiesSP &collection_sp)
38       : m_collection_sp(collection_sp) {}
39 
40   virtual ~Properties() = default;
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, bool is_json = false);
61 
62   virtual void DumpAllPropertyValues(const ExecutionContext *exe_ctx,
63                                      Stream &strm, uint32_t dump_mask,
64                                      bool is_json = false);
65 
66   virtual void DumpAllDescriptions(CommandInterpreter &interpreter,
67                                    Stream &strm) const;
68 
69   size_t Apropos(llvm::StringRef keyword,
70                  std::vector<const Property *> &matching_properties) const;
71 
72   lldb::OptionValuePropertiesSP GetSubProperty(const ExecutionContext *exe_ctx,
73                                                ConstString name);
74 
75   // We sometimes need to introduce a setting to enable experimental features,
76   // but then we don't want the setting for these to cause errors when the
77   // setting goes away.  Add a sub-topic of the settings using this
78   // experimental name, and two things will happen.  One is that settings that
79   // don't find the name will not be treated as errors.  Also, if you decide to
80   // keep the settings just move them into the containing properties, and we
81   // will auto-forward the experimental settings to the real one.
82   static const char *GetExperimentalSettingsName();
83 
84   static bool IsSettingExperimental(llvm::StringRef setting);
85 
86 protected:
87   lldb::OptionValuePropertiesSP m_collection_sp;
88 };
89 
90 } // namespace lldb_private
91 
92 #endif // LLDB_CORE_USERSETTINGSCONTROLLER_H
93