- if let ExprKind::Match(
- scrutinee,
- [arm1 @ Arm { guard: None, .. }, arm2 @ Arm { guard: None, .. }],
- match_kind,
- ) = expr.kind
- {
- if in_external_macro(cx.sess(), expr.span) || in_constant(cx, expr.hir_id) {
- return;
- }
-
- let (scrutinee_ty, ty_ref_count, ty_mutability) =
- peel_mid_ty_refs_is_mutable(cx.typeck_results().expr_ty(scrutinee));
- if !(is_type_diagnostic_item(cx, scrutinee_ty, sym::option_type)
- && is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::option_type))
- {
- return;
- }
-
- let expr_ctxt = expr.span.ctxt();
- let (some_expr, some_pat, pat_ref_count, is_wild_none) = match (
- try_parse_pattern(cx, arm1.pat, expr_ctxt),
- try_parse_pattern(cx, arm2.pat, expr_ctxt),
- ) {
- (Some(OptionPat::Wild), Some(OptionPat::Some { pattern, ref_count }))
- if is_none_expr(cx, arm1.body) =>
- {
- (arm2.body, pattern, ref_count, true)
- },
- (Some(OptionPat::None), Some(OptionPat::Some { pattern, ref_count }))
- if is_none_expr(cx, arm1.body) =>
- {
- (arm2.body, pattern, ref_count, false)
- },
- (Some(OptionPat::Some { pattern, ref_count }), Some(OptionPat::Wild))
- if is_none_expr(cx, arm2.body) =>
- {
- (arm1.body, pattern, ref_count, true)
- },
- (Some(OptionPat::Some { pattern, ref_count }), Some(OptionPat::None))
- if is_none_expr(cx, arm2.body) =>
- {
- (arm1.body, pattern, ref_count, false)
- },
- _ => return,
- };
+ let (scrutinee, then_pat, then_body, else_pat, else_body) = match IfLetOrMatch::parse(cx, expr) {
+ Some(IfLetOrMatch::IfLet(scrutinee, pat, body, Some(r#else))) => (scrutinee, pat, body, None, r#else),
+ Some(IfLetOrMatch::Match(
+ scrutinee,
+ [arm1 @ Arm { guard: None, .. }, arm2 @ Arm { guard: None, .. }],
+ _,
+ )) => (scrutinee, arm1.pat, arm1.body, Some(arm2.pat), arm2.body),
+ _ => return,
+ };
+ if in_external_macro(cx.sess(), expr.span) || in_constant(cx, expr.hir_id) {
+ return;
+ }