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 IsMultiwordObject()32 bool IsMultiwordObject() override { return true; } 33 GetAsMultiwordCommand()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 WantsRawCommandString()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 bool Execute(const char *args_string, CommandReturnObject &result) override; 63 IsRemovable()64 bool IsRemovable() const override { return m_can_be_removed; } 65 SetRemovable(bool removable)66 void SetRemovable(bool removable) { m_can_be_removed = removable; } 67 68 protected: GetSubcommandDictionary()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 bool 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