@@ -1605,6 +1605,63 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
16051605 } ) ;
16061606 }
16071607
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+
16081665 ExprKind :: Mac ( _) => panic ! ( "Shouldn't exist here" ) ,
16091666 } ,
16101667 span : e. span ,
@@ -1819,6 +1876,18 @@ fn block_all(lctx: &LoweringContext,
18191876 } )
18201877}
18211878
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+
18221891fn pat_some ( lctx : & LoweringContext , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
18231892 let some = std_path ( lctx, & [ "option" , "Option" , "Some" ] ) ;
18241893 let path = path_global ( span, some) ;
0 commit comments