[1/3] gdb: Switch "info types" over to use the gdb::options framework

Message ID c93fe4d308adbad677d2f2c473d26f9d1c094e7f.1562931337.git.andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess July 12, 2019, 11:37 a.m. UTC
  Adds a new -q flag to "info types" using the gdb::option framework.
This -q flag is similar to the -q flag already present for "info
variables" and "info functions".

gdb/ChangeLog:

	* NEWS: Mention adding -q option to "info types".
	* symtab.c (struct info_types_options): New struct.
	(info_types_options_defs): New variable.
	(make_info_types_options_def_group): New function.
	(info_types_command): Use gdb::option framework to parse options.
	(info_types_command_completer): New function.
	(_initialize_symtab): Extend the help text on "info types" and
	register command completer.

gdb/doc/ChangeLog:

	* gdb.texinfo (Symbols): Add information about -q flag to "info
	types".
---
 gdb/ChangeLog       | 11 +++++++++
 gdb/NEWS            |  4 ++++
 gdb/doc/ChangeLog   |  5 +++++
 gdb/doc/gdb.texinfo |  6 +++--
 gdb/symtab.c        | 64 +++++++++++++++++++++++++++++++++++++++++++++++++----
 5 files changed, 84 insertions(+), 6 deletions(-)
  

Comments

Eli Zaretskii July 12, 2019, 12:48 p.m. UTC | #1
> From: Andrew Burgess <andrew.burgess@embecosm.com>
> Cc: Andrew Burgess <andrew.burgess@embecosm.com>
> Date: Fri, 12 Jul 2019 12:37:04 +0100
> 
> Adds a new -q flag to "info types" using the gdb::option framework.
> This -q flag is similar to the -q flag already present for "info
> variables" and "info functions".

Thanks.

> diff --git a/gdb/NEWS b/gdb/NEWS
> index 4e479bf738b..cc1d58520d4 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -211,6 +211,10 @@ maint show test-options-completion-result
>  
>      (gdb) print -raw -pretty -object off -- *myptr
>  
> +  ** The "info types" command now supports the '-q' flag to disable
> +     printing of some header information in a similar fashion to "info
> +     variables" and "info functions".
> +

This part is OK.

> +@item info types [-q] [@var{regexp}]
>  Print a brief description of all types whose names match the regular
>  expression @var{regexp} (or all types in your program, if you supply
>  no argument).  Each complete typename is matched as though it were a
> @@ -18449,6 +18448,9 @@
>  @code{whatis}, it does not print a detailed description; second, it
>  lists all source files and line numbers where a type is defined.
>  
> +The optional flag @samp{-q}, which stands for @samp{quiet}, disables
> +printing header information.

I don't see "headers" described anywhere in the preceding text, so
"disables printing header information" here is not clear enough.
Besides, the command's doc string says "some headers and messages",
which seems to imply more than just "headers" is suppressed by this
switch.

Can you please make the effect of this switch more clear?

Thanks.
  
Pedro Alves July 18, 2019, 8:07 p.m. UTC | #2
On 7/12/19 12:37 PM, Andrew Burgess wrote:
> Adds a new -q flag to "info types" using the gdb::option framework.
> This -q flag is similar to the -q flag already present for "info
> variables" and "info functions".
> 
LGTM.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/NEWS b/gdb/NEWS
index 4e479bf738b..cc1d58520d4 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -211,6 +211,10 @@  maint show test-options-completion-result
 
     (gdb) print -raw -pretty -object off -- *myptr
 
+  ** The "info types" command now supports the '-q' flag to disable
+     printing of some header information in a similar fashion to "info
+     variables" and "info functions".
+
 * Completion improvements
 
   ** GDB can now complete the options of the "thread apply all" and
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index eddd939869a..777a412df67 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -18428,8 +18428,7 @@ 
 of such variables.
 
 @kindex info types
-@item info types @var{regexp}
-@itemx info types
+@item info types [-q] [@var{regexp}]
 Print a brief description of all types whose names match the regular
 expression @var{regexp} (or all types in your program, if you supply
 no argument).  Each complete typename is matched as though it were a
@@ -18449,6 +18448,9 @@ 
 @code{whatis}, it does not print a detailed description; second, it
 lists all source files and line numbers where a type is defined.
 
+The optional flag @samp{-q}, which stands for @samp{quiet}, disables
+printing header information.
+
 @kindex info type-printers
 @item info type-printers
 Versions of @value{GDBN} that ship with Python scripting enabled may
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 41898992c19..7b7f1298419 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -4769,11 +4769,62 @@  info_functions_command (const char *args, int from_tty)
 		      opts.type_regexp, from_tty);
 }
 
+/* Holds the -q option for the 'info types' command.  */
+
+struct info_types_options
+{
+  int quiet = false;
+};
+
+/* The options used by the 'info types' command.  */
+
+static const gdb::option::option_def info_types_options_defs[] = {
+  gdb::option::boolean_option_def<info_types_options> {
+    "q",
+    [] (info_types_options *opt) { return &opt->quiet; },
+    nullptr, /* show_cmd_cb */
+    nullptr /* set_doc */
+  }
+};
+
+/* Returns the option group used by 'info types'.  */
+
+static gdb::option::option_def_group
+make_info_types_options_def_group (info_types_options *opts)
+{
+  return {{info_types_options_defs}, opts};
+}
+
+/* Implement the 'info types' command.  */
 
 static void
-info_types_command (const char *regexp, int from_tty)
+info_types_command (const char *args, int from_tty)
 {
-  symtab_symbol_info (false, regexp, TYPES_DOMAIN, NULL, from_tty);
+  info_types_options opts;
+
+  auto grp = make_info_types_options_def_group (&opts);
+  gdb::option::process_options
+    (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
+  if (args != nullptr && *args == '\0')
+    args = nullptr;
+  symtab_symbol_info (opts.quiet, args, TYPES_DOMAIN, NULL, from_tty);
+}
+
+/* Command completer for 'info types' command.  */
+
+static void
+info_types_command_completer (struct cmd_list_element *ignore,
+			      completion_tracker &tracker,
+			      const char *text, const char * /* word */)
+{
+  const auto group
+    = make_info_types_options_def_group (nullptr);
+  if (gdb::option::complete_options
+      (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group))
+    return;
+
+  const char *word = advance_to_expression_complete_word_point (tracker, text);
+  symbol_completer (ignore, tracker, text, word);
 }
 
 /* Breakpoint all functions matching regular expression.  */
@@ -6035,8 +6086,13 @@  Prints the functions.\n"),
      print "struct foo *".
      I also think "ptype" or "whatis" is more likely to be useful (but if
      there is much disagreement "info types" can be fixed).  */
-  add_info ("types", info_types_command,
-	    _("All type names, or those matching REGEXP."));
+  c = add_info ("types", info_types_command, _("\
+All type names, or those matching REGEXP.\n\
+Usage: info types [-q] [REGEXP]\n\
+Print information about all types matching REGEXP, or all types if no\n\
+REGEXP is given.  The optional flag -q disables printing of some headers\n\
+and messages."));
+  set_cmd_completer_handle_brkchars (c, info_types_command_completer);
 
   add_info ("sources", info_sources_command,
 	    _("Source files in the program."));