@@ -376,45 +376,7 @@ impl LoweringContext<'_> {
376
376
)
377
377
}
378
378
ExprKind :: Range ( ref e1, ref e2, lims) => {
379
- use syntax:: ast:: RangeLimits :: * ;
380
-
381
- let path = match ( e1, e2, lims) {
382
- ( & None , & None , HalfOpen ) => sym:: RangeFull ,
383
- ( & Some ( ..) , & None , HalfOpen ) => sym:: RangeFrom ,
384
- ( & None , & Some ( ..) , HalfOpen ) => sym:: RangeTo ,
385
- ( & Some ( ..) , & Some ( ..) , HalfOpen ) => sym:: Range ,
386
- ( & None , & Some ( ..) , Closed ) => sym:: RangeToInclusive ,
387
- ( & Some ( ..) , & Some ( ..) , Closed ) => unreachable ! ( ) ,
388
- ( _, & None , Closed ) => self . diagnostic ( )
389
- . span_fatal ( e. span , "inclusive range with no end" )
390
- . raise ( ) ,
391
- } ;
392
-
393
- let fields = e1. iter ( )
394
- . map ( |e| ( "start" , e) )
395
- . chain ( e2. iter ( ) . map ( |e| ( "end" , e) ) )
396
- . map ( |( s, e) | {
397
- let expr = P ( self . lower_expr ( & e) ) ;
398
- let ident = Ident :: new ( Symbol :: intern ( s) , e. span ) ;
399
- self . field ( ident, expr, e. span )
400
- } )
401
- . collect :: < P < [ hir:: Field ] > > ( ) ;
402
-
403
- let is_unit = fields. is_empty ( ) ;
404
- let struct_path = [ sym:: ops, path] ;
405
- let struct_path = self . std_path ( e. span , & struct_path, None , is_unit) ;
406
- let struct_path = hir:: QPath :: Resolved ( None , P ( struct_path) ) ;
407
-
408
- return hir:: Expr {
409
- hir_id : self . lower_node_id ( e. id ) ,
410
- node : if is_unit {
411
- hir:: ExprKind :: Path ( struct_path)
412
- } else {
413
- hir:: ExprKind :: Struct ( P ( struct_path) , fields, None )
414
- } ,
415
- span : e. span ,
416
- attrs : e. attrs . clone ( ) ,
417
- } ;
379
+ self . lower_expr_range ( e. span , e1. as_deref ( ) , e2. as_deref ( ) , lims)
418
380
}
419
381
ExprKind :: Path ( ref qself, ref path) => {
420
382
let qpath = self . lower_qpath (
@@ -497,6 +459,49 @@ impl LoweringContext<'_> {
497
459
}
498
460
}
499
461
462
+ fn lower_expr_range (
463
+ & mut self ,
464
+ span : Span ,
465
+ e1 : Option < & Expr > ,
466
+ e2 : Option < & Expr > ,
467
+ lims : RangeLimits ,
468
+ ) -> hir:: ExprKind {
469
+ use syntax:: ast:: RangeLimits :: * ;
470
+
471
+ let path = match ( e1, e2, lims) {
472
+ ( None , None , HalfOpen ) => sym:: RangeFull ,
473
+ ( Some ( ..) , None , HalfOpen ) => sym:: RangeFrom ,
474
+ ( None , Some ( ..) , HalfOpen ) => sym:: RangeTo ,
475
+ ( Some ( ..) , Some ( ..) , HalfOpen ) => sym:: Range ,
476
+ ( None , Some ( ..) , Closed ) => sym:: RangeToInclusive ,
477
+ ( Some ( ..) , Some ( ..) , Closed ) => unreachable ! ( ) ,
478
+ ( _, None , Closed ) => self . diagnostic ( )
479
+ . span_fatal ( span, "inclusive range with no end" )
480
+ . raise ( ) ,
481
+ } ;
482
+
483
+ let fields = e1. iter ( )
484
+ . map ( |e| ( "start" , e) )
485
+ . chain ( e2. iter ( ) . map ( |e| ( "end" , e) ) )
486
+ . map ( |( s, e) | {
487
+ let expr = P ( self . lower_expr ( & e) ) ;
488
+ let ident = Ident :: new ( Symbol :: intern ( s) , e. span ) ;
489
+ self . field ( ident, expr, e. span )
490
+ } )
491
+ . collect :: < P < [ hir:: Field ] > > ( ) ;
492
+
493
+ let is_unit = fields. is_empty ( ) ;
494
+ let struct_path = [ sym:: ops, path] ;
495
+ let struct_path = self . std_path ( span, & struct_path, None , is_unit) ;
496
+ let struct_path = hir:: QPath :: Resolved ( None , P ( struct_path) ) ;
497
+
498
+ if is_unit {
499
+ hir:: ExprKind :: Path ( struct_path)
500
+ } else {
501
+ hir:: ExprKind :: Struct ( P ( struct_path) , fields, None )
502
+ }
503
+ }
504
+
500
505
fn lower_expr_asm ( & mut self , asm : & InlineAsm ) -> hir:: ExprKind {
501
506
let hir_asm = hir:: InlineAsm {
502
507
inputs : asm. inputs . iter ( ) . map ( |& ( ref c, _) | c. clone ( ) ) . collect ( ) ,
0 commit comments