@@ -83,7 +83,7 @@ macro_rules! maybe_whole_expr {
83
83
pub ( super ) enum LhsExpr {
84
84
NotYetParsed ,
85
85
AttributesParsed ( AttrWrapper ) ,
86
- AlreadyParsed ( P < Expr > ) ,
86
+ AlreadyParsed ( P < Expr > , bool ) , // (expr, starts_statement)
87
87
}
88
88
89
89
impl From < Option < AttrWrapper > > for LhsExpr {
@@ -101,7 +101,7 @@ impl From<P<Expr>> for LhsExpr {
101
101
///
102
102
/// This conversion does not allocate.
103
103
fn from ( expr : P < Expr > ) -> Self {
104
- LhsExpr :: AlreadyParsed ( expr)
104
+ LhsExpr :: AlreadyParsed ( expr, false )
105
105
}
106
106
}
107
107
@@ -173,7 +173,9 @@ impl<'a> Parser<'a> {
173
173
min_prec : usize ,
174
174
lhs : LhsExpr ,
175
175
) -> PResult < ' a , P < Expr > > {
176
- let mut lhs = if let LhsExpr :: AlreadyParsed ( expr) = lhs {
176
+ let mut starts_stmt = false ;
177
+ let mut lhs = if let LhsExpr :: AlreadyParsed ( expr, starts_statement) = lhs {
178
+ starts_stmt = starts_statement;
177
179
expr
178
180
} else {
179
181
let attrs = match lhs {
@@ -292,15 +294,7 @@ impl<'a> Parser<'a> {
292
294
let op_span = self . prev_token . span . to ( self . token . span ) ;
293
295
// Eat the second `+`
294
296
self . bump ( ) ;
295
- let prev_is_semi = {
296
- if let Ok ( prev_code) = self . sess . source_map ( ) . span_to_prev_source ( lhs. span ) &&
297
- prev_code. trim_end ( ) . ends_with ( ";" ) {
298
- true
299
- } else {
300
- false
301
- }
302
- } ;
303
- lhs = self . recover_from_postfix_increment ( lhs, op_span, prev_is_semi) ?;
297
+ lhs = self . recover_from_postfix_increment ( lhs, op_span, starts_stmt) ?;
304
298
continue ;
305
299
}
306
300
@@ -607,14 +601,15 @@ impl<'a> Parser<'a> {
607
601
token:: BinOp ( token:: Plus )
608
602
if this. look_ahead ( 1 , |t| * t == token:: BinOp ( token:: Plus ) ) =>
609
603
{
610
- let prev_is_semi = this. prev_token == token:: Semi ;
604
+ let starts_stmt = this. prev_token == token:: Semi
605
+ || this. prev_token == token:: CloseDelim ( Delimiter :: Brace ) ;
611
606
let pre_span = this. token . span . to ( this. look_ahead ( 1 , |t| t. span ) ) ;
612
607
// Eat both `+`s.
613
608
this. bump ( ) ;
614
609
this. bump ( ) ;
615
610
616
611
let operand_expr = this. parse_dot_or_call_expr ( Default :: default ( ) ) ?;
617
- this. recover_from_prefix_increment ( operand_expr, pre_span, prev_is_semi )
612
+ this. recover_from_prefix_increment ( operand_expr, pre_span, starts_stmt )
618
613
}
619
614
token:: Ident ( ..) if this. token . is_keyword ( kw:: Box ) => {
620
615
make_it ! ( this, attrs, |this, _| this. parse_box_expr( lo) )
0 commit comments