Skip to content

Commit e533ed9

Browse files
committed
Avoid storing interolated token in Parser.last_token
1 parent 47bfd8c commit e533ed9

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

src/libsyntax/parse/parser.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ pub struct Parser<'a> {
254254
pub cfg: CrateConfig,
255255
/// the previous token or None (only stashed sometimes).
256256
pub last_token: Option<Box<token::Token>>,
257+
last_token_interpolated: bool,
257258
pub buffer: [TokenAndSpan; 4],
258259
pub buffer_start: isize,
259260
pub buffer_end: isize,
@@ -361,6 +362,7 @@ impl<'a> Parser<'a> {
361362
span: span,
362363
last_span: span,
363364
last_token: None,
365+
last_token_interpolated: false,
364366
buffer: [
365367
placeholder.clone(),
366368
placeholder.clone(),
@@ -542,10 +544,11 @@ impl<'a> Parser<'a> {
542544
}
543545

544546
/// returns the span of expr, if it was not interpolated or the span of the interpolated token
545-
fn interpolated_or_expr_span(&self, expr: PResult<'a, P<Expr>>) -> PResult<'a, (Span, P<Expr>)> {
546-
let is_interpolated = self.token.is_interpolated();
547+
fn interpolated_or_expr_span(&self,
548+
expr: PResult<'a, P<Expr>>)
549+
-> PResult<'a, (Span, P<Expr>)> {
547550
expr.map(|e| {
548-
if is_interpolated {
551+
if self.last_token_interpolated {
549552
(self.last_span, e)
550553
} else {
551554
(e.span, e)
@@ -939,12 +942,12 @@ impl<'a> Parser<'a> {
939942
// Stash token for error recovery (sometimes; clone is not necessarily cheap).
940943
self.last_token = if self.token.is_ident() ||
941944
self.token.is_path() ||
942-
self.token.is_interpolated() ||
943945
self.token == token::Comma {
944946
Some(Box::new(self.token.clone()))
945947
} else {
946948
None
947949
};
950+
self.last_token_interpolated = self.token.is_interpolated();
948951
let next = if self.buffer_start == self.buffer_end {
949952
self.reader.real_token()
950953
} else {
@@ -2810,9 +2813,10 @@ impl<'a> Parser<'a> {
28102813
self.expected_tokens.push(TokenType::Operator);
28112814
while let Some(op) = AssocOp::from_token(&self.token) {
28122815

2813-
let lhs_span = match self.last_token {
2814-
Some(ref lt) if lt.is_interpolated() => self.last_span,
2815-
_ => lhs.span
2816+
let lhs_span = if self.last_token_interpolated {
2817+
self.last_span
2818+
} else {
2819+
lhs.span
28162820
};
28172821

28182822
let cur_op_span = self.span;

0 commit comments

Comments
 (0)