@@ -233,7 +233,6 @@ macro_rules! maybe_whole {
233
233
)
234
234
}
235
235
236
-
237
236
fn maybe_append ( mut lhs : Vec < Attribute > , rhs : Option < Vec < Attribute > > )
238
237
-> Vec < Attribute > {
239
238
if let Some ( ref attrs) = rhs {
@@ -255,6 +254,7 @@ pub struct Parser<'a> {
255
254
pub cfg : CrateConfig ,
256
255
/// the previous token or None (only stashed sometimes).
257
256
pub last_token : Option < Box < token:: Token > > ,
257
+ last_token_interpolated : bool ,
258
258
pub buffer : [ TokenAndSpan ; 4 ] ,
259
259
pub buffer_start : isize ,
260
260
pub buffer_end : isize ,
@@ -362,6 +362,7 @@ impl<'a> Parser<'a> {
362
362
span : span,
363
363
last_span : span,
364
364
last_token : None ,
365
+ last_token_interpolated : false ,
365
366
buffer : [
366
367
placeholder. clone ( ) ,
367
368
placeholder. clone ( ) ,
@@ -542,6 +543,19 @@ impl<'a> Parser<'a> {
542
543
self . commit_stmt ( & [ edible] , & [ ] )
543
544
}
544
545
546
+ /// returns the span of expr, if it was not interpolated or the span of the interpolated token
547
+ fn interpolated_or_expr_span ( & self ,
548
+ expr : PResult < ' a , P < Expr > > )
549
+ -> PResult < ' a , ( Span , P < Expr > ) > {
550
+ expr. map ( |e| {
551
+ if self . last_token_interpolated {
552
+ ( self . last_span , e)
553
+ } else {
554
+ ( e. span , e)
555
+ }
556
+ } )
557
+ }
558
+
545
559
pub fn parse_ident ( & mut self ) -> PResult < ' a , ast:: Ident > {
546
560
self . check_strict_keywords ( ) ;
547
561
self . check_reserved_keywords ( ) ;
@@ -933,6 +947,7 @@ impl<'a> Parser<'a> {
933
947
} else {
934
948
None
935
949
} ;
950
+ self . last_token_interpolated = self . token . is_interpolated ( ) ;
936
951
let next = if self . buffer_start == self . buffer_end {
937
952
self . reader . real_token ( )
938
953
} else {
@@ -2328,18 +2343,20 @@ impl<'a> Parser<'a> {
2328
2343
-> PResult < ' a , P < Expr > > {
2329
2344
let attrs = try!( self . parse_or_use_outer_attributes ( already_parsed_attrs) ) ;
2330
2345
2331
- let b = try!( self . parse_bottom_expr ( ) ) ;
2332
- self . parse_dot_or_call_expr_with ( b, attrs)
2346
+ let b = self . parse_bottom_expr ( ) ;
2347
+ let ( span, b) = try!( self . interpolated_or_expr_span ( b) ) ;
2348
+ self . parse_dot_or_call_expr_with ( b, span. lo , attrs)
2333
2349
}
2334
2350
2335
2351
pub fn parse_dot_or_call_expr_with ( & mut self ,
2336
2352
e0 : P < Expr > ,
2353
+ lo : BytePos ,
2337
2354
attrs : ThinAttributes )
2338
2355
-> PResult < ' a , P < Expr > > {
2339
2356
// Stitch the list of outer attributes onto the return value.
2340
2357
// A little bit ugly, but the best way given the current code
2341
2358
// structure
2342
- self . parse_dot_or_call_expr_with_ ( e0)
2359
+ self . parse_dot_or_call_expr_with_ ( e0, lo )
2343
2360
. map ( |expr|
2344
2361
expr. map ( |mut expr| {
2345
2362
expr. attrs . update ( |a| a. prepend ( attrs) ) ;
@@ -2366,7 +2383,8 @@ impl<'a> Parser<'a> {
2366
2383
fn parse_dot_suffix ( & mut self ,
2367
2384
ident : Ident ,
2368
2385
ident_span : Span ,
2369
- self_value : P < Expr > )
2386
+ self_value : P < Expr > ,
2387
+ lo : BytePos )
2370
2388
-> PResult < ' a , P < Expr > > {
2371
2389
let ( _, tys, bindings) = if self . eat ( & token:: ModSep ) {
2372
2390
try!( self . expect_lt ( ) ) ;
@@ -2380,8 +2398,6 @@ impl<'a> Parser<'a> {
2380
2398
self . span_err ( last_span, "type bindings are only permitted on trait paths" ) ;
2381
2399
}
2382
2400
2383
- let lo = self_value. span . lo ;
2384
-
2385
2401
Ok ( match self . token {
2386
2402
// expr.f() method call.
2387
2403
token:: OpenDelim ( token:: Paren ) => {
@@ -2414,9 +2430,8 @@ impl<'a> Parser<'a> {
2414
2430
} )
2415
2431
}
2416
2432
2417
- fn parse_dot_or_call_expr_with_ ( & mut self , e0 : P < Expr > ) -> PResult < ' a , P < Expr > > {
2433
+ fn parse_dot_or_call_expr_with_ ( & mut self , e0 : P < Expr > , lo : BytePos ) -> PResult < ' a , P < Expr > > {
2418
2434
let mut e = e0;
2419
- let lo = e. span . lo ;
2420
2435
let mut hi;
2421
2436
loop {
2422
2437
// expr.f
@@ -2427,7 +2442,7 @@ impl<'a> Parser<'a> {
2427
2442
hi = self . span . hi ;
2428
2443
self . bump ( ) ;
2429
2444
2430
- e = try!( self . parse_dot_suffix ( i, mk_sp ( dot_pos, hi) , e) ) ;
2445
+ e = try!( self . parse_dot_suffix ( i, mk_sp ( dot_pos, hi) , e, lo ) ) ;
2431
2446
}
2432
2447
token:: Literal ( token:: Integer ( n) , suf) => {
2433
2448
let sp = self . span ;
@@ -2480,7 +2495,7 @@ impl<'a> Parser<'a> {
2480
2495
let dot_pos = self . last_span . hi ;
2481
2496
e = try!( self . parse_dot_suffix ( special_idents:: invalid,
2482
2497
mk_sp ( dot_pos, dot_pos) ,
2483
- e) ) ;
2498
+ e, lo ) ) ;
2484
2499
}
2485
2500
}
2486
2501
continue ;
@@ -2715,27 +2730,31 @@ impl<'a> Parser<'a> {
2715
2730
let ex = match self . token {
2716
2731
token:: Not => {
2717
2732
self . bump ( ) ;
2718
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2719
- hi = e. span . hi ;
2733
+ let e = self . parse_prefix_expr ( None ) ;
2734
+ let ( span, e) = try!( self . interpolated_or_expr_span ( e) ) ;
2735
+ hi = span. hi ;
2720
2736
self . mk_unary ( UnNot , e)
2721
2737
}
2722
2738
token:: BinOp ( token:: Minus ) => {
2723
2739
self . bump ( ) ;
2724
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2725
- hi = e. span . hi ;
2740
+ let e = self . parse_prefix_expr ( None ) ;
2741
+ let ( span, e) = try!( self . interpolated_or_expr_span ( e) ) ;
2742
+ hi = span. hi ;
2726
2743
self . mk_unary ( UnNeg , e)
2727
2744
}
2728
2745
token:: BinOp ( token:: Star ) => {
2729
2746
self . bump ( ) ;
2730
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2731
- hi = e. span . hi ;
2747
+ let e = self . parse_prefix_expr ( None ) ;
2748
+ let ( span, e) = try!( self . interpolated_or_expr_span ( e) ) ;
2749
+ hi = span. hi ;
2732
2750
self . mk_unary ( UnDeref , e)
2733
2751
}
2734
2752
token:: BinOp ( token:: And ) | token:: AndAnd => {
2735
2753
try!( self . expect_and ( ) ) ;
2736
2754
let m = try!( self . parse_mutability ( ) ) ;
2737
- let e = try!( self . parse_prefix_expr ( None ) ) ;
2738
- hi = e. span . hi ;
2755
+ let e = self . parse_prefix_expr ( None ) ;
2756
+ let ( span, e) = try!( self . interpolated_or_expr_span ( e) ) ;
2757
+ hi = span. hi ;
2739
2758
ExprAddrOf ( m, e)
2740
2759
}
2741
2760
token:: Ident ( ..) if self . token . is_keyword ( keywords:: In ) => {
@@ -2753,9 +2772,10 @@ impl<'a> Parser<'a> {
2753
2772
}
2754
2773
token:: Ident ( ..) if self . token . is_keyword ( keywords:: Box ) => {
2755
2774
self . bump ( ) ;
2756
- let subexpression = try!( self . parse_prefix_expr ( None ) ) ;
2757
- hi = subexpression. span . hi ;
2758
- ExprBox ( subexpression)
2775
+ let e = self . parse_prefix_expr ( None ) ;
2776
+ let ( span, e) = try!( self . interpolated_or_expr_span ( e) ) ;
2777
+ hi = span. hi ;
2778
+ ExprBox ( e)
2759
2779
}
2760
2780
_ => return self . parse_dot_or_call_expr ( Some ( attrs) )
2761
2781
} ;
@@ -2790,12 +2810,21 @@ impl<'a> Parser<'a> {
2790
2810
try!( self . parse_prefix_expr ( attrs) )
2791
2811
}
2792
2812
} ;
2813
+
2814
+
2793
2815
if self . expr_is_complete ( & * lhs) {
2794
2816
// Semi-statement forms are odd. See https://github.com/rust-lang/rust/issues/29071
2795
2817
return Ok ( lhs) ;
2796
2818
}
2797
2819
self . expected_tokens . push ( TokenType :: Operator ) ;
2798
2820
while let Some ( op) = AssocOp :: from_token ( & self . token ) {
2821
+
2822
+ let lhs_span = if self . last_token_interpolated {
2823
+ self . last_span
2824
+ } else {
2825
+ lhs. span
2826
+ } ;
2827
+
2799
2828
let cur_op_span = self . span ;
2800
2829
let restrictions = if op. is_assign_like ( ) {
2801
2830
self . restrictions & Restrictions :: RESTRICTION_NO_STRUCT_LITERAL
@@ -2812,12 +2841,12 @@ impl<'a> Parser<'a> {
2812
2841
// Special cases:
2813
2842
if op == AssocOp :: As {
2814
2843
let rhs = try!( self . parse_ty ( ) ) ;
2815
- lhs = self . mk_expr ( lhs . span . lo , rhs. span . hi ,
2844
+ lhs = self . mk_expr ( lhs_span . lo , rhs. span . hi ,
2816
2845
ExprCast ( lhs, rhs) , None ) ;
2817
2846
continue
2818
2847
} else if op == AssocOp :: Colon {
2819
2848
let rhs = try!( self . parse_ty ( ) ) ;
2820
- lhs = self . mk_expr ( lhs . span . lo , rhs. span . hi ,
2849
+ lhs = self . mk_expr ( lhs_span . lo , rhs. span . hi ,
2821
2850
ExprType ( lhs, rhs) , None ) ;
2822
2851
continue
2823
2852
} else if op == AssocOp :: DotDot {
@@ -2839,7 +2868,7 @@ impl<'a> Parser<'a> {
2839
2868
} else {
2840
2869
None
2841
2870
} ;
2842
- let ( lhs_span, rhs_span) = ( lhs . span , if let Some ( ref x) = rhs {
2871
+ let ( lhs_span, rhs_span) = ( lhs_span , if let Some ( ref x) = rhs {
2843
2872
x. span
2844
2873
} else {
2845
2874
cur_op_span
@@ -2879,14 +2908,14 @@ impl<'a> Parser<'a> {
2879
2908
AssocOp :: Equal | AssocOp :: Less | AssocOp :: LessEqual | AssocOp :: NotEqual |
2880
2909
AssocOp :: Greater | AssocOp :: GreaterEqual => {
2881
2910
let ast_op = op. to_ast_binop ( ) . unwrap ( ) ;
2882
- let ( lhs_span, rhs_span) = ( lhs . span , rhs. span ) ;
2911
+ let ( lhs_span, rhs_span) = ( lhs_span , rhs. span ) ;
2883
2912
let binary = self . mk_binary ( codemap:: respan ( cur_op_span, ast_op) , lhs, rhs) ;
2884
2913
self . mk_expr ( lhs_span. lo , rhs_span. hi , binary, None )
2885
2914
}
2886
2915
AssocOp :: Assign =>
2887
- self . mk_expr ( lhs . span . lo , rhs. span . hi , ExprAssign ( lhs, rhs) , None ) ,
2916
+ self . mk_expr ( lhs_span . lo , rhs. span . hi , ExprAssign ( lhs, rhs) , None ) ,
2888
2917
AssocOp :: Inplace =>
2889
- self . mk_expr ( lhs . span . lo , rhs. span . hi , ExprInPlace ( lhs, rhs) , None ) ,
2918
+ self . mk_expr ( lhs_span . lo , rhs. span . hi , ExprInPlace ( lhs, rhs) , None ) ,
2890
2919
AssocOp :: AssignOp ( k) => {
2891
2920
let aop = match k {
2892
2921
token:: Plus => BiAdd ,
@@ -2900,7 +2929,7 @@ impl<'a> Parser<'a> {
2900
2929
token:: Shl => BiShl ,
2901
2930
token:: Shr => BiShr
2902
2931
} ;
2903
- let ( lhs_span, rhs_span) = ( lhs . span , rhs. span ) ;
2932
+ let ( lhs_span, rhs_span) = ( lhs_span , rhs. span ) ;
2904
2933
let aopexpr = self . mk_assign_op ( codemap:: respan ( cur_op_span, aop) , lhs, rhs) ;
2905
2934
self . mk_expr ( lhs_span. lo , rhs_span. hi , aopexpr, None )
2906
2935
}
@@ -3834,7 +3863,8 @@ impl<'a> Parser<'a> {
3834
3863
let e = self . mk_mac_expr ( span. lo , span. hi ,
3835
3864
mac. and_then ( |m| m. node ) ,
3836
3865
None ) ;
3837
- let e = try!( self . parse_dot_or_call_expr_with ( e, attrs) ) ;
3866
+ let lo = e. span . lo ;
3867
+ let e = try!( self . parse_dot_or_call_expr_with ( e, lo, attrs) ) ;
3838
3868
let e = try!( self . parse_assoc_expr_with ( 0 , LhsExpr :: AlreadyParsed ( e) ) ) ;
3839
3869
try!( self . handle_expression_like_statement (
3840
3870
e,
0 commit comments