@@ -1605,6 +1605,63 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
1605
1605
} ) ;
1606
1606
}
1607
1607
1608
+ // Desugar ExprKind::Try
1609
+ // From: `<expr>?`
1610
+ ExprKind :: Try ( ref sub_expr) => {
1611
+ // to:
1612
+ //
1613
+ // {
1614
+ // match <expr> {
1615
+ // Ok(val) => val,
1616
+ // Err(err) => {
1617
+ // return Err(From::from(err))
1618
+ // }
1619
+ // }
1620
+ // }
1621
+
1622
+ return cache_ids ( lctx, e. id , |lctx| {
1623
+ // expand <expr>
1624
+ let sub_expr = lower_expr ( lctx, sub_expr) ;
1625
+
1626
+ // Ok(val) => val
1627
+ let ok_arm = {
1628
+ let val_ident = lctx. str_to_ident ( "val" ) ;
1629
+ let val_pat = pat_ident ( lctx, e. span , val_ident) ;
1630
+ let val_expr = expr_ident ( lctx, e. span , val_ident, None ) ;
1631
+ let ok_pat = pat_ok ( lctx, e. span , val_pat) ;
1632
+
1633
+ arm ( hir_vec ! [ ok_pat] , val_expr)
1634
+ } ;
1635
+
1636
+ // Err(err) => return Err(From::from(err))
1637
+ let err_arm = {
1638
+ let err_ident = lctx. str_to_ident ( "err" ) ;
1639
+ let from_expr = {
1640
+ let path = std_path ( lctx, & [ "convert" , "From" , "from" ] ) ;
1641
+ let path = path_global ( e. span , path) ;
1642
+ let from = expr_path ( lctx, path, None ) ;
1643
+ let err_expr = expr_ident ( lctx, e. span , err_ident, None ) ;
1644
+
1645
+ expr_call ( lctx, e. span , from, hir_vec ! [ err_expr] , None )
1646
+ } ;
1647
+ let err_expr = {
1648
+ let path = std_path ( lctx, & [ "result" , "Result" , "Err" ] ) ;
1649
+ let path = path_global ( e. span , path) ;
1650
+ let err_ctor = expr_path ( lctx, path, None ) ;
1651
+ expr_call ( lctx, e. span , err_ctor, hir_vec ! [ from_expr] , None )
1652
+ } ;
1653
+ let err_pat = pat_err ( lctx, e. span , pat_ident ( lctx, e. span , err_ident) ) ;
1654
+ let ret_expr = expr ( lctx, e. span ,
1655
+ hir:: Expr_ :: ExprRet ( Some ( err_expr) ) , None ) ;
1656
+
1657
+ arm ( hir_vec ! [ err_pat] , ret_expr)
1658
+ } ;
1659
+
1660
+ expr_match ( lctx, e. span , sub_expr, hir_vec ! [ err_arm, ok_arm] ,
1661
+ hir:: MatchSource :: TryDesugar , None )
1662
+ } )
1663
+ }
1664
+
1608
1665
ExprKind :: Mac ( _) => panic ! ( "Shouldn't exist here" ) ,
1609
1666
} ,
1610
1667
span : e. span ,
@@ -1819,6 +1876,18 @@ fn block_all(lctx: &LoweringContext,
1819
1876
} )
1820
1877
}
1821
1878
1879
+ fn pat_ok ( lctx : & LoweringContext , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1880
+ let ok = std_path ( lctx, & [ "result" , "Result" , "Ok" ] ) ;
1881
+ let path = path_global ( span, ok) ;
1882
+ pat_enum ( lctx, span, path, hir_vec ! [ pat] )
1883
+ }
1884
+
1885
+ fn pat_err ( lctx : & LoweringContext , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1886
+ let err = std_path ( lctx, & [ "result" , "Result" , "Err" ] ) ;
1887
+ let path = path_global ( span, err) ;
1888
+ pat_enum ( lctx, span, path, hir_vec ! [ pat] )
1889
+ }
1890
+
1822
1891
fn pat_some ( lctx : & LoweringContext , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
1823
1892
let some = std_path ( lctx, & [ "option" , "Option" , "Some" ] ) ;
1824
1893
let path = path_global ( span, some) ;
0 commit comments