Skip to content

Commit effc509

Browse files
committed
Simplify lint emission.
1 parent 377728a commit effc509

File tree

1 file changed

+56
-74
lines changed

1 file changed

+56
-74
lines changed

compiler/rustc_passes/src/dead.rs

Lines changed: 56 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
use std::mem;
77

8-
use hir::ItemKind;
98
use hir::def_id::{LocalDefIdMap, LocalDefIdSet};
109
use rustc_abi::FieldIdx;
1110
use rustc_data_structures::fx::FxIndexSet;
@@ -14,7 +13,7 @@ use rustc_errors::MultiSpan;
1413
use rustc_hir::def::{CtorOf, DefKind, Res};
1514
use rustc_hir::def_id::{DefId, LocalDefId, LocalModDefId};
1615
use rustc_hir::intravisit::{self, Visitor};
17-
use rustc_hir::{self as hir, ImplItem, ImplItemKind, Node, PatKind, QPath};
16+
use rustc_hir::{self as hir, Node, PatKind, QPath};
1817
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
1918
use rustc_middle::middle::privacy::Level;
2019
use rustc_middle::query::Providers;
@@ -930,25 +929,7 @@ impl<'tcx> DeadVisitor<'tcx> {
930929
parent_item: Option<LocalDefId>,
931930
report_on: ReportOn,
932931
) {
933-
fn get_parent_if_enum_variant<'tcx>(
934-
tcx: TyCtxt<'tcx>,
935-
may_variant: LocalDefId,
936-
) -> LocalDefId {
937-
if let Node::Variant(_) = tcx.hir_node_by_def_id(may_variant)
938-
&& let Some(enum_did) = tcx.opt_parent(may_variant.to_def_id())
939-
&& let Some(enum_local_id) = enum_did.as_local()
940-
&& let Node::Item(item) = tcx.hir_node_by_def_id(enum_local_id)
941-
&& let ItemKind::Enum(..) = item.kind
942-
{
943-
enum_local_id
944-
} else {
945-
may_variant
946-
}
947-
}
948-
949-
let Some(&first_item) = dead_codes.first() else {
950-
return;
951-
};
932+
let Some(&first_item) = dead_codes.first() else { return };
952933
let tcx = self.tcx;
953934

