Skip to content

Commit 16b486c

Browse files
Refactor cur_cmnt_and_lit away.
The literal index was increased in only next_lit, so it isn't necessary: code now uses an iterator. The cur_cmnt field is also moved to be increased in print_comment instead of after each call to print_comment.
1 parent bac4bb9 commit 16b486c

File tree

2 files changed

+55
-65
lines changed

2 files changed

+55
-65
lines changed

src/librustc/hir/print.rs

+17-19
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use syntax::parse::ParseSess;
1717
use syntax::parse::lexer::comments;
1818
use syntax::print::pp::{self, Breaks};
1919
use syntax::print::pp::Breaks::{Consistent, Inconsistent};
20-
use syntax::print::pprust::{self as ast_pp, PrintState};
20+
use syntax::print::pprust::PrintState;
2121
use syntax::ptr::P;
2222
use syntax::symbol::keywords;
2323
use syntax_pos::{self, BytePos};
@@ -27,6 +27,8 @@ use hir::{PatKind, RegionTyParamBound, TraitTyParamBound, TraitBoundModifier, Ra
2727

2828
use std::cell::Cell;
2929
use std::io::{self, Write, Read};
30+
use std::iter::Peekable;
31+
use std::vec;
3032

3133
pub enum AnnNode<'a> {
3234
NodeName(&'a ast::Name),
@@ -77,8 +79,8 @@ pub struct State<'a> {
7779
pub s: pp::Printer<'a>,
7880
cm: Option<&'a CodeMap>,
7981
comments: Option<Vec<comments::Comment>>,
80-
literals: Option<Vec<comments::Literal>>,
81-
cur_cmnt_and_lit: ast_pp::CurrentCommentAndLiteral,
82+
literals: Peekable<vec::IntoIter<comments::Literal>>,
83+
cur_cmnt: usize,
8284
boxes: Vec<pp::Breaks>,
8385
ann: &'a (PpAnn + 'a),
8486
}
@@ -96,12 +98,16 @@ impl<'a> PrintState<'a> for State<'a> {
9698
&mut self.comments
9799
}
98100

