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 &current_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 &current_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