From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 88769 invoked by alias); 11 Nov 2018 16:54:52 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 88757 invoked by uid 89); 11 Nov 2018 16:54:51 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=completing, HContent-Transfer-Encoding:8bit X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 11 Nov 2018 16:54:49 +0000 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id iAdhKC309bLLBAEZ (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 11 Nov 2018 11:54:47 -0500 (EST) Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id 92C0B441B21; Sun, 11 Nov 2018 11:54:47 -0500 (EST) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH v2] Add completer for skip numbers Date: Sun, 11 Nov 2018 16:54:00 -0000 Message-Id: <20181111165446.7069-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2018-11/txt/msg00204.txt.bz2 Add completer to various commands that accept skip numbers: - skip enable - skip disable - skip delete - info skip These commands also accept ranges, the completer works for that but is not very smart. It will suggest invalid ranges, for example when doing "2-" it will suggest "1", which would not result in a valid range. Also, it will keep suggesting when doing "1-2-", even though it's an invalid syntax. A future idea would be to make a re-usable and well-tested completer for numbers and ranges. I think it could at least be re-used for breakpoint and thread numbers (for example with the "enable breakpoints" command). gdb/ChangeLog: * skip.c (complete_skip_number): New function. (_initialize_step_skip): Add completers to some skip commands. gdb/testsuite/ChangeLog: * gdb.base/skip.exp: Add standard_testfile. Add "skip delete" completer tests. --- gdb/skip.c | 35 +++++++++++++++++++++++++------- gdb/testsuite/gdb.base/skip.exp | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/gdb/skip.c b/gdb/skip.c index 13db0f6b43c6..f2a1df79e8bf 100644 --- a/gdb/skip.c +++ b/gdb/skip.c @@ -641,6 +641,23 @@ function_name_is_marked_for_skip (const char *function_name, return false; } +/* Completer for skip numbers. */ + +static void +complete_skip_number (cmd_list_element *cmd, + completion_tracker &completer, + const char *text, const char *word) +{ + size_t word_len = strlen (word); + + for (const skiplist_entry &entry : skiplist_entries) + { + gdb::unique_xmalloc_ptr name (xstrprintf ("%d", entry.number ())); + if (strncmp (word, name.get (), word_len) == 0) + completer.add_completion (std::move (name)); + } +} + void _initialize_step_skip (void) { @@ -676,28 +693,31 @@ If no function name is given, skip the current function."), &skiplist); set_cmd_completer (c, location_completer); - add_cmd ("enable", class_breakpoint, skip_enable_command, _("\ + c = add_cmd ("enable", class_breakpoint, skip_enable_command, _("\ Enable skip entries. You can specify numbers (e.g. \"skip enable 1 3\"), \ ranges (e.g. \"skip enable 4-8\"), or both (e.g. \"skip enable 1 3 4-8\").\n\n\ If you don't specify any numbers or ranges, we'll enable all skip entries.\n\n\ Usage: skip enable [NUMBER | RANGE]..."), - &skiplist); + &skiplist); + set_cmd_completer (c, complete_skip_number); - add_cmd ("disable", class_breakpoint, skip_disable_command, _("\ + c = add_cmd ("disable", class_breakpoint, skip_disable_command, _("\ Disable skip entries. You can specify numbers (e.g. \"skip disable 1 3\"), \ ranges (e.g. \"skip disable 4-8\"), or both (e.g. \"skip disable 1 3 4-8\").\n\n\ If you don't specify any numbers or ranges, we'll disable all skip entries.\n\n\ Usage: skip disable [NUMBER | RANGE]..."), - &skiplist); + &skiplist); + set_cmd_completer (c, complete_skip_number); - add_cmd ("delete", class_breakpoint, skip_delete_command, _("\ + c = add_cmd ("delete", class_breakpoint, skip_delete_command, _("\ Delete skip entries. You can specify numbers (e.g. \"skip delete 1 3\"), \ ranges (e.g. \"skip delete 4-8\"), or both (e.g. \"skip delete 1 3 4-8\").\n\n\ If you don't specify any numbers or ranges, we'll delete all skip entries.\n\n\ Usage: skip delete [NUMBER | RANGES]..."), - &skiplist); + &skiplist); + set_cmd_completer (c, complete_skip_number); - add_info ("skip", info_skip_command, _("\ + c = add_info ("skip", info_skip_command, _("\ Display the status of skips. You can specify numbers (e.g. \"skip info 1 3\"), \ ranges (e.g. \"skip info 4-8\"), or both (e.g. \"skip info 1 3 4-8\").\n\n\ If you don't specify any numbers or ranges, we'll show all skips.\n\n\ @@ -705,6 +725,7 @@ Usage: skip info [NUMBER | RANGES]...\n\ The \"Type\" column indicates one of:\n\ \tfile - ignored file\n\ \tfunction - ignored function")); + set_cmd_completer (c, complete_skip_number); add_setshow_boolean_cmd ("skip", class_maintenance, &debug_skip, _("\ diff --git a/gdb/testsuite/gdb.base/skip.exp b/gdb/testsuite/gdb.base/skip.exp index 223c93d0d9b6..a7ea0b52c47b 100644 --- a/gdb/testsuite/gdb.base/skip.exp +++ b/gdb/testsuite/gdb.base/skip.exp @@ -16,6 +16,10 @@ # This file was written by Justin Lebar. (justin.lebar@gmail.com) # And further hacked on by Doug Evans. (dje@google.com) +load_lib completion-support.exp + +standard_testfile + if { [prepare_for_testing "failed to prepare" "skip" \ {skip.c skip1.c } \ {debug nowarnings}] } { @@ -297,3 +301,35 @@ with_test_prefix "step using -fi + -fu" { gdb_test "step" ".*" "step 4"; # Skip over test_skip() gdb_test "step" "test_skip_file_and_function \\(\\) at.*" "step 5"; # Return from skip1_test_skip_file_and_function() } + +with_test_prefix "skip delete completion" { + global binfile + clean_restart "${binfile}" + if ![runto_main] { + fail "can't run to main" + return + } + + # Create a bunch of skips, don't care what they are. + for {set i 0} {$i < 12} {incr i} { + gdb_test "skip" ".*" "add skip $i" + } + + set all_numbers { "1" "10" "11" "12" "2" "3" "4" "5" "6" "7" "8" "9" } + + # Test completing single numbers. + test_gdb_complete_multiple "skip delete " "" "" $all_numbers + test_gdb_complete_multiple "skip delete " "1" "" { "1" "10" "11" "12" } + test_gdb_complete_multiple "skip delete 2 " "" "" $all_numbers + test_gdb_complete_unique "skip delete 11" "skip delete 11" + + # Test completing ranges. + test_gdb_complete_multiple "skip delete 2-" "" "" $all_numbers + test_gdb_complete_unique "skip delete 2-5" "skip delete 2-5" + + # Test cases with no completion. + test_gdb_complete_none "skip delete 123" + test_gdb_complete_none "skip delete a1" + test_gdb_complete_none "skip delete 2-33" +} + -- 2.19.1