Skip to content

Commit 3ceb011

Browse files
committed
Ignore whitespace tokens when re-computing spans in save_analysis
1 parent dcc5c3b commit 3ceb011

File tree

3 files changed

+29
-29
lines changed

3 files changed

+29
-29
lines changed

src/librustc/middle/save/span_utils.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ impl<'a> SpanUtils<'a> {
9292
let mut toks = self.retokenise_span(span);
9393
let mut bracket_count = 0u;
9494
loop {
95-
let ts = toks.next_token();
95+
let ts = toks.real_token();
9696
if ts.tok == token::Eof {
9797
return self.make_sub_span(span, result)
9898
}
@@ -115,7 +115,7 @@ impl<'a> SpanUtils<'a> {
115115
let mut toks = self.retokenise_span(span);
116116
let mut bracket_count = 0u;
117117
loop {
118-
let ts = toks.next_token();
118+
let ts = toks.real_token();
119119
if ts.tok == token::Eof {
120120
return None;
121121
}
@@ -137,13 +137,13 @@ impl<'a> SpanUtils<'a> {
137137
// any brackets, or the last span.
138138
pub fn sub_span_for_meth_name(&self, span: Span) -> Option<Span> {
139139
let mut toks = self.retokenise_span(span);
140-
let mut prev = toks.next_token();
140+
let mut prev = toks.real_token();
141141
let mut result = None;
142142
let mut bracket_count = 0u;
143143
let mut last_span = None;
144144
while prev.tok != token::Eof {
145145
last_span = None;
146-
let mut next = toks.next_token();
146+
let mut next = toks.real_token();
147147

148148
if (next.tok == token::OpenDelim(token::Paren) ||
149149
next.tok == token::Lt) &&
@@ -156,7 +156,7 @@ impl<'a> SpanUtils<'a> {
156156
next.tok == token::ModSep {
157157
let old = prev;
158158
prev = next;
159-
next = toks.next_token();
159+
next = toks.real_token();
160160
if next.tok == token::Lt &&
161161
old.tok.is_ident() {
162162
result = Some(old.sp);
@@ -185,11 +185,11 @@ impl<'a> SpanUtils<'a> {
185185
// brackets, or the last span.
186186
pub fn sub_span_for_type_name(&self, span: Span) -> Option<Span> {
187187
let mut toks = self.retokenise_span(span);
188-
let mut prev = toks.next_token();
188+
let mut prev = toks.real_token();
189189
let mut result = None;
190190
let mut bracket_count = 0u;
191191
loop {
192-
let next = toks.next_token();
192+
let next = toks.real_token();
193193

194194
if (next.tok == token::Lt ||
195195
next.tok == token::Colon) &&
@@ -234,7 +234,7 @@ impl<'a> SpanUtils<'a> {
234234
// We keep track of how many brackets we're nested in
235235
let mut bracket_count = 0i;
236236
loop {
237-
let ts = toks.next_token();
237+
let ts = toks.real_token();
238238
if ts.tok == token::Eof {
239239
if bracket_count != 0 {
240240
let loc = self.sess.codemap().lookup_char_pos(span.lo);
@@ -263,12 +263,12 @@ impl<'a> SpanUtils<'a> {
263263

264264
pub fn sub_span_before_token(&self, span: Span, tok: Token) -> Option<Span> {
265265
let mut toks = self.retokenise_span(span);
266-
let mut prev = toks.next_token();
266+
let mut prev = toks.real_token();
267267
loop {
268268
if prev.tok == token::Eof {
269269
return None;
270270
}
271-
let next = toks.next_token();
271+
let next = toks.real_token();
272272
if next.tok == tok {
273273
return self.make_sub_span(span, Some(prev.sp));
274274
}
@@ -281,15 +281,16 @@ impl<'a> SpanUtils<'a> {
281281
keyword: keywords::Keyword) -> Option<Span> {
282282
let mut toks = self.retokenise_span(span);
283283
loop {
284-
let ts = toks.next_token();
284+
let ts = toks.real_token();
285285
if ts.tok == token::Eof {
286286
return None;
287287
}
288288
if ts.tok.is_keyword(keyword) {
289-
let ts = toks.next_token();
289+
let ts = toks.real_token();
290290
if ts.tok == token::Eof {
291291
return None
292292
} else {
293+
println!("found keyword: {} at {}", ts, ts.sp);
293294
return self.make_sub_span(span, Some(ts.sp));
294295
}
295296
}

src/libsyntax/parse/lexer/mod.rs

+13
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,19 @@ pub trait Reader {
3535
/// Report a non-fatal error with the current span.
3636
fn err(&self, &str);
3737
fn peek(&self) -> TokenAndSpan;
38+
/// Get a token the parser cares about.
39+
fn real_token(&mut self) -> TokenAndSpan {
40+
let mut t = self.next_token();
41+
loop {
42+
match t.tok {
43+
token::Whitespace | token::Comment | token::Shebang(_) => {
44+
t = self.next_token();
45+
},
46+
_ => break
47+
}
48+
}
49+
t
50+
}
3851
}
3952

4053
#[deriving(Clone, PartialEq, Eq, Show)]

src/libsyntax/parse/parser.rs

+3-17
Original file line numberDiff line numberDiff line change
@@ -338,27 +338,13 @@ fn is_plain_ident_or_underscore(t: &token::Token) -> bool {
338338
t.is_plain_ident() || *t == token::Underscore
339339
}
340340

341-
/// Get a token the parser cares about
342-
fn real_token(rdr: &mut Reader) -> TokenAndSpan {
343-
let mut t = rdr.next_token();
344-
loop {
345-
match t.tok {
346-
token::Whitespace | token::Comment | token::Shebang(_) => {
347-
t = rdr.next_token();
348-
},
349-
_ => break
350-
}
351-
}
352-
t
353-
}
354-
355341
impl<'a> Parser<'a> {
356342
pub fn new(sess: &'a ParseSess,
357343
cfg: ast::CrateConfig,
358344
mut rdr: Box<Reader+'a>)
359345
-> Parser<'a>
360346
{
361-
let tok0 = real_token(&mut *rdr);
347+
let tok0 = rdr.real_token();
362348
let span = tok0.sp;
363349
let placeholder = TokenAndSpan {
364350
tok: token::Underscore,
@@ -898,7 +884,7 @@ impl<'a> Parser<'a> {
898884
None
899885
};
900886
let next = if self.buffer_start == self.buffer_end {
901-
real_token(&mut *self.reader)
887+
self.reader.real_token()
902888
} else {
903889
// Avoid token copies with `replace`.
904890
let buffer_start = self.buffer_start as uint;
@@ -942,7 +928,7 @@ impl<'a> Parser<'a> {
942928
-> R {
943929
let dist = distance as int;
944930
while self.buffer_length() < dist {
945-
self.buffer[self.buffer_end as uint] = real_token(&mut *self.reader);
931+
self.buffer[self.buffer_end as uint] = self.reader.real_token();
946932
self.buffer_end = (self.buffer_end + 1) & 3;
947933
}
948934
f(&self.buffer[((self.buffer_start + dist - 1) & 3) as uint].tok)

0 commit comments

Comments
 (0)