From cff880b0c9a07ff8275e91982c0d6e2293b537e7 Mon Sep 17 00:00:00 2001 From: Raphael Isemann Date: Wed, 12 Aug 2020 13:52:03 +0200 Subject: [PATCH] Revert "[lldb] Display autosuggestion part in gray if there is one possible suggestion" This reverts commit 246afe0cd17fce935a01171f3cca548e02523e5c. This broke the following tests on Linux it seems: lldb-api :: commands/expression/multiline-completion/TestMultilineCompletion.py lldb-api :: iohandler/completion/TestIOHandlerCompletion.py --- lldb/include/lldb/Core/Debugger.h | 2 - lldb/include/lldb/Core/IOHandler.h | 6 - lldb/include/lldb/Host/Editline.h | 16 +-- .../lldb/Interpreter/CommandInterpreter.h | 4 - lldb/source/Core/CoreProperties.td | 4 - lldb/source/Core/Debugger.cpp | 6 - lldb/source/Core/IOHandler.cpp | 20 ---- lldb/source/Host/common/Editline.cpp | 88 +-------------- .../source/Interpreter/CommandInterpreter.cpp | 13 --- .../autosuggestion/TestAutosuggestion.py | 105 ------------------ 10 files changed, 2 insertions(+), 262 deletions(-) delete mode 100644 lldb/test/API/iohandler/autosuggestion/TestAutosuggestion.py diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index 252380de2786..7bea0dbae082 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -273,8 +273,6 @@ public: bool SetUseColor(bool use_color); - bool GetUseAutosuggestion() const; - bool GetUseSourceCache() const; bool SetUseSourceCache(bool use_source_cache); diff --git a/lldb/include/lldb/Core/IOHandler.h b/lldb/include/lldb/Core/IOHandler.h index f29482c0c97a..51592afbbabe 100644 --- a/lldb/include/lldb/Core/IOHandler.h +++ b/lldb/include/lldb/Core/IOHandler.h @@ -203,9 +203,6 @@ public: virtual void IOHandlerDeactivated(IOHandler &io_handler) {} - virtual llvm::Optional IOHandlerSuggestion(IOHandler &io_handler, - llvm::StringRef line); - virtual void IOHandlerComplete(IOHandler &io_handler, CompletionRequest &request); @@ -423,9 +420,6 @@ private: static int FixIndentationCallback(Editline *editline, const StringList &lines, int cursor_position, void *baton); - static llvm::Optional SuggestionCallback(llvm::StringRef line, - void *baton); - static void AutoCompleteCallback(CompletionRequest &request, void *baton); #endif diff --git a/lldb/include/lldb/Host/Editline.h b/lldb/include/lldb/Host/Editline.h index a37ad1b9d106..356e8f734732 100644 --- a/lldb/include/lldb/Host/Editline.h +++ b/lldb/include/lldb/Host/Editline.h @@ -98,9 +98,6 @@ typedef int (*FixIndentationCallbackType)(Editline *editline, const StringList &lines, int cursor_position, void *baton); -typedef llvm::Optional (*SuggestionCallbackType)( - llvm::StringRef line, void *baton); - typedef void (*CompleteCallbackType)(CompletionRequest &request, void *baton); /// Status used to decide when and how to start editing another line in @@ -187,9 +184,6 @@ public: /// Cancel this edit and oblitarate all trace of it bool Cancel(); - /// Register a callback for autosuggestion. - void SetSuggestionCallback(SuggestionCallbackType callback, void *baton); - /// Register a callback for the tab key void SetAutoCompleteCallback(CompleteCallbackType callback, void *baton); @@ -318,12 +312,6 @@ private: /// tab key is typed. unsigned char TabCommand(int ch); - /// Apply autosuggestion part in gray as editline. - unsigned char ApplyAutosuggestCommand(int ch); - - /// Command used when a character is typed. - unsigned char TypedCharacter(int ch); - /// Respond to normal character insertion by fixing line indentation unsigned char FixIndentationCommand(int ch); @@ -372,9 +360,7 @@ private: const char *m_fix_indentation_callback_chars = nullptr; CompleteCallbackType m_completion_callback = nullptr; void *m_completion_callback_baton = nullptr; - SuggestionCallbackType m_suggestion_callback = nullptr; - void *m_suggestion_callback_baton = nullptr; - std::size_t m_previous_autosuggestion_size = 0; + std::mutex m_output_mutex; }; } diff --git a/lldb/include/lldb/Interpreter/CommandInterpreter.h b/lldb/include/lldb/Interpreter/CommandInterpreter.h index 36d7e5d3c118..6ef22c1a28c1 100644 --- a/lldb/include/lldb/Interpreter/CommandInterpreter.h +++ b/lldb/include/lldb/Interpreter/CommandInterpreter.h @@ -351,10 +351,6 @@ public: CommandObject *GetCommandObjectForCommand(llvm::StringRef &command_line); - /// Returns the auto-suggestion string that should be added to the given - /// command line. - llvm::Optional GetAutoSuggestionForCommand(llvm::StringRef line); - // This handles command line completion. void HandleCompletion(CompletionRequest &request); diff --git a/lldb/source/Core/CoreProperties.td b/lldb/source/Core/CoreProperties.td index 96f67801553b..b04738175f34 100644 --- a/lldb/source/Core/CoreProperties.td +++ b/lldb/source/Core/CoreProperties.td @@ -131,8 +131,4 @@ let Definition = "debugger" in { Global, DefaultStringValue<"frame #${frame.index}: ${ansi.fg.yellow}${frame.pc}${ansi.normal}{ ${module.file.basename}{`${function.name-without-args}{${frame.no-debug}${function.pc-offset}}}}{ at ${ansi.fg.cyan}${line.file.basename}${ansi.normal}:${ansi.fg.yellow}${line.number}${ansi.normal}{:${ansi.fg.yellow}${line.column}${ansi.normal}}}{${function.is-optimized} [opt]}{${frame.is-artificial} [artificial]}\\\\n">, Desc<"The default frame format string to use when displaying stack frameinformation for threads from thread backtrace unique.">; - def ShowAutosuggestion: Property<"show-autosuggestion", "Boolean">, - Global, - DefaultFalse, - Desc<"If true, LLDB will show suggestions to complete the command the user typed.">; } diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 61d77d03f893..1fb7393eef0a 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -346,12 +346,6 @@ bool Debugger::SetUseColor(bool b) { return ret; } -bool Debugger::GetUseAutosuggestion() const { - const uint32_t idx = ePropertyShowAutosuggestion; - return m_collection_sp->GetPropertyAtIndexAsBoolean( - nullptr, idx, g_debugger_properties[idx].default_uint_value != 0); -} - bool Debugger::GetUseSourceCache() const { const uint32_t idx = ePropertyUseSourceCache; return m_collection_sp->GetPropertyAtIndexAsBoolean( diff --git a/lldb/source/Core/IOHandler.cpp b/lldb/source/Core/IOHandler.cpp index ca35d9fb315d..6cf09aaa7f9d 100644 --- a/lldb/source/Core/IOHandler.cpp +++ b/lldb/source/Core/IOHandler.cpp @@ -195,14 +195,6 @@ void IOHandlerConfirm::IOHandlerInputComplete(IOHandler &io_handler, } } -llvm::Optional -IOHandlerDelegate::IOHandlerSuggestion(IOHandler &io_handler, - llvm::StringRef line) { - return io_handler.GetDebugger() - .GetCommandInterpreter() - .GetAutoSuggestionForCommand(line); -} - void IOHandlerDelegate::IOHandlerComplete(IOHandler &io_handler, CompletionRequest &request) { switch (m_completion) { @@ -266,8 +258,6 @@ IOHandlerEditline::IOHandlerEditline( m_color_prompts); m_editline_up->SetIsInputCompleteCallback(IsInputCompleteCallback, this); m_editline_up->SetAutoCompleteCallback(AutoCompleteCallback, this); - if (debugger.GetUseAutosuggestion() && debugger.GetUseColor()) - m_editline_up->SetSuggestionCallback(SuggestionCallback, this); // See if the delegate supports fixing indentation const char *indent_chars = delegate.IOHandlerGetFixIndentationCharacters(); if (indent_chars) { @@ -440,16 +430,6 @@ int IOHandlerEditline::FixIndentationCallback(Editline *editline, *editline_reader, lines, cursor_position); } -llvm::Optional -IOHandlerEditline::SuggestionCallback(llvm::StringRef line, void *baton) { - IOHandlerEditline *editline_reader = static_cast(baton); - if (editline_reader) - return editline_reader->m_delegate.IOHandlerSuggestion(*editline_reader, - line); - - return llvm::None; -} - void IOHandlerEditline::AutoCompleteCallback(CompletionRequest &request, void *baton) { IOHandlerEditline *editline_reader = (IOHandlerEditline *)baton; diff --git a/lldb/source/Host/common/Editline.cpp b/lldb/source/Host/common/Editline.cpp index 0f2cae1c27fd..49b7a38d8dae 100644 --- a/lldb/source/Host/common/Editline.cpp +++ b/lldb/source/Host/common/Editline.cpp @@ -1008,10 +1008,7 @@ unsigned char Editline::TabCommand(int ch) { to_add.push_back(request.GetParsedArg().GetQuoteChar()); to_add.push_back(' '); el_insertstr(m_editline, to_add.c_str()); - // Clear all the autosuggestion parts if the only single space can be completed. - if (to_add == " ") - return CC_REDISPLAY; - return CC_REFRESH; + break; } case CompletionMode::Partial: { std::string to_add = completion.GetCompletion(); @@ -1045,52 +1042,6 @@ unsigned char Editline::TabCommand(int ch) { return CC_REDISPLAY; } -unsigned char Editline::ApplyAutosuggestCommand(int ch) { - const LineInfo *line_info = el_line(m_editline); - llvm::StringRef line(line_info->buffer, - line_info->lastchar - line_info->buffer); - - if (llvm::Optional to_add = - m_suggestion_callback(line, m_suggestion_callback_baton)) - el_insertstr(m_editline, to_add->c_str()); - - return CC_REDISPLAY; -} - -unsigned char Editline::TypedCharacter(int ch) { - std::string typed = std::string(1, ch); - el_insertstr(m_editline, typed.c_str()); - const LineInfo *line_info = el_line(m_editline); - llvm::StringRef line(line_info->buffer, - line_info->lastchar - line_info->buffer); - - if (llvm::Optional to_add = - m_suggestion_callback(line, m_suggestion_callback_baton)) { - std::string to_add_color = ANSI_FAINT + to_add.getValue() + ANSI_UNFAINT; - fputs(typed.c_str(), m_output_file); - fputs(to_add_color.c_str(), m_output_file); - size_t new_autosuggestion_size = line.size() + to_add->length(); - // Print spaces to hide any remains of a previous longer autosuggestion. - if (new_autosuggestion_size < m_previous_autosuggestion_size) { - size_t spaces_to_print = - m_previous_autosuggestion_size - new_autosuggestion_size; - std::string spaces = std::string(spaces_to_print, ' '); - fputs(spaces.c_str(), m_output_file); - } - m_previous_autosuggestion_size = new_autosuggestion_size; - - int editline_cursor_position = - (int)((line_info->cursor - line_info->buffer) + GetPromptWidth()); - int editline_cursor_row = editline_cursor_position / m_terminal_width; - int toColumn = - editline_cursor_position - (editline_cursor_row * m_terminal_width); - fprintf(m_output_file, ANSI_SET_COLUMN_N, toColumn); - return CC_REFRESH; - } - - return CC_REDISPLAY; -} - void Editline::ConfigureEditor(bool multiline) { if (m_editline && m_multiline_enabled == multiline) return; @@ -1204,38 +1155,7 @@ void Editline::ConfigureEditor(bool multiline) { if (!multiline) { el_set(m_editline, EL_BIND, "^r", "em-inc-search-prev", NULL); // Cycle through backwards search, entering string - - if (m_suggestion_callback) { - el_wset(m_editline, EL_ADDFN, EditLineConstString("lldb-apply-complete"), - EditLineConstString("Adopt autocompletion"), - (EditlineCommandCallbackType)([](EditLine *editline, int ch) { - return Editline::InstanceFor(editline)->ApplyAutosuggestCommand( - ch); - })); - - el_set(m_editline, EL_BIND, "^f", "lldb-apply-complete", - NULL); // Apply a part that is suggested automatically - - el_wset(m_editline, EL_ADDFN, EditLineConstString("lldb-typed-character"), - EditLineConstString("Typed character"), - (EditlineCommandCallbackType)([](EditLine *editline, int ch) { - return Editline::InstanceFor(editline)->TypedCharacter(ch); - })); - - char bind_key[2] = {0, 0}; - llvm::StringRef ascii_chars = - "abcdefghijklmnopqrstuvwxzyABCDEFGHIJKLMNOPQRSTUVWXZY1234567890!\"#$%" - "&'()*+,./:;<=>?@[]_`{|}~ "; - for (char c : ascii_chars) { - bind_key[0] = c; - el_set(m_editline, EL_BIND, bind_key, "lldb-typed-character", NULL); - } - el_set(m_editline, EL_BIND, "\\-", "lldb-typed-character", NULL); - el_set(m_editline, EL_BIND, "\\^", "lldb-typed-character", NULL); - el_set(m_editline, EL_BIND, "\\\\", "lldb-typed-character", NULL); - } } - el_set(m_editline, EL_BIND, "^w", "ed-delete-prev-word", NULL); // Delete previous word, behave like bash in emacs mode el_set(m_editline, EL_BIND, "\t", "lldb-complete", @@ -1446,12 +1366,6 @@ bool Editline::Cancel() { return result; } -void Editline::SetSuggestionCallback(SuggestionCallbackType callback, - void *baton) { - m_suggestion_callback = callback; - m_suggestion_callback_baton = baton; -} - void Editline::SetAutoCompleteCallback(CompleteCallbackType callback, void *baton) { m_completion_callback = callback; diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index ec82efbe926d..4786e4602e4b 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -1878,19 +1878,6 @@ void CommandInterpreter::HandleCompletion(CompletionRequest &request) { HandleCompletionMatches(request); } -llvm::Optional -CommandInterpreter::GetAutoSuggestionForCommand(llvm::StringRef line) { - if (line.empty()) - return llvm::None; - const size_t s = m_command_history.GetSize(); - for (int i = s - 1; i >= 0; --i) { - llvm::StringRef entry = m_command_history.GetStringAtIndex(i); - if (entry.consume_front(line)) - return entry.str(); - } - return llvm::None; -} - CommandInterpreter::~CommandInterpreter() {} void CommandInterpreter::UpdatePrompt(llvm::StringRef new_prompt) { diff --git a/lldb/test/API/iohandler/autosuggestion/TestAutosuggestion.py b/lldb/test/API/iohandler/autosuggestion/TestAutosuggestion.py deleted file mode 100644 index 3c8d20b2d1de..000000000000 --- a/lldb/test/API/iohandler/autosuggestion/TestAutosuggestion.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -Tests autosuggestion using pexpect. -""" - -import lldb -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test.lldbpexpect import PExpectTest - -def cursor_horizontal_abs(s): - return "\x1b[" + str(len(s) + 1) + "G" - - - -class TestCase(PExpectTest): - - mydir = TestBase.compute_mydir(__file__) - - # PExpect uses many timeouts internally and doesn't play well - # under ASAN on a loaded machine.. - @skipIfAsan - @skipIfEditlineSupportMissing - def test_autosuggestion_add_spaces(self): - self.launch(extra_args=["-o", "settings set show-autosuggestion true", "-o", "settings set use-color true"]) - - # Common input codes and escape sequences. - faint_color = "\x1b[2m" - reset = "\x1b[0m" - - # Check if spaces are added to hide the previous gray characters. - self.expect("help frame var") - self.expect("help frame info") - self.child.send("help frame v") - self.child.expect_exact(cursor_horizontal_abs("(lldb) help frame ") + "v" + faint_color + "ar" + reset + " ") - - self.quit() - - @skipIfAsan - @skipIfEditlineSupportMissing - def test_autosuggestion(self): - self.launch(extra_args=["-o", "settings set show-autosuggestion true", "-o", "settings set use-color true"]) - - # Common input codes and escape sequences. - ctrl_f = "\x06" - faint_color = "\x1b[2m" - reset = "\x1b[0m" - delete = chr(127) - - frame_output_needle = "Syntax: frame " - # Run 'help frame' once to put it into the command history. - self.expect("help frame", substrs=[frame_output_needle]) - - # Check that LLDB shows the autosuggestion in gray behind the text. - self.child.send("hel") - self.child.expect_exact(cursor_horizontal_abs("(lldb) he") + "l" + faint_color + "p frame" + reset) - - # Apply the autosuggestion and press enter. This should print the - # 'help frame' output if everything went correctly. - self.child.send(ctrl_f + "\n") - self.child.expect_exact(frame_output_needle) - - # Check that pressing Ctrl+F directly after Ctrl+F again does nothing. - self.child.send("hel" + ctrl_f + ctrl_f + "\n") - self.child.expect_exact(frame_output_needle) - - # Try autosuggestion using tab and ^f. - # \t makes "help" and ^f makes "help frame". If everything went - # correct we should see the 'help frame' output again. - self.child.send("hel\t" + ctrl_f + "\n") - self.child.expect_exact(frame_output_needle) - - # Check that autosuggestion works after delete. - self.child.send("a1234" + 5 * delete + "hel" + ctrl_f + "\n") - self.child.expect_exact(frame_output_needle) - - # Check that autosuggestion works after delete. - self.child.send("help x" + delete + ctrl_f + "\n") - self.child.expect_exact(frame_output_needle) - - # Check that autosuggestion complete to the most recent one. - self.child.send("help frame variable\n") - self.child.send("help fr") - self.child.expect_exact(faint_color + "ame variable" + reset) - self.child.send("\n") - - # Try another command. - apropos_output_needle = "Syntax: apropos " - # Run 'help frame' once to put it into the command history. - self.expect("help apropos", substrs=[apropos_output_needle]) - - # Check that 'hel' should have an autosuggestion for 'help apropos' now. - self.child.send("hel") - self.child.expect_exact(cursor_horizontal_abs("(lldb) he") + "l" + faint_color + "p apropos" + reset) - - # Run the command and expect the 'help apropos' output. - self.child.send(ctrl_f + "\n") - self.child.expect_exact(apropos_output_needle) - - # Check that pressing Ctrl+F in an empty prompt does nothing. - breakpoint_output_needle = "Syntax: breakpoint " - self.child.send(ctrl_f + "help breakpoint" +"\n") - self.child.expect_exact(breakpoint_output_needle) - - - self.quit()