@@ -964,7 +964,7 @@ impl<'a> LoweringContext<'a> {
964
964
let inplace_finalize = [ "ops" , "InPlace" , "finalize" ] ;
965
965
966
966
let make_call = |this : & mut LoweringContext , p, args| {
967
- let path = this. core_path ( e. span , p) ;
967
+ let path = this. std_path ( e. span , p) ;
968
968
let path = this. expr_path ( path, ThinVec :: new ( ) ) ;
969
969
this. expr_call ( e. span , path, args)
970
970
} ;
@@ -1157,15 +1157,13 @@ impl<'a> LoweringContext<'a> {
1157
1157
ast_expr : & Expr ,
1158
1158
path : & [ & str ] ,
1159
1159
fields : & [ ( & str , & P < Expr > ) ] ) -> P < hir:: Expr > {
1160
- let strs = this. std_path ( & iter:: once ( & "ops" )
1161
- . chain ( path)
1162
- . map ( |s| * s)
1163
- . collect :: < Vec < _ > > ( ) ) ;
1164
-
1165
- let structpath = this. path_global ( ast_expr. span , strs) ;
1160
+ let struct_path = this. std_path ( ast_expr. span ,
1161
+ & iter:: once ( & "ops" ) . chain ( path)
1162
+ . map ( |s| * s)
1163
+ . collect :: < Vec < _ > > ( ) ) ;
1166
1164
1167
1165
let hir_expr = if fields. len ( ) == 0 {
1168
- this. expr_path ( structpath , ast_expr. attrs . clone ( ) )
1166
+ this. expr_path ( struct_path , ast_expr. attrs . clone ( ) )
1169
1167
} else {
1170
1168
let fields = fields. into_iter ( ) . map ( |& ( s, e) | {
1171
1169
let expr = this. lower_expr ( & e) ;
@@ -1178,7 +1176,7 @@ impl<'a> LoweringContext<'a> {
1178
1176
} ) . collect ( ) ;
1179
1177
let attrs = ast_expr. attrs . clone ( ) ;
1180
1178
1181
- this. expr_struct ( ast_expr. span , structpath , fields, None , attrs)
1179
+ this. expr_struct ( ast_expr. span , struct_path , fields, None , attrs)
1182
1180
} ;
1183
1181
1184
1182
this. signal_block_expr ( hir_vec ! [ ] ,
@@ -1461,11 +1459,7 @@ impl<'a> LoweringContext<'a> {
1461
1459
1462
1460
// `match ::std::iter::Iterator::next(&mut iter) { ... }`
1463
1461
let match_expr = {
1464
- let next_path = {
1465
- let strs = self . std_path ( & [ "iter" , "Iterator" , "next" ] ) ;
1466
-
1467
- self . path_global ( e. span , strs)
1468
- } ;
1462
+ let next_path = self . std_path ( e. span , & [ "iter" , "Iterator" , "next" ] ) ;
1469
1463
let iter = self . expr_ident ( e. span , iter, iter_pat. id ) ;
1470
1464
let ref_mut_iter = self . expr_mut_addr_of ( e. span , iter) ;
1471
1465
let next_path = self . expr_path ( next_path, ThinVec :: new ( ) ) ;
@@ -1492,11 +1486,8 @@ impl<'a> LoweringContext<'a> {
1492
1486
1493
1487
// `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
1494
1488
let into_iter_expr = {
1495
- let into_iter_path = {
1496
- let strs = self . std_path ( & [ "iter" , "IntoIterator" , "into_iter" ] ) ;
1497
-
1498
- self . path_global ( e. span , strs)
1499
- } ;
1489
+ let into_iter_path = self . std_path ( e. span ,
1490
+ & [ "iter" , "IntoIterator" , "into_iter" ] ) ;
1500
1491
1501
1492
let into_iter = self . expr_path ( into_iter_path, ThinVec :: new ( ) ) ;
1502
1493
self . expr_call ( e. span , into_iter, hir_vec ! [ head] )
@@ -1525,16 +1516,32 @@ impl<'a> LoweringContext<'a> {
1525
1516
// to:
1526
1517
//
1527
1518
// {
1528
- // match <expr> {
1519
+ // match { Carrier::translate( { <expr> } ) } {
1529
1520
// Ok(val) => val,
1530
- // Err(err) => {
1531
- // return Err(From::from(err))
1532
- // }
1521
+ // Err(err) => { return Carrier::from_error(From::from(err)); }
1533
1522
// }
1534
1523
// }
1535
1524
1536
- // expand <expr>
1537
- let sub_expr = self . lower_expr ( sub_expr) ;
1525
+ // { Carrier::translate( { <expr> } ) }
1526
+ let discr = {
1527
+ // expand <expr>
1528
+ let sub_expr = self . lower_expr ( sub_expr) ;
1529
+ let sub_expr = self . signal_block_expr ( hir_vec ! [ ] ,
1530
+ sub_expr,
1531
+ e. span ,
1532
+ hir:: PopUnstableBlock ,
1533
+ ThinVec :: new ( ) ) ;
1534
+
1535
+ let path = self . std_path ( e. span , & [ "ops" , "Carrier" , "translate" ] ) ;
1536
+ let path = self . expr_path ( path, ThinVec :: new ( ) ) ;
1537
+ let call = self . expr_call ( e. span , path, hir_vec ! [ sub_expr] ) ;
1538
+
1539
+ self . signal_block_expr ( hir_vec ! [ ] ,
1540
+ call,
1541
+ e. span ,
1542
+ hir:: PushUnstableBlock ,
1543
+ ThinVec :: new ( ) )
1544
+ } ;
1538
1545
1539
1546
// Ok(val) => val
1540
1547
let ok_arm = {
@@ -1546,32 +1553,35 @@ impl<'a> LoweringContext<'a> {
1546
1553
self . arm ( hir_vec ! [ ok_pat] , val_expr)
1547
1554
} ;
1548
1555
1549
- // Err(err) => return Err (From::from(err))
1556
+ // Err(err) => { return Carrier::from_error (From::from(err)); }
1550
1557
let err_arm = {
1551
1558
let err_ident = self . str_to_ident ( "err" ) ;
1552
1559
let err_local = self . pat_ident ( e. span , err_ident) ;
1553
1560
let from_expr = {
1554
- let path = self . std_path ( & [ "convert" , "From" , "from" ] ) ;
1555
- let path = self . path_global ( e. span , path) ;
1561
+ let path = self . std_path ( e. span , & [ "convert" , "From" , "from" ] ) ;
1556
1562
let from = self . expr_path ( path, ThinVec :: new ( ) ) ;
1557
1563
let err_expr = self . expr_ident ( e. span , err_ident, err_local. id ) ;
1558
1564
1559
1565
self . expr_call ( e. span , from, hir_vec ! [ err_expr] )
1560
1566
} ;
1561
- let err_expr = {
1562
- let path = self . std_path ( & [ "result" , "Result" , "Err" ] ) ;
1563
- let path = self . path_global ( e. span , path) ;
1564
- let err_ctor = self . expr_path ( path, ThinVec :: new ( ) ) ;
1565
- self . expr_call ( e. span , err_ctor, hir_vec ! [ from_expr] )
1567
+ let from_err_expr = {
1568
+ let path = self . std_path ( e. span , & [ "ops" , "Carrier" , "from_error" ] ) ;
1569
+ let from_err = self . expr_path ( path, ThinVec :: new ( ) ) ;
1570
+ self . expr_call ( e. span , from_err, hir_vec ! [ from_expr] )
1566
1571
} ;
1567
- let err_pat = self . pat_err ( e . span , err_local ) ;
1572
+
1568
1573
let ret_expr = self . expr ( e. span ,
1569
- hir:: Expr_ :: ExprRet ( Some ( err_expr) ) ,
1570
- ThinVec :: new ( ) ) ;
1571
- self . arm ( hir_vec ! [ err_pat] , ret_expr)
1574
+ hir:: Expr_ :: ExprRet ( Some ( from_err_expr) ) ,
1575
+ ThinVec :: new ( ) ) ;
1576
+ let ret_stmt = self . stmt_expr ( ret_expr) ;
1577
+ let block = self . signal_block_stmt ( ret_stmt, e. span ,
1578
+ hir:: PushUnstableBlock , ThinVec :: new ( ) ) ;
1579
+
1580
+ let err_pat = self . pat_err ( e. span , err_local) ;
1581
+ self . arm ( hir_vec ! [ err_pat] , block)
1572
1582
} ;
1573
1583
1574
- return self . expr_match ( e. span , sub_expr , hir_vec ! [ err_arm, ok_arm] ,
1584
+ return self . expr_match ( e. span , discr , hir_vec ! [ err_arm, ok_arm] ,
1575
1585
hir:: MatchSource :: TryDesugar ) ;
1576
1586
}
1577
1587
@@ -1785,6 +1795,15 @@ impl<'a> LoweringContext<'a> {
1785
1795
( respan ( sp, hir:: StmtDecl ( P ( decl) , self . next_id ( ) ) ) , pat_id)
1786
1796
}
1787
1797
1798
+ // Turns `<expr>` into `<expr>;`, note that this produces a StmtSemi, not a
1799
+ // StmtExpr.
1800
+ fn stmt_expr ( & self , expr : P < hir:: Expr > ) -> hir:: Stmt {
1801
+ hir:: Stmt {
1802
+ span : expr. span ,
1803
+ node : hir:: StmtSemi ( expr, self . next_id ( ) ) ,
1804
+ }
1805
+ }
1806
+
1788
1807
fn block_expr ( & mut self , expr : P < hir:: Expr > ) -> P < hir:: Block > {
1789
1808
self . block_all ( expr. span , hir:: HirVec :: new ( ) , Some ( expr) )
1790
1809
}
@@ -1801,26 +1820,22 @@ impl<'a> LoweringContext<'a> {
1801
1820
}
1802
1821
1803
1822
fn pat_ok ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1804
- let ok = self . std_path ( & [ "result" , "Result" , "Ok" ] ) ;
1805
- let path = self . path_global ( span, ok) ;
1823
+ let path = self . std_path ( span, & [ "result" , "Result" , "Ok" ] ) ;
1806
1824
self . pat_enum ( span, path, hir_vec ! [ pat] )
1807
1825
}
1808
1826
1809
1827
fn pat_err ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1810
- let err = self . std_path ( & [ "result" , "Result" , "Err" ] ) ;
1811
- let path = self . path_global ( span, err) ;
1828
+ let path = self . std_path ( span, & [ "result" , "Result" , "Err" ] ) ;
1812
1829
self . pat_enum ( span, path, hir_vec ! [ pat] )
1813
1830
}
1814
1831
1815
1832
fn pat_some ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1816
- let some = self . std_path ( & [ "option" , "Option" , "Some" ] ) ;
1817
- let path = self . path_global ( span, some) ;
1833
+ let path = self . std_path ( span, & [ "option" , "Option" , "Some" ] ) ;
1818
1834
self . pat_enum ( span, path, hir_vec ! [ pat] )
1819
1835
}
1820
1836
1821
1837
fn pat_none ( & mut self , span : Span ) -> P < hir:: Pat > {
1822
- let none = self . std_path ( & [ "option" , "Option" , "None" ] ) ;
1823
- let path = self . path_global ( span, none) ;
1838
+ let path = self . std_path ( span, & [ "option" , "Option" , "None" ] ) ;
1824
1839
self . pat_enum ( span, path, hir_vec ! [ ] )
1825
1840
}
1826
1841
@@ -1918,7 +1933,7 @@ impl<'a> LoweringContext<'a> {
1918
1933
}
1919
1934
}
1920
1935
1921
- fn std_path ( & mut self , components : & [ & str ] ) -> Vec < Name > {
1936
+ fn std_path_components ( & mut self , components : & [ & str ] ) -> Vec < Name > {
1922
1937
let mut v = Vec :: new ( ) ;
1923
1938
if let Some ( s) = self . crate_root {
1924
1939
v. push ( token:: intern ( s) ) ;
@@ -1929,8 +1944,8 @@ impl<'a> LoweringContext<'a> {
1929
1944
1930
1945
// Given suffix ["b","c","d"], returns path `::std::b::c::d` when
1931
1946
// `fld.cx.use_std`, and `::core::b::c::d` otherwise.
1932
- fn core_path ( & mut self , span : Span , components : & [ & str ] ) -> hir:: Path {
1933
- let idents = self . std_path ( components) ;
1947
+ fn std_path ( & mut self , span : Span , components : & [ & str ] ) -> hir:: Path {
1948
+ let idents = self . std_path_components ( components) ;
1934
1949
self . path_global ( span, idents)
1935
1950
}
1936
1951
@@ -1951,4 +1966,21 @@ impl<'a> LoweringContext<'a> {
1951
1966
} ) ;
1952
1967
self . expr_block ( block, attrs)
1953
1968
}
1969
+
1970
+ fn signal_block_stmt ( & mut self ,
1971
+ stmt : hir:: Stmt ,
1972
+ span : Span ,
1973
+ rule : hir:: BlockCheckMode ,
1974
+ attrs : ThinVec < Attribute > )
1975
+ -> P < hir:: Expr > {
1976
+ let id = self . next_id ( ) ;
1977
+ let block = P ( hir:: Block {
1978
+ rules : rule,
1979
+ span : span,
1980
+ id : id,
1981
+ stmts : hir_vec ! [ stmt] ,
1982
+ expr : None ,
1983
+ } ) ;
1984
+ self . expr_block ( block, attrs)
1985
+ }
1954
1986
}
0 commit comments