[RFC,4/8] Add variable name styling
Commit Message
This adds style support for variable names. For the time being, this
is only done in backtraces, not in ptype or print; those places do not
use ui-out and so would need ad hoc changes.
Because "name" is a relatively common MI field name, simple name
recognition does not work for variable names. So, this patch changes
cli-out to track the enclosing list name, and only colorize "name"
when appearing somewhere within a list named "args".
This also adds styling to the names printed for local variables in
"backtrace full". This code does not use ui-out, so the styling is
done using the low-level API.
---
gdb/cli-out.c | 8 ++++++++
gdb/cli-out.h | 3 +++
gdb/cli/cli-style.c | 8 ++++++++
gdb/cli/cli-style.h | 1 +
gdb/printcmd.c | 7 ++++++-
5 files changed, 26 insertions(+), 1 deletion(-)
Comments
On 2018-09-06 5:12 p.m., Tom Tromey wrote:
> This adds style support for variable names. For the time being, this
> is only done in backtraces, not in ptype or print; those places do not
> use ui-out and so would need ad hoc changes.
>
> Because "name" is a relatively common MI field name, simple name
> recognition does not work for variable names. So, this patch changes
> cli-out to track the enclosing list name, and only colorize "name"
> when appearing somewhere within a list named "args".
This patch misses an include for it to build on its own.
This is a case where I think the suggestion I made in my previous message
would help. It would be much clearer and less magic if the caller just
explicitly communicated the intent of printing a variable, rather than
cli-out trying to guess.
So in print_frame_args, we could have
-uiout->field_stream ("name", stb);
+uiout->field_stream ("name", stb, print_style::VARIABLE);
or maybe even pass the style object directly
uiout->field_stream ("name", stb, variable_name_style);
Simon
@@ -80,6 +80,9 @@ cli_ui_out::do_table_header (int width, ui_align alignment,
void
cli_ui_out::do_begin (ui_out_type type, const char *id)
{
+ m_in_args.push_back (id != nullptr && strcmp (id, "args") == 0);
+ if (m_in_args.back ())
+ ++m_in_args_count;
}
/* Mark end of a list */
@@ -87,6 +90,9 @@ cli_ui_out::do_begin (ui_out_type type, const char *id)
void
cli_ui_out::do_end (ui_out_type type)
{
+ if (m_in_args.back ())
+ --m_in_args_count;
+ m_in_args.pop_back ();
}
/* output an int field */
@@ -167,6 +173,8 @@ cli_ui_out::do_field_string (int fldno, int width, ui_align align,
style = &file_name_style;
else if (!strcmp (fldname, "func") || !strcmp (fldname, "function"))
style = &function_name_style;
+ else if (m_in_args_count > 0 && !strcmp (fldname, "name"))
+ style = &variable_name_style;
if (style != nullptr)
set_output_style (m_streams.back (), style->style ());
@@ -73,6 +73,9 @@ private:
std::vector<ui_file *> m_streams;
bool m_suppress_output;
+
+ std::vector<bool> m_in_args;
+ int m_in_args_count = 0;
};
extern cli_ui_out *cli_out_new (struct ui_file *stream);
@@ -43,6 +43,7 @@ static const char * const cli_intensities[] = {
cli_style_option file_name_style (ui_file_style::GREEN);
cli_style_option function_name_style (ui_file_style::YELLOW);
+cli_style_option variable_name_style (ui_file_style::CYAN);
cli_style_option::cli_style_option (ui_file_style::color fg)
: m_foreground (cli_colors[fg - ui_file_style::NONE]),
@@ -204,4 +205,11 @@ Configure function name colors and display intensity"),
"style function",
&style_set_list,
&style_show_list);
+ variable_name_style.add_setshow_commands ("variable", no_class,
+ "style variable",
+ _("\
+Variable name display styling\n\
+Configure variable name colors and display intensity"),
+ &style_set_list,
+ &style_show_list);
}
@@ -63,5 +63,6 @@ private:
extern cli_style_option file_name_style;
extern cli_style_option function_name_style;
+extern cli_style_option variable_name_style;
#endif /* CLI_STYLE_H */
@@ -2156,7 +2156,12 @@ print_variable_and_value (const char *name, struct symbol *var,
if (!name)
name = SYMBOL_PRINT_NAME (var);
- fprintf_filtered (stream, "%s%s = ", n_spaces (2 * indent), name);
+ fputs_filtered (n_spaces (2 * indent), stream);
+ set_output_style (stream, variable_name_style.style ());
+ fputs_filtered (name, stream);
+ set_output_style (stream, ui_file_style ());
+ fputs_filtered (" = ", stream);
+
TRY
{
struct value *val;