@@ -233,6 +233,21 @@ macro_rules! maybe_whole {
233
233
)
234
234
}
235
235
236
+ /// Uses $parse_expr to parse an expression and returns the span of the interpolated
237
+ /// token or the span of the parsed expression, if it was not interpolated
238
+ macro_rules! interpolated_or_expr_span {
239
+ ( $p: expr, $parse_expr: expr) => {
240
+ {
241
+ let is_interpolated = $p. token. is_interpolated( ) ;
242
+ let e = $parse_expr;
243
+ if is_interpolated {
244
+ ( $p. last_span, e)
245
+ } else {
246
+ ( e. span, e)
247
+ }
248
+ }
249
+ }
250
+ }
236
251
237
252
fn maybe_append ( mut lhs : Vec < Attribute > , rhs : Option < Vec < Attribute > > )
238
253
-> Vec < Attribute > {
@@ -2323,14 +2338,8 @@ impl<'a> Parser<'a> {
2323
2338
-> PResult < ' a , P < Expr > > {
2324
2339
let attrs = try!( self . parse_or_use_outer_attributes ( already_parsed_attrs) ) ;
2325
2340
2326
- let is_interpolated = self . token . is_interpolated ( ) ;
2327
- let b = try!( self . parse_bottom_expr ( ) ) ;
2328
- let lo = if is_interpolated {
2329
- self . last_span . lo
2330
- } else {
2331
- b. span . lo
2332
- } ;
2333
- self . parse_dot_or_call_expr_with ( b, lo, attrs)
2341
+ let ( span, b) = interpolated_or_expr_span ! ( self , try!( self . parse_bottom_expr( ) ) ) ;
2342
+ self . parse_dot_or_call_expr_with ( b, span. lo , attrs)
2334
2343
}
2335
2344
2336
2345
pub fn parse_dot_or_call_expr_with ( & mut self ,
@@ -2368,7 +2377,8 @@ impl<'a> Parser<'a> {
2368
2377
fn parse_dot_suffix ( & mut self ,
2369
2378
ident : Ident ,
2370
2379
ident_span : Span ,
2371
- self_value : P < Expr > )
2380
+ self_value : P < Expr > ,
2381
+ lo : BytePos )
2372
2382
-> PResult < ' a , P < Expr > > {
2373
2383
let ( _, tys, bindings) = if self . eat ( & token:: ModSep ) {
2374
2384
try!( self . expect_lt ( ) ) ;
@@ -2382,8 +2392,6 @@ impl<'a> Parser<'a> {
2382
2392
self . span_err ( last_span, "type bindings are only permitted on trait paths" ) ;
2383
2393
}
2384
2394
2385
- let lo = self_value. span . lo ;
2386
-
2387
2395
Ok ( match self . token {
2388
2396
// expr.f() method call.
2389
2397
token:: OpenDelim ( token:: Paren ) => {
@@ -2428,7 +2436,7 @@ impl<'a> Parser<'a> {
2428
2436
hi = self . span . hi ;
2429
2437
self . bump ( ) ;
2430
2438
2431
- e = try!( self . parse_dot_suffix ( i, mk_sp ( dot_pos, hi) , e) ) ;
2439
+ e = try!( self . parse_dot_suffix ( i, mk_sp ( dot_pos, hi) , e, lo ) ) ;
2432
2440
}
2433
2441
token:: Literal ( token:: Integer ( n) , suf) => {
2434
2442
let sp = self . span ;
@@ -2481,7 +2489,7 @@ impl<'a> Parser<'a> {
2481
2489
let dot_pos = self . last_span . hi ;
2482
2490
e = try!( self . parse_dot_suffix ( special_idents:: invalid,
2483
2491
mk_sp ( dot_pos, dot_pos) ,
2484
- e) ) ;
2492
+ e, lo ) ) ;
2485
2493
}
2486
2494
}
2487
2495
continue ;
@@ -2716,31 +2724,31 @@ impl<'a> Parser<'a> {
2716
2724
let ex = match self . token {
2717
2725
token:: Not => {
2718
2726
self . bump ( ) ;
2719
- let ( interpolated , prev_span ) = ( self . token . is_interpolated ( ) , self . span ) ;
2720
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2721
- hi = if interpolated { prev_span . hi } else { e . span . hi } ;
2727
+ let ( span , e ) = interpolated_or_expr_span ! ( self ,
2728
+ try!( self . parse_prefix_expr( None ) ) ) ;
2729
+ hi = span. hi ;
2722
2730
self . mk_unary ( UnNot , e)
2723
2731
}
2724
2732
token:: BinOp ( token:: Minus ) => {
2725
2733
self . bump ( ) ;
2726
- let ( interpolated , prev_span ) = ( self . token . is_interpolated ( ) , self . span ) ;
2727
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2728
- hi = if interpolated { prev_span . hi } else { e . span . hi } ;
2734
+ let ( span , e ) = interpolated_or_expr_span ! ( self ,
2735
+ try!( self . parse_prefix_expr( None ) ) ) ;
2736
+ hi = span. hi ;
2729
2737
self . mk_unary ( UnNeg , e)
2730
2738
}
2731
2739
token:: BinOp ( token:: Star ) => {
2732
2740
self . bump ( ) ;
2733
- let ( interpolated , prev_span ) = ( self . token . is_interpolated ( ) , self . span ) ;
2734
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2735
- hi = if interpolated { prev_span . hi } else { e . span . hi } ;
2741
+ let ( span , e ) = interpolated_or_expr_span ! ( self ,
2742
+ try!( self . parse_prefix_expr( None ) ) ) ;
2743
+ hi = span. hi ;
2736
2744
self . mk_unary ( UnDeref , e)
2737
2745
}
2738
2746
token:: BinOp ( token:: And ) | token:: AndAnd => {
2739
2747
try!( self . expect_and ( ) ) ;
2740
2748
let m = try!( self . parse_mutability ( ) ) ;
2741
- let ( interpolated , prev_span ) = ( self . token . is_interpolated ( ) , self . span ) ;
2742
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2743
- hi = if interpolated { prev_span . hi } else { e . span . hi } ;
2749
+ let ( span , e ) = interpolated_or_expr_span ! ( self ,
2750
+ try!( self . parse_prefix_expr( None ) ) ) ;
2751
+ hi = span. hi ;
2744
2752
ExprAddrOf ( m, e)
2745
2753
}
2746
2754
token:: Ident ( ..) if self . token . is_keyword ( keywords:: In ) => {
@@ -2758,10 +2766,10 @@ impl<'a> Parser<'a> {
2758
2766
}
2759
2767
token:: Ident ( ..) if self . token . is_keyword ( keywords:: Box ) => {
2760
2768
self . bump ( ) ;
2761
- let ( interpolated , prev_span ) = ( self . token . is_interpolated ( ) , self . span ) ;
2762
- let subexpression = try!( self . parse_prefix_expr ( None ) ) ;
2763
- hi = if interpolated { prev_span . hi } else { subexpression . span . hi } ;
2764
- ExprBox ( subexpression )
2769
+ let ( span , e ) = interpolated_or_expr_span ! ( self ,
2770
+ try!( self . parse_prefix_expr( None ) ) ) ;
2771
+ hi = span. hi ;
2772
+ ExprBox ( e )
2765
2773
}
2766
2774
_ => return self . parse_dot_or_call_expr ( Some ( attrs) )
2767
2775
} ;
@@ -2825,7 +2833,7 @@ impl<'a> Parser<'a> {
2825
2833
}
2826
2834
// Special cases:
2827
2835
if op == AssocOp :: As {
2828
- let rhs = try!( self . parse_ty ( ) ) ;
2836
+ let rhs = try!( self . parse_ty ( ) ) ;
2829
2837
lhs = self . mk_expr ( lhs_span. lo , rhs. span . hi ,
2830
2838
ExprCast ( lhs, rhs) , None ) ;
2831
2839
continue
0 commit comments