Rollup merge of #7235 - camsteffen:manual-unwrap-or-deref, r=flip1995
Fix another manual_unwrap_or deref FP changelog: none (since this just piggybacks on #7233) Fixes #6960
This commit is contained in:
commit
99fb776ace
@ -11,7 +11,6 @@
|
||||
use rustc_lint::LintContext;
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::lint::in_external_macro;
|
||||
use rustc_middle::ty::adjustment::Adjust;
|
||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||
use rustc_span::sym;
|
||||
|
||||
@ -54,21 +53,6 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
enum Case {
|
||||
Option,
|
||||
Result,
|
||||
}
|
||||
|
||||
impl Case {
|
||||
fn unwrap_fn_path(&self) -> &str {
|
||||
match self {
|
||||
Case::Option => "Option::unwrap_or",
|
||||
Case::Result => "Result::unwrap_or",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn lint_manual_unwrap_or<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
|
||||
fn applicable_or_arm<'a>(cx: &LateContext<'_>, arms: &'a [Arm<'a>]) -> Option<&'a Arm<'a>> {
|
||||
if_chain! {
|
||||
@ -87,9 +71,8 @@ fn applicable_or_arm<'a>(cx: &LateContext<'_>, arms: &'a [Arm<'a>]) -> Option<&'
|
||||
if is_lang_ctor(cx, qpath, OptionSome) || is_lang_ctor(cx, qpath, ResultOk);
|
||||
if let PatKind::Binding(_, binding_hir_id, ..) = unwrap_pat.kind;
|
||||
if path_to_local_id(unwrap_arm.body, binding_hir_id);
|
||||
if cx.typeck_results().expr_adjustments(unwrap_arm.body).is_empty();
|
||||
if !contains_return_break_continue_macro(or_arm.body);
|
||||
if !cx.typeck_results().expr_adjustments(unwrap_arm.body).iter()
|
||||
.any(|a| matches!(a.kind, Adjust::Deref(Some(..))));
|
||||
then {
|
||||
Some(or_arm)
|
||||
} else {
|
||||
@ -101,10 +84,10 @@ fn applicable_or_arm<'a>(cx: &LateContext<'_>, arms: &'a [Arm<'a>]) -> Option<&'
|
||||
if_chain! {
|
||||
if let ExprKind::Match(scrutinee, match_arms, _) = expr.kind;
|
||||
let ty = cx.typeck_results().expr_ty(scrutinee);
|
||||
if let Some(case) = if is_type_diagnostic_item(cx, ty, sym::option_type) {
|
||||
Some(Case::Option)
|
||||
if let Some(ty_name) = if is_type_diagnostic_item(cx, ty, sym::option_type) {
|
||||
Some("Option")
|
||||
} else if is_type_diagnostic_item(cx, ty, sym::result_type) {
|
||||
Some(Case::Result)
|
||||
Some("Result")
|
||||
} else {
|
||||
None
|
||||
};
|
||||
@ -127,7 +110,7 @@ fn applicable_or_arm<'a>(cx: &LateContext<'_>, arms: &'a [Arm<'a>]) -> Option<&'
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
MANUAL_UNWRAP_OR, expr.span,
|
||||
&format!("this pattern reimplements `{}`", case.unwrap_fn_path()),
|
||||
&format!("this pattern reimplements `{}::unwrap_or`", ty_name),
|
||||
"replace with",
|
||||
format!(
|
||||
"{}.unwrap_or({})",
|
||||
|
@ -171,4 +171,11 @@ fn format_name(name: Option<&Rc<str>>) -> &str {
|
||||
}
|
||||
}
|
||||
|
||||
fn implicit_deref_ref() {
|
||||
let _: &str = match Some(&"bye") {
|
||||
None => "hi",
|
||||
Some(s) => s,
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -213,4 +213,11 @@ fn format_name(name: Option<&Rc<str>>) -> &str {
|
||||
}
|
||||
}
|
||||
|
||||
fn implicit_deref_ref() {
|
||||
let _: &str = match Some(&"bye") {
|
||||
None => "hi",
|
||||
Some(s) => s,
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
Loading…
Reference in New Issue
Block a user