From f73363f1dd94996356cefbf24388f561891acf0b Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sat, 28 Jul 2018 11:09:23 +0000 Subject: Vendor import of lldb trunk r338150: https://llvm.org/svn/llvm-project/lldb/trunk@338150 --- source/Interpreter/CommandObject.cpp | 123 ++++++++++++++++------------------- 1 file changed, 56 insertions(+), 67 deletions(-) (limited to 'source/Interpreter/CommandObject.cpp') diff --git a/source/Interpreter/CommandObject.cpp b/source/Interpreter/CommandObject.cpp index 98a6a941864e..07be9139f219 100644 --- a/source/Interpreter/CommandObject.cpp +++ b/source/Interpreter/CommandObject.cpp @@ -90,8 +90,8 @@ void CommandObject::SetHelpLong(llvm::StringRef str) { m_cmd_help_long = str; } void CommandObject::SetSyntax(llvm::StringRef str) { m_cmd_syntax = str; } Options *CommandObject::GetOptions() { - // By default commands don't have options unless this virtual function - // is overridden by base classes. + // By default commands don't have options unless this virtual function is + // overridden by base classes. return nullptr; } @@ -104,20 +104,16 @@ bool CommandObject::ParseOptions(Args &args, CommandReturnObject &result) { auto exe_ctx = GetCommandInterpreter().GetExecutionContext(); options->NotifyOptionParsingStarting(&exe_ctx); - // ParseOptions calls getopt_long_only, which always skips the zero'th item - // in the array and starts at position 1, - // so we need to push a dummy value into position zero. - args.Unshift(llvm::StringRef("dummy_string")); const bool require_validation = true; - error = args.ParseOptions(*options, &exe_ctx, - GetCommandInterpreter().GetPlatform(true), - require_validation); + llvm::Expected args_or = options->Parse( + args, &exe_ctx, GetCommandInterpreter().GetPlatform(true), + require_validation); - // The "dummy_string" will have already been removed by ParseOptions, - // so no need to remove it. - - if (error.Success()) + if (args_or) { + args = std::move(*args_or); error = options->NotifyOptionParsingFinished(&exe_ctx); + } else + error = args_or.takeError(); if (error.Success()) { if (options->VerifyOptions(result)) @@ -142,10 +138,10 @@ bool CommandObject::ParseOptions(Args &args, CommandReturnObject &result) { bool CommandObject::CheckRequirements(CommandReturnObject &result) { #ifdef LLDB_CONFIGURATION_DEBUG - // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx - // has shared pointers to the target, process, thread and frame and we don't - // want any CommandObject instances to keep any of these objects around - // longer than for a single command. Every command should call + // Nothing should be stored in m_exe_ctx between running commands as + // m_exe_ctx has shared pointers to the target, process, thread and frame and + // we don't want any CommandObject instances to keep any of these objects + // around longer than for a single command. Every command should call // CommandObject::Cleanup() after it has completed assert(m_exe_ctx.GetTargetPtr() == NULL); assert(m_exe_ctx.GetProcessPtr() == NULL); @@ -153,9 +149,9 @@ bool CommandObject::CheckRequirements(CommandReturnObject &result) { assert(m_exe_ctx.GetFramePtr() == NULL); #endif - // Lock down the interpreter's execution context prior to running the - // command so we guarantee the selected target, process, thread and frame - // can't go away during the execution + // Lock down the interpreter's execution context prior to running the command + // so we guarantee the selected target, process, thread and frame can't go + // away during the execution m_exe_ctx = m_interpreter.GetExecutionContext(); const uint32_t flags = GetFlags().Get(); @@ -264,19 +260,14 @@ void CommandObject::Cleanup() { m_api_locker.unlock(); } -int CommandObject::HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - int match_start_point, - int max_return_elements, - bool &word_complete, StringList &matches) { +int CommandObject::HandleCompletion(CompletionRequest &request) { // Default implementation of WantsCompletion() is !WantsRawCommandString(). - // Subclasses who want raw command string but desire, for example, - // argument completion should override WantsCompletion() to return true, - // instead. + // Subclasses who want raw command string but desire, for example, argument + // completion should override WantsCompletion() to return true, instead. if (WantsRawCommandString() && !WantsCompletion()) { // FIXME: Abstract telling the completion to insert the completion // character. - matches.Clear(); + request.GetMatches().Clear(); return -1; } else { // Can we do anything generic with the options? @@ -285,34 +276,17 @@ int CommandObject::HandleCompletion(Args &input, int &cursor_index, OptionElementVector opt_element_vector; if (cur_options != nullptr) { - // Re-insert the dummy command name string which will have been - // stripped off: - input.Unshift(llvm::StringRef("dummy-string")); - cursor_index++; - - // I stick an element on the end of the input, because if the last element - // is option that requires an argument, getopt_long_only will freak out. - - input.AppendArgument(llvm::StringRef("")); - - input.ParseArgsForCompletion(*cur_options, opt_element_vector, - cursor_index); + opt_element_vector = cur_options->ParseForCompletion( + request.GetParsedLine(), request.GetCursorIndex()); - input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1); - - bool handled_by_options; - handled_by_options = cur_options->HandleOptionCompletion( - input, opt_element_vector, cursor_index, cursor_char_position, - match_start_point, max_return_elements, GetCommandInterpreter(), - word_complete, matches); + bool handled_by_options = cur_options->HandleOptionCompletion( + request, opt_element_vector, GetCommandInterpreter()); if (handled_by_options) - return matches.GetSize(); + return request.GetMatches().GetSize(); } // If we got here, the last word is not an option or an option argument. - return HandleArgumentCompletion( - input, cursor_index, cursor_char_position, opt_element_vector, - match_start_point, max_return_elements, word_complete, matches); + return HandleArgumentCompletion(request, opt_element_vector); } } @@ -351,6 +325,22 @@ bool CommandObject::HelpTextContainsWord(llvm::StringRef search_word, return found_word; } +bool CommandObject::ParseOptionsAndNotify(Args &args, + CommandReturnObject &result, + OptionGroupOptions &group_options, + ExecutionContext &exe_ctx) { + if (!ParseOptions(args, result)) + return false; + + Status error(group_options.NotifyOptionParsingFinished(&exe_ctx)); + if (error.Fail()) { + result.AppendError(error.AsCString()); + result.SetStatus(eReturnStatusFailed); + return false; + } + return true; +} + int CommandObject::GetNumArgumentEntries() { return m_arguments.size(); } CommandObject::CommandArgumentEntry * @@ -441,9 +431,10 @@ OptSetFiltered(uint32_t opt_set_mask, return ret_val; } -// Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take -// all the argument data into account. On rare cases where some argument sticks -// with certain option sets, this function returns the option set filtered args. +// Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means +// take all the argument data into account. On rare cases where some argument +// sticks with certain option sets, this function returns the option set +// filtered args. void CommandObject::GetFormattedCommandArguments(Stream &str, uint32_t opt_set_mask) { int num_args = m_arguments.size(); @@ -483,8 +474,7 @@ void CommandObject::GetFormattedCommandArguments(Stream &str, first_name, second_name); break; // Explicitly test for all the rest of the cases, so if new types get - // added we will notice the - // missing case statement(s). + // added we will notice the missing case statement(s). case eArgRepeatPlain: case eArgRepeatOptional: case eArgRepeatPlus: @@ -520,8 +510,7 @@ void CommandObject::GetFormattedCommandArguments(Stream &str, str.Printf("<%s_1> .. <%s_n>", name_str.c_str(), name_str.c_str()); break; // Explicitly test for all the rest of the cases, so if new types get - // added we will notice the - // missing case statement(s). + // added we will notice the missing case statement(s). case eArgRepeatPairPlain: case eArgRepeatPairOptional: case eArgRepeatPairPlus: @@ -529,8 +518,8 @@ void CommandObject::GetFormattedCommandArguments(Stream &str, case eArgRepeatPairRange: case eArgRepeatPairRangeOptional: // These should not be hit, as they should pass the IsPairType test - // above, and control should - // have gone into the other branch of the if statement. + // above, and control should have gone into the other branch of the if + // statement. break; } } @@ -874,9 +863,8 @@ void CommandObject::GenerateHelpText(Stream &output_strm) { if (!IsDashDashCommand() && options && options->NumCommandOptions() > 0) { 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. + // 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 " @@ -916,8 +904,8 @@ void CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, id_range_arg.arg_repetition = eArgRepeatOptional; // The first (and only) argument for this command could be either an id or an - // id_range. - // Push both variants into the entry for the first argument for this command. + // id_range. Push both variants into the entry for the first argument for + // this command. arg.push_back(id_arg); arg.push_back(id_range_arg); } @@ -1021,7 +1009,8 @@ static llvm::StringRef arch_helper() { static StreamString g_archs_help; if (g_archs_help.Empty()) { StringList archs; - ArchSpec::AutoComplete(llvm::StringRef(), archs); + + ArchSpec::ListSupportedArchNames(archs); g_archs_help.Printf("These are the supported architecture names:\n"); archs.Join("\n", g_archs_help); } -- cgit v1.2.3