[1/3] gdb: Switch "info types" over to use the gdb::options framework
Commit Message
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
> 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.
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
@@ -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
@@ -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
@@ -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."));