@@ -1,3 +1,10 @@
+2019-01-28 Jan Vrany <jan.vrany@fit.cvut.cz>
+
+ * mi/mi-cmds.h (mi_cmd_complete): New function.
+ * mi/mi-main.c (mi_cmd_complete): Likewise.
+ * mi/mi-cmds.c: Define new MI command -complete.
+ * NEWS: Mention new -complete command.
+
2019-01-24 Jan Vrany <jan.vrany@fit.cvut.cz>
* completer.h (complete): New function.
@@ -96,6 +96,13 @@ maint show dwarf unwinders
info proc files
Display a list of open files for a process.
+* New MI commands
+
+-complete
+ This lists all the possible completions for the rest of the line, if it
+ were to be given as a command itself. This is intended for use by MI frontends
+ in cases when separate CLI and MI channels cannot be used.
+
* Changed commands
Changes to the "frame", "select-frame", and "info frame" CLI commands.
@@ -1,3 +1,8 @@
+2019-01-28 Jan Vrany <jan.vrany@fit.cvut.cz>
+
+ * gdb.texinfo (Miscellaneous GDB/MI Commands): Document new
+ MI command -complete.
+
2019-01-16 Simon Marchi <simon.marchi@ericsson.com>
* gdb.texinfo (GDB/MI Development and Front Ends): Add table of
@@ -34317,6 +34317,37 @@ fullname="/home/nickrob/myprog.c",line="73",arch="i386:x86_64"@}
(gdb)
@end smallexample
+@subheading The @code{-complete} Command
+@findex -complete
+
+@subheading Synopsis
+
+@smallexample
+-complete @var{command}
+@end smallexample
+
+Show a list of completions for partially typed CLI @var{command}.
+
+This command is intended for @sc{gdb/mi} frontends that cannot use two separate
+CLI and MI channels - for example: because of lack of PTYs like on Windows or
+because @sc{gdb} is used remotely via a SSH connection.
+
+@subheading @value{GDBN} Command
+
+The corresponding @value{GDBN} command is @samp{complete}.
+
+@subheading Example
+
+@smallexample
+(gdb)
+-complete br
+^done,completions=["break","break-range"],max_completions_reached="0"
+(gdb)
+-complete "b madv"
+^done,completions=["b madvise"],max_completions_reached="0"
+(gdb)
+@end smallexample
+
@node Annotations
@chapter @value{GDBN} Annotations
@@ -23,6 +23,7 @@
#include "mi-cmds.h"
#include "mi-main.h"
+
struct mi_cmd;
static struct mi_cmd **lookup_table (const char *command);
static void build_table (struct mi_cmd *commands);
@@ -75,6 +76,7 @@ static struct mi_cmd mi_cmds[] =
&mi_suppress_notification.breakpoint),
DEF_MI_CMD_MI_1 ("catch-unload", mi_cmd_catch_unload,
&mi_suppress_notification.breakpoint),
+ DEF_MI_CMD_MI ("complete", mi_cmd_complete),
DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble),
DEF_MI_CMD_MI ("data-evaluate-expression", mi_cmd_data_evaluate_expression),
DEF_MI_CMD_MI ("data-list-changed-registers",
@@ -125,6 +125,7 @@ extern mi_cmd_argv_ftype mi_cmd_var_update;
extern mi_cmd_argv_ftype mi_cmd_enable_pretty_printing;
extern mi_cmd_argv_ftype mi_cmd_enable_frame_filters;
extern mi_cmd_argv_ftype mi_cmd_var_set_update_range;
+extern mi_cmd_argv_ftype mi_cmd_complete;
/* Description of a single command. */
@@ -2709,6 +2709,50 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
}
}
+/* Implement the "-complete" command. */
+void
+mi_cmd_complete (const char *command, char **argv, int argc)
+{
+ if (argc != 1)
+ {
+ error (_("Usage: -complete COMMAND"));
+ }
+ if (max_completions == 0)
+ {
+ error (_("max-completions is zero,"
+ " completion is disabled.\n"));
+ }
+
+ int quote_char = '\0';
+ const char *word;
+
+ completion_result result = complete (argv[0], &word, "e_char);
+
+ std::string arg_prefix (argv[0], word - argv[0]);
+
+ struct ui_out *uiout = current_uiout;
+ {
+ ui_out_emit_list completions_emitter (uiout, "completions");
+
+ if (result.number_matches == 1)
+ {
+ uiout->field_fmt(NULL, "%s%s", arg_prefix.c_str (), result.match_list[0]);
+ }
+ else
+ {
+ result.sort_match_list ();
+ for (size_t i = 0; i < result.number_matches; i++)
+ {
+ uiout->field_fmt(NULL, "%s%s", arg_prefix.c_str (),
+ result.match_list[i + 1]);
+ }
+ }
+ }
+ uiout->field_string ("max_completions_reached",
+ result.number_matches == max_completions ? "1" : "0");
+}
+
+
void
_initialize_mi_main (void)
{
@@ -1,3 +1,7 @@
+2019-01-28 Jan Vrany <jan.vrany@fit.cvut.cz>
+
+ * gdb.mi/mi-complete.exp: New file.
+
2019-01-21 Alan Hayward <alan.hayward@arm.com>
* gdb.base/infcall-nested-structs.exp: Test C++ in addition to C.
new file mode 100644
@@ -0,0 +1,71 @@
+# Copyright 2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Verify -data-evaluate-expression. There are really minimal tests.
+
+# The goal is not to test gdb functionality, which is done by other tests,
+# but to verify the correct output response to MI operations.
+#
+
+load_lib mi-support.exp
+set MIFLAGS "-i=mi"
+
+gdb_exit
+if [mi_gdb_start] {
+ continue
+}
+
+standard_testfile basics.c
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ untested "failed to compile"
+ return -1
+}
+
+mi_run_to_main
+
+mi_gdb_test "1-complete br" \
+ "1\\^done,completions=\\\[.*\"break\",.*\"break-range\".*\\\],max_completions_reached=\"0\"" \
+ "-complete br"
+
+# Check empty completion list
+mi_gdb_test "5-complete bogus" \
+ "5\\^done,completions=\\\[\\\],max_completions_reached=\"0\"" \
+ "-complete bogus"
+
+
+# Check completions for commands with space
+mi_gdb_test "4-complete \"b mai\"" \
+ "4\\^done,completions=\\\[.*\"b main\".*\\\],max_completions_reached=\"0\"" \
+ "-complete \"b mai\""
+
+mi_gdb_test "-info-gdb-mi-command complete" \
+ "\\^done,command=\{exists=\"true\"\}" \
+ "-info-gdb-mi-command complete"
+
+# Limit max completions and check that max_completions_reached=\"0\" is set
+# to 1.
+send_gdb "set max-completions 1\n"
+
+mi_gdb_test "2-complete br" \
+ ".*2\\^done,completions=\\\[\"br\[A-Za-z0-9-\]+\"\\\],max_completions_reached=\"1\"" \
+ "-complete br (max-completions 1)"
+
+# Disable completions and check an error is returned
+send_gdb "set max-completions 0\n"
+
+mi_gdb_test "3-complete br" \
+ ".*3\\^error,msg=\".*" \
+ "-complete br (max-completions 0)"