954935
let first_lint_level = first_item.level;
@@ -957,40 +938,40 @@ impl<'tcx> DeadVisitor<'tcx> {
957938
let names: Vec<_> = dead_codes.iter().map(|item| item.name).collect();
958939
let spans: Vec<_> = dead_codes
959940
.iter()
960-
.map(|item| match tcx.def_ident_span(item.def_id) {
961-
Some(s) => s.with_ctxt(tcx.def_span(item.def_id).ctxt()),
962-
None => tcx.def_span(item.def_id),
941+
.map(|item| {
942+
let span = tcx.def_span(item.def_id);
943+
let ident_span = tcx.def_ident_span(item.def_id);
944+
// FIXME(cjgillot) this SyntaxContext manipulation does not make any sense.
945+
ident_span.map(|s| s.with_ctxt(span.ctxt())).unwrap_or(span)
963946
})
964947
.collect();
965948

966-
let descr = tcx.def_descr(first_item.def_id.to_def_id());
949+
let mut descr = tcx.def_descr(first_item.def_id.to_def_id());
967950
// `impl` blocks are "batched" and (unlike other batching) might
968951
// contain different kinds of associated items.
969-
let descr = if dead_codes.iter().any(|item| tcx.def_descr(item.def_id.to_def_id()) != descr)
970-
{
971-
"associated item"
972-
} else {
973-
descr
974-
};
952+
if dead_codes.iter().any(|item| tcx.def_descr(item.def_id.to_def_id()) != descr) {
953+
descr = "associated item"
954+
}
955+
975956
let num = dead_codes.len();
976957
let multiple = num > 6;
977958
let name_list = names.into();
978959

979-
let parent_info = if let Some(parent_item) = parent_item {
960+
let parent_info = parent_item.map(|parent_item| {
980961
let parent_descr = tcx.def_descr(parent_item.to_def_id());
981962
let span = if let DefKind::Impl { .. } = tcx.def_kind(parent_item) {
982963
tcx.def_span(parent_item)
983964
} else {
984965
tcx.def_ident_span(parent_item).unwrap()
985966
};
986-
Some(ParentInfo { num, descr, parent_descr, span })
987-
} else {
988-
None
989-
};
967+
ParentInfo { num, descr, parent_descr, span }
968+
});
990969

991-
let encl_def_id = parent_item.unwrap_or(first_item.def_id);
992-
// If parent of encl_def_id is an enum, use the parent ID instead.
993-
let encl_def_id = get_parent_if_enum_variant(tcx, encl_def_id);
970+
let mut encl_def_id = parent_item.unwrap_or(first_item.def_id);
971+
// `ignored_derived_traits` is computed for the enum, not for the variants.
972+
if let DefKind::Variant = tcx.def_kind(encl_def_id) {
973+
encl_def_id = tcx.local_parent(encl_def_id);
974+
}
994975

995976
let ignored_derived_impls =
996977
self.ignored_derived_traits.get(&encl_def_id).map(|ign_traits| {
@@ -1006,31 +987,6 @@ impl<'tcx> DeadVisitor<'tcx> {
1006987
}
1007988
});
1008989

1009-
let enum_variants_with_same_name = dead_codes
1010-
.iter()
1011-
.filter_map(|dead_item| {
1012-
if let Node::ImplItem(ImplItem {
1013-
kind: ImplItemKind::Fn(..) | ImplItemKind::Const(..),
1014-
..
1015-
}) = tcx.hir_node_by_def_id(dead_item.def_id)
1016-
&& let Some(impl_did) = tcx.opt_parent(dead_item.def_id.to_def_id())
1017-
&& let DefKind::Impl { of_trait: false } = tcx.def_kind(impl_did)
1018-
&& let ty::Adt(maybe_enum, _) = tcx.type_of(impl_did).skip_binder().kind()
1019-
&& maybe_enum.is_enum()
1020-
&& let Some(variant) =
1021-
maybe_enum.variants().iter().find(|i| i.name == dead_item.name)
1022-
{
1023-
Some(crate::errors::EnumVariantSameName {
1024-
dead_descr: tcx.def_descr(dead_item.def_id.to_def_id()),
1025-
dead_name: dead_item.name,
1026-
variant_span: tcx.def_span(variant.def_id),
1027-
})
1028-
} else {
1029-
None
1030-
}
1031-
})
1032-
.collect();
1033-
1034990
let diag = match report_on {
1035991
ReportOn::TupleField => {
1036992
let tuple_fields = if let Some(parent_id) = parent_item
@@ -1076,16 +1032,42 @@ impl<'tcx> DeadVisitor<'tcx> {
10761032
ignored_derived_impls,
10771033
}
10781034
}
1079-
ReportOn::NamedField => MultipleDeadCodes::DeadCodes {
1080-
multiple,
1081-
num,
1082-
descr,
1083-
participle,
1084-
name_list,
1085-
parent_info,
1086-
ignored_derived_impls,
1087-
enum_variants_with_same_name,
1088-
},
1035+
ReportOn::NamedField => {
1036+
let enum_variants_with_same_name = dead_codes
1037+
.iter()
1038+
.filter_map(|dead_item| {
1039+
if let DefKind::AssocFn | DefKind::AssocConst =
1040+
tcx.def_kind(dead_item.def_id)
1041+
&& let impl_did = tcx.local_parent(dead_item.def_id)
1042+
&& let DefKind::Impl { of_trait: false } = tcx.def_kind(impl_did)
1043+
&& let ty::Adt(maybe_enum, _) =
1044+
tcx.type_of(impl_did).instantiate_identity().kind()
1045+
&& maybe_enum.is_enum()
1046+
&& let Some(variant) =
1047+
maybe_enum.variants().iter().find(|i| i.name == dead_item.name)
1048+
{
1049+
Some(crate::errors::EnumVariantSameName {
1050+
dead_descr: tcx.def_descr(dead_item.def_id.to_def_id()),
1051+
dead_name: dead_item.name,
1052+
variant_span: tcx.def_span(variant.def_id),
1053+
})
1054+
} else {
1055+
None
1056+
}
1057+
})
1058+
.collect();
1059+
1060+
MultipleDeadCodes::DeadCodes {
1061+
multiple,
1062+
num,
1063+
descr,
1064+
participle,
1065+
name_list,
1066+
parent_info,
1067+
ignored_derived_impls,
1068+
enum_variants_with_same_name,
1069+
}
1070+
}
10891071
};
10901072

10911073
let hir_id = tcx.local_def_id_to_hir_id(first_item.def_id);

0 commit comments

Comments
 (0)