Auto merge of #11280 - samueltardieu:issue-11267, r=Centri3
[new_without_default]: include `where` clause in suggestions, make applicable changelog: [`new_without_default`]: include `where` clause in suggestions
This commit is contained in:
commit
1698ce0ba1
@ -130,6 +130,11 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
||||
}
|
||||
|
||||
let generics_sugg = snippet(cx, generics.span, "");
|
||||
let where_clause_sugg = if generics.has_where_clause_predicates {
|
||||
format!("\n{}\n", snippet(cx, generics.where_clause_span, ""))
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
let self_ty_fmt = self_ty.to_string();
|
||||
let self_type_snip = snippet(cx, impl_self_ty.span, &self_ty_fmt);
|
||||
span_lint_hir_and_then(
|
||||
@ -145,8 +150,12 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
||||
cx,
|
||||
item.span,
|
||||
"try adding this",
|
||||
&create_new_without_default_suggest_msg(&self_type_snip, &generics_sugg),
|
||||
Applicability::MaybeIncorrect,
|
||||
&create_new_without_default_suggest_msg(
|
||||
&self_type_snip,
|
||||
&generics_sugg,
|
||||
&where_clause_sugg
|
||||
),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
},
|
||||
);
|
||||
@ -159,10 +168,14 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
||||
}
|
||||
}
|
||||
|
||||
fn create_new_without_default_suggest_msg(self_type_snip: &str, generics_sugg: &str) -> String {
|
||||
fn create_new_without_default_suggest_msg(
|
||||
self_type_snip: &str,
|
||||
generics_sugg: &str,
|
||||
where_clause_sugg: &str,
|
||||
) -> String {
|
||||
#[rustfmt::skip]
|
||||
format!(
|
||||
"impl{generics_sugg} Default for {self_type_snip} {{
|
||||
"impl{generics_sugg} Default for {self_type_snip}{where_clause_sugg} {{
|
||||
fn default() -> Self {{
|
||||
Self::new()
|
||||
}}
|
||||
|
@ -102,7 +102,6 @@ impl<'c> LtKo<'c> {
|
||||
pub fn new() -> LtKo<'c> {
|
||||
unimplemented!()
|
||||
}
|
||||
// FIXME: that suggestion is missing lifetimes
|
||||
}
|
||||
|
||||
struct Private;
|
||||
@ -273,3 +272,30 @@ impl IgnoreLifetimeNew {
|
||||
Self
|
||||
}
|
||||
}
|
||||
|
||||
// From issue #11267
|
||||
|
||||
pub struct MyStruct<K, V>
|
||||
where
|
||||
K: std::hash::Hash + Eq + PartialEq,
|
||||
{
|
||||
_kv: Option<(K, V)>,
|
||||
}
|
||||
|
||||
impl<K, V> Default for MyStruct<K, V>
|
||||
where
|
||||
K: std::hash::Hash + Eq + PartialEq,
|
||||
{
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
impl<K, V> MyStruct<K, V>
|
||||
where
|
||||
K: std::hash::Hash + Eq + PartialEq,
|
||||
{
|
||||
pub fn new() -> Self {
|
||||
Self { _kv: None }
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +84,6 @@ impl<'c> LtKo<'c> {
|
||||
pub fn new() -> LtKo<'c> {
|
||||
unimplemented!()
|
||||
}
|
||||
// FIXME: that suggestion is missing lifetimes
|
||||
}
|
||||
|
||||
struct Private;
|
||||
@ -231,3 +230,21 @@ pub fn new<'a>() -> Self {
|
||||
Self
|
||||
}
|
||||
}
|
||||
|
||||
// From issue #11267
|
||||
|
||||
pub struct MyStruct<K, V>
|
||||
where
|
||||
K: std::hash::Hash + Eq + PartialEq,
|
||||
{
|
||||
_kv: Option<(K, V)>,
|
||||
}
|
||||
|
||||
impl<K, V> MyStruct<K, V>
|
||||
where
|
||||
K: std::hash::Hash + Eq + PartialEq,
|
||||
{
|
||||
pub fn new() -> Self {
|
||||
Self { _kv: None }
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ LL + }
|
||||
|
|
||||
|
||||
error: you should consider adding a `Default` implementation for `NewNotEqualToDerive`
|
||||
--> $DIR/new_without_default.rs:177:5
|
||||
--> $DIR/new_without_default.rs:176:5
|
||||
|
|
||||
LL | / pub fn new() -> Self {
|
||||
LL | | NewNotEqualToDerive { foo: 1 }
|
||||
@ -68,7 +68,7 @@ LL + }
|
||||
|
|
||||
|
||||
error: you should consider adding a `Default` implementation for `FooGenerics<T>`
|
||||
--> $DIR/new_without_default.rs:185:5
|
||||
--> $DIR/new_without_default.rs:184:5
|
||||
|
|
||||
LL | / pub fn new() -> Self {
|
||||
LL | | Self(Default::default())
|
||||
@ -85,7 +85,7 @@ LL + }
|
||||
|
|
||||
|
||||
error: you should consider adding a `Default` implementation for `BarGenerics<T>`
|
||||
--> $DIR/new_without_default.rs:192:5
|
||||
--> $DIR/new_without_default.rs:191:5
|
||||
|
|
||||
LL | / pub fn new() -> Self {
|
||||
LL | | Self(Default::default())
|
||||
@ -102,7 +102,7 @@ LL + }
|
||||
|
|
||||
|
||||
error: you should consider adding a `Default` implementation for `Foo<T>`
|
||||
--> $DIR/new_without_default.rs:203:9
|
||||
--> $DIR/new_without_default.rs:202:9
|
||||
|
|
||||
LL | / pub fn new() -> Self {
|
||||
LL | | todo!()
|
||||
@ -120,5 +120,25 @@ LL +
|
||||
LL ~ impl<T> Foo<T> {
|
||||
|
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
error: you should consider adding a `Default` implementation for `MyStruct<K, V>`
|
||||
--> $DIR/new_without_default.rs:247:5
|
||||
|
|
||||
LL | / pub fn new() -> Self {
|
||||
LL | | Self { _kv: None }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
help: try adding this
|
||||
|
|
||||
LL + impl<K, V> Default for MyStruct<K, V>
|
||||
LL + where
|
||||
LL + K: std::hash::Hash + Eq + PartialEq,
|
||||
LL + {
|
||||
LL + fn default() -> Self {
|
||||
LL + Self::new()
|
||||
LL + }
|
||||
LL + }
|
||||
|
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user