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