Rollup merge of #118131 - lukas-code:multi-default, r=wesleywiser
improve tool-only help for multiple `#[default]` variants When defining an enum with multiple `#[default]` variants, we emit a tool-only suggestion for every `#[default]`ed variant to remove all other `#[default]`s. This PR improves the suggestion to correctly handle the cases where one variant has multiple `#[default]`s and where different `#[default]`s have the same span due to macro expansions. fixes https://github.com/rust-lang/rust/issues/118119
This commit is contained in:
commit
82538b72c0
5 changed files with 111 additions and 47 deletions
|
@ -127,18 +127,17 @@ fn extract_default_variant<'a>(
|
|||
[first, rest @ ..] => {
|
||||
let suggs = default_variants
|
||||
.iter()
|
||||
.map(|variant| {
|
||||
let spans = default_variants
|
||||
.filter_map(|variant| {
|
||||
let keep = attr::find_by_name(&variant.attrs, kw::Default)?.span;
|
||||
let spans: Vec<Span> = default_variants
|
||||
.iter()
|
||||
.filter_map(|v| {
|
||||
if v.span == variant.span {
|
||||
None
|
||||
} else {
|
||||
Some(attr::find_by_name(&v.attrs, kw::Default)?.span)
|
||||
}
|
||||
.flat_map(|v| {
|
||||
attr::filter_by_name(&v.attrs, kw::Default)
|
||||
.filter_map(|attr| (attr.span != keep).then_some(attr.span))
|
||||
})
|
||||
.collect();
|
||||
errors::MultipleDefaultsSugg { spans, ident: variant.ident }
|
||||
(!spans.is_empty())
|
||||
.then_some(errors::MultipleDefaultsSugg { spans, ident: variant.ident })
|
||||
})
|
||||
.collect();
|
||||
cx.emit_err(errors::MultipleDefaults {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue