Suggest removing unused tuple fields if they are the last fields
This commit is contained in:
parent
47314eb427
commit
012a458dca
5 changed files with 111 additions and 47 deletions
|
@ -23,8 +23,7 @@ use rustc_target::abi::FieldIdx;
|
|||
use std::mem;
|
||||
|
||||
use crate::errors::{
|
||||
ChangeFieldsToBeOfUnitType, IgnoredDerivedImpls, MultipleDeadCodes, ParentInfo,
|
||||
UselessAssignment,
|
||||
ChangeFields, IgnoredDerivedImpls, MultipleDeadCodes, ParentInfo, UselessAssignment,
|
||||
};
|
||||
|
||||
// Any local node that may call something in its body block should be
|
||||
|
@ -993,17 +992,50 @@ impl<'tcx> DeadVisitor<'tcx> {
|
|||
};
|
||||
|
||||
let diag = match report_on {
|
||||
ReportOn::TupleField => MultipleDeadCodes::UnusedTupleStructFields {
|
||||
multiple,
|
||||
num,
|
||||
descr,
|
||||
participle,
|
||||
name_list,
|
||||
change_fields_suggestion: ChangeFieldsToBeOfUnitType { num, spans: spans.clone() },
|
||||
parent_info,
|
||||
ignored_derived_impls,
|
||||
},
|
||||
ReportOn::TupleField => {
|
||||
let tuple_fields = if let Some(parent_id) = parent_item
|
||||
&& let node = tcx.hir_node_by_def_id(parent_id)
|
||||
&& let hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Struct(hir::VariantData::Tuple(fields, _, _), _),
|
||||
..
|
||||
}) = node
|
||||
{
|
||||
*fields
|
||||
} else {
|
||||
&[]
|
||||
};
|
||||
|
||||
let trailing_tuple_fields = if tuple_fields.len() >= dead_codes.len() {
|
||||
LocalDefIdSet::from_iter(
|
||||
tuple_fields
|
||||
.iter()
|
||||
.skip(tuple_fields.len() - dead_codes.len())
|
||||
.map(|f| f.def_id),
|
||||
)
|
||||
} else {
|
||||
LocalDefIdSet::default()
|
||||
};
|
||||
|
||||
let fields_suggestion =
|
||||
// Suggest removal if all tuple fields are at the end.
|
||||
// Otherwise suggest removal or changing to unit type
|
||||
if dead_codes.iter().all(|dc| trailing_tuple_fields.contains(&dc.def_id)) {
|
||||
ChangeFields::Remove { num }
|
||||
} else {
|
||||
ChangeFields::ChangeToUnitTypeOrRemove { num, spans: spans.clone() }
|
||||
};
|
||||
|
||||
MultipleDeadCodes::UnusedTupleStructFields {
|
||||
multiple,
|
||||
num,
|
||||
descr,
|
||||
participle,
|
||||
name_list,
|
||||
change_fields_suggestion: fields_suggestion,
|
||||
parent_info,
|
||||
ignored_derived_impls,
|
||||
}
|
||||
}
|
||||
ReportOn::NamedField => MultipleDeadCodes::DeadCodes {
|
||||
multiple,
|
||||
num,
|
||||
|
|
|
@ -1589,7 +1589,7 @@ pub enum MultipleDeadCodes<'tcx> {
|
|||
participle: &'tcx str,
|
||||
name_list: DiagSymbolList,
|
||||
#[subdiagnostic]
|
||||
change_fields_suggestion: ChangeFieldsToBeOfUnitType,
|
||||
change_fields_suggestion: ChangeFields,
|
||||
#[subdiagnostic]
|
||||
parent_info: Option<ParentInfo<'tcx>>,
|
||||
#[subdiagnostic]
|
||||
|
@ -1616,11 +1616,18 @@ pub struct IgnoredDerivedImpls {
|
|||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[multipart_suggestion(passes_change_fields_to_be_of_unit_type, applicability = "has-placeholders")]
|
||||
pub struct ChangeFieldsToBeOfUnitType {
|
||||
pub num: usize,
|
||||
#[suggestion_part(code = "()")]
|
||||
pub spans: Vec<Span>,
|
||||
pub enum ChangeFields {
|
||||
#[multipart_suggestion(
|
||||
passes_change_fields_to_be_of_unit_type,
|
||||
applicability = "has-placeholders"
|
||||
)]
|
||||
ChangeToUnitTypeOrRemove {
|
||||
num: usize,
|
||||
#[suggestion_part(code = "()")]
|
||||
spans: Vec<Span>,
|
||||
},
|
||||
#[help(passes_remove_fields)]
|
||||
Remove { num: usize },
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue