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
This commit is contained in:
parent
34a53788fe
commit
368877a11b
10 changed files with 83 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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 *);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue