1
Fork 0

Ignore whitespace tokens when re-computing spans in save_analysis

This commit is contained in:
Nick Cameron 2014-11-03 17:52:00 +13:00
parent dcc5c3b31b
commit 3ceb0112ef
3 changed files with 29 additions and 29 deletions

View file

@ -92,7 +92,7 @@ impl<'a> SpanUtils<'a> {
let mut toks = self.retokenise_span(span); let mut toks = self.retokenise_span(span);
let mut bracket_count = 0u; let mut bracket_count = 0u;
loop { loop {
let ts = toks.next_token(); let ts = toks.real_token();
if ts.tok == token::Eof { if ts.tok == token::Eof {
return self.make_sub_span(span, result) return self.make_sub_span(span, result)
} }
@ -115,7 +115,7 @@ impl<'a> SpanUtils<'a> {
let mut toks = self.retokenise_span(span); let mut toks = self.retokenise_span(span);
let mut bracket_count = 0u; let mut bracket_count = 0u;
loop { loop {
let ts = toks.next_token(); let ts = toks.real_token();
if ts.tok == token::Eof { if ts.tok == token::Eof {
return None; return None;
} }
@ -137,13 +137,13 @@ impl<'a> SpanUtils<'a> {
// any brackets, or the last span. // any brackets, or the last span.
pub fn sub_span_for_meth_name(&self, span: Span) -> Option<Span> { pub fn sub_span_for_meth_name(&self, span: Span) -> Option<Span> {
let mut toks = self.retokenise_span(span); let mut toks = self.retokenise_span(span);
let mut prev = toks.next_token(); let mut prev = toks.real_token();
let mut result = None; let mut result = None;
let mut bracket_count = 0u; let mut bracket_count = 0u;
let mut last_span = None; let mut last_span = None;
while prev.tok != token::Eof { while prev.tok != token::Eof {
last_span = None; last_span = None;
let mut next = toks.next_token(); let mut next = toks.real_token();
if (next.tok == token::OpenDelim(token::Paren) || if (next.tok == token::OpenDelim(token::Paren) ||
next.tok == token::Lt) && next.tok == token::Lt) &&
@ -156,7 +156,7 @@ impl<'a> SpanUtils<'a> {
next.tok == token::ModSep { next.tok == token::ModSep {
let old = prev; let old = prev;
prev = next; prev = next;
next = toks.next_token(); next = toks.real_token();
if next.tok == token::Lt && if next.tok == token::Lt &&
old.tok.is_ident() { old.tok.is_ident() {
result = Some(old.sp); result = Some(old.sp);
@ -185,11 +185,11 @@ impl<'a> SpanUtils<'a> {
// brackets, or the last span. // brackets, or the last span.
pub fn sub_span_for_type_name(&self, span: Span) -> Option<Span> { pub fn sub_span_for_type_name(&self, span: Span) -> Option<Span> {
let mut toks = self.retokenise_span(span); let mut toks = self.retokenise_span(span);
let mut prev = toks.next_token(); let mut prev = toks.real_token();
let mut result = None; let mut result = None;
let mut bracket_count = 0u; let mut bracket_count = 0u;
loop { loop {
let next = toks.next_token(); let next = toks.real_token();
if (next.tok == token::Lt || if (next.tok == token::Lt ||
next.tok == token::Colon) && next.tok == token::Colon) &&
@ -234,7 +234,7 @@ impl<'a> SpanUtils<'a> {
// We keep track of how many brackets we're nested in // We keep track of how many brackets we're nested in
let mut bracket_count = 0i; let mut bracket_count = 0i;
loop { loop {
let ts = toks.next_token(); let ts = toks.real_token();
if ts.tok == token::Eof { if ts.tok == token::Eof {
if bracket_count != 0 { if bracket_count != 0 {
let loc = self.sess.codemap().lookup_char_pos(span.lo); let loc = self.sess.codemap().lookup_char_pos(span.lo);
@ -263,12 +263,12 @@ impl<'a> SpanUtils<'a> {
pub fn sub_span_before_token(&self, span: Span, tok: Token) -> Option<Span> { pub fn sub_span_before_token(&self, span: Span, tok: Token) -> Option<Span> {
let mut toks = self.retokenise_span(span); let mut toks = self.retokenise_span(span);
let mut prev = toks.next_token(); let mut prev = toks.real_token();
loop { loop {
if prev.tok == token::Eof { if prev.tok == token::Eof {
return None; return None;
} }
let next = toks.next_token(); let next = toks.real_token();
if next.tok == tok { if next.tok == tok {
return self.make_sub_span(span, Some(prev.sp)); return self.make_sub_span(span, Some(prev.sp));
} }
@ -281,15 +281,16 @@ impl<'a> SpanUtils<'a> {
keyword: keywords::Keyword) -> Option<Span> { keyword: keywords::Keyword) -> Option<Span> {
let mut toks = self.retokenise_span(span); let mut toks = self.retokenise_span(span);
loop { loop {
let ts = toks.next_token(); let ts = toks.real_token();
if ts.tok == token::Eof { if ts.tok == token::Eof {
return None; return None;
} }
if ts.tok.is_keyword(keyword) { if ts.tok.is_keyword(keyword) {
let ts = toks.next_token(); let ts = toks.real_token();
if ts.tok == token::Eof { if ts.tok == token::Eof {
return None return None
} else { } else {
println!("found keyword: {} at {}", ts, ts.sp);
return self.make_sub_span(span, Some(ts.sp)); return self.make_sub_span(span, Some(ts.sp));
} }
} }

View file

@ -35,6 +35,19 @@ pub trait Reader {
/// Report a non-fatal error with the current span. /// Report a non-fatal error with the current span.
fn err(&self, &str); fn err(&self, &str);
fn peek(&self) -> TokenAndSpan; fn peek(&self) -> TokenAndSpan;
/// Get a token the parser cares about.
fn real_token(&mut self) -> TokenAndSpan {
let mut t = self.next_token();
loop {
match t.tok {
token::Whitespace | token::Comment | token::Shebang(_) => {
t = self.next_token();
},
_ => break
}
}
t
}
} }
#[deriving(Clone, PartialEq, Eq, Show)] #[deriving(Clone, PartialEq, Eq, Show)]

View file

@ -338,27 +338,13 @@ fn is_plain_ident_or_underscore(t: &token::Token) -> bool {
t.is_plain_ident() || *t == token::Underscore t.is_plain_ident() || *t == token::Underscore
} }
/// Get a token the parser cares about
fn real_token(rdr: &mut Reader) -> TokenAndSpan {
let mut t = rdr.next_token();
loop {
match t.tok {
token::Whitespace | token::Comment | token::Shebang(_) => {
t = rdr.next_token();
},
_ => break
}
}
t
}
impl<'a> Parser<'a> { impl<'a> Parser<'a> {
pub fn new(sess: &'a ParseSess, pub fn new(sess: &'a ParseSess,
cfg: ast::CrateConfig, cfg: ast::CrateConfig,
mut rdr: Box<Reader+'a>) mut rdr: Box<Reader+'a>)
-> Parser<'a> -> Parser<'a>
{ {
let tok0 = real_token(&mut *rdr); let tok0 = rdr.real_token();
let span = tok0.sp; let span = tok0.sp;
let placeholder = TokenAndSpan { let placeholder = TokenAndSpan {
tok: token::Underscore, tok: token::Underscore,
@ -898,7 +884,7 @@ impl<'a> Parser<'a> {
None None
}; };
let next = if self.buffer_start == self.buffer_end { let next = if self.buffer_start == self.buffer_end {
real_token(&mut *self.reader) self.reader.real_token()
} else { } else {
// Avoid token copies with `replace`. // Avoid token copies with `replace`.
let buffer_start = self.buffer_start as uint; let buffer_start = self.buffer_start as uint;
@ -942,7 +928,7 @@ impl<'a> Parser<'a> {
-> R { -> R {
let dist = distance as int; let dist = distance as int;
while self.buffer_length() < dist { while self.buffer_length() < dist {
self.buffer[self.buffer_end as uint] = real_token(&mut *self.reader); self.buffer[self.buffer_end as uint] = self.reader.real_token();
self.buffer_end = (self.buffer_end + 1) & 3; self.buffer_end = (self.buffer_end + 1) & 3;
} }
f(&self.buffer[((self.buffer_start + dist - 1) & 3) as uint].tok) f(&self.buffer[((self.buffer_start + dist - 1) & 3) as uint].tok)