Commit 368877a1 by David Malcolm Committed by David Malcolm

Introduce pretty_printer::clone vfunc

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
parent 34a53788
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.
* selftest.h (selftest::make_fndecl): New decl.
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):
......
......@@ -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. */
......
......@@ -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 *);
......
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
......
......@@ -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);
}
......@@ -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);
......
......@@ -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;
......
......@@ -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
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment