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