Introduce pretty_printer::clone vfunc
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 11 Dec 2019 19:06:39 +0000 (19:06 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Wed, 11 Dec 2019 19:06:39 +0000 (19:06 +0000)
This patch provides a way to clone a pretty_printer.

This is needed so that we can capture text in a label_text and make
layout decisions based on it, using the policy of global_dc's printer,
whilst within a call to diagnostic_show_locus.  We can't print with
the pretty_printer itself within a call to diagnostic_show_locus since
it has partly-buffered content.

gcc/c-family/ChangeLog:
* c-pretty-print.c (c_pretty_printer::clone): New vfunc
implementation.
* c-pretty-print.h (c_pretty_printer::clone): New vfunc decl.

gcc/cp/ChangeLog:
* cxx-pretty-print.c (cxx_pretty_printer::clone): New vfunc
implementation.
* cxx-pretty-print.h (cxx_pretty_printer::clone): New vfunc decl.
* error.c (cxx_format_postprocessor::clone): New vfunc.

gcc/ChangeLog:
* pretty-print.c (pretty_printer::pretty_printer): New copy-ctor.
(pretty_printer::clone): New vfunc implementation.
* pretty-print.h (format_postprocessor::clone): New pure vfunc
decl.
(pretty_printer::pretty_printer): New copy-ctor decl.
(pretty_printer::clone): New vfunc decl.

From-SVN: r279244

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-pretty-print.c
gcc/c-family/c-pretty-print.h
gcc/cp/ChangeLog
gcc/cp/cxx-pretty-print.c
gcc/cp/cxx-pretty-print.h
gcc/cp/error.c
gcc/pretty-print.c
gcc/pretty-print.h

index 160358050bdaf77ada0d98a96b6ae855bc4fff25..747b04dd5f2ec13614031971002cdb4473d151e5 100644 (file)
@@ -1,3 +1,12 @@
+2019-12-11  David Malcolm  <dmalcolm@redhat.com>
+
+       * pretty-print.c (pretty_printer::pretty_printer): New copy-ctor.
+       (pretty_printer::clone): New vfunc implementation.
+       * pretty-print.h (format_postprocessor::clone): New pure vfunc
+       decl.
+       (pretty_printer::pretty_printer): New copy-ctor decl.
+       (pretty_printer::clone): New vfunc decl.
+
 2019-12-11  David Malcolm  <dmalcolm@redhat.com>
 
        * function-tests.c (selftest::make_fndecl): Make non-static.
index 9d488555c42726f667d5c7cbabaf5b06dc052dda..b264c38177f9a974cd899583bb1944344e316e8d 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-11  David Malcolm  <dmalcolm@redhat.com>
+
+       * c-pretty-print.c (c_pretty_printer::clone): New vfunc
+       implementation.
+       * c-pretty-print.h (c_pretty_printer::clone): New vfunc decl.
+
 2019-12-09  David Malcolm  <dmalcolm@redhat.com>
 
        * c-format.c (range_label_for_format_type_mismatch::get_text):
index bc7354559ba58d4740175b4c04fb6ca296a0e729..e5e898a6253c103b1f0f78c292c553757b02f7cd 100644 (file)
@@ -2372,6 +2372,13 @@ c_pretty_printer::c_pretty_printer ()
   parameter_list            = pp_c_parameter_type_list;
 }
 
+/* c_pretty_printer's implementation of pretty_printer::clone vfunc.  */
+
+pretty_printer *
+c_pretty_printer::clone () const
+{
+  return new c_pretty_printer (*this);
+}
 
 /* Print the tree T in full, on file FILE.  */
 
index 8d69620b724062956be17cda6091eb3362ab5e25..df21e212734b3b7360e6d78c15c5b411d9c87566 100644 (file)
@@ -51,6 +51,7 @@ class c_pretty_printer : public pretty_printer
 {
 public:
   c_pretty_printer ();
+  pretty_printer *clone () const OVERRIDE;
 
   // Format string, possibly translated.
   void translate_string (const char *);
index d8a6ae3dd0d06a69b40eb8165f8f168f0404bed6..202bb6cd0b1d721831a9e3415e3e09758ed7291b 100644 (file)
@@ -1,3 +1,10 @@
+2019-12-11  David Malcolm  <dmalcolm@redhat.com>
+
+       * cxx-pretty-print.c (cxx_pretty_printer::clone): New vfunc
+       implementation.
+       * cxx-pretty-print.h (cxx_pretty_printer::clone): New vfunc decl.
+       * error.c (cxx_format_postprocessor::clone): New vfunc.
+
 2019-12-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/92869
index 62805446ba9e8c2a0ded51f9dcc9176e26660e6f..b14aa9640df22bcb1e6c2a71096ba2502f02196e 100644 (file)
@@ -2968,3 +2968,11 @@ cxx_pretty_printer::cxx_pretty_printer ()
   type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
   parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
 }
