@@ -144,8 +144,10 @@ let expr_mapper ~async_context ~in_function_def (self : mapper)
144144 default_expr_mapper self
145145 {e with pexp_desc = Pexp_ifthenelse (b, t_exp, Some f_exp)}
146146 (* Transform:
147- - `@let.unwrap let Ok(inner_pat) = expr`
148- - `@let.unwrap let Some(inner_pat) = expr`
147+ - `@let.unwrap let Ok(inner_pat) = expr`
148+ - `@let.unwrap let Error(inner_pat) = expr`
149+ - `@let.unwrap let Some(inner_pat) = expr`
150+ - `@let.unwrap let None = expr`
149151 ...into switches *)
150152 | Pexp_let
151153 ( Nonrecursive ,
@@ -154,25 +156,32 @@ let expr_mapper ~async_context ~in_function_def (self : mapper)
154156 pvb_pat =
155157 {
156158 ppat_desc =
157- Ppat_construct
158- ( {txt = Lident ((" Ok" | " Some" ) as variant_name)},
159- Some _inner_pat );
159+ ( Ppat_construct
160+ ({txt = Lident (" Ok" as variant_name)}, Some _)
161+ | Ppat_construct
162+ ({txt = Lident (" Error" as variant_name)}, Some _)
163+ | Ppat_construct
164+ ({txt = Lident (" Some" as variant_name)}, Some _)
165+ | Ppat_construct
166+ ({txt = Lident (" None" as variant_name)}, None ) );
160167 } as pvb_pat;
161168 pvb_expr;
162169 pvb_attributes;
163170 };
164171 ],
165172 body )
166173 when Ast_attributes. has_unwrap_attr pvb_attributes -> (
167- let variant =
174+ let variant : [`Result_Ok | `Result_Error | `Option_Some | `Option_None] =
168175 match variant_name with
169- | "Ok" -> `Result
170- | _ -> `Option
176+ | "Ok" -> `Result_Ok
177+ | "Error" -> `Result_Error
178+ | "Some" -> `Option_Some
179+ | _ -> `Option_None
171180 in
172181 match pvb_expr.pexp_desc with
173182 | Pexp_pack _ -> default_expr_mapper self e
174183 | _ ->
175- let ok_case =
184+ let cont_case =
176185 {
177186 Parsetree. pc_bar = None ;
178187 pc_lhs = pvb_pat;
@@ -181,35 +190,61 @@ let expr_mapper ~async_context ~in_function_def (self : mapper)
181190 }
182191 in
183192 let loc = {pvb_pat.ppat_loc with loc_ghost = true } in
184- let error_case =
193+ let early_case =
185194 match variant with
186- | `Result ->
195+ (* Result: continue on Ok(_), early-return on Error(e) * )
196+ | `Result_Ok ->
187197 {
188198 Parsetree. pc_bar = None ;
189199 pc_lhs =
190- Ast_helper.Pat. construct ~loc
191- {txt = Lident " Error" ; loc}
192- (Some (Ast_helper.Pat. var ~loc {txt = " e" ; loc}));
200+ Ast_helper.Pat. alias
201+ (Ast_helper.Pat. construct ~loc
202+ {txt = Lident " Error" ; loc}
203+ (Some (Ast_helper.Pat. any ~loc () )))
204+ {txt = " e" ; loc};
193205 pc_guard = None ;
194- pc_rhs =
195- Ast_helper.Exp. construct ~loc
196- {txt = Lident " Error" ; loc}
197- (Some (Ast_helper.Exp. ident ~loc {txt = Lident " e" ; loc}));
206+ pc_rhs = Ast_helper.Exp. ident ~loc {txt = Lident " e" ; loc};
198207 }
199- | `Option ->
208+ (* Result: continue on Error(_), early-return on Ok(x) *)
209+ | `Result_Error ->
200210 {
201211 Parsetree. pc_bar = None ;
202212 pc_lhs =
203- Ast_helper.Pat. construct ~loc {txt = Lident " None" ; loc} None ;
213+ Ast_helper.Pat. alias
214+ (Ast_helper.Pat. construct ~loc {txt = Lident " Ok" ; loc}
215+ (Some (Ast_helper.Pat. any ~loc () )))
216+ {txt = " x" ; loc};
204217 pc_guard = None ;
205- pc_rhs =
206- Ast_helper.Exp. construct ~loc {txt = Lident " None" ; loc} None ;
218+ pc_rhs = Ast_helper.Exp. ident ~loc {txt = Lident " x" ; loc};
219+ }
220+ (* Option: continue on Some(_), early-return on None *)
221+ | `Option_Some ->
222+ {
223+ Parsetree. pc_bar = None ;
224+ pc_lhs =
225+ Ast_helper.Pat. alias
226+ (Ast_helper.Pat. construct ~loc {txt = Lident " None" ; loc} None )
227+ {txt = " x" ; loc};
228+ pc_guard = None ;
229+ pc_rhs = Ast_helper.Exp. ident ~loc {txt = Lident " x" ; loc};
230+ }
231+ (* Option: continue on None, early-return on Some(x) *)
232+ | `Option_None ->
233+ {
234+ Parsetree. pc_bar = None ;
235+ pc_lhs =
236+ Ast_helper.Pat. alias
237+ (Ast_helper.Pat. construct ~loc {txt = Lident " Some" ; loc}
238+ (Some (Ast_helper.Pat. any ~loc () )))
239+ {txt = " x" ; loc};
240+ pc_guard = None ;
241+ pc_rhs = Ast_helper.Exp. ident ~loc {txt = Lident " x" ; loc};
207242 }
208243 in
209244 default_expr_mapper self
210245 {
211246 e with
212- pexp_desc = Pexp_match (pvb_expr, [error_case; ok_case ]);
247+ pexp_desc = Pexp_match (pvb_expr, [early_case; cont_case ]);
213248 pexp_attributes = e.pexp_attributes @ pvb_attributes;
214249 })
215250 | Pexp_let
0 commit comments