Add autocompletion for convenience vars in print and set

Message ID CAF5HaEUYNe60EPby2Mxbgxy68unMpoxYr8BnQAQNUV_z04wVsw@mail.gmail.com
State New, archived
Headers

Commit Message

Daniel Gutson May 20, 2014, 3:51 p.m. UTC
  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

Daniel Gutson May 20, 2014, 3:52 p.m. UTC | #1
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.
  
Tom Tromey May 20, 2014, 4:36 p.m. UTC | #2
>>>>> "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
  

Patch

diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 0191067..3ae969f 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -777,7 +777,8 @@  exp	:	variable
 
 exp	:	VARIABLE
 			{
-			  write_dollar_variable (pstate, $1);
+			  if (!parse_completion)
+			    write_dollar_variable (pstate, $1);
 			}
 	;
 
diff --git a/gdb/completer.c b/gdb/completer.c
index 94f70a9..6c5cdf8 100644
--- a/gdb/completer.c
+++ b/gdb/completer.c
@@ -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
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 15ac3d1..5ceaf46 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -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