From: Pedro Alves <palves@redhat.com>
To: Keith Seitz <keiths@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH 35/40] Comprehensive C++ linespec/completer tests
Date: Fri, 24 Nov 2017 16:25:00 -0000 [thread overview]
Message-ID: <537f751e-b574-5828-a667-bcaa6b72dd25@redhat.com> (raw)
In-Reply-To: <a6d90da6-e6a8-760e-ad6b-425870a79c1f@redhat.com>
On 08/09/2017 06:30 PM, Keith Seitz wrote:
> On 06/02/2017 05:22 AM, Pedro Alves wrote:
>> Exercises all sorts of aspects fixed by the previous patches.
>
> SUPER!
>
>> Grows the gdb.linespec/ tests like this:
>>
>> -# of expected passes 573
>> +# of expected passes 4458
>
> /me drools
:-)
>
>> gdb/testsuite/ChangeLog:
>> yyyy-mm-dd Pedro Alves <palves@redhat.com>
>>
>> * gdb.linespec/cpcompletion.exp: New file.
>> * gdb.linespec/cpls-hyphen.cc: New file.
>> * gdb.linespec/cpls.cc: New file.
>> * gdb.linespec/cpls2.cc: New file.
>> * gdb.linespec/explicit.exp: Load completion-support.exp. Adjust
>> test to use test_gdb_complete_unique. Add label completion,
>> keyword completion and explicit location completion tests.
>> * lib/completion-support.exp: New file.
>
>> diff --git a/gdb/testsuite/gdb.linespec/cpls-hyphen.cc b/gdb/testsuite/gdb.linespec/cpls-hyphen.cc
>> new file mode 100644
>> index 0000000..fdc063f
>> --- /dev/null
>> +++ b/gdb/testsuite/gdb.linespec/cpls-hyphen.cc
>> @@ -0,0 +1,14 @@
>> +int
>> +ns_hyphen_function (int i)
>> +{
>> + if (i > 0)
>> + {
>> + label1:
>> + return i + 20;
>> + }
>> + else
>> + {
>> + label2:
>> + return i + 10;
>> + }
>> +}
>
> Does this file not require a copyright header?
It does, missed it. Thanks.
>
>> diff --git a/gdb/testsuite/gdb.linespec/explicit.exp b/gdb/testsuite/gdb.linespec/explicit.exp
>> index 65d78ca..998b70a 100644
>> --- a/gdb/testsuite/gdb.linespec/explicit.exp
>> +++ b/gdb/testsuite/gdb.linespec/explicit.exp
>> @@ -326,10 +329,202 @@ namespace eval $testfile {
> [snip]
>>
>> + # Follows completion tests that require having no symbols
>> + # loaded.
>
> "The following completion tests," perhaps?
Adjusted.
>
>> + gdb_exit
>> + gdb_start
>> +
>> + # The match list you get when you complete with no options
>> + # specified at all.
>> + set completion_list {
>> + "-function"
>> + "-label"
>> + "-line"
>> + "-probe"
>> + "-probe-dtrace"
>> + "-probe-stap"
>> + "-qualified"
>> + "-source"
>> + }
>> + with_test_prefix "complete with no arguments and no symbols" {
>> + test_gdb_complete_multiple "b " "" "-" $completion_list
>> + test_gdb_complete_multiple "b " "-" "" $completion_list
>> + }
>> }
>> # End of completion tests.
>>
>> diff --git a/gdb/testsuite/lib/completion-support.exp b/gdb/testsuite/lib/completion-support.exp
>> new file mode 100644
>> index 0000000..ef78269
>> --- /dev/null
>> +++ b/gdb/testsuite/lib/completion-support.exp
>> @@ -0,0 +1,513 @@
> [snip]
>> +
>> +# Test that completing INPUT_LINE with TAB completes to
>> +# COMPLETE_LINE_RE. APPEND_CHAR_RE is the character expected to be
>> +# appended after EXPECTED_OUTPUT. Normally that's a whitespace, but
>> +# in some cases it's some other character, like a colon.
>> +
>> +proc test_gdb_complete_tab_unique { input_line complete_line_re append_char_re } {
>> +
>> + set test "tab complete \"$input_line\""
>> + send_gdb "$input_line\t"
>> + gdb_test_multiple "" "$test" {
>> + -re "^$complete_line_re$append_char_re$" {
>> + pass "$test"
>> + }
>> + }
>> +
>> + clear_input_line $test
>> +}
>> +
>> +# Test that completing INPUT_LINE with TAB completes to "INPUT_LINE +
>> +# ADD_COMPLETED_LINE" and that is displays the completion matches in
> ^^
>
> s/is/it/
Fixed.
>
>> +# COMPLETION_LIST.
>> +
>
>> +proc test_gdb_complete_tab_multiple { input_line add_completed_line \
>> + completion_list } {
>> + global gdb_prompt
>> + global bell_re
> [snip]
>> +
>> +proc test_gdb_complete_menu { line expected_output } {
>> +
>
> Is this used? Maybe in a subsequent patch?
Whoops, no it's isn't used, because I couldn't make it
work last time I tried, I don't recall exactly why.
This was meant to test the "ESC, ?" sequence, which triggers
a completion too. I've removed this for now.
>
>> + set test "menu complete $line"
>> +# send_gdb "$expr\033?"
>> +# send_gdb "$expr^\[?"
>> + send_gdb "$expr"
>> + send_gdb "\x1b"
>> + send_gdb "?"
>> + gdb_test_multiple "" "$test" {
>> + -re "$expected_output" {
>> + pass "$test"
>> + }
>> + }
>> +}
>> +
> [snip]
>> +
>> +proc test_gdb_complete_unique_re { input_line complete_line_re {append_char " "} {max_completions 0}} {
>
> This procedure is only called from this file. If it is meant to be called by
> test writers, it deserves a comment, even if trivial.
>
> If it is only meant for use here, then it should be named differently to
> differentiate it, or stick it into an appropriately namespace so that it is
> more obvious to potential users of this code that it is not meant to be
> "exported." There's a lot of (sometimes mindless) cut-n-paste going on in the
> test suite.
I gave it a comment now. Actually, test_gdb_complete_unique can just
be a wrapper around test_gdb_complete_unique_re; not sure why I didn't
do that the first time. Probably just mindless copy/paste.
I like the idea of a namespace, so I created one ("completion") and
moved other helper procedures and all the related globals there.
I considered moving the public procedures into the namespace as well,
but it requires touching many many lines of the huge tests throughout, and
causes hard to resolve conflicts and it doesn't seem worth it to fight
against that. I'll see if it makes sense to do that on top of the
series instead.
>
>> + set append_char_re [string_to_regexp $append_char]
>> + test_gdb_complete_tab_unique $input_line $complete_line_re $append_char_re
>> +
>> + # Trim INPUT_LINE and COMPLETE LINE, for the case we're completing
>> + # a command with leading whitespace. Leading command whitespace
>> + # is discarded by GDB.
>> + set input_line [string trimleft $input_line]
>> + set expected_output_re [string trimleft $complete_line_re]
>> + if {$append_char_re != " "} {
>> + append expected_output_re $append_char_re
>> + }
>> + if {$max_completions} {
>> + set max_completion_reached_msg \
>> + "*** List may be truncated, max-completions reached. ***"
>> + set input_line_re \
>> + [string_to_regexp $input_line]
>> + set max_completion_reached_msg_re \
>> + [string_to_regexp $max_completion_reached_msg]
>> +
>> + append expected_output_re \
>> + "\r\n$input_line_re $max_completion_reached_msg_re"
>> + }
>> +
>> + test_gdb_complete_cmd_unique $input_line $expected_output_re
>> +}
> [snip]
>> +
>> +# Test completing all the substring prefixes of COMPLETION from
>> +# [0..START) to [0..END) complete to COMPLETION. If END is ommitted,
>> +# default to the length of COMPLETION.
>> +
>> +proc test_complete_prefix_range {completion start {end -1}} {
>> + if {$end == -1} {
>> + set end [string length $completion]
>> + }
>> +
>> + for {set i $start} {$i < $end} {incr i} {
>> + set line [string range $completion 0 $i]
>> + test_gdb_complete_unique "$line" "$completion"
>> + }
>> +}
>> +
>> +proc test_complete_prefix_range_input {input completion_re start {end -1}} {
>
> This procedure also isn't used. Maybe also a later patch? Ditto the "if it
> is meant to be used, ..., or renamed/hidden."
Ah, yes, it's used in a later patch [1]. I've moved it to the right
patch now, and renamed
test_complete_prefix_range_input->test_complete_prefix_range_re instead,
following the similar theme of other procedures. I also reimplemented
test_complete_prefix_range on top of it.
[1] - [PATCH 36/40] Add comprehensive C++ operator linespec/location/completion tests
>
>> + if {$end == -1} {
>> + set end [string length $input]
>> + }
>> +
>> + for {set i $start} {$i < $end} {incr i} {
>> + set line [string range $input 0 $i]
>> + test_gdb_complete_unique_re "$line" $completion_re
>> + }
>> +}
>> +
> [snip]
>> +# Return true if lists A and B have the same elements. Order of
>> +# elements does not matter.
>> +
>> +proc gdb_leq {a b} {
>> + return [expr {[lsort $a] eq [lsort $b]}]
>> +}
>> +
>> +# Check that creating the breakpoint at LINESPEC finds the same
>> +# breakpoint locations as completing LINESPEC. COMPLETION_LIST is
>> +# expected completion match list.
>
> You mention "LINESPEC" here, but this procedure actually takes a breakpoint
> command and a linepsec (or location?), no?
Right. I think I first accepted a LINESPEC, then later made it work
with explicit locations too, and missed updating the comment.
>
>> +
>> +proc check_bp_locations_match_list {break_command completion_list} {
>> + global gdb_prompt
>> + global hex
>> +
>> + with_test_prefix "compare \"$break_command\" completion list with bp location list" {
>> + set num_locations [create_bp $break_command]
>> +
>> + set found_list ""
>> +
>> + set any "\[^\r\n\]*"
>> +
>> + gdb_test_multiple "info breakpoint \$bpnum" "info breakpoint" {
>> + -re "in \(\[^\r\n\]*\) at " {
>> + # A function location.
>> + set found_location "$expect_out(1,string)"
>> + lappend found_list $found_location
>> + exp_continue
>> + }
>> + -re "breakpoint${any}keep${any}y${any}$hex\[ \t]*\(${any}\)\r\n" {
>> + # A label location.
>> + set found_location "$expect_out(1,string)"
>> + lappend found_list $found_location
>> + exp_continue
>> + }
>> + -re "$gdb_prompt $" {
>> + }
>> + }
>> +
>> + gdb_assert {[gdb_leq $found_list $completion_list]} "matches"
>> +
>> + delete_breakpoints
>> + }
>> +}
>> +
Here's what I'm squashing in.
diff --git a/gdb/testsuite/gdb.linespec/cpcompletion.exp b/gdb/testsuite/gdb.linespec/cpcompletion.exp
index dd9bf70..5522b19 100644
--- a/gdb/testsuite/gdb.linespec/cpcompletion.exp
+++ b/gdb/testsuite/gdb.linespec/cpcompletion.exp
@@ -445,10 +445,8 @@ proc_with_prefix const-overload-quoted {} {
# appends the end quote char automatically, both ' and ".
proc_with_prefix append-end-quote-char-when-unambiguous {} {
- global all_quotes_list
-
foreach cmd_prefix {"b" "b -function"} {
- foreach qc $all_quotes_list {
+ foreach qc $completion::all_quotes_list {
set linespec "${qc}not_overloaded_fn()${qc}"
foreach cmd [list "$cmd_prefix ${qc}not_overloaded_fn()" \
"$cmd_prefix ${qc}not_overloaded_fn" \
@@ -480,13 +478,12 @@ proc_with_prefix in-source-file-unconstrained {} {
# name.
proc_with_prefix in-source-file-unambiguous {} {
- global maybe_quoted_list
-
- foreach sqc $maybe_quoted_list {
- foreach fqc $maybe_quoted_list {
+ foreach sqc $completion::maybe_quoted_list {
+ foreach fqc $completion::maybe_quoted_list {
# Linespec.
foreach sep {":" ": "} {
- set linespec "${sqc}cpls2.cc${sqc}${sep}${fqc}file_constrained_test_cpls2_function(int)${fqc}"
+ set linespec \
+ "${sqc}cpls2.cc${sqc}${sep}${fqc}file_constrained_test_cpls2_function(int)${fqc}"
set complete_line "b $linespec"
set start [index_after "constrained_test" $complete_line]
set input_line [string range $complete_line 0 $start]
@@ -515,10 +512,8 @@ proc_with_prefix in-source-file-unambiguous {} {
# function name.
proc_with_prefix in-source-file-ambiguous {} {
- global maybe_quoted_list
-
- foreach sqc $maybe_quoted_list {
- foreach fqc $maybe_quoted_list {
+ foreach sqc $completion::maybe_quoted_list {
+ foreach fqc $completion::maybe_quoted_list {
# Linespec.
foreach sep {":" ": "} {
set cmd_prefix "b ${sqc}cpls2.cc${sqc}${sep}"
@@ -542,13 +537,9 @@ proc_with_prefix in-source-file-ambiguous {} {
# instead of a whitespace character.
proc_with_prefix source-complete-appends-colon {} {
- global maybe_quoted_list
- global all_quotes_list
- global keyword_list
-
# Test with quotes to make sure the end quote char is put at the
# right place.
- foreach qc $maybe_quoted_list {
+ foreach qc $completion::maybe_quoted_list {
test_gdb_complete_unique \
"b ${qc}cpls2." \
"b ${qc}cpls2.cc${qc}" ":"
@@ -574,8 +565,9 @@ proc_with_prefix source-complete-appends-colon {} {
# Cursor at the end of the string.
test_gdb_complete_none "b nonexistingfilename.cc"
# Cursor past the end of the string.
- test_gdb_complete_multiple "b nonexistingfilename.cc " "" "" $keyword_list
- foreach qc $all_quotes_list {
+ test_gdb_complete_multiple "b nonexistingfilename.cc " "" "" \
+ $completion::keyword_list
+ foreach qc $completion::all_quotes_list {
# Unterminated quote.
test_gdb_complete_none "b ${qc}nonexistingfilename.cc"
test_gdb_complete_none "b ${qc}nonexistingfilename.cc "
@@ -585,7 +577,8 @@ proc_with_prefix source-complete-appends-colon {} {
"b ${qc}nonexistingfilename.cc${qc}"
# Terminated quote, cursor past the quote.
test_gdb_complete_multiple \
- "b ${qc}nonexistingfilename.cc${qc} " "" "" $keyword_list
+ "b ${qc}nonexistingfilename.cc${qc} " "" "" \
+ $completion::keyword_list
}
}
@@ -617,18 +610,16 @@ proc_with_prefix incomplete-scope-colon {} {
# finds the same breakpoint location as completion does.
#
proc incomplete_scope_colon_helper {prototype range_ss {skip_check_bp 0}} {
- global maybe_quoted_list
-
foreach source {"" "cpls.cc"} {
# Test with and without source quoting.
- foreach sqc $maybe_quoted_list {
+ foreach sqc $completion::maybe_quoted_list {
if {$source == "" && $sqc != ""} {
# Invalid combination.
continue
}
# Test with and without function quoting.
- foreach fqc $maybe_quoted_list {
+ foreach fqc $completion::maybe_quoted_list {
if {$source == ""} {
set linespec_source ""
set explicit_source ""
@@ -676,10 +667,8 @@ proc_with_prefix incomplete-scope-colon {} {
# Test completing functions/methods in anonymous namespaces.
proc_with_prefix anon-ns {} {
- global maybe_quoted_list
-
foreach cmd_prefix {"b" "b -function"} {
- foreach qc $maybe_quoted_list {
+ foreach qc $completion::maybe_quoted_list {
test_gdb_complete_unique \
"$cmd_prefix ${qc}anon_ns_function" \
"$cmd_prefix ${qc}anon_ns_function()${qc}"
@@ -833,9 +822,8 @@ proc_with_prefix function-labels {} {
# location options in explicit locations mode.
proc_with_prefix keywords-after-function {} {
- global explicit_opts_list keyword_list
-
- set explicit_list [concat $explicit_opts_list $keyword_list]
+ set explicit_list \
+ [concat $completion::explicit_opts_list $completion::keyword_list]
# Test without a source file, with a known source file, and with
# and unknown source file.
@@ -845,20 +833,21 @@ proc_with_prefix keywords-after-function {} {
{ "function_with_labels(int)" "unknown_function(int)" } \
{
# Linespec version.
- test_gdb_complete_multiple "b ${location} " "" "" $keyword_list
+ test_gdb_complete_multiple "b ${location} " "" "" \
+ $completion::keyword_list
} \
{
# Explicit locations version.
- test_gdb_complete_multiple "b ${location} " "" "" $explicit_list
+ test_gdb_complete_multiple "b ${location} " "" "" \
+ $explicit_list
}
}
# Same, but after a label.
proc_with_prefix keywords-after-label {} {
- global explicit_opts_list keyword_list
-
- set explicit_list [concat $explicit_opts_list $keyword_list]
+ set explicit_list \
+ [concat $completion::explicit_opts_list $completion::keyword_list]
foreach_location_labels \
{ "" "cpls.cc" } \
@@ -866,24 +855,23 @@ proc_with_prefix keywords-after-label {} {
{ "label1" "non_existing_label" } \
{
# Linespec version.
- test_gdb_complete_multiple "b ${location} " "" "" $keyword_list
+ test_gdb_complete_multiple "b ${location} " "" "" \
+ $completion::keyword_list
} \
{
# Explicit locations version.
- test_gdb_complete_multiple "b ${location} " "" "" $explicit_list
+ test_gdb_complete_multiple "b ${location} " "" "" \
+ $explicit_list
}
}
# Similar, but after an unknown file, and in linespec mode only.
proc_with_prefix keywords-after-unknown-file {} {
- global maybe_quoted_list
- global keyword_list
-
# Test with and without quoting.
- foreach qc $maybe_quoted_list {
+ foreach qc $completion::maybe_quoted_list {
set line "b ${qc}unknown_file.cc${qc}: "
- test_gdb_complete_multiple $line "" "" $keyword_list
+ test_gdb_complete_multiple $line "" "" $completion::keyword_list
}
}
diff --git a/gdb/testsuite/gdb.linespec/cpls-hyphen.cc b/gdb/testsuite/gdb.linespec/cpls-hyphen.cc
index fdc063f..4bd2d9f 100644
--- a/gdb/testsuite/gdb.linespec/cpls-hyphen.cc
+++ b/gdb/testsuite/gdb.linespec/cpls-hyphen.cc
@@ -1,3 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2017 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/>. */
+
+/* A function in a file whose name has an hyphen. */
+
int
ns_hyphen_function (int i)
{
diff --git a/gdb/testsuite/gdb.linespec/explicit.exp b/gdb/testsuite/gdb.linespec/explicit.exp
index 6936971..1e7f0dc 100644
--- a/gdb/testsuite/gdb.linespec/explicit.exp
+++ b/gdb/testsuite/gdb.linespec/explicit.exp
@@ -225,7 +225,7 @@ namespace eval $testfile {
}
with_test_prefix "complete unique file name" {
- foreach qc $maybe_quoted_list {
+ foreach qc $completion::maybe_quoted_list {
set cmd "break -source ${qc}3explicit.c${qc}"
test_gdb_complete_unique \
"break -source ${qc}3ex" \
@@ -332,7 +332,7 @@ namespace eval $testfile {
global maybe_quoted_list
with_test_prefix "complete unique label name" {
- foreach qc $maybe_quoted_list {
+ foreach qc $completion::maybe_quoted_list {
test_gdb_complete_unique \
"break -function myfunction -label ${qc}to" \
"break -function myfunction -label ${qc}top${qc}"
@@ -521,7 +521,7 @@ namespace eval $testfile {
# such as "-func main -sour 3ex\t" (main is defined in explicit.c).
# The completer cannot handle these yet.
- # Follows completion tests that require having no symbols
+ # The following completion tests require having no symbols
# loaded.
gdb_exit
gdb_start
diff --git a/gdb/testsuite/lib/completion-support.exp b/gdb/testsuite/lib/completion-support.exp
index ef78269..3d03943 100644
--- a/gdb/testsuite/lib/completion-support.exp
+++ b/gdb/testsuite/lib/completion-support.exp
@@ -15,18 +15,23 @@
# This file is part of the gdb testsuite.
-set timeout 5
+# Any variable or procedure in the namespace whose name starts with
+# "_" is private to the module. Do not use these.
-set bell_re "\\\x07"
+namespace eval completion {
+ variable bell_re "\\\x07"
-# List of all quote chars.
-set all_quotes_list {"'" "\""}
+ # List of all quote chars.
+ variable all_quotes_list {"'" "\""}
-# List of all quote chars, including no-quote at all.
-set maybe_quoted_list {"" "'" "\""}
+ # List of all quote chars, including no-quote at all.
+ variable maybe_quoted_list {"" "'" "\""}
-set keyword_list {"if" "task" "thread"}
-set explicit_opts_list {"-function" "-label" "-line" "-qualified" "-source"}
+ variable keyword_list {"if" "task" "thread"}
+
+ variable explicit_opts_list \
+ {"-function" "-label" "-line" "-qualified" "-source"}
+}
# Make a regular expression that matches a TAB completion list.
@@ -81,14 +86,12 @@ proc clear_input_line { test } {
# Test that completing LINE with TAB completes to nothing.
proc test_gdb_complete_tab_none { line } {
- global bell_re
-
set line_re [string_to_regexp $line]
set test "tab complete \"$line\""
send_gdb "$line\t"
gdb_test_multiple "" "$test" {
- -re "^$line_re$bell_re$" {
+ -re "^$line_re$completion::bell_re$" {
pass "$test"
}
}
@@ -115,13 +118,12 @@ proc test_gdb_complete_tab_unique { input_line complete_line_re append_char_re }
}
# Test that completing INPUT_LINE with TAB completes to "INPUT_LINE +
-# ADD_COMPLETED_LINE" and that is displays the completion matches in
+# ADD_COMPLETED_LINE" and that it displays the completion matches in
# COMPLETION_LIST.
proc test_gdb_complete_tab_multiple { input_line add_completed_line \
completion_list } {
global gdb_prompt
- global bell_re
set input_line_re [string_to_regexp $input_line]
set add_completed_line_re [string_to_regexp $add_completed_line]
@@ -131,7 +133,7 @@ proc test_gdb_complete_tab_multiple { input_line add_completed_line \
set test "tab complete \"$input_line\""
send_gdb "$input_line\t"
gdb_test_multiple "" "$test (first tab)" {
- -re "^${input_line_re}$bell_re$add_completed_line_re$" {
+ -re "^${input_line_re}${completion::bell_re}$add_completed_line_re$" {
send_gdb "\t"
# If we auto-completed to an ambiguous prefix, we need an
# extra tab to show the matches list.
@@ -189,21 +191,6 @@ proc test_gdb_complete_cmd_multiple { cmd_prefix completion_word completion_list
}
}
-proc test_gdb_complete_menu { line expected_output } {
-
- set test "menu complete $line"
-# send_gdb "$expr\033?"
-# send_gdb "$expr^\[?"
- send_gdb "$expr"
- send_gdb "\x1b"
- send_gdb "?"
- gdb_test_multiple "" "$test" {
- -re "$expected_output" {
- pass "$test"
- }
- }
-}
-
# Test that completing LINE completes to nothing.
proc test_gdb_complete_none { input_line } {
@@ -211,7 +198,7 @@ proc test_gdb_complete_none { input_line } {
test_gdb_complete_cmd_none $input_line
}
-# Test that completing INPUT_LINE completes to COMPLETE_LINE.
+# Test that completing INPUT_LINE completes to COMPLETE_LINE_RE.
#
# APPEND_CHAR is the character expected to be appended after
# EXPECTED_OUTPUT when TAB completing. Normally that's a whitespace,
@@ -222,9 +209,12 @@ proc test_gdb_complete_none { input_line } {
# match, this will only be visible in the "complete" command output.
# Tab completion will just auto-complete the only match and won't
# display a match list.
+#
+# Note: usually it's more convenient to pass a literal string instead
+# of a regular expression (as COMPLETE_LINE_RE). See
+# test_gdb_complete_unique below.
-proc test_gdb_complete_unique { input_line complete_line {append_char " "} {max_completions 0}} {
- set complete_line_re [string_to_regexp $complete_line]
+proc test_gdb_complete_unique_re { input_line complete_line_re {append_char " "} {max_completions 0}} {
set append_char_re [string_to_regexp $append_char]
test_gdb_complete_tab_unique $input_line $complete_line_re $append_char_re
@@ -251,31 +241,12 @@ proc test_gdb_complete_unique { input_line complete_line {append_char " "} {max_
test_gdb_complete_cmd_unique $input_line $expected_output_re
}
-proc test_gdb_complete_unique_re { input_line complete_line_re {append_char " "} {max_completions 0}} {
- set append_char_re [string_to_regexp $append_char]
- test_gdb_complete_tab_unique $input_line $complete_line_re $append_char_re
+# Like TEST_GDB_COMPLETE_UNIQUE_RE, but COMPLETE_LINE is a string, not
+# a regular expression.
- # Trim INPUT_LINE and COMPLETE LINE, for the case we're completing
- # a command with leading whitespace. Leading command whitespace
- # is discarded by GDB.
- set input_line [string trimleft $input_line]
- set expected_output_re [string trimleft $complete_line_re]
- if {$append_char_re != " "} {
- append expected_output_re $append_char_re
- }
- if {$max_completions} {
- set max_completion_reached_msg \
- "*** List may be truncated, max-completions reached. ***"
- set input_line_re \
- [string_to_regexp $input_line]
- set max_completion_reached_msg_re \
- [string_to_regexp $max_completion_reached_msg]
-
- append expected_output_re \
- "\r\n$input_line_re $max_completion_reached_msg_re"
- }
-
- test_gdb_complete_cmd_unique $input_line $expected_output_re
+proc test_gdb_complete_unique { input_line complete_line {append_char " "} {max_completions 0}} {
+ set complete_line_re [string_to_regexp $complete_line]
+ test_gdb_complete_unique_re $input_line $complete_line_re $append_char $max_completions
}
# Test that completing "CMD_PREFIX + COMPLETION_WORD" adds
@@ -288,8 +259,8 @@ proc test_gdb_complete_multiple { cmd_prefix completion_word add_completed_line
test_gdb_complete_cmd_multiple $cmd_prefix $completion_word $completion_list $start_quote_char $end_quote_char
}
-# Test completing all the substring prefixes of COMPLETION from
-# [0..START) to [0..END) complete to COMPLETION. If END is ommitted,
+# Test that all the substring prefixes of COMPLETION from
+# [0..START) to [0..END) complete to COMPLETION. If END is ommitted,
# default to the length of COMPLETION.
proc test_complete_prefix_range {completion start {end -1}} {
@@ -303,17 +274,6 @@ proc test_complete_prefix_range {completion start {end -1}} {
}
}
-proc test_complete_prefix_range_input {input completion_re start {end -1}} {
- if {$end == -1} {
- set end [string length $input]
- }
-
- for {set i $start} {$i < $end} {incr i} {
- set line [string range $input 0 $i]
- test_gdb_complete_unique_re "$line" $completion_re
- }
-}
-
# Find NEEDLE in HAYSTACK and return the index _after_ NEEDLE. E.g.,
# searching for "(" in "foo(int)" returns 4, which would be useful if
# you want to find the "(" to try completing "foo(".
@@ -326,10 +286,10 @@ proc index_after {needle haystack} {
return [expr $start + [string length $needle]]
}
-# Create a breakpoint using BREAK_COMMAND, and return the number of
-# locations found.
+# Create a breakpoint using BREAK_COMMAND, and return the number
+# of locations found.
-proc create_bp {break_command} {
+proc completion::_create_bp {break_command} {
global gdb_prompt
global decimal hex
@@ -361,11 +321,18 @@ proc create_bp {break_command} {
return $found_locations
}
-# Check that trying to create a breakpoint from linespec fails.
+# Return true if lists A and B have the same elements. Order of
+# elements does not matter.
+
+proc completion::_leq {a b} {
+ return [expr {[lsort $a] eq [lsort $b]}]
+}
+
+# Check that trying to create a breakpoint using BREAK_COMMAND fails.
proc check_setting_bp_fails {break_command} {
with_test_prefix "\"$break_command\" creates no bp locations" {
- set found_locations [create_bp $break_command]
+ set found_locations [completion::_create_bp $break_command]
gdb_assert {$found_locations == 0} "matches"
if {$found_locations != 0} {
delete_breakpoints
@@ -373,23 +340,16 @@ proc check_setting_bp_fails {break_command} {
}
}
-# Return true if lists A and B have the same elements. Order of
-# elements does not matter.
-
-proc gdb_leq {a b} {
- return [expr {[lsort $a] eq [lsort $b]}]
-}
-
-# Check that creating the breakpoint at LINESPEC finds the same
-# breakpoint locations as completing LINESPEC. COMPLETION_LIST is
-# expected completion match list.
+# Check that creating the breakpoint using BREAK_COMMAND finds the
+# same breakpoint locations as completing BREAK_COMMAND.
+# COMPLETION_LIST is the expected completion match list.
proc check_bp_locations_match_list {break_command completion_list} {
global gdb_prompt
global hex
with_test_prefix "compare \"$break_command\" completion list with bp location list" {
- set num_locations [create_bp $break_command]
+ set num_locations [completion::_create_bp $break_command]
set found_list ""
@@ -412,7 +372,7 @@ proc check_bp_locations_match_list {break_command completion_list} {
}
}
- gdb_assert {[gdb_leq $found_list $completion_list]} "matches"
+ gdb_assert {[completion::_leq $found_list $completion_list]} "matches"
delete_breakpoints
}
@@ -426,7 +386,6 @@ proc check_bp_locations_match_list {break_command completion_list} {
# currently iterated location.
proc foreach_location_functions { sources functions body_linespec body_explicit } {
- global maybe_quoted_list
upvar source source
upvar function function
upvar source_sep source_sep
@@ -434,14 +393,14 @@ proc foreach_location_functions { sources functions body_linespec body_explicit
foreach source $sources {
# Test with and without source quoting.
- foreach sqc $maybe_quoted_list {
+ foreach sqc $completion::maybe_quoted_list {
if {$source == "" && $sqc != ""} {
# Invalid combination.
continue
}
# Test with and without function quoting.
- foreach fqc $maybe_quoted_list {
+ foreach fqc $completion::maybe_quoted_list {
# Test known and unknown functions.
foreach function $functions {
# Linespec version. Test with and without spacing
@@ -477,7 +436,6 @@ proc foreach_location_functions { sources functions body_linespec body_explicit
# Same as foreach_locations_functions, but also iterate over
# combinations of labels.
proc foreach_location_labels { sources functions labels body_linespec body_explicit } {
- global maybe_quoted_list
upvar source source
upvar function function
upvar label label
next prev parent reply other threads:[~2017-11-24 16:25 UTC|newest]
Thread overview: 182+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-02 12:22 [PATCH 00/40] C++ debugging improvements: breakpoints, TAB completion, more Pedro Alves
2017-06-02 12:22 ` [PATCH 06/40] Expression completer should not match explicit location options Pedro Alves
2017-06-29 8:29 ` Yao Qi
2017-06-29 10:56 ` Pedro Alves
2017-06-29 11:08 ` Pedro Alves
2017-06-29 15:23 ` Pedro Alves
2017-06-29 11:24 ` Yao Qi
2017-06-29 15:25 ` Pedro Alves
2017-06-02 12:22 ` [PATCH 08/40] completion_list_add_name wrapper functions Pedro Alves
2017-06-27 12:56 ` Yao Qi
2017-06-27 15:35 ` Pedro Alves
2017-06-02 12:22 ` [PATCH 02/40] Eliminate make_cleanup_obstack_free, introduce auto_obstack Pedro Alves
2017-06-26 13:47 ` Yao Qi
2017-06-27 10:25 ` Pedro Alves
2017-06-28 10:36 ` Yao Qi
2017-06-28 14:39 ` Pedro Alves
2017-06-28 21:33 ` Yao Qi
2017-06-02 12:22 ` [PATCH 14/40] Introduce CP_OPERATOR_STR/CP_OPERATOR_LEN and use throughout Pedro Alves
2017-07-14 18:04 ` Keith Seitz
2017-07-17 14:55 ` Pedro Alves
2017-06-02 12:22 ` [PATCH 03/40] Fix gdb.base/completion.exp with --target_board=dwarf4-gdb-index Pedro Alves
2017-07-13 20:28 ` Keith Seitz
2017-07-14 16:02 ` Pedro Alves
2017-06-02 12:22 ` [PATCH 01/40] Make gdb.base/dmsym.exp independent of "set language ada" Pedro Alves
2017-07-18 19:42 ` Simon Marchi
2017-07-20 17:00 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 34/40] Make strcmp_iw NOT ignore whitespace in the middle of tokens Pedro Alves
2017-08-09 15:48 ` Keith Seitz
2017-11-24 23:38 ` [pushed] " Pedro Alves
2017-06-02 12:23 ` [PATCH 37/40] Fix completing an empty string Pedro Alves
2017-08-09 18:01 ` Keith Seitz
2017-11-25 0:28 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 27/40] Make cp_remove_params return a unique_ptr Pedro Alves
2017-08-08 20:35 ` Keith Seitz
2017-10-09 15:13 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 10/40] Clean up "completer_handle_brkchars" callback handling Pedro Alves
2017-07-13 21:08 ` Keith Seitz
2017-07-17 11:14 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 35/40] Comprehensive C++ linespec/completer tests Pedro Alves
2017-08-09 17:30 ` Keith Seitz
2017-11-24 16:25 ` Pedro Alves [this message]
2017-06-02 12:23 ` [PATCH 36/40] Add comprehensive C++ operator linespec/location/completion tests Pedro Alves
2017-08-09 17:59 ` Keith Seitz
2017-11-25 0:18 ` [pushed] " Pedro Alves
2017-11-30 15:43 ` Yao Qi
2017-11-30 16:06 ` Pedro Alves
2017-11-30 16:35 ` [pushed] Fix gdb.linespec/cpls-ops.exp on 32-bit (Re: [pushed] Re: [PATCH 36/40] Add comprehensive C++ operator linespec/location/completion tests) Pedro Alves
2017-06-02 12:23 ` [PATCH 39/40] Breakpoints in symbols with ABI tags (PR c++/19436) Pedro Alves
2017-08-09 19:34 ` Keith Seitz
2017-11-27 17:14 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 15/40] Rewrite/enhance explicit locations completer, parse left->right Pedro Alves
2017-07-14 20:55 ` Keith Seitz
2017-07-17 19:24 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 11/40] Introduce class completion_tracker & rewrite completion<->readline interaction Pedro Alves
2017-07-14 17:23 ` Keith Seitz
2017-07-17 13:56 ` Pedro Alves
2017-07-18 8:23 ` Christophe Lyon
[not found] ` <845f435e-d3d5-b327-4e3a-ce9434bd6ffd@redhat.com>
2017-07-18 10:42 ` [pushed] Fix GDB builds that include the simulator (Re: [PATCH 11/40] Introduce class completion_tracker & rewrite completion<->readline interaction) Pedro Alves
2018-03-05 21:43 ` [PATCH 11/40] Introduce class completion_tracker & rewrite completion<->readline interaction Simon Marchi
2017-06-02 12:23 ` [PATCH 09/40] Rename make_symbol_completion_list_fn -> symbol_completer Pedro Alves
2017-06-28 21:40 ` Yao Qi
2017-07-13 20:46 ` Keith Seitz
2017-07-17 11:00 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 13/40] Introduce strncmp_iw Pedro Alves
2017-06-29 8:42 ` Yao Qi
2017-07-17 19:16 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 38/40] Use TOLOWER in SYMBOL_HASH_NEXT Pedro Alves
2017-08-09 19:25 ` Keith Seitz
2017-11-25 0:35 ` [pushed] " Pedro Alves
2017-06-02 12:23 ` [PATCH 18/40] A smarter linespec completer Pedro Alves
2017-07-15 0:07 ` Keith Seitz
2017-07-17 18:21 ` Pedro Alves
2017-07-17 19:02 ` Keith Seitz
2017-07-17 19:33 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 40/40] Document breakpoints / linespec & co improvements (manual + NEWS) Pedro Alves
2017-06-02 13:01 ` Eli Zaretskii
2017-06-02 13:33 ` Pedro Alves
2017-06-21 15:50 ` Pedro Alves
2017-06-21 19:14 ` Pedro Alves
2017-06-22 19:45 ` Eli Zaretskii
2017-06-22 19:42 ` Eli Zaretskii
2017-06-21 13:32 ` Pedro Alves
2017-06-21 18:26 ` Eli Zaretskii
2017-06-21 19:01 ` Pedro Alves
2017-06-22 19:43 ` Eli Zaretskii
2017-06-02 12:23 ` [PATCH 19/40] Fix cp_find_first_component_aux bug Pedro Alves
2017-07-17 19:17 ` Keith Seitz
2017-07-17 19:50 ` Pedro Alves
2017-07-17 21:38 ` Keith Seitz
2017-07-20 17:03 ` Pedro Alves
2017-06-02 12:23 ` [PATCH 28/40] lookup_name_info::make_ignore_params Pedro Alves
2017-08-08 20:55 ` Keith Seitz
2017-11-08 16:18 ` Pedro Alves
2017-06-02 12:28 ` [PATCH 24/40] Per-language symbol name hashing algorithm Pedro Alves
2017-07-18 17:33 ` Keith Seitz
2017-07-20 18:53 ` Pedro Alves
2017-11-08 16:08 ` Pedro Alves
2017-06-02 12:29 ` [PATCH 21/40] Use SYMBOL_MATCHES_SEARCH_NAME some more Pedro Alves
2017-07-17 21:39 ` Keith Seitz
2017-07-20 17:08 ` Pedro Alves
2017-06-02 12:29 ` [PATCH 05/40] command.h: Include scoped_restore_command.h Pedro Alves
2017-06-27 11:30 ` Yao Qi
2017-06-27 11:45 ` Pedro Alves
2017-06-27 11:52 ` Pedro Alves
2017-06-27 12:03 ` Pedro Alves
2017-06-27 15:46 ` [PATCH 05/40] command.h: Include common/scoped_restore.h Pedro Alves
2017-06-28 7:54 ` Yao Qi
2017-06-28 14:20 ` Pedro Alves
2017-06-02 12:29 ` [PATCH 07/40] objfile_per_bfd_storage non-POD Pedro Alves
2017-06-27 12:00 ` Yao Qi
2017-06-27 15:30 ` Pedro Alves
2017-06-02 12:29 ` [PATCH 16/40] Explicit locations -label completer Pedro Alves
2017-07-14 21:32 ` Keith Seitz
2017-06-02 12:29 ` [PATCH 17/40] Linespec lexing and C++ operators Pedro Alves
2017-07-14 21:45 ` Keith Seitz
2017-07-17 19:34 ` Pedro Alves
2017-06-02 12:29 ` [PATCH 12/40] "complete" command and completion word break characters Pedro Alves
2017-07-14 17:50 ` Keith Seitz
2017-07-17 14:36 ` Pedro Alves
2017-06-02 12:29 ` [PATCH 33/40] Make the linespec/location completer ignore data symbols Pedro Alves
2017-08-09 15:42 ` Keith Seitz
2017-11-08 16:22 ` Pedro Alves
2017-06-02 12:30 ` [PATCH 30/40] Use search_domain::FUNCTIONS_DOMAIN when setting breakpoints Pedro Alves
2017-08-08 21:07 ` Keith Seitz
2017-11-08 16:20 ` Pedro Alves
2017-06-02 12:30 ` [PATCH 32/40] Make "break foo" find "A::foo", A::B::foo", etc. [C++ and wild matching] Pedro Alves
2017-08-08 23:48 ` Keith Seitz
2017-11-22 16:48 ` Pedro Alves
2017-11-24 16:48 ` Pedro Alves
2017-11-24 16:57 ` Pedro Alves
2017-11-28 0:39 ` Keith Seitz
2017-11-28 0:02 ` Keith Seitz
2017-11-28 0:21 ` Pedro Alves
2017-11-28 0:42 ` Keith Seitz
2017-06-02 12:30 ` [PATCH 20/40] Eliminate block_iter_name_* Pedro Alves
2017-07-17 19:47 ` Keith Seitz
2017-07-20 17:05 ` Pedro Alves
2017-06-02 12:31 ` [PATCH 22/40] get_int_var_value Pedro Alves
2017-07-17 22:11 ` Keith Seitz
2017-07-20 17:15 ` Pedro Alves
2017-06-02 12:31 ` [PATCH 29/40] Simplify completion_list_add_name | remove sym_text / sym_text_len Pedro Alves
2017-08-08 20:59 ` Keith Seitz
2017-11-08 16:19 ` Pedro Alves
2017-06-02 12:31 ` [PATCH 04/40] Fix TAB-completion + .gdb_index slowness (generalize filename_seen_cache) Pedro Alves
2017-07-13 20:41 ` Keith Seitz
2017-07-14 19:40 ` Pedro Alves
2017-07-17 10:51 ` Pedro Alves
2017-06-02 12:33 ` [PATCH 31/40] Handle custom completion match prefix / LCD Pedro Alves
2017-08-08 21:28 ` Keith Seitz
2017-11-27 17:11 ` Pedro Alves
2017-06-02 12:39 ` [PATCH 26/40] Optimize .gdb_index symbol name searching Pedro Alves
2017-08-08 20:32 ` Keith Seitz
2017-11-08 16:14 ` Pedro Alves
2017-11-08 16:16 ` [pushed] Reorder/reindent dw2_expand_symtabs_matching & friends (Re: [PATCH 26/40] Optimize .gdb_index symbol name searching) Pedro Alves
2017-11-18 5:23 ` [PATCH 26/40] Optimize .gdb_index symbol name searching Simon Marchi
2017-11-20 0:33 ` Pedro Alves
2017-11-20 0:42 ` [PATCH 3/3] Fix mapped_index::find_name_components_bounds upper bound computation Pedro Alves
2017-11-20 3:17 ` Simon Marchi
2017-11-20 0:42 ` [PATCH 2/3] Unit test name-component bounds searching directly Pedro Alves
2017-11-20 3:16 ` Simon Marchi
2017-11-20 14:17 ` Pedro Alves
2017-11-20 0:42 ` [PATCH 1/3] 0xff chars in name components table; cp-name-parser lex UTF-8 identifiers Pedro Alves
2017-11-20 1:38 ` Simon Marchi
2017-11-20 11:56 ` Pedro Alves
2017-11-20 16:50 ` Simon Marchi
2017-11-21 0:11 ` Pedro Alves
2017-06-02 12:39 ` [PATCH 23/40] Make language_def O(1) Pedro Alves
2017-07-17 23:03 ` Keith Seitz
2017-07-20 17:40 ` Pedro Alves
2017-07-20 18:12 ` Get rid of "set language local"? (was: Re: [PATCH 23/40] Make language_def O(1)) Pedro Alves
2017-07-20 23:44 ` Matt Rice
2017-06-02 12:39 ` [PATCH 25/40] Introduce lookup_name_info and generalize Ada's FULL/WILD name matching Pedro Alves
2017-07-18 20:14 ` Keith Seitz
2017-07-18 22:31 ` Pedro Alves
2017-07-20 19:00 ` Pedro Alves
2017-07-20 19:06 ` Pedro Alves
2017-08-08 20:29 ` Keith Seitz
2017-10-19 17:36 ` Pedro Alves
2017-11-01 15:38 ` Joel Brobecker
2017-11-08 16:10 ` Pedro Alves
2017-11-08 22:15 ` Joel Brobecker
2017-06-02 15:26 ` [PATCH 00/40] C++ debugging improvements: breakpoints, TAB completion, more Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=537f751e-b574-5828-a667-bcaa6b72dd25@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=keiths@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox