Don't print two errors for unknown commands.

Summary:
We always print two error messages when we hit an unknown command. As the function
`CommandInterpreter::HandleCommand` that prints the second error message unconditionally called the `CommandInterpreter::ResolveCommandImpl` before (which prints the first error message), we can just remove
that second error message.

Fixes https://bugs.llvm.org/show_bug.cgi?id=38312

Reviewers: labath

Reviewed By: labath

Subscribers: labath, lldb-commits

Differential Revision: https://reviews.llvm.org/D49831

llvm-svn: 338040
This commit is contained in:
Raphael Isemann 2018-07-26 16:32:05 +00:00
parent 4dd7558fab
commit 6fcc7d703b
3 changed files with 40 additions and 27 deletions

View File

@ -0,0 +1,39 @@
"""
Test how lldb reacts to wrong commands
"""
from __future__ import print_function
import os
import time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class UnknownCommandTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
@no_debug_info_test
def test_ambiguous_command(self):
command_interpreter = self.dbg.GetCommandInterpreter()
self.assertTrue(command_interpreter, VALID_COMMAND_INTERPRETER)
result = lldb.SBCommandReturnObject()
command_interpreter.HandleCommand("g", result)
self.assertFalse(result.Succeeded())
self.assertRegexpMatches(result.GetError(), "Ambiguous command 'g'. Possible matches:")
self.assertRegexpMatches(result.GetError(), "gui")
self.assertRegexpMatches(result.GetError(), "gdb-remote")
# FIXME: Somehow we get 'gui' and 'gdb-remote' twice in the output.
@no_debug_info_test
def test_unknown_command(self):
command_interpreter = self.dbg.GetCommandInterpreter()
self.assertTrue(command_interpreter, VALID_COMMAND_INTERPRETER)
result = lldb.SBCommandReturnObject()
command_interpreter.HandleCommand("qbert", result)
self.assertFalse(result.Succeeded())
self.assertEquals(result.GetError(), "error: 'qbert' is not a valid command.\n")

View File

@ -1693,33 +1693,6 @@ bool CommandInterpreter::HandleCommand(const char *command_line,
remainder.c_str());
cmd_obj->Execute(remainder.c_str(), result);
} else {
// We didn't find the first command object, so complete the first argument.
Args command_args(command_string);
StringList matches;
unsigned cursor_char_position = strlen(command_args.GetArgumentAtIndex(0));
CompletionRequest request(command_line, cursor_char_position, 0, -1,
matches);
int num_matches = HandleCompletionMatches(request);
if (num_matches > 0) {
std::string error_msg;
error_msg.assign("ambiguous command '");
error_msg.append(command_args.GetArgumentAtIndex(0));
error_msg.append("'.");
error_msg.append(" Possible completions:");
for (int i = 0; i < num_matches; i++) {
error_msg.append("\n\t");
error_msg.append(matches.GetStringAtIndex(i));
}
error_msg.append("\n");
result.AppendRawError(error_msg.c_str());
} else
result.AppendErrorWithFormat("Unrecognized command '%s'.\n",
command_args.GetArgumentAtIndex(0));
result.SetStatus(eReturnStatusFailed);
}
if (log)