diff --git a/src/librustc/hir/print.rs b/src/librustc/hir/print.rs index 01cdd8a6f22b..8342331e3609 100644 --- a/src/librustc/hir/print.rs +++ b/src/librustc/hir/print.rs @@ -68,13 +68,13 @@ impl PpAnn for hir::Crate { } pub struct State<'a> { - pub s: pp::Printer<'a>, + pub s: pp::Printer, comments: Option>, 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 } @@ -94,16 +94,14 @@ 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> { @@ -111,11 +109,10 @@ impl<'a> State<'a> { 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, } @@ -125,17 +122,13 @@ impl<'a> State<'a> { pub fn to_string(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>>(vis: &hir::Visibility, w: S) -> String { diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index 3e6d843ffbe3..cd38eb695eb5 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -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); @@ -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(); }) } diff --git a/src/libsyntax/print/pp.rs b/src/libsyntax/print/pp.rs index f64e95aee5bc..ea90defcd508 100644 --- a/src/libsyntax/print/pp.rs +++ b/src/libsyntax/print/pp.rs @@ -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, @@ -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, @@ -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() } @@ -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>>(&mut self, wrd: S) { diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 43714d3015be..54672d9da2e2 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -87,7 +87,7 @@ impl<'a> Comments<'a> { } pub struct State<'a> { - pub s: pp::Printer<'a>, + pub s: pp::Printer, comments: Option>, ann: &'a (dyn PpAnn+'a), is_expanded: bool @@ -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, @@ -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) -> 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 { @@ -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>; fn word_space>>(&mut self, w: S) { @@ -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 }