54  CommandObject::CommandMap::iterator pos;
 
   57  if (matches == 
nullptr)
 
   58    matches = &local_matches;
 
   62  if (num_matches == 1) {
 
   69      return_cmd_sp = pos->second;
 
 
   85           "tried to add a CommandObject from a different interpreter");
 
 
   91    llvm::StringRef name, 
const CommandObjectSP &cmd_obj_sp, 
bool can_replace) {
 
   95           "tried to add a CommandObject from a different interpreter");
 
   97    return llvm::createStringError(llvm::inconvertibleErrorCode(),
 
   98                              "can't add a user subcommand to a builtin container command.");
 
  101  cmd_obj_sp->SetIsUserCommand(
true);
 
  103  std::string str_name(name);
 
  107    return llvm::Error::success();
 
  109  const char *error_str = 
nullptr;
 
  111    error_str = 
"sub-command already exists";
 
  112  if (!(*pos).second->IsUserCommand())
 
  113    error_str = 
"can't replace a builtin subcommand";
 
  116    return llvm::createStringError(llvm::inconvertibleErrorCode(), error_str);
 
  118  pos->second = cmd_obj_sp;
 
  119  return llvm::Error::success();
 
 
  123                                                    bool must_be_multiword) {
 
  124  CommandMap::iterator pos;
 
  125  std::string str_name(cmd_name);
 
  129    return llvm::createStringError(llvm::inconvertibleErrorCode(),
"subcommand '%s' not found.",
 
  132  if (!(*pos).second->IsUserCommand()) {
 
  133    return llvm::createStringError(llvm::inconvertibleErrorCode(),
"subcommand '%s' not a user command.",
 
  137  if (must_be_multiword && !(*pos).second->IsMultiwordObject()) {
 
  138    return llvm::createStringError(llvm::inconvertibleErrorCode(),
"subcommand '%s' is not a container command",
 
  141  if (!must_be_multiword && (*pos).second->IsMultiwordObject()) {
 
  142    return llvm::createStringError(llvm::inconvertibleErrorCode(),
"subcommand '%s' is not a user command",
 
  148  return llvm::Error::success();
 
 
  153  Args args(args_string);
 
  160  auto sub_command = args[0].ref();
 
  161  if (sub_command.empty()) {
 
  162    result.
AppendError(
"need to specify a non-empty subcommand");
 
  174  if (sub_cmd_obj != 
nullptr) {
 
  180    sub_cmd_obj->
Execute(args_string, result);
 
  184  std::string error_msg;
 
  185  const size_t num_subcmd_matches = matches.
GetSize();
 
  186  if (num_subcmd_matches > 0) {
 
  187    error_msg.assign(
"ambiguous command ");
 
  188    error_msg.append(
"'");
 
  190    error_msg.append(
" ");
 
  191    error_msg.append(std::string(sub_command));
 
  192    error_msg.append(
"'.");
 
  194    error_msg.append(
" Possible completions:");
 
  195    for (
const std::string &match : matches) {
 
  196      error_msg.append(
"\n\t");
 
  197      error_msg.append(match);
 
  202        llvm::Twine(
"\"" + sub_command + 
"\" is not a valid subcommand of \"" +
 
  207  error_msg.append(
"\n");
 
 
  214  const size_t maxCount = 5;
 
  216  std::string buffer = 
" Valid subcommand";
 
  218  CommandMap::iterator pos;
 
  222    buffer.append(pos->first);
 
  226    buffer.append(
" and others");
 
 
  239  output_stream.
PutCString(
"\nThe following subcommands are supported:\n\n");
 
  241  CommandMap::iterator pos;
 
  248    std::string indented_command(
"    ");
 
  249    indented_command.append(pos->first);
 
  250    if (pos->second->WantsRawCommandString()) {
 
  251      std::string help_text(std::string(pos->second->GetHelp()));
 
  252      help_text.append(
"  Expects 'raw' input (see 'help raw-input'.)");
 
  253      m_interpreter.OutputFormattedHelpText(output_stream, indented_command,
 
  254                                            "--", help_text, max_len);
 
  256      m_interpreter.OutputFormattedHelpText(output_stream, indented_command,
 
  257                                            "--", pos->second->GetHelp(),
 
  261  output_stream.
PutCString(
"\nFor more help on any particular subcommand, type " 
  262                           "'help <command> <subcommand>'.\n");
 
 
  273    if (new_matches.
GetSize() == 1 &&
 
  278      if (cmd_obj != 
nullptr) {
 
  293  if (!sub_command_object)
 
 
  303std::optional<std::string>
 
  311  if (sub_command_object == 
nullptr)
 
 
  317                                       const char *name, 
const char *help,
 
  318                                       const char *syntax, uint32_t flags)
 
 
  333    return proxy_command->
GetHelp();
 
 
  433std::optional<std::string>
 
  443  return "command is not implemented";
 
 
  449    proxy_command->Execute(args_string, result);
 
 
A command line argument class.
void Shift()
Shifts the first argument C string value of the array off the argument array.
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
void Execute(const char *args_string, CommandReturnObject &result) override
llvm::Error LoadUserSubcommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj, bool can_replace) override
void GenerateHelpText(Stream &output_stream) override
CommandObject::CommandMap m_subcommand_dict
void HandleCompletion(CompletionRequest &request) override
This default version handles calling option argument completions and then calls HandleArgumentComplet...
~CommandObjectMultiword() override
std::string GetSubcommandsHintText()
std::optional< std::string > GetRepeatCommand(Args ¤t_command_args, uint32_t index) override
Get the command that appropriate for a "repeat" of the current command.
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObject * GetSubcommandObject(llvm::StringRef sub_cmd, StringList *matches=nullptr) override
llvm::Error RemoveUserSubcommand(llvm::StringRef cmd_name, bool multiword_okay)
CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
lldb::CommandObjectSP GetSubcommandSPExact(llvm::StringRef sub_cmd) override
friend class CommandInterpreter
lldb::CommandObjectSP GetSubcommandSP(llvm::StringRef sub_cmd, StringList *matches=nullptr) override
void GenerateHelpText(Stream &result) override
bool WantsCompletion() override
virtual CommandObject * GetProxyCommandObject()=0
llvm::StringRef GetHelpLong() override
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
lldb::CommandObjectSP GetSubcommandSP(llvm::StringRef sub_cmd, StringList *matches=nullptr) override
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObjectMultiword * GetAsMultiwordCommand() override
llvm::StringRef GetSyntax() override
CommandObject * GetSubcommandObject(llvm::StringRef sub_cmd, StringList *matches=nullptr) override
void Execute(const char *args_string, CommandReturnObject &result) override
CommandObjectProxy(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
Options * GetOptions() override
bool IsMultiwordObject() override
virtual llvm::StringRef GetUnsupportedError()
bool WantsRawCommandString() override
void HandleCompletion(CompletionRequest &request) override
This default version handles calling option argument completions and then calls HandleArgumentComplet...
std::optional< std::string > GetRepeatCommand(Args ¤t_command_args, uint32_t index) override
Get the command that appropriate for a "repeat" of the current command.
bool IsRemovable() const override
~CommandObjectProxy() override
llvm::StringRef GetHelp() override
friend class CommandInterpreter
virtual bool WantsRawCommandString()=0
void GenerateHelpText(CommandReturnObject &result)
virtual llvm::StringRef GetHelpLong()
llvm::StringRef GetCommandName() const
virtual bool IsMultiwordObject()
virtual bool WantsCompletion()
CommandInterpreter & GetCommandInterpreter()
virtual void Execute(const char *args_string, CommandReturnObject &result)=0
CommandInterpreter & m_interpreter
virtual bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj)
virtual std::optional< std::string > GetRepeatCommand(Args ¤t_command_args, uint32_t index)
Get the command that appropriate for a "repeat" of the current command.
virtual CommandObject * GetSubcommandObject(llvm::StringRef sub_cmd, StringList *matches=nullptr)
virtual CommandObjectMultiword * GetAsMultiwordCommand()
virtual Options * GetOptions()
CommandObject(CommandInterpreter &interpreter, llvm::StringRef name, llvm::StringRef help="", llvm::StringRef syntax="", uint32_t flags=0)
virtual void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector)
The default version handles argument definitions that have only one argument type,...
virtual llvm::StringRef GetSyntax()
virtual bool IsRemovable() const
virtual void HandleCompletion(CompletionRequest &request)
This default version handles calling option argument completions and then calls HandleArgumentComplet...
virtual llvm::StringRef GetHelp()
virtual lldb::CommandObjectSP GetSubcommandSP(llvm::StringRef sub_cmd, StringList *matches=nullptr)
void void AppendError(llvm::StringRef in_string)
void AppendRawError(llvm::StringRef in_string)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
"lldb/Utility/ArgCompletionRequest.h"
void AddCompletions(const StringList &completions)
Adds multiple possible completion strings.
const Args & GetParsedLine() const
void ShiftArguments()
Drops the first argument from the argument list.
void AppendEmptyArgument()
Adds an empty argument at the end of the argument list and moves the cursor to this new argument.
size_t GetCursorIndex() const
A command line option parsing protocol class.
A stream class that can stream formatted output to a file.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
void AppendString(const std::string &s)
const char * GetStringAtIndex(size_t idx) const
void DeleteStringAtIndex(size_t id)
A class that represents a running process on the host machine.
size_t FindLongestCommandWord(std::map< std::string, ValueType, std::less<> > &dict)
std::vector< OptionArgElement > OptionElementVector
int AddNamesMatchingPartialString(const std::map< std::string, ValueType, std::less<> > &in_map, llvm::StringRef cmd_str, StringList &matches, StringList *descriptions=nullptr)
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP