Skip to content

Commit f7c3b0c

Browse files
authored
Rollup merge of #71888 - lcnr:refactor-suggest_traits_to_import, r=estebank
refactor suggest_traits_to_import
2 parents 7fc579f + ab7360d commit f7c3b0c

File tree

1 file changed

+49
-55
lines changed

1 file changed

+49
-55
lines changed

src/librustc_typeck/check/method/suggest.rs

+49-55
Original file line numberDiff line numberDiff line change
@@ -947,65 +947,59 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
947947
// this isn't perfect (that is, there are cases when
948948
// implementing a trait would be legal but is rejected
949949
// here).
950-
!unsatisfied_predicates.iter().any(|(p, _)| match p {
951-
// Hide traits if they are present in predicates as they can be fixed without
952-
// having to implement them.
953-
ty::Predicate::Trait(t, _) => t.def_id() != info.def_id,
954-
ty::Predicate::Projection(p) => p.item_def_id() != info.def_id,
955-
_ => true,
956-
}) && (type_is_local || info.def_id.is_local())
957-
&& self
958-
.associated_item(info.def_id, item_name, Namespace::ValueNS)
959-
.filter(|item| {
960-
if let ty::AssocKind::Fn = item.kind {
961-
let id = item.def_id.as_local().map(|def_id| {
962-
self.tcx.hir().as_local_hir_id(def_id)
963-
});
964-
if let Some(hir::Node::TraitItem(hir::TraitItem {
965-
kind: hir::TraitItemKind::Fn(fn_sig, method),
966-
..
967-
})) = id.map(|id| self.tcx.hir().get(id))
950+
unsatisfied_predicates.iter().all(|(p, _)| match p {
951+
// Hide traits if they are present in predicates as they can be fixed without
952+
// having to implement them.
953+
ty::Predicate::Trait(t, _) => t.def_id() == info.def_id,
954+
ty::Predicate::Projection(p) => p.item_def_id() == info.def_id,
955+
_ => false,
956+
}) && (type_is_local || info.def_id.is_local())
957+
&& self
958+
.associated_item(info.def_id, item_name, Namespace::ValueNS)
959+
.filter(|item| {
960+
if let ty::AssocKind::Fn = item.kind {
961+
let id = item
962+
.def_id
963+
.as_local()
964+
.map(|def_id| self.tcx.hir().as_local_hir_id(def_id));
965+
if let Some(hir::Node::TraitItem(hir::TraitItem {
966+
kind: hir::TraitItemKind::Fn(fn_sig, method),
967+
..
968+
})) = id.map(|id| self.tcx.hir().get(id))
969+
{
970+
let self_first_arg = match method {
971+
hir::TraitFn::Required([ident, ..]) => {
972+
ident.name == kw::SelfLower
973+
}
974+
hir::TraitFn::Provided(body_id) => {
975+
self.tcx.hir().body(*body_id).params.first().map_or(
976+
false,
977+
|param| {
978+
matches!(
979+
param.pat.kind,
980+
hir::PatKind::Binding(_, _, ident, _)
981+
if ident.name == kw::SelfLower
982+
)
983+
},
984+
)
985+
}
986+
_ => false,
987+
};
988+
989+
if !fn_sig.decl.implicit_self.has_implicit_self()
990+
&& self_first_arg
968991
{
969-
let self_first_arg = match method {
970-
hir::TraitFn::Required([ident, ..]) => {
971-
ident.name == kw::SelfLower
972-
}
973-
hir::TraitFn::Provided(body_id) => {
974-
match &self.tcx.hir().body(*body_id).params[..] {
975-
[hir::Param {
976-
pat:
977-
hir::Pat {
978-
kind:
979-
hir::PatKind::Binding(
980-
_,
981-
_,
982-
ident,
983-
..,
984-
),
985-
..
986-
},
987-
..
988-
}, ..] => ident.name == kw::SelfLower,
989-
_ => false,
990-
}
991-
}
992-
_ => false,
993-
};
994-
995-
if !fn_sig.decl.implicit_self.has_implicit_self()
996-
&& self_first_arg
997-
{
998-
if let Some(ty) = fn_sig.decl.inputs.get(0) {
999-
arbitrary_rcvr.push(ty.span);
1000-
}
1001-
return false;
992+
if let Some(ty) = fn_sig.decl.inputs.get(0) {
993+
arbitrary_rcvr.push(ty.span);
1002994
}
995+
return false;
1003996
}
1004997
}
1005-
// We only want to suggest public or local traits (#45781).
1006-
item.vis == ty::Visibility::Public || info.def_id.is_local()
1007-
})
1008-
.is_some()
998+
}
999+
// We only want to suggest public or local traits (#45781).
1000+
item.vis == ty::Visibility::Public || info.def_id.is_local()
1001+
})
1002+
.is_some()
10091003
})
10101004
.collect::<Vec<_>>();
10111005
for span in &arbitrary_rcvr {

0 commit comments

Comments
 (0)