@@ -376,45 +376,7 @@ impl LoweringContext<'_> {
376376 )
377377 }
378378 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)
418380 }
419381 ExprKind :: Path ( ref qself, ref path) => {
420382 let qpath = self . lower_qpath (
@@ -497,6 +459,49 @@ impl LoweringContext<'_> {
497459 }
498460 }
499461
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+
500505 fn lower_expr_asm ( & mut self , asm : & InlineAsm ) -> hir:: ExprKind {
501506 let hir_asm = hir:: InlineAsm {
502507 inputs : asm. inputs . iter ( ) . map ( |& ( ref c, _) | c. clone ( ) ) . collect ( ) ,
0 commit comments