99-
fn cur_cmnt_and_lit(&mut self) -> &mut ast_pp::CurrentCommentAndLiteral {
100-
&mut self.cur_cmnt_and_lit
101+
fn cur_cmnt(&mut self) -> &mut usize {
102+
&mut self.cur_cmnt
101103
}
102104

103-
fn literals(&self) -> &Option<Vec<comments::Literal>> {
104-
&self.literals
105+
fn cur_lit(&mut self) -> Option<&comments::Literal> {
106+
self.literals.peek()
107+
}
108+
109+
fn bump_lit(&mut self) -> Option<comments::Literal> {
110+
self.literals.next()
105111
}
106112
}
107113

@@ -169,11 +175,8 @@ impl<'a> State<'a> {
169175
s: pp::mk_printer(out, default_columns),
170176
cm: Some(cm),
171177
comments: comments.clone(),
172-
literals: literals.clone(),
173-
cur_cmnt_and_lit: ast_pp::CurrentCommentAndLiteral {
174-
cur_cmnt: 0,
175-
cur_lit: 0,
176-
},
178+
literals: literals.unwrap_or_default().into_iter().peekable(),
179+
cur_cmnt: 0,
177180
boxes: Vec::new(),
178181
ann,
179182
}
@@ -189,11 +192,8 @@ pub fn to_string<F>(ann: &PpAnn, f: F) -> String
189192
s: pp::mk_printer(Box::new(&mut wr), default_columns),
190193
cm: None,
191194
comments: None,
192-
literals: None,
193-
cur_cmnt_and_lit: ast_pp::CurrentCommentAndLiteral {
194-
cur_cmnt: 0,
195-
cur_lit: 0,
196-
},
195+
literals: vec![].into_iter().peekable(),
196+
cur_cmnt: 0,
197197
boxes: Vec::new(),
198198
ann,
199199
};
@@ -2131,7 +2131,6 @@ impl<'a> State<'a> {
21312131
if span.hi < (*cmnt).pos && (*cmnt).pos < next &&
21322132
span_line.line == comment_line.line {
21332133
self.print_comment(cmnt)?;
2134-
self.cur_cmnt_and_lit.cur_cmnt += 1;
21352134
}
21362135
}
21372136
Ok(())
@@ -2147,7 +2146,6 @@ impl<'a> State<'a> {
21472146
match self.next_comment() {
21482147
Some(ref cmnt) => {
21492148
self.print_comment(cmnt)?;
2150-
self.cur_cmnt_and_lit.cur_cmnt += 1;
21512149
}
21522150
_ => break,
21532151
}

src/libsyntax/print/pprust.rs

+38-46
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ use tokenstream::{self, TokenStream, TokenTree};
3131

3232
use std::ascii;
3333
use std::io::{self, Write, Read};
34-
use std::iter;
34+
use std::iter::{self, Peekable};
35+
use std::vec;
3536

3637
pub enum AnnNode<'a> {
3738
NodeIdent(&'a ast::Ident),
@@ -53,18 +54,12 @@ pub struct NoAnn;
5354

5455
impl PpAnn for NoAnn {}
5556

56-
#[derive(Copy, Clone)]
57-
pub struct CurrentCommentAndLiteral {
58-
pub cur_cmnt: usize,
59-
pub cur_lit: usize,
60-
}
61-
6257
pub struct State<'a> {
6358
pub s: pp::Printer<'a>,
6459
cm: Option<&'a CodeMap>,
6560
comments: Option<Vec<comments::Comment> >,
66-
literals: Option<Vec<comments::Literal> >,
67-
cur_cmnt_and_lit: CurrentCommentAndLiteral,
61+
literals: Peekable<vec::IntoIter<comments::Literal>>,
62+
cur_cmnt: usize,
6863
boxes: Vec<pp::Breaks>,
6964
ann: &'a (PpAnn+'a),
7065
}
@@ -80,11 +75,8 @@ pub fn rust_printer_annotated<'a>(writer: Box<Write+'a>,
8075
s: pp::mk_printer(writer, DEFAULT_COLUMNS),
8176
cm: None,
8277
comments: None,
83-
literals: None,
84-
cur_cmnt_and_lit: CurrentCommentAndLiteral {
85-
cur_cmnt: 0,
86-
cur_lit: 0
87-
},
78+
literals: vec![].into_iter().peekable(),
79+
cur_cmnt: 0,
8880
boxes: Vec::new(),
8981
ann: ann,
9082
}
@@ -160,11 +152,8 @@ impl<'a> State<'a> {
160152
s: pp::mk_printer(out, DEFAULT_COLUMNS),
161153
cm: Some(cm),
162154
comments: comments,
163-
literals: literals,
164-
cur_cmnt_and_lit: CurrentCommentAndLiteral {
165-
cur_cmnt: 0,
166-
cur_lit: 0
167-
},
155+
literals: literals.unwrap_or_default().into_iter().peekable(),
156+
cur_cmnt: 0,
168157
boxes: Vec::new(),
169158
ann: ann,
170159
}
@@ -451,8 +440,9 @@ pub trait PrintState<'a> {
451440
fn writer(&mut self) -> &mut pp::Printer<'a>;
452441
fn boxes(&mut self) -> &mut Vec<pp::Breaks>;
453442
fn comments(&mut self) -> &mut Option<Vec<comments::Comment>>;
454-
fn cur_cmnt_and_lit(&mut self) -> &mut CurrentCommentAndLiteral;
455-
fn literals(&self) -> &Option<Vec<comments::Literal>>;
443+
fn cur_cmnt(&mut self) -> &mut usize;
444+
fn cur_lit(&mut self) -> Option<&comments::Literal>;
445+
fn bump_lit(&mut self) -> Option<comments::Literal>;
456446

457447
fn word_space(&mut self, w: &str) -> io::Result<()> {
458448
self.writer().word(w)?;
@@ -518,31 +508,24 @@ pub trait PrintState<'a> {
518508
}
519509

