Don't lint Default::default if it is the udpate syntax base
An Update Syntax looks like this: Foo { a: 3, ..Default::default() } Don't lint `Default::default` here
This commit is contained in:
parent
4931cab709
commit
504f3af70e
3 changed files with 41 additions and 5 deletions
|
@ -1,7 +1,7 @@
|
|||
use clippy_utils::diagnostics::{span_lint_and_note, span_lint_and_sugg};
|
||||
use clippy_utils::source::snippet_with_macro_callsite;
|
||||
use clippy_utils::ty::{has_drop, is_copy};
|
||||
use clippy_utils::{any_parent_is_automatically_derived, contains_name, match_def_path, paths};
|
||||
use clippy_utils::{any_parent_is_automatically_derived, contains_name, get_parent_expr, match_def_path, paths};
|
||||
use if_chain::if_chain;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_errors::Applicability;
|
||||
|
@ -88,6 +88,7 @@ impl<'tcx> LateLintPass<'tcx> for Default {
|
|||
if let ExprKind::Path(ref qpath) = path.kind;
|
||||
if let Some(def_id) = cx.qpath_res(qpath, path.hir_id).opt_def_id();
|
||||
if match_def_path(cx, def_id, &paths::DEFAULT_TRAIT_METHOD);
|
||||
if !is_update_syntax_base(cx, expr);
|
||||
// Detect and ignore <Foo as Default>::default() because these calls do explicitly name the type.
|
||||
if let QPath::Resolved(None, _path) = qpath;
|
||||
let expr_ty = cx.typeck_results().expr_ty(expr);
|
||||
|
@ -290,3 +291,16 @@ fn field_reassigned_by_stmt<'tcx>(this: &Stmt<'tcx>, binding_name: Symbol) -> Op
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns whether `expr` is the update syntax base: `Foo { a: 1, .. base }`
|
||||
fn is_update_syntax_base<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) -> bool {
|
||||
if_chain! {
|
||||
if let Some(parent) = get_parent_expr(cx, expr);
|
||||
if let ExprKind::Struct(_, _, Some(base)) = parent.kind;
|
||||
then {
|
||||
base.hir_id == expr.hir_id
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,9 +46,14 @@ fn main() {
|
|||
|
||||
let s19 = <DerivedDefault as Default>::default();
|
||||
|
||||
let s20 = UpdateSyntax {
|
||||
s: "foo",
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
println!(
|
||||
"[{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}], [{:?}]",
|
||||
s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19,
|
||||
"[{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}]",
|
||||
s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -86,3 +91,9 @@ struct ArrayDerivedDefault {
|
|||
|
||||
#[derive(Debug, Default)]
|
||||
struct TupleStructDerivedDefault(String);
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
struct UpdateSyntax {
|
||||
pub s: &'static str,
|
||||
pub u: u64,
|
||||
}
|
||||
|
|
|
@ -46,9 +46,14 @@ fn main() {
|
|||
|
||||
let s19 = <DerivedDefault as Default>::default();
|
||||
|
||||
let s20 = UpdateSyntax {
|
||||
s: "foo",
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
println!(
|
||||
"[{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}], [{:?}]",
|
||||
s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19,
|
||||
"[{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}] [{:?}]",
|
||||
s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -86,3 +91,9 @@ struct ArrayDerivedDefault {
|
|||
|
||||
#[derive(Debug, Default)]
|
||||
struct TupleStructDerivedDefault(String);
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
struct UpdateSyntax {
|
||||
pub s: &'static str,
|
||||
pub u: u64,
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue