Set span for interpolated tokens correctly
This commit is contained in:
parent
877ed0d068
commit
20edb366e7
@ -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)));
|
||||
|
@ -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));
|
||||
@ -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
|
||||
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user