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