]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
analyzer: respect GCC_COLORS in out-of-bounds diagrams [PR114588]
authorDavid Malcolm <dmalcolm@redhat.com>
Fri, 5 Apr 2024 18:49:53 +0000 (14:49 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Fri, 5 Apr 2024 18:49:53 +0000 (14:49 -0400)
gcc/analyzer/ChangeLog:
PR analyzer/114588
* access-diagram.cc (access_diagram_impl::access_diagram_impl):
Replace hardcoded colors for valid_style and invalid_style with
calls to text_art::get_style_from_color_cap_name.

gcc/ChangeLog:
PR analyzer/114588
* diagnostic-color.cc (color_dict): Add "valid" and "invalid" as
color capability names.
* doc/invoke.texi: Document them in description of GCC_COLORS.
* text-art/style.cc: Include "diagnostic-color.h".
(text_art::get_style_from_color_cap_name): New.
* text-art/types.h (get_style_from_color_cap_name): New decl.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
gcc/analyzer/access-diagram.cc
gcc/diagnostic-color.cc
gcc/doc/invoke.texi
gcc/text-art/style.cc
gcc/text-art/types.h

index 4cb6570e90b988932e7915d6176e8a2066c92ab5..85e1049bb8982d1f10f96adcd565398064c78929 100644 (file)
@@ -2059,14 +2059,10 @@ public:
 
     /* Register painting styles.  */
     {
-      style valid_style;
-      valid_style.m_fg_color = style::named_color::GREEN;
-      valid_style.m_bold = true;
+      style valid_style (get_style_from_color_cap_name ("valid"));
       m_valid_style_id = m_sm.get_or_create_id (valid_style);
 
-      style invalid_style;
-      invalid_style.m_fg_color = style::named_color::RED;
-      invalid_style.m_bold = true;
+      style invalid_style (get_style_from_color_cap_name ("invalid"));
       m_invalid_style_id = m_sm.get_or_create_id (invalid_style);
     }
 
index 4859f36da6a948374e87309ec3399c9de3c32541..f01a0fc2e3775c974ce1ffcb1d5f1ba74cf41c84 100644 (file)
@@ -101,6 +101,8 @@ static struct color_cap color_dict[] =
   { "diff-delete", SGR_SEQ (COLOR_FG_RED), 11, false },
   { "diff-insert", SGR_SEQ (COLOR_FG_GREEN), 11, false },
   { "type-diff", SGR_SEQ (COLOR_BOLD COLOR_SEPARATOR COLOR_FG_GREEN), 9, false },
+  { "valid", SGR_SEQ (COLOR_BOLD COLOR_SEPARATOR COLOR_FG_GREEN), 5, false },
+  { "invalid", SGR_SEQ (COLOR_BOLD COLOR_SEPARATOR COLOR_FG_RED), 7, false },
   { NULL, NULL, 0, false }
 };
 
index e2edf7a6c1397c9face3dd9e7053f10e2a4aa5ff..1006510fc6aaf0d50d1a045fcd63f99d06b2e8d9 100644 (file)
@@ -5244,7 +5244,7 @@ The default @env{GCC_COLORS} is
 error=01;31:warning=01;35:note=01;36:range1=32:range2=34:locus=01:\
 quote=01:path=01;36:fixit-insert=32:fixit-delete=31:\
 diff-filename=01:diff-hunk=32:diff-delete=31:diff-insert=32:\
-type-diff=01;32:fnname=01;32:targs=35
+type-diff=01;32:fnname=01;32:targs=35:valid=01;31:invalid=01;32
 @end smallexample
 @noindent
 where @samp{01;31} is bold red, @samp{01;35} is bold magenta,
@@ -5327,6 +5327,14 @@ SGR substring for inserted lines within generated patches.
 @item type-diff=
 SGR substring for highlighting mismatching types within template
 arguments in the C++ frontend.
+
+@vindex valid GCC_COLORS @r{capability}
+@item valid=
+SGR substring for highlighting valid elements within text art diagrams.
+
+@vindex invalid GCC_COLORS @r{capability}
+@item invalid=
+SGR substring for highlighting invalid elements within text art diagrams.
 @end table
 
 @opindex fdiagnostics-urls
index e74efe23014c5b4056cd38c72ba118d9cb0c7646..5c58d432cf4849158856b96f198719855e2e8d60 100644 (file)
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "text-art/selftests.h"
 #include "text-art/types.h"
 #include "color-macros.h"
+#include "diagnostic-color.h"
 
 using namespace text_art;
 
@@ -256,6 +257,23 @@ style::print_changes (pretty_printer *pp,
     }
 }
 
+/* Look up the current SGR codes for a color capability NAME
+   (from GCC_COLORS or the defaults), and convert them to
+   a text_art::style.  */
+
+style
+text_art::get_style_from_color_cap_name (const char *name)
+{
+  const char *sgr_codes = colorize_start (true, name);
+  gcc_assert (sgr_codes);
+
+  /* Parse the sgr codes.  We expect the resulting styled_string to be
+     empty; we're interested in the final style created during parsing.  */
+  style_manager sm;
+  styled_string styled_str (sm, sgr_codes);
+  return sm.get_style (sm.get_num_styles () - 1);
+}
+
 /* class text_art::style_manager.  */
 
 style_manager::style_manager ()
index 02de2e86122ef8c9ac61f3b18691802e410d7faf..2b9f8b387c71997f6f611fcffd697a9ee663d4ab 100644 (file)
@@ -332,6 +332,8 @@ struct style
   std::vector<cppchar_t> m_url; // empty = no URL
 };
 
+extern style get_style_from_color_cap_name (const char *name);
+
 /* A class to keep track of all the styles in use in a drawing, so that
    we can refer to them via the compact style::id_t type, rather than
    via e.g. pointers.  */