1 | //===-- CommandObjectMultiword.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_INTERPRETER_COMMANDOBJECTMULTIWORD_H |
10 | #define LLDB_INTERPRETER_COMMANDOBJECTMULTIWORD_H |
11 | |
12 | #include "lldb/Interpreter/CommandObject.h" |
13 | #include "lldb/Utility/CompletionRequest.h" |
14 | #include <optional> |
15 | |
16 | namespace lldb_private { |
17 | |
18 | // CommandObjectMultiword |
19 | |
20 | class CommandObjectMultiword : public CommandObject { |
21 | // These two want to iterate over the subcommand dictionary. |
22 | friend class CommandInterpreter; |
23 | friend class CommandObjectSyntax; |
24 | |
25 | public: |
26 | CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, |
27 | const char *help = nullptr, |
28 | const char *syntax = nullptr, uint32_t flags = 0); |
29 | |
30 | ~CommandObjectMultiword() override; |
31 | |
32 | bool IsMultiwordObject() override { return true; } |
33 | |
34 | CommandObjectMultiword *GetAsMultiwordCommand() override { return this; } |
35 | |
36 | bool LoadSubCommand(llvm::StringRef cmd_name, |
37 | const lldb::CommandObjectSP &command_obj) override; |
38 | |
39 | llvm::Error LoadUserSubcommand(llvm::StringRef cmd_name, |
40 | const lldb::CommandObjectSP &command_obj, |
41 | bool can_replace) override; |
42 | |
43 | llvm::Error RemoveUserSubcommand(llvm::StringRef cmd_name, bool multiword_okay); |
44 | |
45 | void GenerateHelpText(Stream &output_stream) override; |
46 | |
47 | lldb::CommandObjectSP GetSubcommandSP(llvm::StringRef sub_cmd, |
48 | StringList *matches = nullptr) override; |
49 | |
50 | lldb::CommandObjectSP GetSubcommandSPExact(llvm::StringRef sub_cmd) override; |
51 | |
52 | CommandObject *GetSubcommandObject(llvm::StringRef sub_cmd, |
53 | StringList *matches = nullptr) override; |
54 | |
55 | bool WantsRawCommandString() override { return false; } |
56 | |
57 | void HandleCompletion(CompletionRequest &request) override; |
58 | |
59 | std::optional<std::string> GetRepeatCommand(Args ¤t_command_args, |
60 | uint32_t index) override; |
61 | |
62 | void Execute(const char *args_string, CommandReturnObject &result) override; |
63 | |
64 | bool IsRemovable() const override { return m_can_be_removed; } |
65 | |
66 | void SetRemovable(bool removable) { m_can_be_removed = removable; } |
67 | |
68 | protected: |
69 | CommandObject::CommandMap &GetSubcommandDictionary() { |
70 | return m_subcommand_dict; |
71 | } |
72 | |
73 | CommandObject::CommandMap m_subcommand_dict; |
74 | bool m_can_be_removed; |
75 | }; |
76 | |
77 | class CommandObjectProxy : public CommandObject { |
78 | public: |
79 | CommandObjectProxy(CommandInterpreter &interpreter, const char *name, |
80 | const char *help = nullptr, const char *syntax = nullptr, |
81 | uint32_t flags = 0); |
82 | |
83 | ~CommandObjectProxy() override; |
84 | |
85 | // Subclasses must provide a command object that will be transparently used |
86 | // for this object. |
87 | virtual CommandObject *GetProxyCommandObject() = 0; |
88 | |
89 | llvm::StringRef GetSyntax() override; |
90 | |
91 | llvm::StringRef GetHelp() override; |
92 | |
93 | llvm::StringRef GetHelpLong() override; |
94 | |
95 | bool IsRemovable() const override; |
96 | |
97 | bool IsMultiwordObject() override; |
98 | |
99 | CommandObjectMultiword *GetAsMultiwordCommand() override; |
100 | |
101 | void GenerateHelpText(Stream &result) override; |
102 | |
103 | lldb::CommandObjectSP GetSubcommandSP(llvm::StringRef sub_cmd, |
104 | StringList *matches = nullptr) override; |
105 | |
106 | CommandObject *GetSubcommandObject(llvm::StringRef sub_cmd, |
107 | StringList *matches = nullptr) override; |
108 | |
109 | bool LoadSubCommand(llvm::StringRef cmd_name, |
110 | const lldb::CommandObjectSP &command_obj) override; |
111 | |
112 | bool WantsRawCommandString() override; |
113 | |
114 | bool WantsCompletion() override; |
115 | |
116 | Options *GetOptions() override; |
117 | |
118 | void HandleCompletion(CompletionRequest &request) override; |
119 | |
120 | void |
121 | HandleArgumentCompletion(CompletionRequest &request, |
122 | OptionElementVector &opt_element_vector) override; |
123 | |
124 | std::optional<std::string> GetRepeatCommand(Args ¤t_command_args, |
125 | uint32_t index) override; |
126 | |
127 | /// \return |
128 | /// An error message to be displayed when the command is executed (i.e. |
129 | /// Execute is called) and \a GetProxyCommandObject returned null. |
130 | virtual llvm::StringRef GetUnsupportedError(); |
131 | |
132 | void Execute(const char *args_string, CommandReturnObject &result) override; |
133 | |
134 | protected: |
135 | // These two want to iterate over the subcommand dictionary. |
136 | friend class CommandInterpreter; |
137 | friend class CommandObjectSyntax; |
138 | }; |
139 | |
140 | } // namespace lldb_private |
141 | |
142 | #endif // LLDB_INTERPRETER_COMMANDOBJECTMULTIWORD_H |
143 | |