- fn moves_by_default(cx: &LateContext<'_, '_>, expression: &Expr) -> bool {
- let expr_ty = cx.tables.expr_ty(expression);
+ fn check_if_let_some_and_early_return_none(cx: &LateContext<'_>, expr: &Expr<'_>) {
+ if_chain! {
+ if let Some(higher::IfLet { let_pat, let_expr, if_then, if_else: Some(if_else) }) = higher::IfLet::hir(cx, expr);
+ if Self::is_option(cx, let_expr);
+
+ if let PatKind::TupleStruct(ref path1, fields, None) = let_pat.kind;
+ if is_lang_ctor(cx, path1, OptionSome);
+ if let PatKind::Binding(annot, bind_id, _, _) = fields[0].kind;
+ let by_ref = matches!(annot, BindingAnnotation::Ref | BindingAnnotation::RefMut);
+
+ if let ExprKind::Block(ref block, None) = if_then.kind;
+ if block.stmts.is_empty();
+ if let Some(trailing_expr) = &block.expr;
+ if path_to_local_id(trailing_expr, bind_id);