@@ -955,7 +955,7 @@ impl<'a> LoweringContext<'a> {
955955 let inplace_finalize = [ "ops" , "InPlace" , "finalize" ] ;
956956
957957 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) ;
959959 let path = this. expr_path ( path, None ) ;
960960 this. expr_call ( e. span , path, args, None )
961961 } ;
@@ -1147,15 +1147,13 @@ impl<'a> LoweringContext<'a> {
11471147 ast_expr : & Expr ,
11481148 path : & [ & str ] ,
11491149 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 < _ > > ( ) ) ;
11561154
11571155 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 ( ) )
11591157 } else {
11601158 let fields = fields. into_iter ( ) . map ( |& ( s, e) | {
11611159 let expr = this. lower_expr ( & e) ;
@@ -1168,7 +1166,7 @@ impl<'a> LoweringContext<'a> {
11681166 } ) . collect ( ) ;
11691167 let attrs = ast_expr. attrs . clone ( ) ;
11701168
1171- this. expr_struct ( ast_expr. span , structpath , fields, None , attrs)
1169+ this. expr_struct ( ast_expr. span , struct_path , fields, None , attrs)
11721170 } ;
11731171
11741172 this. signal_block_expr ( hir_vec ! [ ] ,
@@ -1452,11 +1450,7 @@ impl<'a> LoweringContext<'a> {
14521450
14531451 // `match ::std::iter::Iterator::next(&mut iter) { ... }`
14541452 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" ] ) ;
14601454 let iter = self . expr_ident ( e. span , iter, None , iter_pat. id ) ;
14611455 let ref_mut_iter = self . expr_mut_addr_of ( e. span , iter, None ) ;
14621456 let next_path = self . expr_path ( next_path, None ) ;
@@ -1483,11 +1477,8 @@ impl<'a> LoweringContext<'a> {
14831477
14841478 // `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
14851479 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" ] ) ;
14911482
14921483 let into_iter = self . expr_path ( into_iter_path, None ) ;
14931484 self . expr_call ( e. span , into_iter, hir_vec ! [ head] , None )
@@ -1517,16 +1508,25 @@ impl<'a> LoweringContext<'a> {
15171508 // to:
15181509 //
15191510 // {
1520- // match <expr> {
1511+ // match { Carrier::translate( { <expr> } ) } {
15211512 // Ok(val) => val,
1522- // Err(err) => {
1523- // return Err(From::from(err))
1524- // }
1513+ // Err(err) => return { Carrier::from_error(From::from(err)) },
15251514 // }
15261515 // }
15271516
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+ } ;
15301530
15311531 // Ok(val) => val
15321532 let ok_arm = {
@@ -1538,32 +1538,33 @@ impl<'a> LoweringContext<'a> {
15381538 self . arm ( hir_vec ! [ ok_pat] , val_expr)
15391539 } ;
15401540
1541- // Err(err) => return Err (From::from(err))
1541+ // Err(err) => return { Carrier::from_error (From::from(err)) },
15421542 let err_arm = {
15431543 let err_ident = self . str_to_ident ( "err" ) ;
15441544 let err_local = self . pat_ident ( e. span , err_ident) ;
15451545 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" ] ) ;
15481547 let from = self . expr_path ( path, None ) ;
15491548 let err_expr = self . expr_ident ( e. span , err_ident, None , err_local. id ) ;
15501549
15511550 self . expr_call ( e. span , from, hir_vec ! [ err_expr] , None )
15521551 } ;
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 )
15581559 } ;
15591560 let err_pat = self . pat_err ( e. span , err_local) ;
15601561 let ret_expr = self . expr ( e. span ,
1561- hir:: Expr_ :: ExprRet ( Some ( err_expr ) ) , None ) ;
1562+ hir:: Expr_ :: ExprRet ( Some ( from_err_expr ) ) , None ) ;
15621563
15631564 self . arm ( hir_vec ! [ err_pat] , ret_expr)
15641565 } ;
15651566
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] ,
15671568 hir:: MatchSource :: TryDesugar , None ) ;
15681569 }
15691570
@@ -1798,26 +1799,22 @@ impl<'a> LoweringContext<'a> {
17981799 }
17991800
18001801 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" ] ) ;
18031803 self . pat_enum ( span, path, hir_vec ! [ pat] )
18041804 }
18051805
18061806 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" ] ) ;
18091808 self . pat_enum ( span, path, hir_vec ! [ pat] )
18101809 }
18111810
18121811 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" ] ) ;
18151813 self . pat_enum ( span, path, hir_vec ! [ pat] )
18161814 }
18171815
18181816 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" ] ) ;
18211818 self . pat_enum ( span, path, hir_vec ! [ ] )
18221819 }
18231820
@@ -1915,7 +1912,7 @@ impl<'a> LoweringContext<'a> {
19151912 }
19161913 }
19171914
1918- fn std_path ( & mut self , components : & [ & str ] ) -> Vec < hir:: Ident > {
1915+ fn std_path_components ( & mut self , components : & [ & str ] ) -> Vec < hir:: Ident > {
19191916 let mut v = Vec :: new ( ) ;
19201917 if let Some ( s) = self . crate_root {
19211918 v. push ( hir:: Ident :: from_name ( token:: intern ( s) ) ) ;
@@ -1926,8 +1923,8 @@ impl<'a> LoweringContext<'a> {
19261923
19271924 // Given suffix ["b","c","d"], returns path `::std::b::c::d` when
19281925 // `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) ;
19311928 self . path_global ( span, idents)
19321929 }
19331930
0 commit comments