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

Message ID 20190719145048.GA23204@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess July 19, 2019, 2:50 p.m. UTC
  * Eli Zaretskii <eliz@gnu.org> [2019-07-12 15:48:38 +0300]:

> > 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 for your feedback.

Part of the problem here is that many of the commands in this area are
similarly poorly documented, and I more or less copied the description
over.

I've simplified the command help text to actually reflect reality
(only headers are suppressed) and extended the manual text to mention
the headers before describing that the -q flag disables them.

Hopefully this all makes more sense.

Thanks,
Andrew

---

    gdb: Switch "info types" over to use the gdb::options framework
    
    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".
  

Comments

Eli Zaretskii July 19, 2019, 2:59 p.m. UTC | #1
> Date: Fri, 19 Jul 2019 15:50:48 +0100
> From: Andrew Burgess <andrew.burgess@embecosm.com>
> Cc: gdb-patches@sourceware.org
> 
> > > +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 for your feedback.
> 
> Part of the problem here is that many of the commands in this area are
> similarly poorly documented, and I more or less copied the description
> over.
> 
> I've simplified the command help text to actually reflect reality
> (only headers are suppressed) and extended the manual text to mention
> the headers before describing that the -q flag disables them.
> 
> Hopefully this all makes more sense.

Yes, the text is clear now.  Thanks.
  

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..be65d528d28 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,11 @@ 
 @code{whatis}, it does not print a detailed description; second, it
 lists all source files and line numbers where a type is defined.
 
+The output from @samp{into types} is proceeded with a header line
+describing what types are being listed.  The optional flag @samp{-q},
+which stands for @samp{quiet}, disables printing this 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 719e5b2ee9a..16861e2bc92 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.  */
@@ -6037,8 +6088,12 @@  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 headers."));
+  set_cmd_completer_handle_brkchars (c, info_types_command_completer);
 
   add_info ("sources", info_sources_command,
 	    _("Source files in the program."));