520510
fn next_lit(&mut self, pos: BytePos) -> Option<comments::Literal> {
521-
let mut cur_lit = self.cur_cmnt_and_lit().cur_lit;
522-
523-
let mut result = None;
511+
while let Some(ltrl) = self.cur_lit().cloned() {
512+
if ltrl.pos > pos { break; }
524513

525-
if let Some(ref lits) = *self.literals() {
526-
while cur_lit < lits.len() {
527-
let ltrl = (*lits)[cur_lit].clone();
528-
if ltrl.pos > pos { break; }
529-
cur_lit += 1;
530-
if ltrl.pos == pos {
531-
result = Some(ltrl);
532-
break;
533-
}
514+
// we don't need the value here since we're forced to clone cur_lit
515+
// due to lack of NLL.
516+
self.bump_lit();
517+
if ltrl.pos == pos {
518+
return Some(ltrl);
534519
}
535520
}
536521

537-
self.cur_cmnt_and_lit().cur_lit = cur_lit;
538-
result
522+
None
539523
}
540524

541525
fn maybe_print_comment(&mut self, pos: BytePos) -> io::Result<()> {
542526
while let Some(ref cmnt) = self.next_comment() {
543527
if cmnt.pos < pos {
544528
self.print_comment(cmnt)?;
545-
self.cur_cmnt_and_lit().cur_cmnt += 1;
546529
} else {
547530
break
548531
}
@@ -552,7 +535,7 @@ pub trait PrintState<'a> {
552535

553536
fn print_comment(&mut self,
554537
cmnt: &comments::Comment) -> io::Result<()> {
555-
match cmnt.style {
538+
let r = match cmnt.style {
556539
comments::Mixed => {
557540
assert_eq!(cmnt.lines.len(), 1);
558541
self.writer().zerobreak()?;
@@ -600,11 +583,18 @@ pub trait PrintState<'a> {
600583
}
601584
self.writer().hardbreak()
602585
}
586+
};
587+
match r {
588+
Ok(()) => {
589+
*self.cur_cmnt() = *self.cur_cmnt() + 1;
590+
Ok(())
591+
}
592+
Err(e) => Err(e),
603593
}
604594
}
605595

606596
fn next_comment(&mut self) -> Option<comments::Comment> {
607-
let cur_cmnt = self.cur_cmnt_and_lit().cur_cmnt;
597+
let cur_cmnt = *self.cur_cmnt();
608598
match *self.comments() {
609599
Some(ref cmnts) => {
610600
if cur_cmnt < cmnts.len() {
@@ -619,8 +609,8 @@ pub trait PrintState<'a> {
619609

620610
fn print_literal(&mut self, lit: &ast::Lit) -> io::Result<()> {
621611
self.maybe_print_comment(lit.span.lo)?;
622-
if let Some(ref ltrl) = self.next_lit(lit.span.lo) {
623-
return self.writer().word(&(*ltrl).lit);
612+
if let Some(ltrl) = self.next_lit(lit.span.lo) {
613+
return self.writer().word(&ltrl.lit);
624614
}
625615
match lit.node {
626616
ast::LitKind::Str(st, style) => self.print_string(&st.as_str(), style),
@@ -860,12 +850,16 @@ impl<'a> PrintState<'a> for State<'a> {
860850
&mut self.comments
861851
}
862852

863-
fn cur_cmnt_and_lit(&mut self) -> &mut CurrentCommentAndLiteral {
864-
&mut self.cur_cmnt_and_lit
853+
fn cur_cmnt(&mut self) -> &mut usize {
854+
&mut self.cur_cmnt
855+
}
856+
857+
fn cur_lit(&mut self) -> Option<&comments::Literal> {
858+
self.literals.peek()
865859
}
866860

867-
fn literals(&self) -> &Option<Vec<comments::Literal>> {
868-
&self.literals
861+
fn bump_lit(&mut self) -> Option<comments::Literal> {
862+
self.literals.next()
869863
}
870864
}
871865

@@ -3021,7 +3015,6 @@ impl<'a> State<'a> {
30213015
let next = next_pos.unwrap_or(cmnt.pos + BytePos(1));
30223016
if span.hi < cmnt.pos && cmnt.pos < next && span_line.line == comment_line.line {
30233017
self.print_comment(cmnt)?;
3024-
self.cur_cmnt_and_lit.cur_cmnt += 1;
30253018
}
30263019
}
30273020
Ok(())
@@ -3035,7 +3028,6 @@ impl<'a> State<'a> {
30353028
}
30363029
while let Some(ref cmnt) = self.next_comment() {
30373030
self.print_comment(cmnt)?;
3038-
self.cur_cmnt_and_lit.cur_cmnt += 1;
30393031
}
30403032
Ok(())
30413033
}

0 commit comments

Comments
 (0)