@@ -39,36 +39,6 @@ use rustc_span::{BytePos, ErrorGuaranteed, Pos, Span};
39
39
use thin_vec::{thin_vec, ThinVec};
40
40
use tracing::instrument;
41
41
42
- /// Possibly accepts an `token::Interpolated` expression (a pre-parsed expression
43
- /// dropped into the token stream, which happens while parsing the result of
44
- /// macro expansion). Placement of these is not as complex as I feared it would
45
- /// be. The important thing is to make sure that lookahead doesn't balk at
46
- /// `token::Interpolated` tokens.
47
- macro_rules! maybe_whole_expr {
48
- ($p:expr) => {
49
- if let token::Interpolated(nt) = &$p.token.kind {
50
- match &**nt {
51
- token::NtExpr(e) | token::NtLiteral(e) => {
52
- let e = e.clone();
53
- $p.bump();
54
- return Ok(e);
55
- }
56
- token::NtPath(path) => {
57
- let path = (**path).clone();
58
- $p.bump();
59
- return Ok($p.mk_expr($p.prev_token.span, ExprKind::Path(None, path)));
60
- }
61
- token::NtBlock(block) => {
62
- let block = block.clone();
63
- $p.bump();
64
- return Ok($p.mk_expr($p.prev_token.span, ExprKind::Block(block, None)));
65
- }
66
- _ => {}
67
- };
68
- }
69
- };
70
- }
71
-
72
42
#[derive(Debug)]
73
43
pub(super) enum LhsExpr {
74
44
// Already parsed just the outer attributes.
@@ -1421,7 +1391,27 @@ impl<'a> Parser<'a> {
1421
1391
/// correctly if called from `parse_dot_or_call_expr()`.
1422
1392
fn parse_expr_bottom(&mut self) -> PResult<'a, P<Expr>> {
1423
1393
maybe_recover_from_interpolated_ty_qpath!(self, true);
1424
- maybe_whole_expr!(self);
1394
+
1395
+ if let token::Interpolated(nt) = &self.token.kind {
1396
+ match &**nt {
1397
+ token::NtExpr(e) | token::NtLiteral(e) => {
1398
+ let e = e.clone();
1399
+ self.bump();
1400
+ return Ok(e);
1401
+ }
1402
+ token::NtPath(path) => {
1403
+ let path = (**path).clone();
1404
+ self.bump();
1405
+ return Ok(self.mk_expr(self.prev_token.span, ExprKind::Path(None, path)));
1406
+ }
1407
+ token::NtBlock(block) => {
1408
+ let block = block.clone();
1409
+ self.bump();
1410
+ return Ok(self.mk_expr(self.prev_token.span, ExprKind::Block(block, None)));
1411
+ }
1412
+ _ => {}
1413
+ };
1414
+ }
1425
1415
1426
1416
// Outer attributes are already parsed and will be
1427
1417
// added to the return value after the fact.
@@ -2190,7 +2180,26 @@ impl<'a> Parser<'a> {
2190
2180
/// Matches `'-' lit | lit` (cf. `ast_validation::AstValidator::check_expr_within_pat`).
2191
2181
/// Keep this in sync with `Token::can_begin_literal_maybe_minus`.
2192
2182
pub fn parse_literal_maybe_minus(&mut self) -> PResult<'a, P<Expr>> {
2193
- maybe_whole_expr!(self);
2183
+ if let token::Interpolated(nt) = &self.token.kind {
2184
+ match &**nt {
2185
+ // FIXME(nnethercote) The `NtExpr` case should only match if
2186
+ // `e` is an `ExprKind::Lit` or an `ExprKind::Unary` containing
2187
+ // an `UnOp::Neg` and an `ExprKind::Lit`, like how
2188
+ // `can_begin_literal_maybe_minus` works. But this method has
2189
+ // been over-accepting for a long time, and to make that change
2190
+ // here requires also changing some `parse_literal_maybe_minus`
2191
+ // call sites to accept additional expression kinds. E.g.
2192
+ // `ExprKind::Path` must be accepted when parsing range
2193
+ // patterns. That requires some care. So for now, we continue
2194
+ // being less strict here than we should be.
2195
+ token::NtExpr(e) | token::NtLiteral(e) => {
2196
+ let e = e.clone();
2197
+ self.bump();
2198
+ return Ok(e);
2199
+ }
2200
+ _ => {}
2201
+ };
2202
+ }
2194
2203
2195
2204
let lo = self.token.span;
2196
2205
let minus_present = self.eat(&token::BinOp(token::Minus));
0 commit comments