Add autocompletion for convenience vars in print and set
Commit Message
Hi,
this small patch adds autocompletion for convenience variables
for 'print' and 'set' commands. I guess other commands using the
same completers will be benefited as well.
I could not find any testsuite where to add tests for this; if there are,
please let me know.
2014-05-20 Daniel Gutson <daniel.gutson@tallertechnologies.com>
gdb/
* c-exp.y (exp): Do not create an internal var when completing.
* completer.c (expression_completer): Call complete_internalvar.
* symtab.c (make_symbol_completion_list): Call complete_internalvar.
Comments
I forgot to mention that if OK, please commit it for me since I don't have write
access.
Thanks,
Daniel.
On Tue, May 20, 2014 at 12:51 PM, Daniel Gutson
<daniel.gutson@tallertechnologies.com> wrote:
> Hi,
>
> this small patch adds autocompletion for convenience variables
> for 'print' and 'set' commands. I guess other commands using the
> same completers will be benefited as well.
>
> I could not find any testsuite where to add tests for this; if there are,
> please let me know.
>
>
> 2014-05-20 Daniel Gutson <daniel.gutson@tallertechnologies.com>
>
> gdb/
> * c-exp.y (exp): Do not create an internal var when completing.
> * completer.c (expression_completer): Call complete_internalvar.
> * symtab.c (make_symbol_completion_list): Call complete_internalvar.
>>>>> "Daniel" == Daniel Gutson <daniel.gutson@tallertechnologies.com> writes:
Daniel> I could not find any testsuite where to add tests for this; if
Daniel> there are, please let me know.
See testsuite/gdb.base/completion.exp
Daniel> exp : VARIABLE
Daniel> {
Daniel> - write_dollar_variable (pstate, $1);
Daniel> + if (!parse_completion)
Daniel> + write_dollar_variable (pstate, $1);
Daniel> }
I think this isn't correct. I think it won't work if you try to
complete on a field name where the "LHS" has a convenience variable.
That is something like:
set $var = (struct x *) malloc (...)
complete print $var.somethin
Instead I think you need a new production, like "exp : VARIABLE COMPLETE".
Daniel> + if (p != NULL && *p == '$')
Daniel> + return complete_internalvar (p + 1);
I'm not sure this is correct either, but offhand I don't know.
Should it not look at "word"?
Daniel> + VEC (char_ptr) * ret = current_language->la_make_symbol_completion_list (
Daniel> + text, word,
Daniel> + TYPE_CODE_UNDEF);
No space before "ret".
The line breaks look odd, I would break before the "=" and not after the "(".
thanks,
Tom
@@ -777,7 +777,8 @@ exp : variable
exp : VARIABLE
{
- write_dollar_variable (pstate, $1);
+ if (!parse_completion)
+ write_dollar_variable (pstate, $1);
}
;
@@ -20,6 +20,7 @@
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
+#include "value.h"
#include "filenames.h" /* For DOSish file names. */
#include "language.h"
#include "gdb_assert.h"
@@ -446,8 +447,11 @@ expression_completer (struct cmd_list_element *ignore,
p--)
;
- /* Not ideal but it is what we used to do before... */
- return location_completer (ignore, p, word);
+ if (p != NULL && *p == '$')
+ return complete_internalvar (p + 1);
+ else
+ /* Not ideal but it is what we used to do before... */
+ return location_completer (ignore, p, word);
}
/* Here are some useful test cases for completion. FIXME: These
@@ -4542,14 +4542,21 @@ default_make_symbol_completion_list (const char *text, const char *word,
}
/* Return a vector of all symbols (regardless of class) which begin by
- matching TEXT. If the answer is no symbols, then the return value
- is NULL. */
+ matching TEXT. If the answer is no symbols, then check whether the
+ text is an internal var ($foo), if so, return what complete_internalvar
+ returns; otherwise the return value is NULL. */
VEC (char_ptr) *
make_symbol_completion_list (const char *text, const char *word)
{
- return current_language->la_make_symbol_completion_list (text, word,
- TYPE_CODE_UNDEF);
+ VEC (char_ptr) * ret = current_language->la_make_symbol_completion_list (
+ text, word,
+ TYPE_CODE_UNDEF);
+
+ if (ret == NULL && *text == '$')
+ ret = complete_internalvar (text + 1);
+
+ return ret;
}
/* Like make_symbol_completion_list, but only return STRUCT_DOMAIN