@@ -955,7 +955,7 @@ impl<'a> LoweringContext<'a> {
955
955
let inplace_finalize = [ "ops" , "InPlace" , "finalize" ] ;
956
956
957
957
let make_call = |this : & mut LoweringContext , p, args| {
958
- let path = this. core_path ( e. span , p) ;
958
+ let path = this. std_path ( e. span , p) ;
959
959
let path = this. expr_path ( path, None ) ;
960
960
this. expr_call ( e. span , path, args, None )
961
961
} ;
@@ -1147,15 +1147,13 @@ impl<'a> LoweringContext<'a> {
1147
1147
ast_expr : & Expr ,
1148
1148
path : & [ & str ] ,
1149
1149
fields : & [ ( & str , & P < Expr > ) ] ) -> P < hir:: Expr > {
1150
- let strs = this. std_path ( & iter:: once ( & "ops" )
1151
- . chain ( path)
1152
- . map ( |s| * s)
1153
- . collect :: < Vec < _ > > ( ) ) ;
1154
-
1155
- let structpath = this. path_global ( ast_expr. span , strs) ;
1150
+ let struct_path = this. std_path ( ast_expr. span ,
1151
+ & iter:: once ( & "ops" ) . chain ( path)
1152
+ . map ( |s| * s)
1153
+ . collect :: < Vec < _ > > ( ) ) ;
1156
1154
1157
1155
let hir_expr = if fields. len ( ) == 0 {
1158
- this. expr_path ( structpath , ast_expr. attrs . clone ( ) )
1156
+ this. expr_path ( struct_path , ast_expr. attrs . clone ( ) )
1159
1157
} else {
1160
1158
let fields = fields. into_iter ( ) . map ( |& ( s, e) | {
1161
1159
let expr = this. lower_expr ( & e) ;
@@ -1168,7 +1166,7 @@ impl<'a> LoweringContext<'a> {
1168
1166
} ) . collect ( ) ;
1169
1167
let attrs = ast_expr. attrs . clone ( ) ;
1170
1168
1171
- this. expr_struct ( ast_expr. span , structpath , fields, None , attrs)
1169
+ this. expr_struct ( ast_expr. span , struct_path , fields, None , attrs)
1172
1170
} ;
1173
1171
1174
1172
this. signal_block_expr ( hir_vec ! [ ] ,
@@ -1452,11 +1450,7 @@ impl<'a> LoweringContext<'a> {
1452
1450
1453
1451
// `match ::std::iter::Iterator::next(&mut iter) { ... }`
1454
1452
let match_expr = {
1455
- let next_path = {
1456
- let strs = self . std_path ( & [ "iter" , "Iterator" , "next" ] ) ;
1457
-
1458
- self . path_global ( e. span , strs)
1459
- } ;
1453
+ let next_path = self . std_path ( e. span , & [ "iter" , "Iterator" , "next" ] ) ;
1460
1454
let iter = self . expr_ident ( e. span , iter, None , iter_pat. id ) ;
1461
1455
let ref_mut_iter = self . expr_mut_addr_of ( e. span , iter, None ) ;
1462
1456
let next_path = self . expr_path ( next_path, None ) ;
@@ -1483,11 +1477,8 @@ impl<'a> LoweringContext<'a> {
1483
1477
1484
1478
// `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
1485
1479
let into_iter_expr = {
1486
- let into_iter_path = {
1487
- let strs = self . std_path ( & [ "iter" , "IntoIterator" , "into_iter" ] ) ;
1488
-
1489
- self . path_global ( e. span , strs)
1490
- } ;
1480
+ let into_iter_path = self . std_path ( e. span ,
1481
+ & [ "iter" , "IntoIterator" , "into_iter" ] ) ;
1491
1482
1492
1483
let into_iter = self . expr_path ( into_iter_path, None ) ;
1493
1484
self . expr_call ( e. span , into_iter, hir_vec ! [ head] , None )
@@ -1517,16 +1508,25 @@ impl<'a> LoweringContext<'a> {
1517
1508
// to:
1518
1509
//
1519
1510
// {
1520
- // match <expr> {
1511
+ // match { Carrier::translate( { <expr> } ) } {
1521
1512
// Ok(val) => val,
1522
- // Err(err) => {
1523
- // return Err(From::from(err))
1524
- // }
1513
+ // Err(err) => return { Carrier::from_error(From::from(err)) },
1525
1514
// }
1526
1515
// }
1527
1516
1528
- // expand <expr>
1529
- let sub_expr = self . lower_expr ( sub_expr) ;
1517
+ // { Carrier::translate( { <expr> } ) }
1518
+ let discr = {
1519
+ // expand <expr>
1520
+ let sub_expr = self . lower_expr ( sub_expr) ;
1521
+ let sub_expr = self . signal_block_expr ( hir_vec ! [ ] , sub_expr, e. span ,
1522
+ hir:: PopUnstableBlock , None ) ;
1523
+
1524
+ let path = self . std_path ( e. span , & [ "ops" , "Carrier" , "translate" ] ) ;
1525
+ let path = self . expr_path ( path, None ) ;
1526
+ let call = self . expr_call ( e. span , path, hir_vec ! [ sub_expr] , None ) ;
1527
+
1528
+ self . signal_block_expr ( hir_vec ! [ ] , call, e. span , hir:: PushUnstableBlock , None )
1529
+ } ;
1530
1530
1531
1531
// Ok(val) => val
1532
1532
let ok_arm = {
@@ -1538,32 +1538,33 @@ impl<'a> LoweringContext<'a> {
1538
1538
self . arm ( hir_vec ! [ ok_pat] , val_expr)
1539
1539
} ;
1540
1540
1541
- // Err(err) => return Err (From::from(err))
1541
+ // Err(err) => return { Carrier::from_error (From::from(err)) },
1542
1542
let err_arm = {
1543
1543
let err_ident = self . str_to_ident ( "err" ) ;
1544
1544
let err_local = self . pat_ident ( e. span , err_ident) ;
1545
1545
let from_expr = {
1546
- let path = self . std_path ( & [ "convert" , "From" , "from" ] ) ;
1547
- let path = self . path_global ( e. span , path) ;
1546
+ let path = self . std_path ( e. span , & [ "convert" , "From" , "from" ] ) ;
1548
1547
let from = self . expr_path ( path, None ) ;
1549
1548
let err_expr = self . expr_ident ( e. span , err_ident, None , err_local. id ) ;
1550
1549
1551
1550
self . expr_call ( e. span , from, hir_vec ! [ err_expr] , None )
1552
1551
} ;
1553
- let err_expr = {
1554
- let path = self . std_path ( & [ "result" , "Result" , "Err" ] ) ;
1555
- let path = self . path_global ( e. span , path) ;
1556
- let err_ctor = self . expr_path ( path, None ) ;
1557
- self . expr_call ( e. span , err_ctor, hir_vec ! [ from_expr] , None )
1552
+ let from_err_expr = {
1553
+ let path = self . std_path ( e. span , & [ "ops" , "Carrier" , "from_error" ] ) ;
1554
+ let from_err = self . expr_path ( path, None ) ;
1555
+ let call = self . expr_call ( e. span , from_err, hir_vec ! [ from_expr] , None ) ;
1556
+
1557
+ self . signal_block_expr ( hir_vec ! [ ] , call, e. span ,
1558
+ hir:: PushUnstableBlock , None )
1558
1559
} ;
1559
1560
let err_pat = self . pat_err ( e. span , err_local) ;
1560
1561
let ret_expr = self . expr ( e. span ,
1561
- hir:: Expr_ :: ExprRet ( Some ( err_expr ) ) , None ) ;
1562
+ hir:: Expr_ :: ExprRet ( Some ( from_err_expr ) ) , None ) ;
1562
1563
1563
1564
self . arm ( hir_vec ! [ err_pat] , ret_expr)
1564
1565
} ;
1565
1566
1566
- return self . expr_match ( e. span , sub_expr , hir_vec ! [ err_arm, ok_arm] ,
1567
+ return self . expr_match ( e. span , discr , hir_vec ! [ err_arm, ok_arm] ,
1567
1568
hir:: MatchSource :: TryDesugar , None ) ;
1568
1569
}
1569
1570
@@ -1798,26 +1799,22 @@ impl<'a> LoweringContext<'a> {
1798
1799
}
1799
1800
1800
1801
fn pat_ok ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1801
- let ok = self . std_path ( & [ "result" , "Result" , "Ok" ] ) ;
1802
- let path = self . path_global ( span, ok) ;
1802
+ let path = self . std_path ( span, & [ "result" , "Result" , "Ok" ] ) ;
1803
1803
self . pat_enum ( span, path, hir_vec ! [ pat] )
1804
1804
}
1805
1805
1806
1806
fn pat_err ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1807
- let err = self . std_path ( & [ "result" , "Result" , "Err" ] ) ;
1808
- let path = self . path_global ( span, err) ;
1807
+ let path = self . std_path ( span, & [ "result" , "Result" , "Err" ] ) ;
1809
1808
self . pat_enum ( span, path, hir_vec ! [ pat] )
1810
1809
}
1811
1810
1812
1811
fn pat_some ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1813
- let some = self . std_path ( & [ "option" , "Option" , "Some" ] ) ;
1814
- let path = self . path_global ( span, some) ;
1812
+ let path = self . std_path ( span, & [ "option" , "Option" , "Some" ] ) ;
1815
1813
self . pat_enum ( span, path, hir_vec ! [ pat] )
1816
1814
}
1817
1815
1818
1816
fn pat_none ( & mut self , span : Span ) -> P < hir:: Pat > {
1819
- let none = self . std_path ( & [ "option" , "Option" , "None" ] ) ;
1820
- let path = self . path_global ( span, none) ;
1817
+ let path = self . std_path ( span, & [ "option" , "Option" , "None" ] ) ;
1821
1818
self . pat_enum ( span, path, hir_vec ! [ ] )
1822
1819
}
1823
1820
@@ -1915,7 +1912,7 @@ impl<'a> LoweringContext<'a> {
1915
1912
}
1916
1913
}
1917
1914
1918
- fn std_path ( & mut self , components : & [ & str ] ) -> Vec < hir:: Ident > {
1915
+ fn std_path_components ( & mut self , components : & [ & str ] ) -> Vec < hir:: Ident > {
1919
1916
let mut v = Vec :: new ( ) ;
1920
1917
if let Some ( s) = self . crate_root {
1921
1918
v. push ( hir:: Ident :: from_name ( token:: intern ( s) ) ) ;
@@ -1926,8 +1923,8 @@ impl<'a> LoweringContext<'a> {
1926
1923
1927
1924
// Given suffix ["b","c","d"], returns path `::std::b::c::d` when
1928
1925
// `fld.cx.use_std`, and `::core::b::c::d` otherwise.
1929
- fn core_path ( & mut self , span : Span , components : & [ & str ] ) -> hir:: Path {
1930
- let idents = self . std_path ( components) ;
1926
+ fn std_path ( & mut self , span : Span , components : & [ & str ] ) -> hir:: Path {
1927
+ let idents = self . std_path_components ( components) ;
1931
1928
self . path_global ( span, idents)
1932
1929
}
1933
1930
0 commit comments