Style field names in "print"
authorTom Tromey <tom@tromey.com>
Sat, 22 Feb 2020 17:02:42 +0000 (10:02 -0700)
committerTom Tromey <tom@tromey.com>
Sat, 22 Feb 2020 17:12:52 +0000 (10:12 -0700)
This changes gdb to use the "variable" style when printing field
names.  I've added new tests for C and Rust, but not other languages.

I chose "variable" because that seemed most straightforward.  However,
another option would be to introduce a new "field" style.  Similarly,
this patch uses the variable style for enumerator constants -- but
again, a new style could be used if that's preferred.

gdb/ChangeLog
2020-02-22  Tom Tromey  <tom@tromey.com>

* valprint.c (generic_val_print_enum_1)
(val_print_type_code_flags): Style member names.
* rust-lang.c (val_print_struct, rust_print_enum)
(rust_print_struct_def, rust_internal_print_type): Style member
names.
* p-valprint.c (pascal_object_print_value_fields): Style member
names.  Only call fprintf_symbol_filtered for static members.
* m2-typeprint.c (m2_record_fields, m2_enum): Style member names.
* f-valprint.c (f_val_print): Style member names.
* f-typeprint.c (f_type_print_base): Style member names.
* cp-valprint.c (cp_print_value_fields): Style member names.  Only
call fprintf_symbol_filtered for static members.
(cp_print_class_member): Style member names.
* c-typeprint.c (c_print_type_1, c_type_print_base_1): Style
member names.
* ada-valprint.c (ada_print_scalar): Style enum names.
(ada_val_print_enum): Likewise.
* ada-typeprint.c (print_enum_type): Style enum names.

gdb/testsuite/ChangeLog
2020-02-22  Tom Tromey  <tom@tromey.com>

* gdb.rust/rust-style.rs: New file.
* gdb.rust/rust-style.exp: New file.
* gdb.base/style.exp: Test structure printing.
* gdb.base/style.c (struct some_struct): New type.
(enum etype): New type.
(struct_value): New global.

Change-Id: I070e1293c6cc830c9ea916af8243410aa384e944

16 files changed:
gdb/ChangeLog
gdb/ada-typeprint.c
gdb/ada-valprint.c
gdb/c-typeprint.c
gdb/cp-valprint.c
gdb/f-typeprint.c
gdb/f-valprint.c
gdb/m2-typeprint.c
gdb/p-valprint.c
gdb/rust-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/style.c
gdb/testsuite/gdb.base/style.exp
gdb/testsuite/gdb.rust/rust-style.exp [new file with mode: 0644]
gdb/testsuite/gdb.rust/rust-style.rs [new file with mode: 0644]
gdb/valprint.c

index 782f6008c369fd70f85787d0b0913be5545933c5..ecdce315f7e02747bb7be6e569bd969f7637bea1 100644 (file)
@@ -1,3 +1,24 @@
+2020-02-22  Tom Tromey  <tom@tromey.com>
+
+       * valprint.c (generic_val_print_enum_1)
+       (val_print_type_code_flags): Style member names.
+       * rust-lang.c (val_print_struct, rust_print_enum)
+       (rust_print_struct_def, rust_internal_print_type): Style member
+       names.
+       * p-valprint.c (pascal_object_print_value_fields): Style member
+       names.  Only call fprintf_symbol_filtered for static members.
+       * m2-typeprint.c (m2_record_fields, m2_enum): Style member names.
+       * f-valprint.c (f_val_print): Style member names.
+       * f-typeprint.c (f_type_print_base): Style member names.
+       * cp-valprint.c (cp_print_value_fields): Style member names.  Only
+       call fprintf_symbol_filtered for static members.
+       (cp_print_class_member): Style member names.
+       * c-typeprint.c (c_print_type_1, c_type_print_base_1): Style
+       member names.
+       * ada-valprint.c (ada_print_scalar): Style enum names.
+       (ada_val_print_enum): Likewise.
+       * ada-typeprint.c (print_enum_type): Style enum names.
+
 2020-02-21  Tom Tromey  <tom@tromey.com>
 
        * psympriv.h (struct partial_symtab): Update comment.
