From 20edb366e7d16da946c2484a8542dffb07b79837 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Sun, 24 Jan 2016 00:52:43 +0100 Subject: [PATCH] Set span for interpolated tokens correctly --- src/libsyntax/ext/tt/transcribe.rs | 4 ++-- src/libsyntax/parse/parser.rs | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/libsyntax/ext/tt/transcribe.rs b/src/libsyntax/ext/tt/transcribe.rs index c048547f5c9..6cf05558adb 100644 --- a/src/libsyntax/ext/tt/transcribe.rs +++ b/src/libsyntax/ext/tt/transcribe.rs @@ -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))); diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index acce6ed87d0..f5ebe842577 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2322,18 +2322,29 @@ pub fn parse_dot_or_call_expr(&mut self, -> PResult<'a, P> { 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, + lo: BytePos, attrs: ThinAttributes) -> PResult<'a, P> { // 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)); @@ -2408,9 +2419,8 @@ fn parse_dot_suffix(&mut self, }) } - fn parse_dot_or_call_expr_with_(&mut self, e0: P) -> PResult<'a, P> { + fn parse_dot_or_call_expr_with_(&mut self, e0: P, lo: BytePos) -> PResult<'a, P> { let mut e = e0; - let lo = e.span.lo; let mut hi; loop { // expr.f @@ -3828,7 +3838,8 @@ fn parse_block_tail(&mut self, lo: BytePos, s: BlockCheckMode) -> PResult<'a, P< 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, -- 2.44.0