From 37cd5d19fecc44f28d9b1f32146e53cdb19b5553 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 9 Jun 2008 19:25:15 +0000 Subject: gdb * completer.c (complete_line): Don't special-case expression_completer. (expression_completer): Only pass last word to location_completer. * c-exp.y (yylex): Check 'token', not 'operator'. gdb/testsuite * gdb.base/completion.exp: New tests for field name completion with spaces, and field name completion with '->'. --- gdb/ChangeLog | 8 ++++++++ gdb/c-exp.y | 2 +- gdb/completer.c | 17 +++++++++++------ gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.base/completion.exp | 30 ++++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 89d60700b9c..475d952349b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2008-06-09 Tom Tromey + + * completer.c (complete_line): Don't special-case + expression_completer. + (expression_completer): Only pass last word to + location_completer. + * c-exp.y (yylex): Check 'token', not 'operator'. + 2008-06-09 Daniel Jacobowitz * configure.ac (build_warnings): Add -Wno-format for mingw. diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 9cf63d8970d..0f2ee16f2fc 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -1433,7 +1433,7 @@ yylex () { lexptr += 2; yylval.opcode = tokentab2[i].opcode; - if (in_parse_field && tokentab2[i].opcode == ARROW) + if (in_parse_field && tokentab2[i].token == ARROW) last_was_structop = 1; return tokentab2[i].token; } diff --git a/gdb/completer.c b/gdb/completer.c index 163a9dcfc83..62f0b694fa3 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -387,7 +387,7 @@ char ** expression_completer (char *text, char *word) { struct type *type; - char *fieldname; + char *fieldname, *p; /* Perform a tentative parse of the expression, to see whether a field completion is required. */ @@ -418,8 +418,15 @@ expression_completer (char *text, char *word) } } + /* Commands which complete on locations want to see the entire + argument. */ + for (p = word; + p > text && p[-1] != ' ' && p[-1] != '\t'; + p--) + ; + /* Not ideal but it is what we used to do before... */ - return location_completer (text, word); + return location_completer (p, word); } /* Complete on command names. Used by "help". */ @@ -604,8 +611,7 @@ complete_line (const char *text, char *line_buffer, int point) rl_completer_word_break_characters = gdb_completer_file_name_break_characters; } - else if (c->completer == location_completer - || c->completer == expression_completer) + else if (c->completer == location_completer) { /* Commands which complete on locations want to see the entire argument. */ @@ -673,8 +679,7 @@ complete_line (const char *text, char *line_buffer, int point) rl_completer_word_break_characters = gdb_completer_file_name_break_characters; } - else if (c->completer == location_completer - || c->completer == expression_completer) + else if (c->completer == location_completer) { for (p = word; p > tmp_command diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ef42b4d4f72..d7673059e8c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-06-09 Tom Tromey + + * gdb.base/completion.exp: New tests for field name completion + with spaces, and field name completion with '->'. + 2008-06-06 Tom Tromey * gdb.base/break1.c (struct some_struct): New struct. diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp index 79f588b8aab..f4ab1b13273 100644 --- a/gdb/testsuite/gdb.base/completion.exp +++ b/gdb/testsuite/gdb.base/completion.exp @@ -654,6 +654,36 @@ gdb_expect { timeout { fail "(timeout) complete 'p values\[0\].a' 2" } } +send_gdb "p values\[0\] . a\t" +gdb_expect { + -re "^p values.0. . a_field $"\ + { send_gdb "\n" + gdb_expect { + -re "^.* = 0.*$gdb_prompt $"\ + { pass "complete 'p values\[0\] . a'"} + -re ".*$gdb_prompt $" { fail "complete 'p values\[0\] . a'"} + timeout {fail "(timeout) complete 'p values\[0\] . a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'p values\[0\] . a'" } + timeout { fail "(timeout) complete 'p values\[0\] . a' 2" } + } + +send_gdb "p &values\[0\] -> a\t" +gdb_expect { + -re "^p &values.0. -> a_field $"\ + { send_gdb "\n" + gdb_expect { + -re "^.* = .*0x\[0-9a-fA-F\]*.*$gdb_prompt $"\ + { pass "complete 'p &values\[0\] -> a'"} + -re ".*$gdb_prompt $" { fail "complete 'p &values\[0\] -> a'"} + timeout {fail "(timeout) complete 'p &values\[0\] -> a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'p &values\[0\] -> a'" } + timeout { fail "(timeout) complete 'p &values\[0\] -> a' 2" } + } + # The following tests used to simply try to complete `${objdir}/file', # and so on. The problem is that ${objdir} can be very long; the # completed filename may be more than eighty characters wide. When -- cgit v1.2.1