Skip to content

Commit b91e0a3

Browse files
committed
move span and token to tt reader
1 parent d29f0d2 commit b91e0a3

File tree

3 files changed

+35
-40
lines changed

3 files changed

+35
-40
lines changed

src/libsyntax/parse/lexer/mod.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,6 @@ pub struct StringReader<'a> {
6262
// cache a direct reference to the source text, so that we don't have to
6363
// retrieve it via `self.source_file.src.as_ref().unwrap()` all the time.
6464
src: Lrc<String>,
65-
token: token::Token,
66-
span: Span,
67-
/// The raw source span which *does not* take `override_span` into account
68-
span_src_raw: Span,
6965
override_span: Option<Span>,
7066
}
7167

@@ -113,8 +109,6 @@ impl<'a> StringReader<'a> {
113109
sp: self.peek_span,
114110
};
115111
self.advance_token()?;
116-
self.span_src_raw = self.peek_span_src_raw;
117-
118112
Ok(ret_val)
119113
}
120114

@@ -151,9 +145,6 @@ impl<'a> StringReader<'a> {
151145
}
152146
}
153147

154-
self.token = t.tok.clone();
155-
self.span = t.sp;
156-
157148
Ok(t)
158149
}
159150

@@ -243,9 +234,6 @@ impl<'a> StringReader<'a> {
243234
peek_span_src_raw: syntax_pos::DUMMY_SP,
244235
src,
245236
fatal_errs: Vec::new(),
246-
token: token::Eof,
247-
span: syntax_pos::DUMMY_SP,
248-
span_src_raw: syntax_pos::DUMMY_SP,
249237
override_span,
250238
}
251239
}

