Skip to content

Commit

Permalink
Move pp::Printer out field to owned String
Browse files Browse the repository at this point in the history
This enforces that eof() must be called to get the String out, and
generally is better from an API perspective. No users of pretty printing
pre-allocate the buffer.
  • Loading branch information
Mark-Simulacrum committed Jul 10, 2019
1 parent e0ffa7c commit 00ca508
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 47 deletions.
31 changes: 12 additions & 19 deletions src/librustc/hir/print.rs
Expand Up @@ -68,13 +68,13 @@ impl PpAnn for hir::Crate {
}

pub struct State<'a> {
pub s: pp::Printer<'a>,
pub s: pp::Printer,
comments: Option<Comments<'a>>,
ann: &'a (dyn PpAnn + 'a),
}

impl<'a> PrintState<'a> for State<'a> {
fn writer(&mut self) -> &mut pp::Printer<'a> {
fn writer(&mut self) -> &mut pp::Printer {
&mut self.s
}

Expand All @@ -94,28 +94,25 @@ pub fn print_crate<'a>(cm: &'a SourceMap,
filename: FileName,
input: String,
ann: &'a dyn PpAnn) -> String {
let mut out = String::new();
let mut s = State::new_from_input(cm, sess, filename, input, &mut out, ann);
let mut s = State::new_from_input(cm, sess, filename, input, ann);

// When printing the AST, we sometimes need to inject `#[no_std]` here.
// Since you can't compile the HIR, it's not necessary.

s.print_mod(&krate.module, &krate.attrs);
s.print_remaining_comments();
s.s.eof();
out
s.s.eof()
}

impl<'a> State<'a> {
pub fn new_from_input(cm: &'a SourceMap,
sess: &ParseSess,
filename: FileName,
input: String,
out: &'a mut String,
ann: &'a dyn PpAnn)
-> State<'a> {
State {
s: pp::mk_printer(out),
s: pp::mk_printer(),
comments: Some(Comments::new(cm, sess, filename, input)),
ann,
}
Expand All @@ -125,17 +122,13 @@ impl<'a> State<'a> {
pub fn to_string<F>(ann: &dyn PpAnn, f: F) -> String
where F: FnOnce(&mut State<'_>)
{
let mut wr = String::new();
{
let mut printer = State {
s: pp::mk_printer(&mut wr),
comments: None,
ann,
};
f(&mut printer);
printer.s.eof();
}
wr
let mut printer = State {
s: pp::mk_printer(),
comments: None,
ann,
};
f(&mut printer);
printer.s.eof()
}

pub fn visibility_qualified<S: Into<Cow<'static, str>>>(vis: &hir::Visibility, w: S) -> String {
Expand Down
3 changes: 1 addition & 2 deletions src/librustc_driver/pretty.rs
Expand Up @@ -814,7 +814,6 @@ pub fn print_after_hir_lowering<'tcx>(
&sess.parse_sess,
src_name,
src,
out,
annotation.pp_ann());
for node_id in uii.all_matching_node_ids(hir_map) {
let hir_id = tcx.hir().node_to_hir_id(node_id);
Expand All @@ -826,7 +825,7 @@ pub fn print_after_hir_lowering<'tcx>(
pp_state.synth_comment(path);
pp_state.s.hardbreak();
}
pp_state.s.eof();
*out = pp_state.s.eof();
})
}

Expand Down
15 changes: 8 additions & 7 deletions src/libsyntax/print/pp.rs
Expand Up @@ -235,13 +235,13 @@ crate struct PrintStackElem {

const SIZE_INFINITY: isize = 0xffff;

pub fn mk_printer(out: &mut String) -> Printer<'_> {
pub fn mk_printer() -> Printer {
let linewidth = 78;
// Yes 55, it makes the ring buffers big enough to never fall behind.
let n: usize = 55 * linewidth;
debug!("mk_printer {}", linewidth);
Printer {
out,
out: String::new(),
buf_max_len: n,
margin: linewidth as isize,
space: linewidth as isize,
Expand All @@ -258,8 +258,8 @@ pub fn mk_printer(out: &mut String) -> Printer<'_> {
}
}

pub struct Printer<'a> {
out: &'a mut String,
pub struct Printer {
out: String,
buf_max_len: usize,
/// Width of lines we're constrained to
margin: isize,
Expand Down Expand Up @@ -300,7 +300,7 @@ impl Default for BufEntry {
}
}

impl<'a> Printer<'a> {
impl Printer {
pub fn last_token(&mut self) -> Token {
self.buf[self.right].token.clone()
}
Expand Down Expand Up @@ -629,8 +629,9 @@ impl<'a> Printer<'a> {
self.pretty_print_end()
}

pub fn eof(&mut self) {
self.pretty_print_eof()
pub fn eof(mut self) -> String {
self.pretty_print_eof();
self.out
}

pub fn word<S: Into<Cow<'static, str>>>(&mut self, wrd: S) {
Expand Down
32 changes: 13 additions & 19 deletions src/libsyntax/print/pprust.rs
Expand Up @@ -87,7 +87,7 @@ impl<'a> Comments<'a> {
}

pub struct State<'a> {
pub s: pp::Printer<'a>,
pub s: pp::Printer,
comments: Option<Comments<'a>>,
ann: &'a (dyn PpAnn+'a),
is_expanded: bool
Expand All @@ -104,9 +104,8 @@ pub fn print_crate<'a>(cm: &'a SourceMap,
input: String,
ann: &'a dyn PpAnn,
is_expanded: bool) -> String {
let mut out = String::new();
let mut s = State {
s: pp::mk_printer(&mut out),
s: pp::mk_printer(),
comments: Some(Comments::new(cm, sess, filename, input)),
ann,
is_expanded,
Expand All @@ -133,25 +132,20 @@ pub fn print_crate<'a>(cm: &'a SourceMap,

s.print_mod(&krate.module, &krate.attrs);
s.print_remaining_comments();
s.s.eof();
out
s.s.eof()
}

pub fn to_string<F>(f: F) -> String where
F: FnOnce(&mut State<'_>),
{
let mut wr = String::new();
{
let mut printer = State {
s: pp::mk_printer(&mut wr),
comments: None,
ann: &NoAnn,
is_expanded: false
};
f(&mut printer);
printer.s.eof();
}
wr
let mut printer = State {
s: pp::mk_printer(),
comments: None,
ann: &NoAnn,
is_expanded: false
};
f(&mut printer);
printer.s.eof()
}

fn binop_to_string(op: BinOpToken) -> &'static str {
Expand Down Expand Up @@ -439,7 +433,7 @@ fn visibility_qualified(vis: &ast::Visibility, s: &str) -> String {
}

pub trait PrintState<'a> {
fn writer(&mut self) -> &mut pp::Printer<'a>;
fn writer(&mut self) -> &mut pp::Printer;
fn comments(&mut self) -> &mut Option<Comments<'a>>;

fn word_space<S: Into<Cow<'static, str>>>(&mut self, w: S) {
Expand Down Expand Up @@ -760,7 +754,7 @@ pub trait PrintState<'a> {
}

impl<'a> PrintState<'a> for State<'a> {
fn writer(&mut self) -> &mut pp::Printer<'a> {
fn writer(&mut self) -> &mut pp::Printer {
&mut self.s
}

Expand Down

0 comments on commit 00ca508

Please sign in to comment.