index 89ce290de7e643c9c278b200a3026fd114ff1d6c..db4634c0f3b01cf402e444b7e83afde3dd9e8e66 100644 (file)
@@ -326,7 +326,8 @@ print_enum_type (struct type *type, struct ui_file *stream)
       if (i)
        fprintf_filtered (stream, ", ");
       wrap_here ("    ");
-      fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
+      fputs_styled (ada_enum_name (TYPE_FIELD_NAME (type, i)),
+                   variable_name_style.style (), stream);
       if (lastval != TYPE_FIELD_ENUMVAL (type, i))
        {
          fprintf_filtered (stream, " => %s",
index 88b74cd06198077b0cbca6cb71a3b178da287206..b918caf473ff4bc6e1a009771ab4f31e5e503b12 100644 (file)
@@ -418,7 +418,8 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream)
        }
       if (i < len)
        {
-         fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
+         fputs_styled (ada_enum_name (TYPE_FIELD_NAME (type, i)),
+                       variable_name_style.style (), stream);
        }
       else
        {
@@ -956,9 +957,11 @@ ada_val_print_enum (struct type *type, const gdb_byte *valaddr,
       const char *name = ada_enum_name (TYPE_FIELD_NAME (type, i));
 
       if (name[0] == '\'')
-       fprintf_filtered (stream, "%ld %s", (long) val, name);
+       fprintf_filtered (stream, "%ld %ps", (long) val,
+                         styled_string (variable_name_style.style (),
+                                        name));
       else
-       fputs_filtered (name, stream);
+       fputs_styled (name, variable_name_style.style (), stream);
     }
   else
     print_longest (stream, 'd', 0, val);
index a8c9705c031677969cbb215dace7ad7016099922..1f27b5664673ef4c9b2341aba8605d6f1b8a2b22 100644 (file)
@@ -148,7 +148,7 @@ c_print_type_1 (struct type *type,
       if (code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD)
        fputs_styled (varstring, function_name_style.style (), stream);
       else
-       fputs_filtered (varstring, stream);
+       fputs_styled (varstring, variable_name_style.style (), stream);
 
       /* For demangled function names, we have the arglist as part of
          the name, so don't print an additional pair of ()'s.  */
@@ -1595,7 +1595,8 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream,
              if (i)
                fprintf_filtered (stream, ", ");
              wrap_here ("    ");
-             fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+             fputs_styled (TYPE_FIELD_NAME (type, i),
+                           variable_name_style.style (), stream);
              if (lastval != TYPE_FIELD_ENUMVAL (type, i))
                {
                  fprintf_filtered (stream, " = %s",
index 288ebafec7287953e2cb78e134fae39e23888c30..e936e3ffa3234e80784d1514a82647b9136190e2 100644 (file)
@@ -235,11 +235,16 @@ cp_print_value_fields (struct type *type, struct type *real_type,
          annotate_field_begin (TYPE_FIELD_TYPE (type, i));
 
          if (field_is_static (&TYPE_FIELD (type, i)))
-           fputs_filtered ("static ", stream);
-         fprintf_symbol_filtered (stream,
-                                  TYPE_FIELD_NAME (type, i),
-                                  current_language->la_language,
-                                  DMGL_PARAMS | DMGL_ANSI);
+           {
+             fputs_filtered ("static ", stream);
+             fprintf_symbol_filtered (stream,
+                                      TYPE_FIELD_NAME (type, i),
+                                      current_language->la_language,
+                                      DMGL_PARAMS | DMGL_ANSI);
+           }
+         else
+           fputs_styled (TYPE_FIELD_NAME (type, i),
+                         variable_name_style.style (), stream);
          annotate_field_name_end ();
 
          /* We tweak various options in a few cases below.  */
@@ -782,7 +787,8 @@ cp_print_class_member (const gdb_byte *valaddr, struct type *type,
       else
        c_type_print_base (self_type, stream, 0, 0, &type_print_raw_options);
       fprintf_filtered (stream, "::");
-      fputs_filtered (TYPE_FIELD_NAME (self_type, fieldno), stream);
+      fputs_styled (TYPE_FIELD_NAME (self_type, fieldno),
+                   variable_name_style.style (), stream);
     }
   else
     fprintf_filtered (stream, "%ld", (long) val);
index 72a4188fbb9130bd1e3817cc432c79b85df7d0d1..e4a2beb930b422f705ff4c329b3ccd9ea47da0de 100644 (file)
@@ -435,7 +435,8 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show,
              f_type_print_base (TYPE_FIELD_TYPE (type, index), stream,
                                 show - 1, level + 4);
              fputs_filtered (" :: ", stream);
-             fputs_filtered (TYPE_FIELD_NAME (type, index), stream);
+             fputs_styled (TYPE_FIELD_NAME (type, index),
+                           variable_name_style.style (), stream);
              f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index),
                                           stream, show - 1, 0, 0, 0, false);
              fputs_filtered ("\n", stream);
index 71247a7143ddb6fe0e125ded3ed96e862aaf648f..a25e61473228d245fd94d6bf0b19c77d629c125a 100644 (file)
@@ -341,7 +341,8 @@ f_val_print (struct type *type, int embedded_offset,
              field_name = TYPE_FIELD_NAME (type, index);
              if (field_name != NULL)
                {
-                 fputs_filtered (field_name, stream);
+                 fputs_styled (field_name, variable_name_style.style (),
+                               stream);
                  fputs_filtered (" = ", stream);
                }
 
index 0fe4fad0be835aeae30ece0827ff57a56f805910..a4a7689c33eeda556b06301de908da75645a6fec 100644 (file)
@@ -563,7 +563,8 @@ m2_record_fields (struct type *type, struct ui_file *stream, int show,
          QUIT;
 
          print_spaces_filtered (level + 4, stream);
-         fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+         fputs_styled (TYPE_FIELD_NAME (type, i),
+                       variable_name_style.style (), stream);
          fputs_filtered (" : ", stream);
          m2_print_type (TYPE_FIELD_TYPE (type, i),
                         "",
@@ -608,7 +609,8 @@ m2_enum (struct type *type, struct ui_file *stream, int show, int level)
          if (i > 0)
            fprintf_filtered (stream, ", ");
          wrap_here ("    ");
-         fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+         fputs_styled (TYPE_FIELD_NAME (type, i),
+                       variable_name_style.style (), stream);
          if (lastval != TYPE_FIELD_ENUMVAL (type, i))
            {
              fprintf_filtered (stream, " = %s",
index aaeb4b67e98381c75cabb3e059acbc03dd345b97..7d087557fd32be6c332e6e9fbe5df95bac0fb38b 100644 (file)
@@ -605,10 +605,16 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
          annotate_field_begin (TYPE_FIELD_TYPE (type, i));
 
          if (field_is_static (&TYPE_FIELD (type, i)))
-           fputs_filtered ("static ", stream);
-         fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
-                                  language_cplus,
-                                  DMGL_PARAMS | DMGL_ANSI);
+           {
+             fputs_filtered ("static ", stream);
+             fprintf_symbol_filtered (stream,
+                                      TYPE_FIELD_NAME (type, i),
+                                      current_language->la_language,
+                                      DMGL_PARAMS | DMGL_ANSI);
+           }
+         else
+           fputs_styled (TYPE_FIELD_NAME (type, i),
+                         variable_name_style.style (), stream);
          annotate_field_name_end ();
          fputs_filtered (" = ", stream);
          annotate_field_value ();
index 18dc6a56471378387d2d299d3c7960a6a791c310..fc48e3486aef940815b04572f438dd9f71e9fa72 100644 (file)
@@ -436,7 +436,8 @@ val_print_struct (struct type *type, int embedded_offset,
 
       if (!is_tuple && !is_tuple_struct)
         {
-         fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+         fputs_styled (TYPE_FIELD_NAME (type, i),
+                       variable_name_style.style (), stream);
          fputs_filtered (": ", stream);
         }
 
@@ -515,8 +516,9 @@ rust_print_enum (struct type *type, int embedded_offset,
       first_field = false;
 
       if (!is_tuple)
-       fprintf_filtered (stream, "%s: ",
-                         TYPE_FIELD_NAME (variant_type, j));
+       fprintf_filtered (stream, "%ps: ",
+                         styled_string (variable_name_style.style (),
+                                        TYPE_FIELD_NAME (variant_type, j)));
 
       val_print (TYPE_FIELD_TYPE (variant_type, j),
                 (embedded_offset
@@ -792,9 +794,12 @@ rust_print_struct_def (struct type *type, const char *varstring,
       if (!for_rust_enum || flags->print_offsets)
        print_spaces_filtered (level + 2, stream);
       if (is_enum)
-       fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+       fputs_styled (TYPE_FIELD_NAME (type, i), variable_name_style.style (),
+                     stream);
       else if (!is_tuple_struct)
-       fprintf_filtered (stream, "%s: ", TYPE_FIELD_NAME (type, i));
+       fprintf_filtered (stream, "%ps: ",
+                         styled_string (variable_name_style.style (),
+                                        TYPE_FIELD_NAME (type, i)));
 
       rust_internal_print_type (TYPE_FIELD_TYPE (type, i), NULL,
                                stream, (is_enum ? show : show - 1),
@@ -943,7 +948,9 @@ rust_internal_print_type (struct type *type, const char *varstring,
                && name[len] == ':'
                && name[len + 1] == ':')
              name += len + 2;
-           fprintfi_filtered (level + 2, stream, "%s,\n", name);
+           fprintfi_filtered (level + 2, stream, "%ps,\n",
+                              styled_string (variable_name_style.style (),
+                                             name));
          }
 
        fputs_filtered ("}", stream);
index 5dd1d3386a524dd5f644f920a113299191481f09..d3f555ef5b3b7ed4d71caaa0ea47645b4213c304 100644 (file)
@@ -1,3 +1,12 @@
+2020-02-22  Tom Tromey  <tom@tromey.com>
+
+       * gdb.rust/rust-style.rs: New file.
+       * gdb.rust/rust-style.exp: New file.
+       * gdb.base/style.exp: Test structure printing.
+       * gdb.base/style.c (struct some_struct): New type.
+       (enum etype): New type.
+       (struct_value): New global.
+
 2020-02-21  Tom de Vries  <tdevries@suse.de>
 
        PR go/18926
index 805f500f9577c91139d83ee36e6128563c43dcd4..cb75b3b915ea8afa56139beb6766eff52a61177a 100644 (file)
 
 #define SOME_MACRO 23
 
+enum etype
+{
+  VALUE_ONE = 1,
+  VALUE_TWO = 2
+};
+
+struct some_struct
+{
+  int int_field;
+  char *string_field;
+  enum etype e_field;
+};
+
+struct some_struct struct_value = { 23, "skidoo", VALUE_TWO };
+
 int some_called_function (void)
 {
   return 0;
index 0457c3dc4ad0a61f0382720cbf07ef49aa34a01b..47ef8c93c7c09dc7acb1f664038eafe99c7fae78 100644 (file)
@@ -87,6 +87,13 @@ save_vars { env(TERM) } {
     # Somewhere should see the call to the function.
     gdb_test "disassemble main" "[style $hex address].*$func.*"
 
+    set ifield [style int_field variable]
+    set sfield [style string_field variable]
+    set efield [style e_field variable]
+    set evalue [style VALUE_TWO variable]
+    gdb_test "print struct_value" \
+       "\{$ifield = 23,.*$sfield = .*,.*$efield = $evalue.*"
+
     gdb_exit
     gdb_spawn
 
diff --git a/gdb/testsuite/gdb.rust/rust-style.exp b/gdb/testsuite/gdb.rust/rust-style.exp
new file mode 100644 (file)
index 0000000..ec7e8a1
--- /dev/null
@@ -0,0 +1,44 @@
+# Copyright 2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test CLI output styling for Rust.
+
+load_lib rust-support.exp
+if {[skip_rust_tests]} {
+    continue
+}
+
+save_vars { env(TERM) } {
+    # We need an ANSI-capable terminal to get the output.
+    setenv TERM ansi
+
+    standard_testfile .rs
+    if {[prepare_for_testing "failed to prepare" $testfile $srcfile \
+            {debug rust}]} {
+       return -1
+    }
+
+    set line [gdb_get_line_number "breakpoint"]
+    if {![runto ${srcfile}:$line]} {
+       untested "could not run to breakpoint"
+       return -1
+    }
+
+    set vfield [style value variable]
+    set v2field [style value2 variable]
+    gdb_test "print v" \
+       "Two\{$vfield: 23, $v2field: 97\}"
+
+}
diff --git a/gdb/testsuite/gdb.rust/rust-style.rs b/gdb/testsuite/gdb.rust/rust-style.rs
new file mode 100644 (file)
index 0000000..9952f66
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2020 Free Software Foundation, Inc.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#![allow(dead_code)]
+#![allow(unused_variables)]
+#![allow(unused_assignments)]
+
+enum EnumType {
+    One(i32),
+    Two{value: i32, value2: i32},
+}
+
+fn main() {
+    let v = EnumType::Two{ value: 23, value2: 97 };
+
+    println!("");               // breakpoint
+}
index ee370228eda541792b5688d6d29ebf364ec31323..8adbb3df45714be5aa23cb842506cb6aa800dbd5 100644 (file)
@@ -625,7 +625,8 @@ generic_val_print_enum_1 (struct type *type, LONGEST val,
     }
   if (i < len)
     {
-      fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+      fputs_styled (TYPE_FIELD_NAME (type, i), variable_name_style.style (),
+                   stream);
     }
   else if (TYPE_FLAG_ENUM (type))
     {
@@ -655,7 +656,8 @@ generic_val_print_enum_1 (struct type *type, LONGEST val,
                fputs_filtered (" | ", stream);
 
              val &= ~TYPE_FIELD_ENUMVAL (type, i);
-             fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+             fputs_styled (TYPE_FIELD_NAME (type, i),
+                           variable_name_style.style (), stream);
            }
        }
 
@@ -1268,8 +1270,10 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
              && TYPE_FIELD_BITSIZE (type, field) == 1)
            {
              if (val & ((ULONGEST)1 << TYPE_FIELD_BITPOS (type, field)))
-               fprintf_filtered (stream, " %s",
-                                 TYPE_FIELD_NAME (type, field));
+               fprintf_filtered
+                 (stream, " %ps",
+                  styled_string (variable_name_style.style (),
+                                 TYPE_FIELD_NAME (type, field)));
            }
          else
            {
@@ -1279,8 +1283,9 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
 
              if (field_len < sizeof (ULONGEST) * TARGET_CHAR_BIT)
                field_val &= ((ULONGEST) 1 << field_len) - 1;
-             fprintf_filtered (stream, " %s=",
-                               TYPE_FIELD_NAME (type, field));
+             fprintf_filtered (stream, " %ps=",
+                               styled_string (variable_name_style.style (),
+                                              TYPE_FIELD_NAME (type, field)));
              if (TYPE_CODE (field_type) == TYPE_CODE_ENUM)
                generic_val_print_enum_1 (field_type, field_val, stream);
              else