@@ -928,6 +928,7 @@ impl<'a> Parser<'a> {
928928 // Stash token for error recovery (sometimes; clone is not necessarily cheap).
929929 self . last_token = if self . token . is_ident ( ) ||
930930 self . token . is_path ( ) ||
931+ self . token . is_interpolated ( ) ||
931932 self . token == token:: Comma {
932933 Some ( Box :: new ( self . token . clone ( ) ) )
933934 } else {
@@ -2322,13 +2323,9 @@ impl<'a> Parser<'a> {
23222323 -> PResult < ' a , P < Expr > > {
23232324 let attrs = try!( self . parse_or_use_outer_attributes ( already_parsed_attrs) ) ;
23242325
2325- let interp = if let token:: Interpolated ( ..) = self . token {
2326- true
2327- } else {
2328- false
2329- } ;
2326+ let is_interpolated = self . token . is_interpolated ( ) ;
23302327 let b = try!( self . parse_bottom_expr ( ) ) ;
2331- let lo = if interp {
2328+ let lo = if is_interpolated {
23322329 self . last_span . lo
23332330 } else {
23342331 b. span . lo
@@ -2719,27 +2716,31 @@ impl<'a> Parser<'a> {
27192716 let ex = match self . token {
27202717 token:: Not => {
27212718 self . bump ( ) ;
2719+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
27222720 let e = try!( self . parse_prefix_expr ( None ) ) ;
2723- hi = e. span . hi ;
2721+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
27242722 self . mk_unary ( UnNot , e)
27252723 }
27262724 token:: BinOp ( token:: Minus ) => {
27272725 self . bump ( ) ;
2726+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
27282727 let e = try!( self . parse_prefix_expr ( None ) ) ;
2729- hi = e. span . hi ;
2728+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
27302729 self . mk_unary ( UnNeg , e)
27312730 }
27322731 token:: BinOp ( token:: Star ) => {
27332732 self . bump ( ) ;
2733+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
27342734 let e = try!( self . parse_prefix_expr ( None ) ) ;
2735- hi = e. span . hi ;
2735+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
27362736 self . mk_unary ( UnDeref , e)
27372737 }
27382738 token:: BinOp ( token:: And ) | token:: AndAnd => {
27392739 try!( self . expect_and ( ) ) ;
27402740 let m = try!( self . parse_mutability ( ) ) ;
2741+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
27412742 let e = try!( self . parse_prefix_expr ( None ) ) ;
2742- hi = e. span . hi ;
2743+ hi = if interpolated { prev_span . hi } else { e. span . hi } ;
27432744 ExprAddrOf ( m, e)
27442745 }
27452746 token:: Ident ( ..) if self . token . is_keyword ( keywords:: In ) => {
@@ -2757,8 +2758,9 @@ impl<'a> Parser<'a> {
27572758 }
27582759 token:: Ident ( ..) if self . token . is_keyword ( keywords:: Box ) => {
27592760 self . bump ( ) ;
2761+ let ( interpolated, prev_span) = ( self . token . is_interpolated ( ) , self . span ) ;
27602762 let subexpression = try!( self . parse_prefix_expr ( None ) ) ;
2761- hi = subexpression. span . hi ;
2763+ hi = if interpolated { prev_span . hi } else { subexpression. span . hi } ;
27622764 ExprBox ( subexpression)
27632765 }
27642766 _ => return self . parse_dot_or_call_expr ( Some ( attrs) )
@@ -2794,12 +2796,20 @@ impl<'a> Parser<'a> {
27942796 try!( self . parse_prefix_expr ( attrs) )
27952797 }
27962798 } ;
2799+
2800+
27972801 if self . expr_is_complete ( & * lhs) {
27982802 // Semi-statement forms are odd. See https://github.com/rust-lang/rust/issues/29071
27992803 return Ok ( lhs) ;
28002804 }
28012805 self . expected_tokens . push ( TokenType :: Operator ) ;
28022806 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+
28032813 let cur_op_span = self . span ;
28042814 let restrictions = if op. is_assign_like ( ) {
28052815 self . restrictions & Restrictions :: RESTRICTION_NO_STRUCT_LITERAL
@@ -2815,13 +2825,13 @@ impl<'a> Parser<'a> {
28152825 }
28162826 // Special cases:
28172827 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 ,
28202830 ExprCast ( lhs, rhs) , None ) ;
28212831 continue
28222832 } else if op == AssocOp :: Colon {
28232833 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 ,
28252835 ExprType ( lhs, rhs) , None ) ;
28262836 continue
28272837 } else if op == AssocOp :: DotDot {
@@ -2843,7 +2853,7 @@ impl<'a> Parser<'a> {
28432853 } else {
28442854 None
28452855 } ;
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 {
28472857 x. span
28482858 } else {
28492859 cur_op_span
@@ -2883,14 +2893,14 @@ impl<'a> Parser<'a> {
28832893 AssocOp :: Equal | AssocOp :: Less | AssocOp :: LessEqual | AssocOp :: NotEqual |
28842894 AssocOp :: Greater | AssocOp :: GreaterEqual => {
28852895 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 ) ;
28872897 let binary = self . mk_binary ( codemap:: respan ( cur_op_span, ast_op) , lhs, rhs) ;
28882898 self . mk_expr ( lhs_span. lo , rhs_span. hi , binary, None )
28892899 }
28902900 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 ) ,
28922902 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 ) ,
28942904 AssocOp :: AssignOp ( k) => {
28952905 let aop = match k {
28962906 token:: Plus => BiAdd ,
@@ -2904,7 +2914,7 @@ impl<'a> Parser<'a> {
29042914 token:: Shl => BiShl ,
29052915 token:: Shr => BiShr
29062916 } ;
2907- let ( lhs_span, rhs_span) = ( lhs . span , rhs. span ) ;
2917+ let ( lhs_span, rhs_span) = ( lhs_span , rhs. span ) ;
29082918 let aopexpr = self . mk_assign_op ( codemap:: respan ( cur_op_span, aop) , lhs, rhs) ;
29092919 self . mk_expr ( lhs_span. lo , rhs_span. hi , aopexpr, None )
29102920 }
0 commit comments