@@ -1900,57 +1900,45 @@ impl<'a> LoweringContext<'a> {
1900
1900
hir:: ExprIndex ( P ( self . lower_expr ( el) ) , P ( self . lower_expr ( er) ) )
1901
1901
}
1902
1902
ExprKind :: Range ( ref e1, ref e2, lims) => {
1903
- fn make_struct ( this : & mut LoweringContext ,
1904
- ast_expr : & Expr ,
1905
- path : & [ & str ] ,
1906
- fields : & [ ( & str , & P < Expr > ) ] ) -> hir:: Expr {
1907
- let struct_path = & iter:: once ( & "ops" ) . chain ( path) . map ( |s| * s)
1908
- . collect :: < Vec < _ > > ( ) ;
1909
- let unstable_span = this. allow_internal_unstable ( "..." , ast_expr. span ) ;
1910
-
1911
- if fields. len ( ) == 0 {
1912
- this. expr_std_path ( unstable_span, struct_path,
1913
- ast_expr. attrs . clone ( ) )
1914
- } else {
1915
- let fields = fields. into_iter ( ) . map ( |& ( s, e) | {
1916
- let expr = P ( this. lower_expr ( & e) ) ;
1917
- let unstable_span = this. allow_internal_unstable ( "..." , e. span ) ;
1918
- this. field ( Symbol :: intern ( s) , expr, unstable_span)
1919
- } ) . collect ( ) ;
1920
- let attrs = ast_expr. attrs . clone ( ) ;
1921
-
1922
- this. expr_std_struct ( unstable_span, struct_path, fields, None , attrs)
1923
- }
1924
- }
1925
-
1926
1903
use syntax:: ast:: RangeLimits :: * ;
1927
1904
1928
- return match ( e1, e2, lims) {
1929
- ( & None , & None , HalfOpen ) =>
1930
- make_struct ( self , e, & [ "RangeFull" ] , & [ ] ) ,
1931
-
1932
- ( & Some ( ref e1) , & None , HalfOpen ) =>
1933
- make_struct ( self , e, & [ "RangeFrom" ] ,
1934
- & [ ( "start" , e1) ] ) ,
1935
-
1936
- ( & None , & Some ( ref e2) , HalfOpen ) =>
1937
- make_struct ( self , e, & [ "RangeTo" ] ,
1938
- & [ ( "end" , e2) ] ) ,
1939
-
1940
- ( & Some ( ref e1) , & Some ( ref e2) , HalfOpen ) =>
1941
- make_struct ( self , e, & [ "Range" ] ,
1942
- & [ ( "start" , e1) , ( "end" , e2) ] ) ,
1943
-
1944
- ( & None , & Some ( ref e2) , Closed ) =>
1945
- make_struct ( self , e, & [ "RangeToInclusive" ] ,
1946
- & [ ( "end" , e2) ] ) ,
1947
-
1948
- ( & Some ( ref e1) , & Some ( ref e2) , Closed ) =>
1949
- make_struct ( self , e, & [ "RangeInclusive" , "NonEmpty" ] ,
1950
- & [ ( "start" , e1) , ( "end" , e2) ] ) ,
1905
+ let ( path, variant) = match ( e1, e2, lims) {
1906
+ ( & None , & None , HalfOpen ) => ( "RangeFull" , None ) ,
1907
+ ( & Some ( ..) , & None , HalfOpen ) => ( "RangeFrom" , None ) ,
1908
+ ( & None , & Some ( ..) , HalfOpen ) => ( "RangeTo" , None ) ,
1909
+ ( & Some ( ..) , & Some ( ..) , HalfOpen ) => ( "Range" , None ) ,
1910
+ ( & None , & Some ( ..) , Closed ) => ( "RangeToInclusive" , None ) ,
1911
+ ( & Some ( ..) , & Some ( ..) , Closed ) => ( "RangeInclusive" , Some ( "NonEmpty" ) ) ,
1912
+ ( _, & None , Closed ) =>
1913
+ panic ! ( self . diagnostic( ) . span_fatal(
1914
+ e. span, "inclusive range with no end" ) ) ,
1915
+ } ;
1951
1916
1952
- _ => panic ! ( self . diagnostic( )
1953
- . span_fatal( e. span, "inclusive range with no end" ) ) ,
1917
+ let fields =
1918
+ e1. iter ( ) . map ( |e| ( "start" , e) ) . chain ( e2. iter ( ) . map ( |e| ( "end" , e) ) )
1919
+ . map ( |( s, e) | {
1920
+ let expr = P ( self . lower_expr ( & e) ) ;
1921
+ let unstable_span = self . allow_internal_unstable ( "..." , e. span ) ;
1922
+ self . field ( Symbol :: intern ( s) , expr, unstable_span)
1923
+ } ) . collect :: < P < [ hir:: Field ] > > ( ) ;
1924
+
1925
+ let is_unit = fields. is_empty ( ) ;
1926
+ let unstable_span = self . allow_internal_unstable ( "..." , e. span ) ;
1927
+ let struct_path =
1928
+ iter:: once ( "ops" ) . chain ( iter:: once ( path) ) . chain ( variant)
1929
+ . collect :: < Vec < _ > > ( ) ;
1930
+ let struct_path = self . std_path ( unstable_span, & struct_path, is_unit) ;
1931
+ let struct_path = hir:: QPath :: Resolved ( None , P ( struct_path) ) ;
1932
+
1933
+ return hir:: Expr {
1934
+ id : self . lower_node_id ( e. id ) ,
1935
+ node : if is_unit {
1936
+ hir:: ExprPath ( struct_path)
1937
+ } else {
1938
+ hir:: ExprStruct ( struct_path, fields, None )
1939
+ } ,
1940
+ span : unstable_span,
1941
+ attrs : e. attrs . clone ( ) ,
1954
1942
} ;
1955
1943
}
1956
1944
ExprKind :: Path ( ref qself, ref path) => {
@@ -2613,17 +2601,6 @@ impl<'a> LoweringContext<'a> {
2613
2601
P ( self . expr ( sp, hir:: ExprTup ( exprs) , ThinVec :: new ( ) ) )
2614
2602
}
2615
2603
2616
- fn expr_std_struct ( & mut self ,
2617
- span : Span ,
2618
- components : & [ & str ] ,
2619
- fields : hir:: HirVec < hir:: Field > ,
2620
- e : Option < P < hir:: Expr > > ,
2621
- attrs : ThinVec < Attribute > ) -> hir:: Expr {
2622
- let path = self . std_path ( span, components, false ) ;
2623
- let qpath = hir:: QPath :: Resolved ( None , P ( path) ) ;
2624
- self . expr ( span, hir:: ExprStruct ( qpath, fields, e) , attrs)
2625
- }
2626
-
2627
2604
fn expr ( & mut self , span : Span , node : hir:: Expr_ , attrs : ThinVec < Attribute > ) -> hir:: Expr {
2628
2605
hir:: Expr {
2629
2606
id : self . next_id ( ) ,
0 commit comments