Skip to content

Commit

Permalink
Set span for interpolated tokens correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
fhahn committed Jan 26, 2016
1 parent 877ed0d commit 20edb36
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
4 changes: 2 additions & 2 deletions src/libsyntax/ext/tt/transcribe.rs
Expand Up @@ -300,13 +300,13 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
// (a) idents can be in lots of places, so it'd be a pain
// (b) we actually can, since it's a token.
MatchedNonterminal(NtIdent(ref sn, b)) => {
r.cur_span = sp;
r.cur_span = sn.span;
r.cur_tok = token::Ident(sn.node, b);
return ret_val;
}
MatchedNonterminal(NtExpr(ref expr)) => {
let mut expr = (**expr).clone();
update_span(sp, &mut expr);
//update_span(sp, &mut expr);
// FIXME(pcwalton): Bad copy.
r.cur_span = sp;
r.cur_tok = token::Interpolated(NtExpr(ptr::P(expr)));
Expand Down
21 changes: 16 additions & 5 deletions src/libsyntax/parse/parser.rs
Expand Up @@ -2322,18 +2322,29 @@ impl<'a> Parser<'a> {
-> PResult<'a, P<Expr>> {
let attrs = try!(self.parse_or_use_outer_attributes(already_parsed_attrs));

let interp = if let token::Interpolated(..) = self.token {
true
} else {
false
};
let b = try!(self.parse_bottom_expr());
self.parse_dot_or_call_expr_with(b, attrs)
let lo = if interp {
self.last_span.lo
} else {
b.span.lo
};
self.parse_dot_or_call_expr_with(b, lo, attrs)
}

pub fn parse_dot_or_call_expr_with(&mut self,
e0: P<Expr>,
lo: BytePos,
attrs: ThinAttributes)
-> PResult<'a, P<Expr>> {
// Stitch the list of outer attributes onto the return value.
// A little bit ugly, but the best way given the current code
// structure
self.parse_dot_or_call_expr_with_(e0)
self.parse_dot_or_call_expr_with_(e0, lo)
.map(|expr|
expr.map(|mut expr| {
expr.attrs.update(|a| a.prepend(attrs));
Expand Down Expand Up @@ -2408,9 +2419,8 @@ impl<'a> Parser<'a> {
})
}

fn parse_dot_or_call_expr_with_(&mut self, e0: P<Expr>) -> PResult<'a, P<Expr>> {
fn parse_dot_or_call_expr_with_(&mut self, e0: P<Expr>, lo: BytePos) -> PResult<'a, P<Expr>> {
let mut e = e0;
let lo = e.span.lo;
let mut hi;
loop {
// expr.f
Expand Down Expand Up @@ -3828,7 +3838,8 @@ impl<'a> Parser<'a> {
let e = self.mk_mac_expr(span.lo, span.hi,
mac.and_then(|m| m.node),
None);
let e = try!(self.parse_dot_or_call_expr_with(e, attrs));
let lo = e.span.lo;
let e = try!(self.parse_dot_or_call_expr_with(e, lo, attrs));
let e = try!(self.parse_assoc_expr_with(0, LhsExpr::AlreadyParsed(e)));
try!(self.handle_expression_like_statement(
e,
Expand Down

0 comments on commit 20edb36

Please sign in to comment.