@@ -1762,56 +1762,48 @@ impl<'a> LoweringContext<'a> {
1762
1762
ExprKind :: Try ( ref sub_expr) => {
1763
1763
// to:
1764
1764
//
1765
+ // match QuestionMark::question_mark(<expr>) {
1766
+ // Try::Continue(val) => val,
1767
+ // Try::Done(r) => return r,
1768
+ // }
1765
1769
// match Carrier::translate(<expr>) {
1766
1770
// Ok(val) => val,
1767
1771
// Err(err) => return Carrier::from_error(From::from(err))
1768
1772
// }
1769
1773
let unstable_span = self . allow_internal_unstable ( "?" , e. span ) ;
1770
1774
1771
- // Carrier::translate (<expr>)
1775
+ // QuestionMark::question_mark (<expr>)
1772
1776
let discr = {
1773
1777
// expand <expr>
1774
1778
let sub_expr = self . lower_expr ( sub_expr) ;
1775
1779
1776
- let path = & [ "ops" , "Carrier " , "translate " ] ;
1780
+ let path = & [ "ops" , "QuestionMark " , "question_mark " ] ;
1777
1781
let path = P ( self . expr_std_path ( unstable_span, path, ThinVec :: new ( ) ) ) ;
1778
1782
P ( self . expr_call ( e. span , path, hir_vec ! [ sub_expr] ) )
1779
1783
} ;
1780
1784
1781
- // Ok (val) => val
1785
+ // Continue (val) => val
1782
1786
let ok_arm = {
1783
1787
let val_ident = self . str_to_ident ( "val" ) ;
1784
- let val_pat = self . pat_ident ( e . span , val_ident) ;
1785
- let val_expr = P ( self . expr_ident ( e . span , val_ident, val_pat. id ) ) ;
1786
- let ok_pat = self . pat_ok ( e . span , val_pat) ;
1788
+ let val_pat = self . pat_ident ( unstable_span , val_ident) ;
1789
+ let val_expr = P ( self . expr_ident ( unstable_span , val_ident, val_pat. id ) ) ;
1790
+ let ok_pat = self . pat_continue ( unstable_span , val_pat) ;
1787
1791
1788
1792
self . arm ( hir_vec ! [ ok_pat] , val_expr)
1789
1793
} ;
1790
1794
1791
- // Err(err ) => return Carrier::from_error(From::from(err))
1795
+ // Done(r ) => return r
1792
1796
let err_arm = {
1793
1797
let err_ident = self . str_to_ident ( "err" ) ;
1794
- let err_local = self . pat_ident ( e. span , err_ident) ;
1795
- let from_expr = {
1796
- let path = & [ "convert" , "From" , "from" ] ;
1797
- let from = P ( self . expr_std_path ( e. span , path, ThinVec :: new ( ) ) ) ;
1798
- let err_expr = self . expr_ident ( e. span , err_ident, err_local. id ) ;
1799
-
1800
- self . expr_call ( e. span , from, hir_vec ! [ err_expr] )
1801
- } ;
1802
- let from_err_expr = {
1803
- let path = & [ "ops" , "Carrier" , "from_error" ] ;
1804
- let from_err = P ( self . expr_std_path ( unstable_span, path,
1805
- ThinVec :: new ( ) ) ) ;
1806
- P ( self . expr_call ( e. span , from_err, hir_vec ! [ from_expr] ) )
1807
- } ;
1798
+ let err_local = self . pat_ident ( unstable_span, err_ident) ;
1808
1799
1809
- let ret_expr = P ( self . expr ( e. span ,
1810
- hir:: Expr_ :: ExprRet ( Some ( from_err_expr) ) ,
1800
+ let err_expr = self . expr_ident ( unstable_span, err_ident, err_local. id ) ;
1801
+ let ret_expr = P ( self . expr ( unstable_span,
1802
+ hir:: Expr_ :: ExprRet ( Some ( P ( err_expr) ) ) ,
1811
1803
ThinVec :: new ( ) ) ) ;
1812
1804
1813
- let err_pat = self . pat_err ( e . span , err_local) ;
1814
- self . arm ( hir_vec ! [ err_pat ] , ret_expr)
1805
+ let done_pat = self . pat_done ( unstable_span , err_local) ;
1806
+ self . arm ( hir_vec ! [ done_pat ] , ret_expr)
1815
1807
} ;
1816
1808
1817
1809
return self . expr_match ( e. span , discr, hir_vec ! [ err_arm, ok_arm] ,
@@ -2060,14 +2052,6 @@ impl<'a> LoweringContext<'a> {
2060
2052
}
2061
2053
}
2062
2054
2063
- fn pat_ok ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
2064
- self . pat_std_enum ( span, & [ "result" , "Result" , "Ok" ] , hir_vec ! [ pat] )
2065
- }
2066
-
2067
- fn pat_err ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
2068
- self . pat_std_enum ( span, & [ "result" , "Result" , "Err" ] , hir_vec ! [ pat] )
2069
- }
2070
-
2071
2055
fn pat_some ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
2072
2056
self . pat_std_enum ( span, & [ "option" , "Option" , "Some" ] , hir_vec ! [ pat] )
2073
2057
}
@@ -2076,6 +2060,14 @@ impl<'a> LoweringContext<'a> {
2076
2060
self . pat_std_enum ( span, & [ "option" , "Option" , "None" ] , hir_vec ! [ ] )
2077
2061
}
2078
2062
2063
+ fn pat_continue ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
2064
+ self . pat_std_enum ( span, & [ "ops" , "Try" , "Continue" ] , hir_vec ! [ pat] )
2065
+ }
2066
+
2067
+ fn pat_done ( & mut self , span : Span , pat : P < hir:: Pat > ) -> P < hir:: Pat > {
2068
+ self . pat_std_enum ( span, & [ "ops" , "Try" , "Done" ] , hir_vec ! [ pat] )
2069
+ }
2070
+
2079
2071
fn pat_std_enum ( & mut self ,
2080
2072
span : Span ,
2081
2073
components : & [ & str ] ,
0 commit comments