diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index c2c70dc8aaa046..65b3cf535bfc43 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -1837,6 +1837,8 @@ void CommandInterpreter::HandleCompletionMatches(CompletionRequest &request) { void CommandInterpreter::HandleCompletion(CompletionRequest &request) { + UpdateExecutionContext(nullptr); + // Don't complete comments, and if the line we are completing is just the // history repeat character, substitute the appropriate history line. llvm::StringRef first_arg = request.GetParsedLine().GetArgumentAtIndex(0); diff --git a/lldb/source/Interpreter/CommandObject.cpp b/lldb/source/Interpreter/CommandObject.cpp index b87ca44c9943fc..01fa86750b1221 100644 --- a/lldb/source/Interpreter/CommandObject.cpp +++ b/lldb/source/Interpreter/CommandObject.cpp @@ -267,6 +267,9 @@ void CommandObject::Cleanup() { } void CommandObject::HandleCompletion(CompletionRequest &request) { + + m_exe_ctx = m_interpreter.GetExecutionContext(); + // 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. @@ -293,6 +296,8 @@ void CommandObject::HandleCompletion(CompletionRequest &request) { // If we got here, the last word is not an option or an option argument. HandleArgumentCompletion(request, opt_element_vector); } + + m_exe_ctx.Clear(); } bool CommandObject::HelpTextContainsWord(llvm::StringRef search_word, diff --git a/lldb/test/API/functionalities/completion/TestCompletion.py b/lldb/test/API/functionalities/completion/TestCompletion.py index 9e15b5d3f557b1..1156650c78f8b2 100644 --- a/lldb/test/API/functionalities/completion/TestCompletion.py +++ b/lldb/test/API/functionalities/completion/TestCompletion.py @@ -43,9 +43,10 @@ def test_frame_variable(self): (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec) self.assertEquals(process.GetState(), lldb.eStateStopped) - # FIXME: This pulls in the debug information to make the completions work, - # but the completions should also work without. - self.runCmd("frame variable fooo") + + # Since CommandInterpreter has been corrected to update the current execution + # context at the beginning of HandleCompletion, we're here explicitly testing + # the scenario where "frame var" is completed without any preceding commands. self.complete_from_to('frame variable fo', 'frame variable fooo')