@@ -928,6 +928,7 @@ impl<'a> Parser<'a> {
928
928
// Stash token for error recovery (sometimes; clone is not necessarily cheap).
929
929
self . last_token = if self . token . is_ident ( ) ||
930
930
self . token . is_path ( ) ||
931
+ self . token . is_interpolated ( ) ||
931
932
self . token == token:: Comma {
932
933
Some ( Box :: new ( self . token . clone ( ) ) )
933
934
} else {
@@ -2322,13 +2323,9 @@ impl<'a> Parser<'a> {
2322
2323
-> PResult < ' a , P < Expr > > {
2323
2324
let attrs = try!( self . parse_or_use_outer_attributes ( already_parsed_attrs) ) ;
2324
2325
2325
- let interp = if let token:: Interpolated ( ..) = self . token {
2326
- true
2327
- } else {
2328
- false
2329
- } ;
2326
+ let is_interpolated = self . token . is_interpolated ( ) ;
2330
2327
let b = try!( self . parse_bottom_expr ( ) ) ;
2331
- let lo = if interp {
2328
+ let lo = if is_interpolated {
2332
2329
self . last_span . lo
2333
2330
} else {
2334
2331
b. span . lo
@@ -2719,27 +2716,31 @@ impl<'a> Parser<'a> {
2719
2716
let ex = match self . token {
2720
2717
token:: Not => {
2721
2718
self . bump ( ) ;
2719
+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
2722
2720
let e = try!( self . parse_prefix_expr ( None ) ) ;
2723
- hi = e. span . hi ;
2721
+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
2724
2722
self . mk_unary ( UnNot , e)
2725
2723
}
2726
2724
token:: BinOp ( token:: Minus ) => {
2727
2725
self . bump ( ) ;
2726
+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
2728
2727
let e = try!( self . parse_prefix_expr ( None ) ) ;
2729
- hi = e. span . hi ;
2728
+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
2730
2729
self . mk_unary ( UnNeg , e)
2731
2730
}
2732
2731
token:: BinOp ( token:: Star ) => {
2733
2732
self . bump ( ) ;
2733
+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
2734
2734
let e = try!( self . parse_prefix_expr ( None ) ) ;
2735
- hi = e. span . hi ;
2735
+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
2736
2736
self . mk_unary ( UnDeref , e)
2737
2737
}
2738
2738
token:: BinOp ( token:: And ) | token:: AndAnd => {
2739
2739
try!( self . expect_and ( ) ) ;
2740
2740
let m = try!( self . parse_mutability ( ) ) ;
2741
+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
2741
2742
let e = try!( self . parse_prefix_expr ( None ) ) ;
2742
- hi = e. span . hi ;
2743
+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
2743
2744
ExprAddrOf ( m, e)
2744
2745
}
2745
2746
token:: Ident ( ..) if self . token . is_keyword ( keywords:: In ) => {
@@ -2757,8 +2758,9 @@ impl<'a> Parser<'a> {
2757
2758
}
2758
2759
token:: Ident ( ..) if self . token . is_keyword ( keywords:: Box ) => {
2759
2760
self . bump ( ) ;
2761
+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
2760
2762
let subexpression = try!( self . parse_prefix_expr ( None ) ) ;
2761
- hi = subexpression. span . hi ;
2763
+ hi = if interpolated { prev_span . hi } else { subexpression. span . hi } ;
2762
2764
ExprBox ( subexpression)
2763
2765
}
2764
2766
_ => return self . parse_dot_or_call_expr ( Some ( attrs) )
@@ -2794,12 +2796,20 @@ impl<'a> Parser<'a> {
2794
2796
try!( self . parse_prefix_expr ( attrs) )
2795
2797
}
2796
2798
} ;
2799
+
2800
+
2797
2801
if self . expr_is_complete ( & * lhs) {
2798
2802
// Semi-statement forms are odd. See https://github.com/rust-lang/rust/issues/29071
2799
2803
return Ok ( lhs) ;
2800
2804
}
2801
2805
self . expected_tokens . push ( TokenType :: Operator ) ;
2802
2806
while let Some ( op) = AssocOp :: from_token ( & self . token ) {
2807
+
2808
+ let lhs_span = match self . last_token {
2809
+ Some ( ref lt) if lt. is_interpolated ( ) => self . last_span ,
2810
+ _ => lhs. span
2811
+ } ;
2812
+
2803
2813
let cur_op_span = self . span ;
2804
2814
let restrictions = if op. is_assign_like ( ) {
2805
2815
self . restrictions & Restrictions :: RESTRICTION_NO_STRUCT_LITERAL
@@ -2815,13 +2825,13 @@ impl<'a> Parser<'a> {
2815
2825
}
2816
2826
// Special cases:
2817
2827
if op == AssocOp :: As {
2818
- let rhs = try!( self . parse_ty ( ) ) ;
2819
- lhs = self . mk_expr ( lhs . span . lo , rhs. span . hi ,
2828
+ let rhs = try!( self . parse_ty ( ) ) ;
2829
+ lhs = self . mk_expr ( lhs_span . lo , rhs. span . hi ,
2820
2830
ExprCast ( lhs, rhs) , None ) ;
2821
2831
continue
2822
2832
} else if op == AssocOp :: Colon {
2823
2833
let rhs = try!( self . parse_ty ( ) ) ;
2824
- lhs = self . mk_expr ( lhs . span . lo , rhs. span . hi ,
2834
+ lhs = self . mk_expr ( lhs_span . lo , rhs. span . hi ,
2825
2835
ExprType ( lhs, rhs) , None ) ;
2826
2836
continue
2827
2837
} else if op == AssocOp :: DotDot {
@@ -2843,7 +2853,7 @@ impl<'a> Parser<'a> {
2843
2853
} else {
2844
2854
None
2845
2855
} ;
2846
- let ( lhs_span, rhs_span) = ( lhs . span , if let Some ( ref x) = rhs {
2856
+ let ( lhs_span, rhs_span) = ( lhs_span , if let Some ( ref x) = rhs {
2847
2857
x. span
2848
2858
} else {
2849
2859
cur_op_span
@@ -2883,14 +2893,14 @@ impl<'a> Parser<'a> {
2883
2893
AssocOp :: Equal | AssocOp :: Less | AssocOp :: LessEqual | AssocOp :: NotEqual |
2884
2894
AssocOp :: Greater | AssocOp :: GreaterEqual => {
2885
2895
let ast_op = op. to_ast_binop ( ) . unwrap ( ) ;
2886
- let ( lhs_span, rhs_span) = ( lhs . span , rhs. span ) ;
2896
+ let ( lhs_span, rhs_span) = ( lhs_span , rhs. span ) ;
2887
2897
let binary = self . mk_binary ( codemap:: respan ( cur_op_span, ast_op) , lhs, rhs) ;
2888
2898
self . mk_expr ( lhs_span. lo , rhs_span. hi , binary, None )
2889
2899
}
2890
2900
AssocOp :: Assign =>
2891
- self . mk_expr ( lhs . span . lo , rhs. span . hi , ExprAssign ( lhs, rhs) , None ) ,
2901
+ self . mk_expr ( lhs_span . lo , rhs. span . hi , ExprAssign ( lhs, rhs) , None ) ,
2892
2902
AssocOp :: Inplace =>
2893
- self . mk_expr ( lhs . span . lo , rhs. span . hi , ExprInPlace ( lhs, rhs) , None ) ,
2903
+ self . mk_expr ( lhs_span . lo , rhs. span . hi , ExprInPlace ( lhs, rhs) , None ) ,
2894
2904
AssocOp :: AssignOp ( k) => {
2895
2905
let aop = match k {
2896
2906
token:: Plus => BiAdd ,
@@ -2904,7 +2914,7 @@ impl<'a> Parser<'a> {
2904
2914
token:: Shl => BiShl ,
2905
2915
token:: Shr => BiShr
2906
2916
} ;
2907
- let ( lhs_span, rhs_span) = ( lhs . span , rhs. span ) ;
2917
+ let ( lhs_span, rhs_span) = ( lhs_span , rhs. span ) ;
2908
2918
let aopexpr = self . mk_assign_op ( codemap:: respan ( cur_op_span, aop) , lhs, rhs) ;
2909
2919
self . mk_expr ( lhs_span. lo , rhs_span. hi , aopexpr, None )
2910
2920
}
0 commit comments