src/libsyntax/parse/lexer/tokentrees.rs

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ impl<'a> StringReader<'a> {
99
crate fn into_token_trees(self) -> (PResult<'a, TokenStream>, Vec<UnmatchedBrace>) {
1010
let mut tt_reader = TokenTreesReader {
1111
string_reader: self,
12+
token: token::Eof,
13+
span: syntax_pos::DUMMY_SP,
1214
open_braces: Vec::new(),
1315
unmatched_braces: Vec::new(),
1416
matching_delim_spans: Vec::new(),
@@ -21,6 +23,8 @@ impl<'a> StringReader<'a> {
2123

2224
struct TokenTreesReader<'a> {
2325
string_reader: StringReader<'a>,
26+
token: token::Token,
27+
span: Span,
2428
/// Stack of open delimiters and their spans. Used for error message.
2529
open_braces: Vec<(token::DelimToken, Span)>,
2630
unmatched_braces: Vec<UnmatchedBrace>,
@@ -36,7 +40,8 @@ impl<'a> TokenTreesReader<'a> {
3640
fn parse_all_token_trees(&mut self) -> PResult<'a, TokenStream> {
3741
let mut tts = Vec::new();
3842

39-
while self.string_reader.token != token::Eof {
43+
self.real_token();
44+
while self.token != token::Eof {
4045
tts.push(self.parse_token_tree()?);
4146
}
4247

@@ -47,7 +52,7 @@ impl<'a> TokenTreesReader<'a> {
4752
fn parse_token_trees_until_close_delim(&mut self) -> TokenStream {
4853
let mut tts = vec![];
4954
loop {
50-
if let token::CloseDelim(..) = self.string_reader.token {
55+
if let token::CloseDelim(..) = self.token {
5156
return TokenStream::new(tts);
5257
}
5358

@@ -63,11 +68,11 @@ impl<'a> TokenTreesReader<'a> {
6368

6469
fn parse_token_tree(&mut self) -> PResult<'a, TreeAndJoint> {
6570
let sm = self.string_reader.sess.source_map();
66-
match self.string_reader.token {
71+
match self.token {
6772
token::Eof => {
6873
let msg = "this file contains an un-closed delimiter";
6974
let mut err = self.string_reader.sess.span_diagnostic
70-
.struct_span_err(self.span(), msg);
75+
.struct_span_err(self.span, msg);
7176
for &(_, sp) in &self.open_braces {
7277
err.span_label(sp, "un-closed delimiter");
7378
}
@@ -97,21 +102,21 @@ impl<'a> TokenTreesReader<'a> {
97102
},
98103
token::OpenDelim(delim) => {
99104
// The span for beginning of the delimited section
100-
let pre_span = self.span();
105+
let pre_span = self.span;
101106

102107
// Parse the open delimiter.
103-
self.open_braces.push((delim, self.span()));
104-
self.string_reader.real_token();
108+
self.open_braces.push((delim, self.span));
109+
self.real_token();
105110

106111
// Parse the token trees within the delimiters.
107112
// We stop at any delimiter so we can try to recover if the user
108113
// uses an incorrect delimiter.
109114
let tts = self.parse_token_trees_until_close_delim();
110115

111116
// Expand to cover the entire delimited token tree
112-
let delim_span = DelimSpan::from_pair(pre_span, self.span());
117+
let delim_span = DelimSpan::from_pair(pre_span, self.span);
113118

114-
match self.string_reader.token {
119+
match self.token {
115120
// Correct delimiter.
116121
token::CloseDelim(d) if d == delim => {
117122
let (open_brace, open_brace_span) = self.open_braces.pop().unwrap();
@@ -121,26 +126,26 @@ impl<'a> TokenTreesReader<'a> {
121126
self.matching_delim_spans.clear();
122127
} else {
123128
self.matching_delim_spans.push(
124-
(open_brace, open_brace_span, self.span()),
129+
(open_brace, open_brace_span, self.span),
125130
);
126131
}
127132
// Parse the close delimiter.
128-
self.string_reader.real_token();
133+
self.real_token();
129134
}
130135
// Incorrect delimiter.
131136
token::CloseDelim(other) => {
132137
let mut unclosed_delimiter = None;
133138
let mut candidate = None;
134-
if self.last_unclosed_found_span != Some(self.span()) {
139+
if self.last_unclosed_found_span != Some(self.span) {
135140
// do not complain about the same unclosed delimiter multiple times
136-
self.last_unclosed_found_span = Some(self.span());
141+
self.last_unclosed_found_span = Some(self.span);
137142
// This is a conservative error: only report the last unclosed
138143
// delimiter. The previous unclosed delimiters could actually be
139144
// closed! The parser just hasn't gotten to them yet.
140145
if let Some(&(_, sp)) = self.open_braces.last() {
141146
unclosed_delimiter = Some(sp);
142147
};
143-
if let Some(current_padding) = sm.span_to_margin(self.span()) {
148+
if let Some(current_padding) = sm.span_to_margin(self.span) {
144149
for (brace, brace_span) in &self.open_braces {
145150
if let Some(padding) = sm.span_to_margin(*brace_span) {
146151
// high likelihood of these two corresponding
@@ -154,7 +159,7 @@ impl<'a> TokenTreesReader<'a> {
154159
self.unmatched_braces.push(UnmatchedBrace {
155160
expected_delim: tok,
156161
found_delim: other,
157-
found_span: self.span(),
162+
found_span: self.span,
158163
unclosed_span: unclosed_delimiter,
159164
candidate_span: candidate,
160165
});
@@ -170,7 +175,7 @@ impl<'a> TokenTreesReader<'a> {
170175
// bar(baz(
171176
// } // Incorrect delimiter but matches the earlier `{`
172177
if !self.open_braces.iter().any(|&(b, _)| b == other) {
173-
self.string_reader.real_token();
178+
self.real_token();
174179
}
175180
}
176181
token::Eof => {
@@ -190,28 +195,31 @@ impl<'a> TokenTreesReader<'a> {
190195
token::CloseDelim(_) => {
191196
// An unexpected closing delimiter (i.e., there is no
192197
// matching opening delimiter).
193-
let token_str = token_to_string(&self.string_reader.token);
198+
let token_str = token_to_string(&self.token);
194199
let msg = format!("unexpected close delimiter: `{}`", token_str);
195200
let mut err = self.string_reader.sess.span_diagnostic
196-
.struct_span_err(self.span(), &msg);
197-
err.span_label(self.span(), "unexpected close delimiter");
201+
.struct_span_err(self.span, &msg);
202+
err.span_label(self.span, "unexpected close delimiter");
198203
Err(err)
199204
},
200205
_ => {
201-
let tt = TokenTree::Token(self.span(), self.string_reader.token.clone());
206+
let tt = TokenTree::Token(self.span, self.token.clone());
202207
// Note that testing for joint-ness here is done via the raw
203208
// source span as the joint-ness is a property of the raw source
204209
// rather than wanting to take `override_span` into account.
205-
let raw = self.string_reader.span_src_raw;
206-
self.string_reader.real_token();
207-
let is_joint = raw.hi() == self.string_reader.span_src_raw.lo()
208-
&& token::is_op(&self.string_reader.token);
210+
let raw = self.string_reader.peek_span_src_raw;
211+
self.real_token();
212+
let is_joint = raw.hi() == self.string_reader.peek_span_src_raw.lo()
213+
&& token::is_op(&self.token);
209214
Ok((tt, if is_joint { Joint } else { NonJoint }))
210215
}
211216
}
212217
}
213218

214-
fn span(&self) -> Span {
215-
self.string_reader.span
219+
fn real_token(&mut self) {
220+
let t = self.string_reader.real_token();
221+
self.token = t.tok;
222+
self.span = t.sp;
216223
}
217224
}
225+

src/libsyntax/parse/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,7 @@ pub fn maybe_file_to_stream(
301301
source_file: Lrc<SourceFile>,
302302
override_span: Option<Span>,
303303
) -> Result<(TokenStream, Vec<lexer::UnmatchedBrace>), Vec<Diagnostic>> {
304-
let mut srdr = lexer::StringReader::new_or_buffered_errs(sess, source_file, override_span)?;
305-
srdr.real_token();
304+
let srdr = lexer::StringReader::new_or_buffered_errs(sess, source_file, override_span)?;
306305
let (token_trees, unmatched_braces) = srdr.into_token_trees();
307306

308307
match token_trees {

0 commit comments

Comments
 (0)