+
+/* cxx_pretty_printer's implementation of pretty_printer::clone vfunc.  */
+
+pretty_printer *
+cxx_pretty_printer::clone () const
+{
+  return new cxx_pretty_printer (*this);
+}
index 347811fe735d9384e1f339e61998c88c641a8eb5..dd96226ae0bc2609ef07d91246474db6da382092 100644 (file)
@@ -34,6 +34,8 @@ class cxx_pretty_printer : public c_pretty_printer
 public:
   cxx_pretty_printer ();
 
+  pretty_printer *clone () const OVERRIDE;
+
   void constant (tree);
   void id_expression (tree);
   void primary_expression (tree);
index 7c46c17c1e18d30b000526cd9c699c525262f891..298030baf2164fb9e82b29fb9936a10474e47166 100644 (file)
@@ -143,6 +143,11 @@ class cxx_format_postprocessor : public format_postprocessor
   : m_type_a (), m_type_b ()
   {}
 
+  format_postprocessor *clone() const FINAL OVERRIDE
+  {
+    return new cxx_format_postprocessor ();
+  }
+
   void handle (pretty_printer *pp) FINAL OVERRIDE;
 
   deferred_printed_type m_type_a;
index 511ef0ab0afabe2abbe1318b9e95167b40700ece..084e03c73c781ce2b1e93efa3c5b487524b547b3 100644 (file)
@@ -1590,6 +1590,32 @@ pretty_printer::pretty_printer (int maximum_length)
   pp_set_prefix (this, NULL);
 }
 
+/* Copy constructor for pretty_printer.  */
+
+pretty_printer::pretty_printer (const pretty_printer &other)
+: buffer (new (XCNEW (output_buffer)) output_buffer ()),
+  prefix (),
+  padding (other.padding),
+  maximum_length (other.maximum_length),
+  indent_skip (other.indent_skip),
+  wrapping (other.wrapping),
+  format_decoder (other.format_decoder),
+  m_format_postprocessor (NULL),
+  emitted_prefix (other.emitted_prefix),
+  need_newline (other.need_newline),
+  translate_identifiers (other.translate_identifiers),
+  show_color (other.show_color),
+  show_urls (other.show_urls)
+{
+  pp_line_cutoff (this) = maximum_length;
+  /* By default, we emit prefixes once per message.  */
+  pp_prefixing_rule (this) = pp_prefixing_rule (&other);
+  pp_set_prefix (this, NULL);
+
+  if (other.m_format_postprocessor)
+    m_format_postprocessor = other.m_format_postprocessor->clone ();
+}
+
 pretty_printer::~pretty_printer ()
 {
   if (m_format_postprocessor)
@@ -1599,6 +1625,14 @@ pretty_printer::~pretty_printer ()
   free (prefix);
 }
 
+/* Base class implementation of pretty_printer::clone vfunc.  */
+
+pretty_printer *
+pretty_printer::clone () const
+{
+  return new pretty_printer (*this);
+}
+
 /* Append a string delimited by START and END to the output area of
    PRETTY-PRINTER.  No line wrapping is done.  However, if beginning a
    new line then emit PRETTY-PRINTER's prefix and skip any leading
index c73fc308d509fc375208a59f785b47ec162e7d00..493507d41419e9065afb8d4fbe04f4e976da67a1 100644 (file)
@@ -192,6 +192,7 @@ class format_postprocessor
 {
  public:
   virtual ~format_postprocessor () {}
+  virtual format_postprocessor *clone() const = 0;
   virtual void handle (pretty_printer *) = 0;
 };
 
@@ -221,9 +222,12 @@ public:
   /* Default construct a pretty printer with specified
      maximum line length cut off limit.  */
   explicit pretty_printer (int = 0);
+  explicit pretty_printer (const pretty_printer &other);
 
   virtual ~pretty_printer ();
 
+  virtual pretty_printer *clone () const;
+
   /* Where we print external representation of ENTITY.  */
   output_buffer *buffer;