mirror of
https://github.com/rust-lang/rust-clippy
synced 2025-02-17 14:38:46 +00:00
field_reassign_with_default: don't expand macros in suggestion
fixes #6522 changelog: field_reassign_with_default: don't expand macros in lint suggestion (#6522)
This commit is contained in:
parent
60919e416d
commit
5d48b91b40
3 changed files with 48 additions and 25 deletions
|
@ -1,4 +1,6 @@
|
||||||
use crate::utils::{any_parent_is_automatically_derived, contains_name, match_def_path, paths, qpath_res, snippet};
|
use crate::utils::{
|
||||||
|
any_parent_is_automatically_derived, contains_name, match_def_path, paths, qpath_res, snippet_with_macro_callsite,
|
||||||
|
};
|
||||||
use crate::utils::{span_lint_and_note, span_lint_and_sugg};
|
use crate::utils::{span_lint_and_note, span_lint_and_sugg};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
|
@ -187,7 +189,7 @@ impl LateLintPass<'_> for Default {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(field, rhs)| {
|
.map(|(field, rhs)| {
|
||||||
// extract and store the assigned value for help message
|
// extract and store the assigned value for help message
|
||||||
let value_snippet = snippet(cx, rhs.span, "..");
|
let value_snippet = snippet_with_macro_callsite(cx, rhs.span, "..");
|
||||||
format!("{}: {}", field, value_snippet)
|
format!("{}: {}", field, value_snippet)
|
||||||
})
|
})
|
||||||
.collect::<Vec<String>>()
|
.collect::<Vec<String>>()
|
||||||
|
|
|
@ -11,6 +11,11 @@ struct B {
|
||||||
j: i64,
|
j: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
struct C {
|
||||||
|
i: Vec<i32>,
|
||||||
|
j: i64,
|
||||||
|
}
|
||||||
/// Implements .next() that returns a different number each time.
|
/// Implements .next() that returns a different number each time.
|
||||||
struct SideEffect(i32);
|
struct SideEffect(i32);
|
||||||
|
|
||||||
|
@ -111,6 +116,10 @@ fn main() {
|
||||||
// don't lint - some private fields
|
// don't lint - some private fields
|
||||||
let mut x = m::F::default();
|
let mut x = m::F::default();
|
||||||
x.a = 1;
|
x.a = 1;
|
||||||
|
|
||||||
|
// don't expand macros in the suggestion (#6522)
|
||||||
|
let mut a: C = C::default();
|
||||||
|
a.i = vec![1];
|
||||||
}
|
}
|
||||||
|
|
||||||
mod m {
|
mod m {
|
||||||
|
|
|
@ -1,24 +1,12 @@
|
||||||
error: field assignment outside of initializer for an instance created with Default::default()
|
error: field assignment outside of initializer for an instance created with Default::default()
|
||||||
--> $DIR/field_reassign_with_default.rs:30:5
|
--> $DIR/field_reassign_with_default.rs:35:5
|
||||||
|
|
|
|
||||||
LL | a.i = 42;
|
LL | a.i = 42;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: `-D clippy::field-reassign-with-default` implied by `-D warnings`
|
= note: `-D clippy::field-reassign-with-default` implied by `-D warnings`
|
||||||
note: consider initializing the variable with `A { i: 42, ..Default::default() }` and removing relevant reassignments
|
note: consider initializing the variable with `A { i: 42, ..Default::default() }` and removing relevant reassignments
|
||||||
--> $DIR/field_reassign_with_default.rs:29:5
|
--> $DIR/field_reassign_with_default.rs:34:5
|
||||||
|
|
|
||||||
LL | let mut a: A = Default::default();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: field assignment outside of initializer for an instance created with Default::default()
|
|
||||||
--> $DIR/field_reassign_with_default.rs:70:5
|
|
||||||
|
|
|
||||||
LL | a.j = 43;
|
|
||||||
| ^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: consider initializing the variable with `A { j: 43, i: 42 }` and removing relevant reassignments
|
|
||||||
--> $DIR/field_reassign_with_default.rs:69:5
|
|
||||||
|
|
|
|
||||||
LL | let mut a: A = Default::default();
|
LL | let mut a: A = Default::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -26,50 +14,74 @@ LL | let mut a: A = Default::default();
|
||||||
error: field assignment outside of initializer for an instance created with Default::default()
|
error: field assignment outside of initializer for an instance created with Default::default()
|
||||||
--> $DIR/field_reassign_with_default.rs:75:5
|
--> $DIR/field_reassign_with_default.rs:75:5
|
||||||
|
|
|
|
||||||
LL | a.i = 42;
|
LL | a.j = 43;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: consider initializing the variable with `A { i: 42, j: 44 }` and removing relevant reassignments
|
note: consider initializing the variable with `A { j: 43, i: 42 }` and removing relevant reassignments
|
||||||
--> $DIR/field_reassign_with_default.rs:74:5
|
--> $DIR/field_reassign_with_default.rs:74:5
|
||||||
|
|
|
|
||||||
LL | let mut a: A = Default::default();
|
LL | let mut a: A = Default::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: field assignment outside of initializer for an instance created with Default::default()
|
error: field assignment outside of initializer for an instance created with Default::default()
|
||||||
--> $DIR/field_reassign_with_default.rs:81:5
|
--> $DIR/field_reassign_with_default.rs:80:5
|
||||||
|
|
|
||||||
|
LL | a.i = 42;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: consider initializing the variable with `A { i: 42, j: 44 }` and removing relevant reassignments
|
||||||
|
--> $DIR/field_reassign_with_default.rs:79:5
|
||||||
|
|
|
||||||
|
LL | let mut a: A = Default::default();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: field assignment outside of initializer for an instance created with Default::default()
|
||||||
|
--> $DIR/field_reassign_with_default.rs:86:5
|
||||||
|
|
|
|
||||||
LL | a.i = 42;
|
LL | a.i = 42;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: consider initializing the variable with `A { i: 42, ..Default::default() }` and removing relevant reassignments
|
note: consider initializing the variable with `A { i: 42, ..Default::default() }` and removing relevant reassignments
|
||||||
--> $DIR/field_reassign_with_default.rs:80:5
|
--> $DIR/field_reassign_with_default.rs:85:5
|
||||||
|
|
|
|
||||||
LL | let mut a = A::default();
|
LL | let mut a = A::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: field assignment outside of initializer for an instance created with Default::default()
|
error: field assignment outside of initializer for an instance created with Default::default()
|
||||||
--> $DIR/field_reassign_with_default.rs:91:5
|
--> $DIR/field_reassign_with_default.rs:96:5
|
||||||
|
|
|
|
||||||
LL | a.i = Default::default();
|
LL | a.i = Default::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: consider initializing the variable with `A { i: Default::default(), ..Default::default() }` and removing relevant reassignments
|
note: consider initializing the variable with `A { i: Default::default(), ..Default::default() }` and removing relevant reassignments
|
||||||
--> $DIR/field_reassign_with_default.rs:90:5
|
--> $DIR/field_reassign_with_default.rs:95:5
|
||||||
|
|
|
|
||||||
LL | let mut a: A = Default::default();
|
LL | let mut a: A = Default::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: field assignment outside of initializer for an instance created with Default::default()
|
error: field assignment outside of initializer for an instance created with Default::default()
|
||||||
--> $DIR/field_reassign_with_default.rs:95:5
|
--> $DIR/field_reassign_with_default.rs:100:5
|
||||||
|
|
|
|
||||||
LL | a.i = Default::default();
|
LL | a.i = Default::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: consider initializing the variable with `A { i: Default::default(), j: 45 }` and removing relevant reassignments
|
note: consider initializing the variable with `A { i: Default::default(), j: 45 }` and removing relevant reassignments
|
||||||
--> $DIR/field_reassign_with_default.rs:94:5
|
--> $DIR/field_reassign_with_default.rs:99:5
|
||||||
|
|
|
|
||||||
LL | let mut a: A = Default::default();
|
LL | let mut a: A = Default::default();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: field assignment outside of initializer for an instance created with Default::default()
|
||||||
|
--> $DIR/field_reassign_with_default.rs:122:5
|
||||||
|
|
|
||||||
|
LL | a.i = vec![1];
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: consider initializing the variable with `C { i: vec![1], ..Default::default() }` and removing relevant reassignments
|
||||||
|
--> $DIR/field_reassign_with_default.rs:121:5
|
||||||
|
|
|
||||||
|
LL | let mut a: C = C::default();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue