gdb: don't warn about deprecated aliases during tab completion
authorAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 8 Dec 2020 17:32:34 +0000 (17:32 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 11 Dec 2020 22:10:50 +0000 (22:10 +0000)
Consider this gdb session, where on line #3 tab completion is used:

  (gdb) alias xxx_yyy_zzz=break
  (gdb) maint deprecate xxx_yyy_zzz
  (gdb) xxx_yyy_<TAB>

The third line then updates to look like this:

  (gdb) xxx_yyy_Warning: 'xxx_yyy_zzz', an alias for the command 'break' is deprecated.
  No alternative known.

  zzz

What's happened is during tab completion the alias has been resolved
to the actual command being aliased, and at this stage the warning is
issued.  Clearly this is not what we want during tab completion.

In this commit I add a new parameter to the lookup function, a boolean
that indicates if the lookup is being done as part of completion.
This flag is used to suppress the warning.  Now we get the expected
behaviour, the alias completes without any warning, but the warning is
still given once the user executes the alias.

gdb/ChangeLog:

* cli/cli-decode.c (lookup_cmd_1): Move header comment into
command.h, add extra parameter, and use this to guard giving a
warning.
* command.h (lookup_cmd_1): Add comment from cli/cli-decode.c,
include argument names in declaration, add new argument.
* completer.c (complete_line_internal_1): Remove unneeded
brackets, pass extra argument to lookup_cmd_1.

gdb/testsuite/ChangeLog:

* gdb.base/completion.exp: Add additional tests.

gdb/ChangeLog
gdb/cli/cli-decode.c
gdb/command.h
gdb/completer.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/completion.exp

index 84456114c60f1f23e1d94268514372d1d5d96087..0c6ced3c6c98fd24ba9b50fe3a97480ed1b97c0a 100644 (file)
@@ -1,3 +1,13 @@
+2020-12-11  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * cli/cli-decode.c (lookup_cmd_1): Move header comment into
+       command.h, add extra parameter, and use this to guard giving a
+       warning.
+       * command.h (lookup_cmd_1): Add comment from cli/cli-decode.c,
+       include argument names in declaration, add new argument.
+       * completer.c (complete_line_internal_1): Remove unneeded
+       brackets, pass extra argument to lookup_cmd_1.
+
 2020-12-11  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * infrun.h (debug_infrun): Make a bool.
index 71924c3fb8c05ea686839e07dbd3e534a7688b24..c62b8498060589b8f2919abe595a126aa83f07d4 100644 (file)
@@ -1613,50 +1613,12 @@ valid_user_defined_cmd_name_p (const char *name)
   return true;
 }
 
