summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/tools/lldb/source/Commands/CommandObjectHelp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Commands/CommandObjectHelp.cpp')
-rw-r--r--contrib/llvm/tools/lldb/source/Commands/CommandObjectHelp.cpp428
1 files changed, 198 insertions, 230 deletions
diff --git a/contrib/llvm/tools/lldb/source/Commands/CommandObjectHelp.cpp b/contrib/llvm/tools/lldb/source/Commands/CommandObjectHelp.cpp
index 4cf7488..99e9d7b 100644
--- a/contrib/llvm/tools/lldb/source/Commands/CommandObjectHelp.cpp
+++ b/contrib/llvm/tools/lldb/source/Commands/CommandObjectHelp.cpp
@@ -12,10 +12,10 @@
// Other libraries and framework includes
// Project includes
#include "CommandObjectHelp.h"
-#include "lldb/Interpreter/CommandObjectMultiword.h"
#include "lldb/Interpreter/CommandInterpreter.h"
-#include "lldb/Interpreter/Options.h"
+#include "lldb/Interpreter/CommandObjectMultiword.h"
#include "lldb/Interpreter/CommandReturnObject.h"
+#include "lldb/Interpreter/Options.h"
using namespace lldb;
using namespace lldb_private;
@@ -24,252 +24,220 @@ using namespace lldb_private;
// CommandObjectHelp
//-------------------------------------------------------------------------
-void
-CommandObjectHelp::GenerateAdditionalHelpAvenuesMessage (Stream *s,
- const char* command,
- const char* prefix,
- const char* subcommand,
- bool include_apropos,
- bool include_type_lookup)
-{
- if (s && command && *command)
- {
- s->Printf("'%s' is not a known command.\n", command);
- s->Printf("Try '%shelp' to see a current list of commands.\n", prefix ? prefix : "");
- if (include_apropos)
- {
- s->Printf("Try '%sapropos %s' for a list of related commands.\n",
- prefix ? prefix : "", subcommand ? subcommand : command);
- }
- if (include_type_lookup)
- {
- s->Printf("Try '%stype lookup %s' for information on types, methods, functions, modules, etc.",
- prefix ? prefix : "", subcommand ? subcommand : command);
- }
- }
+void CommandObjectHelp::GenerateAdditionalHelpAvenuesMessage(
+ Stream *s, llvm::StringRef command, llvm::StringRef prefix, llvm::StringRef subcommand,
+ bool include_apropos, bool include_type_lookup) {
+ if (!s || command.empty())
+ return;
+
+ std::string command_str = command.str();
+ std::string prefix_str = prefix.str();
+ std::string subcommand_str = subcommand.str();
+ const std::string &lookup_str = !subcommand_str.empty() ? subcommand_str : command_str;
+ s->Printf("'%s' is not a known command.\n", command_str.c_str());
+ s->Printf("Try '%shelp' to see a current list of commands.\n",
+ prefix.str().c_str());
+ if (include_apropos) {
+ s->Printf("Try '%sapropos %s' for a list of related commands.\n",
+ prefix_str.c_str(), lookup_str.c_str());
+ }
+ if (include_type_lookup) {
+ s->Printf("Try '%stype lookup %s' for information on types, methods, "
+ "functions, modules, etc.",
+ prefix_str.c_str(), lookup_str.c_str());
+ }
}
CommandObjectHelp::CommandObjectHelp(CommandInterpreter &interpreter)
- : CommandObjectParsed(interpreter, "help",
- "Show a list of all debugger commands, or give details about a specific command.",
+ : CommandObjectParsed(interpreter, "help", "Show a list of all debugger "
+ "commands, or give details "
+ "about a specific command.",
"help [<cmd-name>]"),
- m_options(interpreter)
-{
- CommandArgumentEntry arg;
- CommandArgumentData command_arg;
+ m_options() {
+ CommandArgumentEntry arg;
+ CommandArgumentData command_arg;
- // Define the first (and only) variant of this arg.
- command_arg.arg_type = eArgTypeCommandName;
- command_arg.arg_repetition = eArgRepeatStar;
+ // Define the first (and only) variant of this arg.
+ command_arg.arg_type = eArgTypeCommandName;
+ command_arg.arg_repetition = eArgRepeatStar;
- // There is only one variant this argument could be; put it into the argument entry.
- arg.push_back (command_arg);
+ // There is only one variant this argument could be; put it into the argument
+ // entry.
+ arg.push_back(command_arg);
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg);
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back(arg);
}
CommandObjectHelp::~CommandObjectHelp() = default;
-OptionDefinition
-CommandObjectHelp::CommandOptions::g_option_table[] =
-{
- { LLDB_OPT_SET_ALL, false, "hide-aliases", 'a', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Hide aliases in the command list."},
- { LLDB_OPT_SET_ALL, false, "hide-user-commands", 'u', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Hide user-defined commands from the list."},
- { LLDB_OPT_SET_ALL, false, "show-hidden-commands", 'h', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Include commands prefixed with an underscore."},
- { 0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr }
+static OptionDefinition g_help_options[] = {
+ // clang-format off
+ {LLDB_OPT_SET_ALL, false, "hide-aliases", 'a', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Hide aliases in the command list."},
+ {LLDB_OPT_SET_ALL, false, "hide-user-commands", 'u', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Hide user-defined commands from the list."},
+ {LLDB_OPT_SET_ALL, false, "show-hidden-commands", 'h', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Include commands prefixed with an underscore."},
+ // clang-format on
};
-bool
-CommandObjectHelp::DoExecute (Args& command, CommandReturnObject &result)
-{
- CommandObject::CommandMap::iterator pos;
- CommandObject *cmd_obj;
- const size_t argc = command.GetArgumentCount ();
-
- // 'help' doesn't take any arguments, other than command names. If argc is 0, we show the user
- // all commands (aliases and user commands if asked for). Otherwise every argument must be the name of a command or a sub-command.
- if (argc == 0)
- {
- uint32_t cmd_types = CommandInterpreter::eCommandTypesBuiltin;
- if (m_options.m_show_aliases)
- cmd_types |= CommandInterpreter::eCommandTypesAliases;
- if (m_options.m_show_user_defined)
- cmd_types |= CommandInterpreter::eCommandTypesUserDef;
- if (m_options.m_show_hidden)
- cmd_types |= CommandInterpreter::eCommandTypesHidden;
+llvm::ArrayRef<OptionDefinition>
+CommandObjectHelp::CommandOptions::GetDefinitions() {
+ return llvm::makeArrayRef(g_help_options);
+}
+
+bool CommandObjectHelp::DoExecute(Args &command, CommandReturnObject &result) {
+ CommandObject::CommandMap::iterator pos;
+ CommandObject *cmd_obj;
+ const size_t argc = command.GetArgumentCount();
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- m_interpreter.GetHelp (result, cmd_types); // General help
- }
- else
- {
- // Get command object for the first command argument. Only search built-in command dictionary.
- StringList matches;
- cmd_obj = m_interpreter.GetCommandObject (command.GetArgumentAtIndex (0), &matches);
- bool is_alias_command = m_interpreter.AliasExists (command.GetArgumentAtIndex (0));
- std::string alias_name = command.GetArgumentAtIndex(0);
-
- if (cmd_obj != nullptr)
- {
- StringList matches;
- bool all_okay = true;
- CommandObject *sub_cmd_obj = cmd_obj;
- // Loop down through sub_command dictionaries until we find the command object that corresponds
- // to the help command entered.
- std::string sub_command;
- for (size_t i = 1; i < argc && all_okay; ++i)
- {
- sub_command = command.GetArgumentAtIndex(i);
- matches.Clear();
- if (sub_cmd_obj->IsAlias())
- sub_cmd_obj = ((CommandAlias*)sub_cmd_obj)->GetUnderlyingCommand().get();
- if (! sub_cmd_obj->IsMultiwordObject ())
- {
- all_okay = false;
- }
- else
- {
- CommandObject *found_cmd;
- found_cmd = sub_cmd_obj->GetSubcommandObject(sub_command.c_str(), &matches);
- if (found_cmd == nullptr)
- all_okay = false;
- else if (matches.GetSize() > 1)
- all_okay = false;
- else
- sub_cmd_obj = found_cmd;
- }
- }
-
- if (!all_okay || (sub_cmd_obj == nullptr))
- {
- std::string cmd_string;
- command.GetCommandString (cmd_string);
- if (matches.GetSize() >= 2)
- {
- StreamString s;
- s.Printf ("ambiguous command %s", cmd_string.c_str());
- size_t num_matches = matches.GetSize();
- for (size_t match_idx = 0; match_idx < num_matches; match_idx++)
- {
- s.Printf ("\n\t%s", matches.GetStringAtIndex(match_idx));
- }
- s.Printf ("\n");
- result.AppendError(s.GetData());
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- else if (!sub_cmd_obj)
- {
- StreamString error_msg_stream;
- GenerateAdditionalHelpAvenuesMessage(&error_msg_stream,
- cmd_string.c_str(),
- m_interpreter.GetCommandPrefix(),
- sub_command.c_str());
- result.AppendErrorWithFormat("%s",error_msg_stream.GetData());
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- else
- {
- GenerateAdditionalHelpAvenuesMessage(&result.GetOutputStream(),
- cmd_string.c_str(),
- m_interpreter.GetCommandPrefix(),
- sub_command.c_str());
- result.GetOutputStream().Printf("\nThe closest match is '%s'. Help on it follows.\n\n", sub_cmd_obj->GetCommandName());
- }
- }
-
- sub_cmd_obj->GenerateHelpText(result);
-
- if (is_alias_command)
- {
- StreamString sstr;
- m_interpreter.GetAlias(alias_name.c_str())->GetAliasExpansion(sstr);
- result.GetOutputStream().Printf ("\n'%s' is an abbreviation for %s\n", alias_name.c_str(), sstr.GetData());
- }
- }
- else if (matches.GetSize() > 0)
- {
- Stream &output_strm = result.GetOutputStream();
- output_strm.Printf("Help requested with ambiguous command name, possible completions:\n");
- const size_t match_count = matches.GetSize();
- for (size_t i = 0; i < match_count; i++)
- {
- output_strm.Printf("\t%s\n", matches.GetStringAtIndex(i));
- }
+ // 'help' doesn't take any arguments, other than command names. If argc is 0,
+ // we show the user
+ // all commands (aliases and user commands if asked for). Otherwise every
+ // argument must be the name of a command or a sub-command.
+ if (argc == 0) {
+ uint32_t cmd_types = CommandInterpreter::eCommandTypesBuiltin;
+ if (m_options.m_show_aliases)
+ cmd_types |= CommandInterpreter::eCommandTypesAliases;
+ if (m_options.m_show_user_defined)
+ cmd_types |= CommandInterpreter::eCommandTypesUserDef;
+ if (m_options.m_show_hidden)
+ cmd_types |= CommandInterpreter::eCommandTypesHidden;
+
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ m_interpreter.GetHelp(result, cmd_types); // General help
+ } else {
+ // Get command object for the first command argument. Only search built-in
+ // command dictionary.
+ StringList matches;
+ auto command_name = command[0].ref;
+ cmd_obj = m_interpreter.GetCommandObject(command_name, &matches);
+
+ if (cmd_obj != nullptr) {
+ StringList matches;
+ bool all_okay = true;
+ CommandObject *sub_cmd_obj = cmd_obj;
+ // Loop down through sub_command dictionaries until we find the command
+ // object that corresponds to the help command entered.
+ std::string sub_command;
+ for (auto &entry : command.entries().drop_front()) {
+ sub_command = entry.ref;
+ matches.Clear();
+ if (sub_cmd_obj->IsAlias())
+ sub_cmd_obj =
+ ((CommandAlias *)sub_cmd_obj)->GetUnderlyingCommand().get();
+ if (!sub_cmd_obj->IsMultiwordObject()) {
+ all_okay = false;
+ break;
+ } else {
+ CommandObject *found_cmd;
+ found_cmd =
+ sub_cmd_obj->GetSubcommandObject(sub_command.c_str(), &matches);
+ if (found_cmd == nullptr || matches.GetSize() > 1) {
+ all_okay = false;
+ break;
+ } else
+ sub_cmd_obj = found_cmd;
}
- else
- {
- // Maybe the user is asking for help about a command argument rather than a command.
- const CommandArgumentType arg_type = CommandObject::LookupArgumentName (command.GetArgumentAtIndex (0));
- if (arg_type != eArgTypeLastArg)
- {
- Stream &output_strm = result.GetOutputStream ();
- CommandObject::GetArgumentHelp (output_strm, arg_type, m_interpreter);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- StreamString error_msg_stream;
- GenerateAdditionalHelpAvenuesMessage(&error_msg_stream, command.GetArgumentAtIndex(0), m_interpreter.GetCommandPrefix());
- result.AppendErrorWithFormat("%s",error_msg_stream.GetData());
- result.SetStatus (eReturnStatusFailed);
- }
+ }
+
+ if (!all_okay || (sub_cmd_obj == nullptr)) {
+ std::string cmd_string;
+ command.GetCommandString(cmd_string);
+ if (matches.GetSize() >= 2) {
+ StreamString s;
+ s.Printf("ambiguous command %s", cmd_string.c_str());
+ size_t num_matches = matches.GetSize();
+ for (size_t match_idx = 0; match_idx < num_matches; match_idx++) {
+ s.Printf("\n\t%s", matches.GetStringAtIndex(match_idx));
+ }
+ s.Printf("\n");
+ result.AppendError(s.GetString());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ } else if (!sub_cmd_obj) {
+ StreamString error_msg_stream;
+ GenerateAdditionalHelpAvenuesMessage(
+ &error_msg_stream, cmd_string.c_str(),
+ m_interpreter.GetCommandPrefix(), sub_command.c_str());
+ result.AppendError(error_msg_stream.GetString());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ } else {
+ GenerateAdditionalHelpAvenuesMessage(
+ &result.GetOutputStream(), cmd_string.c_str(),
+ m_interpreter.GetCommandPrefix(), sub_command.c_str());
+ result.GetOutputStream().Printf(
+ "\nThe closest match is '%s'. Help on it follows.\n\n",
+ sub_cmd_obj->GetCommandName().str().c_str());
}
+ }
+
+ sub_cmd_obj->GenerateHelpText(result);
+
+ if (m_interpreter.AliasExists(command_name)) {
+ StreamString sstr;
+ m_interpreter.GetAlias(command_name)->GetAliasExpansion(sstr);
+ result.GetOutputStream().Printf("\n'%s' is an abbreviation for %s\n",
+ command[0].c_str(), sstr.GetData());
+ }
+ } else if (matches.GetSize() > 0) {
+ Stream &output_strm = result.GetOutputStream();
+ output_strm.Printf("Help requested with ambiguous command name, possible "
+ "completions:\n");
+ const size_t match_count = matches.GetSize();
+ for (size_t i = 0; i < match_count; i++) {
+ output_strm.Printf("\t%s\n", matches.GetStringAtIndex(i));
+ }
+ } else {
+ // Maybe the user is asking for help about a command argument rather than
+ // a command.
+ const CommandArgumentType arg_type =
+ CommandObject::LookupArgumentName(command_name);
+ if (arg_type != eArgTypeLastArg) {
+ Stream &output_strm = result.GetOutputStream();
+ CommandObject::GetArgumentHelp(output_strm, arg_type, m_interpreter);
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ } else {
+ StreamString error_msg_stream;
+ GenerateAdditionalHelpAvenuesMessage(&error_msg_stream, command_name,
+ m_interpreter.GetCommandPrefix(),
+ "");
+ result.AppendError(error_msg_stream.GetString());
+ result.SetStatus(eReturnStatusFailed);
+ }
}
-
- return result.Succeeded();
+ }
+
+ return result.Succeeded();
}
-int
-CommandObjectHelp::HandleCompletion(Args &input,
- int &cursor_index,
- int &cursor_char_position,
- int match_start_point,
- int max_return_elements,
- bool &word_complete,
- StringList &matches)
-{
- // Return the completions of the commands in the help system:
- if (cursor_index == 0)
- {
- return m_interpreter.HandleCompletionMatches (input,
- cursor_index,
- cursor_char_position,
- match_start_point,
- max_return_elements,
- word_complete,
- matches);
- }
- else
- {
- CommandObject *cmd_obj = m_interpreter.GetCommandObject (input.GetArgumentAtIndex(0));
-
- // The command that they are getting help on might be ambiguous, in which case we should complete that,
- // otherwise complete with the command the user is getting help on...
-
- if (cmd_obj)
- {
- input.Shift();
- cursor_index--;
- return cmd_obj->HandleCompletion (input,
- cursor_index,
- cursor_char_position,
- match_start_point,
- max_return_elements,
- word_complete,
- matches);
- }
- else
- {
- return m_interpreter.HandleCompletionMatches (input,
- cursor_index,
- cursor_char_position,
- match_start_point,
- max_return_elements,
- word_complete,
- matches);
- }
+int CommandObjectHelp::HandleCompletion(Args &input, int &cursor_index,
+ int &cursor_char_position,
+ int match_start_point,
+ int max_return_elements,
+ bool &word_complete,
+ StringList &matches) {
+ // Return the completions of the commands in the help system:
+ if (cursor_index == 0) {
+ return m_interpreter.HandleCompletionMatches(
+ input, cursor_index, cursor_char_position, match_start_point,
+ max_return_elements, word_complete, matches);
+ } else {
+ CommandObject *cmd_obj = m_interpreter.GetCommandObject(input[0].ref);
+
+ // The command that they are getting help on might be ambiguous, in which
+ // case we should complete that,
+ // otherwise complete with the command the user is getting help on...
+
+ if (cmd_obj) {
+ input.Shift();
+ cursor_index--;
+ return cmd_obj->HandleCompletion(
+ input, cursor_index, cursor_char_position, match_start_point,
+ max_return_elements, word_complete, matches);
+ } else {
+ return m_interpreter.HandleCompletionMatches(
+ input, cursor_index, cursor_char_position, match_start_point,
+ max_return_elements, word_complete, matches);
}
+ }
}
OpenPOWER on IntegriCloud