https://gcc.gnu.org/g:3d00efc156367ef8f84d90446bf6977b9fed66cf

commit r16-974-g3d00efc156367ef8f84d90446bf6977b9fed66cf
Author: David Malcolm <dmalc...@redhat.com>
Date:   Thu May 29 16:57:52 2025 -0400

    diagnostics: reimplement html_token_printer in terms of xml::printer
    
    No functional change intended.
    
    gcc/ChangeLog:
            * diagnostic-format-html.cc
            (html_builder::make_element_for_diagnostic::html_token_printer):
            Reimplement in terms of xml::printer.
            (html_builder::make_element_for_diagnostic): Create an
            xml::printer and use it with the html_token_printer.
    
    Signed-off-by: David Malcolm <dmalc...@redhat.com>

Diff:
---
 gcc/diagnostic-format-html.cc | 46 ++++++++++++-------------------------------
 1 file changed, 13 insertions(+), 33 deletions(-)

diff --git a/gcc/diagnostic-format-html.cc b/gcc/diagnostic-format-html.cc
index 3fa5e662d2be..f418ccc3ed97 100644
--- a/gcc/diagnostic-format-html.cc
+++ b/gcc/diagnostic-format-html.cc
@@ -700,11 +700,9 @@ html_builder::make_element_for_diagnostic (const 
diagnostic_info &diagnostic,
   class html_token_printer : public token_printer
   {
   public:
-    html_token_printer (html_builder &builder,
-                        xml::element &parent_element)
-    : m_builder (builder)
+    html_token_printer (xml::printer &xp)
+    : m_xp (xp)
     {
-      m_open_elements.push_back (&parent_element);
     }
     void print_tokens (pretty_printer */*pp*/,
                       const pp_token_list &tokens) final override
@@ -722,7 +720,7 @@ html_builder::make_element_for_diagnostic (const 
diagnostic_info &diagnostic,
              pp_token_text *sub = as_a <pp_token_text *> (iter);
              /* The value might be in the obstack, so we may need to
                 copy it.  */
-             insertion_element ().add_text (sub->m_value.get ());
+             m_xp.add_text (sub->m_value.get ());
            }
            break;
 
@@ -733,51 +731,32 @@ html_builder::make_element_for_diagnostic (const 
diagnostic_info &diagnostic,
 
          case pp_token::kind::begin_quote:
            {
-             insertion_element ().add_text (open_quote);
-             push_element (make_span ("gcc-quoted-text"));
+             m_xp.add_text (open_quote);
+             m_xp.push_tag_with_class ("span", "gcc-quoted-text");
            }
            break;
          case pp_token::kind::end_quote:
            {
-             pop_element ();
-             insertion_element ().add_text (close_quote);
+             m_xp.pop_tag ();
+             m_xp.add_text (close_quote);
            }
            break;
 
          case pp_token::kind::begin_url:
            {
              pp_token_begin_url *sub = as_a <pp_token_begin_url *> (iter);
-             auto anchor = std::make_unique<xml::element> ("a", true);
-             anchor->set_attr ("href", sub->m_value.get ());
-             push_element (std::move (anchor));
+             m_xp.push_tag ("a", true);
+             m_xp.set_attr ("href", sub->m_value.get ());
            }
            break;
          case pp_token::kind::end_url:
-           pop_element ();
+           m_xp.pop_tag ();
            break;
          }
     }
 
   private:
-    xml::element &insertion_element () const
-    {
-      return *m_open_elements.back ();
-    }
-    void push_element (std::unique_ptr<xml::element> new_element)
-    {
-      xml::element &current_top = insertion_element ();
-      m_open_elements.push_back (new_element.get ());
-      current_top.add_child (std::move (new_element));
-    }
-    void pop_element ()
-    {
-      m_open_elements.pop_back ();
-    }
-
-    html_builder &m_builder;
-    /* We maintain a stack of currently "open" elements.
-       Children are added to the topmost open element.  */
-    std::vector<xml::element *> m_open_elements;
+    xml::printer &m_xp;
   };
 
   auto diag_element = make_div ("gcc-diagnostic");
@@ -798,7 +777,8 @@ html_builder::make_element_for_diagnostic (const 
diagnostic_info &diagnostic,
   message_span->set_attr ("id", message_span_id);
   add_focus_id (message_span_id);
 
-  html_token_printer tok_printer (*this, *message_span.get ());
+  xml::printer xp (*message_span.get ());
+  html_token_printer tok_printer (xp);
   m_printer->set_token_printer (&tok_printer);
   pp_output_formatted_text (m_printer, m_context.get_urlifier ());
   m_printer->set_token_printer (nullptr);

Reply via email to