Don't print two errors for unknown commands.
authorRaphael Isemann <teemperor@gmail.com>
Thu, 26 Jul 2018 16:32:05 +0000 (16:32 +0000)
committerRaphael Isemann <teemperor@gmail.com>
Thu, 26 Jul 2018 16:32:05 +0000 (16:32 +0000)
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

lldb/packages/Python/lldbsuite/test/functionalities/wrong_commands/.categories [new file with mode: 0644]
lldb/packages/Python/lldbsuite/test/functionalities/wrong_commands/TestWrongCommands.py [new file with mode: 0644]
lldb/source/Interpreter/CommandInterpreter.cpp

diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/wrong_commands/.categories b/lldb/packages/Python/lldbsuite/test/functionalities/wrong_commands/.categories
new file mode 100644 (file)
index 0000000..3a3f4df
--- /dev/null
@@ -0,0 +1 @@
+cmdline
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/wrong_commands/TestWrongCommands.py b/lldb/packages/Python/lldbsuite/test/functionalities/wrong_commands/TestWrongCommands.py
new file mode 100644 (file)
index 0000000..dcfb434
--- /dev/null
@@ -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")
index df27eb2..977c9ba 100644 (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)