From patchwork Mon Jan 28 12:41:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Vrany X-Patchwork-Id: 31228 Received: (qmail 106762 invoked by alias); 28 Jan 2019 12:41:44 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 106699 invoked by uid 89); 28 Jan 2019 12:41:44 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_PASS autolearn=ham version=3.3.2 spammy=mai, 23, 7, Limit X-HELO: relay.fit.cvut.cz Received: from relay.fit.cvut.cz (HELO relay.fit.cvut.cz) (147.32.232.237) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 28 Jan 2019 12:41:41 +0000 Received: from imap.fit.cvut.cz (imap.fit.cvut.cz [147.32.232.238]) by relay.fit.cvut.cz (8.15.2/8.15.2) with ESMTPS id x0SCfbhI060270 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 28 Jan 2019 13:41:39 +0100 (CET) (envelope-from jan.vrany@fit.cvut.cz) Received: from localhost (027906ee.bb.sky.com [2.121.6.238] (may be forged)) (authenticated bits=0 as user vranyj1) by imap.fit.cvut.cz (8.15.2/8.15.2) with ESMTPSA id x0SCfaqx086261 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Mon, 28 Jan 2019 13:41:37 +0100 (CET) (envelope-from jan.vrany@fit.cvut.cz) From: Jan Vrany To: gdb-patches@sourceware.org Cc: Jan Vrany Subject: [PATCH v2 2/2] MI: Add new command -complete Date: Mon, 28 Jan 2019 12:41:01 +0000 Message-Id: <20190128124101.26243-3-jan.vrany@fit.cvut.cz> In-Reply-To: <20190128124101.26243-1-jan.vrany@fit.cvut.cz> References: <87imynm3ia.fsf@tromey.com> <20190128124101.26243-1-jan.vrany@fit.cvut.cz> MIME-Version: 1.0 There is a CLI command 'complete' intended to use with emacs. Such a command would also be useful for MI frontends, when separate CLI and MI channels cannot be used. For example, on Windows (because of lack of PTYs) or when GDB is used through SSH session. This commit adds a new '-complete' MI command. gdb/Changelog: 2019-01-28 Jan Vrany * 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. gdb/doc/ChangeLog: 2019-01-28 Jan Vrany * gdb.texinfo (Miscellaneous GDB/MI Commands): Document new MI command -complete. gdb/testsuite/ChangeLog: 2019-01-28 Jan Vrany * gdb.mi/mi-complete.exp: New file. --- gdb/ChangeLog | 7 +++ gdb/NEWS | 7 +++ gdb/doc/ChangeLog | 5 ++ gdb/doc/gdb.texinfo | 31 ++++++++++++ gdb/mi/mi-cmds.c | 2 + gdb/mi/mi-cmds.h | 1 + gdb/mi/mi-main.c | 44 +++++++++++++++++ gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.mi/mi-complete.exp | 71 ++++++++++++++++++++++++++++ 9 files changed, 172 insertions(+) create mode 100644 gdb/testsuite/gdb.mi/mi-complete.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 17e29a7807..51e62a7d30 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2019-01-28 Jan Vrany + + * 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 * completer.h (complete): New function. diff --git a/gdb/NEWS b/gdb/NEWS index eaef6aa384..3018313a46 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -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. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index d38d4625c4..669f7e8ce6 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2019-01-28 Jan Vrany + + * gdb.texinfo (Miscellaneous GDB/MI Commands): Document new + MI command -complete. + 2019-01-16 Simon Marchi * gdb.texinfo (GDB/MI Development and Front Ends): Add table of diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 173d18be6f..d7ef71367e 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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 diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index bb7c20c777..683e990cdf 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -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", diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index af38363cfc..32bd747d43 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -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. */ diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 7176963845..b2ff8df8de 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -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) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7d8c7908fe..f395de64a8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-01-28 Jan Vrany + + * gdb.mi/mi-complete.exp: New file. + 2019-01-21 Alan Hayward * gdb.base/infcall-nested-structs.exp: Test C++ in addition to C. diff --git a/gdb/testsuite/gdb.mi/mi-complete.exp b/gdb/testsuite/gdb.mi/mi-complete.exp new file mode 100644 index 0000000000..2963bd2ac5 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-complete.exp @@ -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 . + +# 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)"