-/* This routine takes a line of TEXT and a CLIST in which to start the
-   lookup.  When it returns it will have incremented the text pointer past
-   the section of text it matched, set *RESULT_LIST to point to the list in
-   which the last word was matched, and will return a pointer to the cmd
-   list element which the text matches.  It will return NULL if no match at
-   all was possible.  It will return -1 (cast appropriately, ick) if ambigous
-   matches are possible; in this case *RESULT_LIST will be set to point to
-   the list in which there are ambiguous choices (and *TEXT will be set to
-   the ambiguous text string).
-
-   if DEFAULT_ARGS is not null, *DEFAULT_ARGS is set to the found command
-   default args (possibly empty).
-
-   If the located command was an abbreviation, this routine returns the base
-   command of the abbreviation.  Note that *DEFAULT_ARGS will contain the
-   default args defined for the alias.
-
-   It does no error reporting whatsoever; control will always return
-   to the superior routine.
-
-   In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
-   at the prefix_command (ie. the best match) *or* (special case) will be NULL
-   if no prefix command was ever found.  For example, in the case of "info a",
-   "info" matches without ambiguity, but "a" could be "args" or "address", so
-   *RESULT_LIST is set to the cmd_list_element for "info".  So in this case
-   RESULT_LIST should not be interpreted as a pointer to the beginning of a
-   list; it simply points to a specific command.  In the case of an ambiguous
-   return *TEXT is advanced past the last non-ambiguous prefix (e.g.
-   "info t" can be "info types" or "info target"; upon return *TEXT has been
-   advanced past "info ").
-
-   If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
-   affect the operation).
-
-   This routine does *not* modify the text pointed to by TEXT.
-
-   If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
-   are actually help classes rather than commands (i.e. the function field of
-   the struct cmd_list_element is NULL).  */
+/* See command.h.  */
 
 struct cmd_list_element *
 lookup_cmd_1 (const char **text, struct cmd_list_element *clist,
              struct cmd_list_element **result_list, std::string *default_args,
-             int ignore_help_classes)
+             int ignore_help_classes, bool lookup_for_completion_p)
 {
   char *command;
   int len, nfound;
@@ -1715,7 +1677,7 @@ lookup_cmd_1 (const char **text, struct cmd_list_element *clist,
        itself and we will adjust the appropriate DEPRECATED_WARN_USER
        flags.  */
 
-      if (found->deprecated_warn_user)
+      if (found->deprecated_warn_user && !lookup_for_completion_p)
        deprecated_cmd_warning (line);
 
       /* Return the default_args of the alias, not the default_args
@@ -1729,8 +1691,8 @@ lookup_cmd_1 (const char **text, struct cmd_list_element *clist,
 
   if (found->prefixlist)
     {
-      c = lookup_cmd_1 (text, *found->prefixlist, result_list,
-                       default_args, ignore_help_classes);
+      c = lookup_cmd_1 (text, *found->prefixlist, result_list, default_args,
+                       ignore_help_classes, lookup_for_completion_p);
       if (!c)
        {
          /* Didn't find anything; this is as far as we got.  */
index 22e43de3c15973f9e0a0590c58dfd403d92acd0a..a6ddaa249059f75ae5850c276073969b5610eff5 100644 (file)
@@ -278,11 +278,53 @@ extern struct cmd_list_element *lookup_cmd (const char **,
                                            std::string *,
                                            int, int);
 
-extern struct cmd_list_element *lookup_cmd_1 (const char **,
-                                             struct cmd_list_element *,
-                                             struct cmd_list_element **,
-                                             std::string *,
-                                             int);
+/* This routine takes a line of TEXT and a CLIST in which to start the
+   lookup.  When it returns it will have incremented the text pointer past
+   the section of text it matched, set *RESULT_LIST to point to the list in
+   which the last word was matched, and will return a pointer to the cmd
+   list element which the text matches.  It will return NULL if no match at
+   all was possible.  It will return -1 (cast appropriately, ick) if ambigous
+   matches are possible; in this case *RESULT_LIST will be set to point to
+   the list in which there are ambiguous choices (and *TEXT will be set to
+   the ambiguous text string).
+
+   if DEFAULT_ARGS is not null, *DEFAULT_ARGS is set to the found command
+   default args (possibly empty).
+
+   If the located command was an abbreviation, this routine returns the base
+   command of the abbreviation.  Note that *DEFAULT_ARGS will contain the
+   default args defined for the alias.
+
+   It does no error reporting whatsoever; control will always return
+   to the superior routine.
+
+   In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
+   at the prefix_command (ie. the best match) *or* (special case) will be NULL
+   if no prefix command was ever found.  For example, in the case of "info a",
+   "info" matches without ambiguity, but "a" could be "args" or "address", so
+   *RESULT_LIST is set to the cmd_list_element for "info".  So in this case
+   RESULT_LIST should not be interpreted as a pointer to the beginning of a
+   list; it simply points to a specific command.  In the case of an ambiguous
+   return *TEXT is advanced past the last non-ambiguous prefix (e.g.
+   "info t" can be "info types" or "info target"; upon return *TEXT has been
+   advanced past "info ").
+
+   If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
+   affect the operation).
+
+   This routine does *not* modify the text pointed to by TEXT.
+
+   If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
+   are actually help classes rather than commands (i.e. the function field of
+   the struct cmd_list_element is NULL).
+
+   When LOOKUP_FOR_COMPLETION_P is true the completion is being requested
+   for the completion engine, no warnings should be printed.  */
+
+extern struct cmd_list_element *lookup_cmd_1
+       (const char **text, struct cmd_list_element *clist,
+        struct cmd_list_element **result_list, std::string *default_args,
+        int ignore_help_classes, bool lookup_for_completion_p = false);
 
 extern struct cmd_list_element *deprecate_cmd (struct cmd_list_element *,
                                               const char * );
index 7f63ced93d8e486a698c2862fb19dcb77ce0a5f3..4c1ad254b0716dcb7eef9637c2cc427626ee0c2b 100644 (file)
@@ -1388,9 +1388,8 @@ complete_line_internal_1 (completion_tracker &tracker,
       result_list = 0;
     }
   else
-    {
-      c = lookup_cmd_1 (&p, cmdlist, &result_list, NULL, ignore_help_classes);
-    }
+    c = lookup_cmd_1 (&p, cmdlist, &result_list, NULL, ignore_help_classes,
+                     true);
 
   /* Move p up to the next interesting thing.  */
   while (*p == ' ' || *p == '\t')
index 7f682281660619b7ebfcb292ea990ef970f58ed6..f2262f6b3c7d72d72c75b31f78be1d4455d07d2a 100644 (file)
@@ -1,3 +1,7 @@
+2020-12-11  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gdb.base/completion.exp: Add additional tests.
+
 2020-12-11  Tom de Vries  <tdevries@suse.de>
 
        PR testsuite/26991
index 1c5d03b217c53603178d4685553a01d8569fffe4..14d56a5cc19e6f3c778152084db550811b6b6b69 100644 (file)
@@ -962,3 +962,9 @@ foreach_with_prefix cmd { "watch" "awatch" "rwatch" } {
            }
     }
 }
+
+# Check that tab completion of a deprecated alias does not display the
+# warning about the alias being deprecated during tab completion.
+gdb_test_no_output "alias xxx_yyy_zzz=break"
+gdb_test_no_output "maint deprecate xxx_yyy_zzz"
+test_gdb_complete_unique "xxx_yyy_" "xxx_yyy_zzz"