summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/tools/lldb/source/Interpreter/CommandAlias.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Interpreter/CommandAlias.cpp')
-rw-r--r--contrib/llvm/tools/lldb/source/Interpreter/CommandAlias.cpp467
1 files changed, 206 insertions, 261 deletions
diff --git a/contrib/llvm/tools/lldb/source/Interpreter/CommandAlias.cpp b/contrib/llvm/tools/lldb/source/Interpreter/CommandAlias.cpp
index a915d63..a8f5343 100644
--- a/contrib/llvm/tools/lldb/source/Interpreter/CommandAlias.cpp
+++ b/contrib/llvm/tools/lldb/source/Interpreter/CommandAlias.cpp
@@ -1,4 +1,4 @@
-//===-- CommandAlias.cpp ------------------------------------------*- C++ -*-===//
+//===-- CommandAlias.cpp -----------------------------------------*- C++-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -12,6 +12,7 @@
#include "llvm/Support/ErrorHandling.h"
#include "lldb/Core/StreamString.h"
+#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/CommandObject.h"
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Interpreter/Options.h"
@@ -19,289 +20,233 @@
using namespace lldb;
using namespace lldb_private;
-static bool
-ProcessAliasOptionsArgs (lldb::CommandObjectSP &cmd_obj_sp,
- const char *options_args,
- OptionArgVectorSP &option_arg_vector_sp)
-{
- bool success = true;
- OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
-
- if (!options_args || (strlen (options_args) < 1))
- return true;
-
- std::string options_string (options_args);
- Args args (options_args);
- CommandReturnObject result;
- // Check to see if the command being aliased can take any command options.
- Options *options = cmd_obj_sp->GetOptions ();
- if (options)
- {
- // See if any options were specified as part of the alias; if so, handle them appropriately.
- options->NotifyOptionParsingStarting ();
- args.Unshift ("dummy_arg");
- args.ParseAliasOptions (*options, result, option_arg_vector, options_string);
- args.Shift ();
- if (result.Succeeded())
- options->VerifyPartialOptions (result);
- if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted)
- {
- result.AppendError ("Unable to create requested alias.\n");
- return false;
- }
+static bool ProcessAliasOptionsArgs(lldb::CommandObjectSP &cmd_obj_sp,
+ llvm::StringRef options_args,
+ OptionArgVectorSP &option_arg_vector_sp) {
+ bool success = true;
+ OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
+
+ if (options_args.size() < 1)
+ return true;
+
+ Args args(options_args);
+ std::string options_string(options_args);
+ CommandReturnObject result;
+ // Check to see if the command being aliased can take any command options.
+ Options *options = cmd_obj_sp->GetOptions();
+ if (options) {
+ // See if any options were specified as part of the alias; if so, handle
+ // them appropriately.
+ ExecutionContext exe_ctx =
+ cmd_obj_sp->GetCommandInterpreter().GetExecutionContext();
+ options->NotifyOptionParsingStarting(&exe_ctx);
+ args.Unshift(llvm::StringRef("dummy_arg"));
+ options_string = args.ParseAliasOptions(*options, result, option_arg_vector,
+ options_args);
+ args.Shift();
+ if (result.Succeeded())
+ options->VerifyPartialOptions(result);
+ if (!result.Succeeded() &&
+ result.GetStatus() != lldb::eReturnStatusStarted) {
+ result.AppendError("Unable to create requested alias.\n");
+ return false;
}
-
- if (!options_string.empty())
- {
- if (cmd_obj_sp->WantsRawCommandString ())
- option_arg_vector->push_back (OptionArgPair ("<argument>",
- OptionArgValue (-1,
- options_string)));
- else
- {
- const size_t argc = args.GetArgumentCount();
- for (size_t i = 0; i < argc; ++i)
- if (strcmp (args.GetArgumentAtIndex (i), "") != 0)
- option_arg_vector->push_back
- (OptionArgPair ("<argument>",
- OptionArgValue (-1,
- std::string (args.GetArgumentAtIndex (i)))));
- }
+ }
+
+ if (!options_string.empty()) {
+ if (cmd_obj_sp->WantsRawCommandString())
+ option_arg_vector->emplace_back("<argument>", -1, options_string);
+ else {
+ for (auto &entry : args.entries()) {
+ if (!entry.ref.empty())
+ option_arg_vector->emplace_back("<argument>", -1, entry.ref);
+ }
}
-
- return success;
-}
-
-CommandAlias::CommandAlias (CommandInterpreter &interpreter,
- lldb::CommandObjectSP cmd_sp,
- const char *options_args,
- const char *name,
- const char *help,
- const char *syntax,
- uint32_t flags) :
- CommandObject(interpreter,
- name,
- help,
- syntax,
- flags),
-m_underlying_command_sp(),
-m_option_string(options_args ? options_args : ""),
-m_option_args_sp(new OptionArgVector),
-m_is_dashdash_alias(eLazyBoolCalculate),
-m_did_set_help(false),
-m_did_set_help_long(false)
-{
- if (ProcessAliasOptionsArgs(cmd_sp, options_args, m_option_args_sp))
- {
- m_underlying_command_sp = cmd_sp;
- for (int i = 0;
- auto cmd_entry = m_underlying_command_sp->GetArgumentEntryAtIndex(i);
- i++)
- {
- m_arguments.push_back(*cmd_entry);
- }
- if (!help || !help[0])
- {
- StreamString sstr;
- StreamString translation_and_help;
- GetAliasExpansion(sstr);
-
- translation_and_help.Printf ("(%s) %s", sstr.GetData(), GetUnderlyingCommand()->GetHelp());
- SetHelp(translation_and_help.GetData());
- }
+ }
+
+ return success;
+}
+
+CommandAlias::CommandAlias(CommandInterpreter &interpreter,
+ lldb::CommandObjectSP cmd_sp,
+ llvm::StringRef options_args, llvm::StringRef name,
+ llvm::StringRef help, llvm::StringRef syntax,
+ uint32_t flags)
+ : CommandObject(interpreter, name, help, syntax, flags),
+ m_underlying_command_sp(), m_option_string(options_args),
+ m_option_args_sp(new OptionArgVector),
+ m_is_dashdash_alias(eLazyBoolCalculate), m_did_set_help(false),
+ m_did_set_help_long(false) {
+ if (ProcessAliasOptionsArgs(cmd_sp, options_args, m_option_args_sp)) {
+ m_underlying_command_sp = cmd_sp;
+ for (int i = 0;
+ auto cmd_entry = m_underlying_command_sp->GetArgumentEntryAtIndex(i);
+ i++) {
+ m_arguments.push_back(*cmd_entry);
}
-}
+ if (!help.empty()) {
+ StreamString sstr;
+ StreamString translation_and_help;
+ GetAliasExpansion(sstr);
+
+ translation_and_help.Printf(
+ "(%s) %s", sstr.GetData(),
+ GetUnderlyingCommand()->GetHelp().str().c_str());
+ SetHelp(translation_and_help.GetString());
+ }
+ }
+}
+
+bool CommandAlias::WantsRawCommandString() {
+ if (IsValid())
+ return m_underlying_command_sp->WantsRawCommandString();
+ return false;
+}
+
+bool CommandAlias::WantsCompletion() {
+ if (IsValid())
+ return m_underlying_command_sp->WantsCompletion();
+ return false;
+}
+
+int CommandAlias::HandleCompletion(Args &input, int &cursor_index,
+ int &cursor_char_position,
+ int match_start_point,
+ int max_return_elements, bool &word_complete,
+ StringList &matches) {
+ if (IsValid())
+ return m_underlying_command_sp->HandleCompletion(
+ input, cursor_index, cursor_char_position, match_start_point,
+ max_return_elements, word_complete, matches);
+ return -1;
+}
+
+int CommandAlias::HandleArgumentCompletion(
+ Args &input, int &cursor_index, int &cursor_char_position,
+ OptionElementVector &opt_element_vector, int match_start_point,
+ int max_return_elements, bool &word_complete, StringList &matches) {
+ if (IsValid())
+ return m_underlying_command_sp->HandleArgumentCompletion(
+ input, cursor_index, cursor_char_position, opt_element_vector,
+ match_start_point, max_return_elements, word_complete, matches);
+ return -1;
+}
+
+Options *CommandAlias::GetOptions() {
+ if (IsValid())
+ return m_underlying_command_sp->GetOptions();
+ return nullptr;
+}
+
+bool CommandAlias::Execute(const char *args_string,
+ CommandReturnObject &result) {
+ llvm_unreachable("CommandAlias::Execute is not to be called");
+}
+
+void CommandAlias::GetAliasExpansion(StreamString &help_string) const {
+ llvm::StringRef command_name = m_underlying_command_sp->GetCommandName();
+ help_string.Printf("'%*s", (int)command_name.size(), command_name.data());
+
+ if (!m_option_args_sp) {
+ help_string.Printf("'");
+ return;
+ }
+
+ OptionArgVector *options = m_option_args_sp.get();
+ std::string opt;
+ std::string value;
+
+ for (const auto &opt_entry : *options) {
+ std::tie(opt, std::ignore, value) = opt_entry;
+ if (opt == "<argument>") {
+ help_string.Printf(" %s", value.c_str());
+ } else {
+ help_string.Printf(" %s", opt.c_str());
+ if ((value.compare("<no-argument>") != 0) &&
+ (value.compare("<need-argument") != 0)) {
+ help_string.Printf(" %s", value.c_str());
+ }
+ }
+ }
-bool
-CommandAlias::WantsRawCommandString()
-{
- if (IsValid())
- return m_underlying_command_sp->WantsRawCommandString();
- return false;
+ help_string.Printf("'");
}
-bool
-CommandAlias::WantsCompletion()
-{
- if (IsValid())
- return m_underlying_command_sp->WantsCompletion();
+bool CommandAlias::IsDashDashCommand() {
+ if (m_is_dashdash_alias != eLazyBoolCalculate)
+ return (m_is_dashdash_alias == eLazyBoolYes);
+ m_is_dashdash_alias = eLazyBoolNo;
+ if (!IsValid())
return false;
-}
-int
-CommandAlias::HandleCompletion (Args &input,
- int &cursor_index,
- int &cursor_char_position,
- int match_start_point,
- int max_return_elements,
- bool &word_complete,
- StringList &matches)
-{
- if (IsValid())
- return m_underlying_command_sp->HandleCompletion(input,
- cursor_index,
- cursor_char_position,
- match_start_point,
- max_return_elements,
- word_complete,
- matches);
- return -1;
-}
-
-int
-CommandAlias::HandleArgumentCompletion (Args &input,
- int &cursor_index,
- int &cursor_char_position,
- OptionElementVector &opt_element_vector,
- int match_start_point,
- int max_return_elements,
- bool &word_complete,
- StringList &matches)
-{
- if (IsValid())
- return m_underlying_command_sp->HandleArgumentCompletion(input,
- cursor_index,
- cursor_char_position,
- opt_element_vector,
- match_start_point,
- max_return_elements,
- word_complete,
- matches);
- return -1;
-}
+ std::string opt;
+ std::string value;
-Options*
-CommandAlias::GetOptions()
-{
- if (IsValid())
- return m_underlying_command_sp->GetOptions();
- return nullptr;
-}
-
-bool
-CommandAlias::Execute(const char *args_string, CommandReturnObject &result)
-{
- llvm_unreachable("CommandAlias::Execute is not to be called");
-}
-
-void
-CommandAlias::GetAliasExpansion (StreamString &help_string)
-{
- const char* command_name = m_underlying_command_sp->GetCommandName();
- help_string.Printf ("'%s", command_name);
-
- if (m_option_args_sp)
- {
- OptionArgVector *options = m_option_args_sp.get();
- for (size_t i = 0; i < options->size(); ++i)
- {
- OptionArgPair cur_option = (*options)[i];
- std::string opt = cur_option.first;
- OptionArgValue value_pair = cur_option.second;
- std::string value = value_pair.second;
- if (opt.compare("<argument>") == 0)
- {
- help_string.Printf (" %s", value.c_str());
- }
- else
- {
- help_string.Printf (" %s", opt.c_str());
- if ((value.compare ("<no-argument>") != 0)
- && (value.compare ("<need-argument") != 0))
- {
- help_string.Printf (" %s", value.c_str());
- }
- }
- }
+ for (const auto &opt_entry : *GetOptionArguments()) {
+ std::tie(opt, std::ignore, value) = opt_entry;
+ if (opt == "<argument>" && !value.empty() &&
+ llvm::StringRef(value).endswith("--")) {
+ m_is_dashdash_alias = eLazyBoolYes;
+ break;
}
-
- help_string.Printf ("'");
-}
+ }
-bool
-CommandAlias::IsDashDashCommand ()
-{
- if (m_is_dashdash_alias == eLazyBoolCalculate)
- {
- m_is_dashdash_alias = eLazyBoolNo;
- if (IsValid())
- {
- for (const OptionArgPair& opt_arg : *GetOptionArguments())
- {
- if (opt_arg.first == "<argument>" &&
- !opt_arg.second.second.empty() &&
- llvm::StringRef(opt_arg.second.second).endswith("--"))
- {
- m_is_dashdash_alias = eLazyBoolYes;
- break;
- }
- }
- // if this is a nested alias, it may be adding arguments on top of an already dash-dash alias
- if ((m_is_dashdash_alias == eLazyBoolNo) && IsNestedAlias())
- m_is_dashdash_alias = (GetUnderlyingCommand()->IsDashDashCommand() ? eLazyBoolYes : eLazyBoolNo);
- }
- }
- return (m_is_dashdash_alias == eLazyBoolYes);
+ // if this is a nested alias, it may be adding arguments on top of an
+ // already dash-dash alias
+ if ((m_is_dashdash_alias == eLazyBoolNo) && IsNestedAlias())
+ m_is_dashdash_alias =
+ (GetUnderlyingCommand()->IsDashDashCommand() ? eLazyBoolYes
+ : eLazyBoolNo);
+ return (m_is_dashdash_alias == eLazyBoolYes);
}
-bool
-CommandAlias::IsNestedAlias ()
-{
- if (GetUnderlyingCommand())
- return GetUnderlyingCommand()->IsAlias();
- return false;
+bool CommandAlias::IsNestedAlias() {
+ if (GetUnderlyingCommand())
+ return GetUnderlyingCommand()->IsAlias();
+ return false;
}
-std::pair<lldb::CommandObjectSP, OptionArgVectorSP>
-CommandAlias::Desugar ()
-{
- auto underlying = GetUnderlyingCommand();
- if (!underlying)
- return {nullptr,nullptr};
-
- if (underlying->IsAlias())
- {
- auto desugared = ((CommandAlias*)underlying.get())->Desugar();
- auto options = GetOptionArguments();
- options->insert(options->begin(), desugared.second->begin(), desugared.second->end());
- return {desugared.first,options};
- }
+std::pair<lldb::CommandObjectSP, OptionArgVectorSP> CommandAlias::Desugar() {
+ auto underlying = GetUnderlyingCommand();
+ if (!underlying)
+ return {nullptr, nullptr};
+
+ if (underlying->IsAlias()) {
+ auto desugared = ((CommandAlias *)underlying.get())->Desugar();
+ auto options = GetOptionArguments();
+ options->insert(options->begin(), desugared.second->begin(),
+ desugared.second->end());
+ return {desugared.first, options};
+ }
- return {underlying,GetOptionArguments()};
+ return {underlying, GetOptionArguments()};
}
-// allow CommandAlias objects to provide their own help, but fallback to the info
+// allow CommandAlias objects to provide their own help, but fallback to the
+// info
// for the underlying command if no customization has been provided
-void
-CommandAlias::SetHelp (const char * str)
-{
- this->CommandObject::SetHelp(str);
- m_did_set_help = true;
+void CommandAlias::SetHelp(llvm::StringRef str) {
+ this->CommandObject::SetHelp(str);
+ m_did_set_help = true;
}
-void
-CommandAlias::SetHelpLong (const char * str)
-{
- this->CommandObject::SetHelpLong(str);
- m_did_set_help_long = true;
+void CommandAlias::SetHelpLong(llvm::StringRef str) {
+ this->CommandObject::SetHelpLong(str);
+ m_did_set_help_long = true;
}
-const char*
-CommandAlias::GetHelp ()
-{
- if (!m_cmd_help_short.empty() || m_did_set_help)
- return m_cmd_help_short.c_str();
- if (IsValid())
- return m_underlying_command_sp->GetHelp();
- return nullptr;
+llvm::StringRef CommandAlias::GetHelp() {
+ if (!m_cmd_help_short.empty() || m_did_set_help)
+ return m_cmd_help_short;
+ if (IsValid())
+ return m_underlying_command_sp->GetHelp();
+ return llvm::StringRef();
}
-const char*
-CommandAlias::GetHelpLong ()
-{
- if (!m_cmd_help_long.empty() || m_did_set_help_long)
- return m_cmd_help_long.c_str();
- if (IsValid())
- return m_underlying_command_sp->GetHelpLong();
- return nullptr;
+llvm::StringRef CommandAlias::GetHelpLong() {
+ if (!m_cmd_help_long.empty() || m_did_set_help_long)
+ return m_cmd_help_long;
+ if (IsValid())
+ return m_underlying_command_sp->GetHelpLong();
+ return llvm::StringRef();
}
OpenPOWER on IntegriCloud