summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2013-06-12 01:50:57 +0000
committerEnrico Granata <egranata@apple.com>2013-06-12 01:50:57 +0000
commit9b62d1d5ee32ec7abca5ed2fdfc079aab2168c2a (patch)
tree4a81d561c8821dd14d627e1daf6580ad238f508a
parentf045007f117f91656a5d16ae004cfc3934c61c70 (diff)
downloadbcm5719-llvm-9b62d1d5ee32ec7abca5ed2fdfc079aab2168c2a.tar.gz
bcm5719-llvm-9b62d1d5ee32ec7abca5ed2fdfc079aab2168c2a.zip
<rdar://problem/11914077>
If you type help command <word> <word> <word> <missingSubCommand> (e.g. help script import or help type summary fake), you will get help on the deepest matched command word (i.e. script or type summary in the examples) Also, reworked the logic for commands to produce their help to make it more object-oriented llvm-svn: 183822
-rw-r--r--lldb/include/lldb/Interpreter/CommandObject.h7
-rw-r--r--lldb/include/lldb/Interpreter/CommandObjectMultiword.h2
-rw-r--r--lldb/source/Commands/CommandObjectHelp.cpp92
-rw-r--r--lldb/source/Commands/CommandObjectHelp.h2
-rw-r--r--lldb/source/Commands/CommandObjectMultiword.cpp13
-rw-r--r--lldb/source/Interpreter/CommandObject.cpp77
6 files changed, 104 insertions, 89 deletions
diff --git a/lldb/include/lldb/Interpreter/CommandObject.h b/lldb/include/lldb/Interpreter/CommandObject.h
index 917061e3e14..6ddebdb563a 100644
--- a/lldb/include/lldb/Interpreter/CommandObject.h
+++ b/lldb/include/lldb/Interpreter/CommandObject.h
@@ -160,10 +160,11 @@ public:
{
}
+ void
+ GenerateHelpText (CommandReturnObject &result);
+
virtual void
- GenerateHelpText (CommandReturnObject &result)
- {
- }
+ GenerateHelpText (Stream &result);
// this is needed in order to allow the SBCommand class to
// transparently try and load subcommands - it will fail on
diff --git a/lldb/include/lldb/Interpreter/CommandObjectMultiword.h b/lldb/include/lldb/Interpreter/CommandObjectMultiword.h
index d417f23eea8..491d43c4bd9 100644
--- a/lldb/include/lldb/Interpreter/CommandObjectMultiword.h
+++ b/lldb/include/lldb/Interpreter/CommandObjectMultiword.h
@@ -47,7 +47,7 @@ public:
const lldb::CommandObjectSP& command_obj);
virtual void
- GenerateHelpText (CommandReturnObject &result);
+ GenerateHelpText (Stream &output_stream);
virtual lldb::CommandObjectSP
GetSubcommandSP (const char *sub_cmd, StringList *matches = NULL);
diff --git a/lldb/source/Commands/CommandObjectHelp.cpp b/lldb/source/Commands/CommandObjectHelp.cpp
index 00e2551842f..7d638a4732e 100644
--- a/lldb/source/Commands/CommandObjectHelp.cpp
+++ b/lldb/source/Commands/CommandObjectHelp.cpp
@@ -119,13 +119,7 @@ CommandObjectHelp::DoExecute (Args& command, CommandReturnObject &result)
{
std::string cmd_string;
command.GetCommandString (cmd_string);
- if (matches.GetSize() < 2)
- {
- result.AppendErrorWithFormat("'%s' is not a known command.\n"
- "Try 'help' to see a current list of commands.\n",
- cmd_string.c_str());
- }
- else
+ if (matches.GetSize() >= 2)
{
StreamString s;
s.Printf ("ambiguous command %s", cmd_string.c_str());
@@ -136,83 +130,29 @@ CommandObjectHelp::DoExecute (Args& command, CommandReturnObject &result)
}
s.Printf ("\n");
result.AppendError(s.GetData());
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
-
- result.SetStatus (eReturnStatusFailed);
- }
- else
- {
- Stream &output_strm = result.GetOutputStream();
- if (sub_cmd_obj->GetOptions() != NULL)
- {
- if (sub_cmd_obj->WantsRawCommandString())
- {
- std::string help_text (sub_cmd_obj->GetHelp());
- help_text.append (" This command takes 'raw' input (no need to quote stuff).");
- m_interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
- }
- else
- m_interpreter.OutputFormattedHelpText (output_strm, "", "", sub_cmd_obj->GetHelp(), 1);
- output_strm.Printf ("\nSyntax: %s\n", sub_cmd_obj->GetSyntax());
- sub_cmd_obj->GetOptions()->GenerateOptionUsage (output_strm, sub_cmd_obj);
- const char *long_help = sub_cmd_obj->GetHelpLong();
- if ((long_help != NULL)
- && (strlen (long_help) > 0))
- output_strm.Printf ("\n%s", long_help);
- if (sub_cmd_obj->WantsRawCommandString() && !sub_cmd_obj->WantsCompletion())
- {
- // Emit the message about using ' -- ' between the end of the command options and the raw input
- // conditionally, i.e., only if the command object does not want completion.
- m_interpreter.OutputFormattedHelpText (output_strm, "", "",
- "\nIMPORTANT NOTE: Because this command takes 'raw' input, if you use any command options"
- " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1);
- }
- else if (sub_cmd_obj->GetNumArgumentEntries() > 0
- && sub_cmd_obj->GetOptions()
- && sub_cmd_obj->GetOptions()->NumCommandOptions() > 0)
- {
- // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
- m_interpreter.OutputFormattedHelpText (output_strm, "", "",
- "\nThis command takes options and free-form arguments. If your arguments resemble"
- " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
- " the end of the command options and the beginning of the arguments.", 1);
- }
-
- // Mark this help command with a success status.
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else if (sub_cmd_obj->IsMultiwordObject())
+ else if (!sub_cmd_obj)
{
- if (sub_cmd_obj->WantsRawCommandString())
- {
- std::string help_text (sub_cmd_obj->GetHelp());
- help_text.append (" This command takes 'raw' input (no need to quote stuff).");
- m_interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
- }
- else
- m_interpreter.OutputFormattedHelpText (output_strm, "", "", sub_cmd_obj->GetHelp(), 1);
- sub_cmd_obj->GenerateHelpText (result);
+ result.AppendErrorWithFormat("'%s' is not a known command.\n"
+ "Try 'help' to see a current list of commands.\n",
+ cmd_string.c_str());
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
else
{
- const char *long_help = sub_cmd_obj->GetHelpLong();
- if ((long_help != NULL)
- && (strlen (long_help) > 0))
- output_strm.Printf ("%s", long_help);
- else if (sub_cmd_obj->WantsRawCommandString())
- {
- std::string help_text (sub_cmd_obj->GetHelp());
- help_text.append (" This command takes 'raw' input (no need to quote stuff).");
- m_interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
- }
- else
- m_interpreter.OutputFormattedHelpText (output_strm, "", "", sub_cmd_obj->GetHelp(), 1);
- output_strm.Printf ("\nSyntax: %s\n", sub_cmd_obj->GetSyntax());
- // Mark this help command with a success status.
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ result.GetOutputStream().Printf("'%s' is not a known command.\n"
+ "Try 'help' to see a current list of commands.\n"
+ "The closest match is '%s'. Help on it follows.\n\n",
+ cmd_string.c_str(),
+ sub_cmd_obj->GetCommandName());
}
}
+ sub_cmd_obj->GenerateHelpText(result);
+
if (is_alias_command)
{
StreamString sstr;
diff --git a/lldb/source/Commands/CommandObjectHelp.h b/lldb/source/Commands/CommandObjectHelp.h
index 91a40b52949..6e8f9d4cbc7 100644
--- a/lldb/source/Commands/CommandObjectHelp.h
+++ b/lldb/source/Commands/CommandObjectHelp.h
@@ -108,7 +108,7 @@ protected:
virtual bool
DoExecute (Args& command,
CommandReturnObject &result);
-
+
private:
CommandOptions m_options;
diff --git a/lldb/source/Commands/CommandObjectMultiword.cpp b/lldb/source/Commands/CommandObjectMultiword.cpp
index bfb5132a644..f84b401f3aa 100644
--- a/lldb/source/Commands/CommandObjectMultiword.cpp
+++ b/lldb/source/Commands/CommandObjectMultiword.cpp
@@ -115,7 +115,7 @@ CommandObjectMultiword::Execute(const char *args_string, CommandReturnObject &re
const size_t argc = args.GetArgumentCount();
if (argc == 0)
{
- GenerateHelpText (result);
+ this->CommandObject::GenerateHelpText (result);
}
else
{
@@ -125,7 +125,7 @@ CommandObjectMultiword::Execute(const char *args_string, CommandReturnObject &re
{
if (::strcasecmp (sub_command, "help") == 0)
{
- GenerateHelpText (result);
+ this->CommandObject::GenerateHelpText (result);
}
else if (!m_subcommand_dict.empty())
{
@@ -181,12 +181,11 @@ CommandObjectMultiword::Execute(const char *args_string, CommandReturnObject &re
}
void
-CommandObjectMultiword::GenerateHelpText (CommandReturnObject &result)
+CommandObjectMultiword::GenerateHelpText (Stream &output_stream)
{
// First time through here, generate the help text for the object and
// push it to the return result object as well
- Stream &output_stream = result.GetOutputStream();
output_stream.PutCString ("The following subcommands are supported:\n\n");
CommandMap::iterator pos;
@@ -203,14 +202,14 @@ CommandObjectMultiword::GenerateHelpText (CommandReturnObject &result)
{
std::string help_text (pos->second->GetHelp());
help_text.append (" This command takes 'raw' input (no need to quote stuff).");
- m_interpreter.OutputFormattedHelpText (result.GetOutputStream(),
+ m_interpreter.OutputFormattedHelpText (output_stream,
indented_command.c_str(),
"--",
help_text.c_str(),
max_len);
}
else
- m_interpreter.OutputFormattedHelpText (result.GetOutputStream(),
+ m_interpreter.OutputFormattedHelpText (output_stream,
indented_command.c_str(),
"--",
pos->second->GetHelp(),
@@ -218,8 +217,6 @@ CommandObjectMultiword::GenerateHelpText (CommandReturnObject &result)
}
output_stream.PutCString ("\nFor more help on any particular subcommand, type 'help <command> <subcommand>'.\n");
-
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
int
diff --git a/lldb/source/Interpreter/CommandObject.cpp b/lldb/source/Interpreter/CommandObject.cpp
index 68756050c6f..67d57f1b1e1 100644
--- a/lldb/source/Interpreter/CommandObject.cpp
+++ b/lldb/source/Interpreter/CommandObject.cpp
@@ -903,6 +903,83 @@ ExprPathHelpTextCallback()
}
void
+CommandObject::GenerateHelpText (CommandReturnObject &result)
+{
+ GenerateHelpText(result.GetOutputStream());
+
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+}
+
+void
+CommandObject::GenerateHelpText (Stream &output_strm)
+{
+ CommandInterpreter& interpreter = GetCommandInterpreter();
+ if (GetOptions() != NULL)
+ {
+ if (WantsRawCommandString())
+ {
+ std::string help_text (GetHelp());
+ help_text.append (" This command takes 'raw' input (no need to quote stuff).");
+ interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
+ }
+ else
+ interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
+ output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
+ GetOptions()->GenerateOptionUsage (output_strm, this);
+ const char *long_help = GetHelpLong();
+ if ((long_help != NULL)
+ && (strlen (long_help) > 0))
+ output_strm.Printf ("\n%s", long_help);
+ if (WantsRawCommandString() && !WantsCompletion())
+ {
+ // Emit the message about using ' -- ' between the end of the command options and the raw input
+ // conditionally, i.e., only if the command object does not want completion.
+ interpreter.OutputFormattedHelpText (output_strm, "", "",
+ "\nIMPORTANT NOTE: Because this command takes 'raw' input, if you use any command options"
+ " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1);
+ }
+ else if (GetNumArgumentEntries() > 0
+ && GetOptions()
+ && GetOptions()->NumCommandOptions() > 0)
+ {
+ // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
+ interpreter.OutputFormattedHelpText (output_strm, "", "",
+ "\nThis command takes options and free-form arguments. If your arguments resemble"
+ " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
+ " the end of the command options and the beginning of the arguments.", 1);
+ }
+ }
+ else if (IsMultiwordObject())
+ {
+ if (WantsRawCommandString())
+ {
+ std::string help_text (GetHelp());
+ help_text.append (" This command takes 'raw' input (no need to quote stuff).");
+ interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
+ }
+ else
+ interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
+ GenerateHelpText (output_strm);
+ }
+ else
+ {
+ const char *long_help = GetHelpLong();
+ if ((long_help != NULL)
+ && (strlen (long_help) > 0))
+ output_strm.Printf ("%s", long_help);
+ else if (WantsRawCommandString())
+ {
+ std::string help_text (GetHelp());
+ help_text.append (" This command takes 'raw' input (no need to quote stuff).");
+ interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
+ }
+ else
+ interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
+ output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
+ }
+}
+
+void
CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
{
CommandArgumentData id_arg;
OpenPOWER on IntegriCloud