diff options
| author | Jonas Schievink <jonasschievink@gmail.com> | 2020-02-06 23:21:44 +0100 |
|---|---|---|
| committer | Jonas Schievink <jonasschievink@gmail.com> | 2020-02-08 14:29:18 +0100 |
| commit | 66fd4e6ed8fbc00feeccfe0fe9d25e1c1346807d (patch) | |
| tree | fbe08b10091e7e103384b1d40ca48eefd41a446f /src/librustc | |
| parent | 6cad7542da2f10e2110f942de4db59716bacb3df (diff) | |
Make `associated_items` query return a slice
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/query/mod.rs | 2 | ||||
| -rw-r--r-- | src/librustc/traits/mod.rs | 1 | ||||
| -rw-r--r-- | src/librustc/traits/object_safety.rs | 6 | ||||
| -rw-r--r-- | src/librustc/traits/project.rs | 2 | ||||
| -rw-r--r-- | src/librustc/traits/types/specialization_graph.rs | 11 | ||||
| -rw-r--r-- | src/librustc/traits/wf.rs | 5 | ||||
| -rw-r--r-- | src/librustc/ty/adjustment.rs | 1 | ||||
| -rw-r--r-- | src/librustc/ty/instance.rs | 1 | ||||
| -rw-r--r-- | src/librustc/ty/mod.rs | 24 | ||||
| -rw-r--r-- | src/librustc/ty/sty.rs | 1 | ||||
| -rw-r--r-- | src/librustc/ty/util.rs | 2 |
11 files changed, 25 insertions, 31 deletions
diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index d1bccb961c4..7cb1f3aa0e8 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -323,7 +323,7 @@ rustc_queries! { query associated_item(_: DefId) -> ty::AssocItem {} /// Collects the associated items defined on a trait or impl. - query associated_items(key: DefId) -> ty::AssocItemsIterator<'tcx> { + query associated_items(key: DefId) -> &'tcx [ty::AssocItem] { desc { |tcx| "collecting associated items of {}", tcx.def_path_str(key) } } diff --git a/src/librustc/traits/mod.rs b/src/librustc/traits/mod.rs index 50068b89687..9e6e6047b35 100644 --- a/src/librustc/traits/mod.rs +++ b/src/librustc/traits/mod.rs @@ -539,6 +539,7 @@ fn vtable_methods<'tcx>( tcx.arena.alloc_from_iter(supertraits(tcx, trait_ref).flat_map(move |trait_ref| { let trait_methods = tcx .associated_items(trait_ref.def_id()) + .iter() .filter(|item| item.kind == ty::AssocKind::Method); // Now list each method's DefId and InternalSubsts (for within its trait). diff --git a/src/librustc/traits/object_safety.rs b/src/librustc/traits/object_safety.rs index d0dbfe73c91..3c886ce7f3e 100644 --- a/src/librustc/traits/object_safety.rs +++ b/src/librustc/traits/object_safety.rs @@ -212,6 +212,7 @@ fn object_safety_violations_for_trait( // Check methods for violations. let mut violations: Vec<_> = tcx .associated_items(trait_def_id) + .iter() .filter(|item| item.kind == ty::AssocKind::Method) .filter_map(|item| { object_safety_violation_for_method(tcx, trait_def_id, &item) @@ -277,6 +278,7 @@ fn object_safety_violations_for_trait( violations.extend( tcx.associated_items(trait_def_id) + .iter() .filter(|item| item.kind == ty::AssocKind::Const) .map(|item| ObjectSafetyViolation::AssocConst(item.ident.name, item.ident.span)), ); @@ -632,7 +634,9 @@ fn object_ty_for_trait<'tcx>( let mut associated_types = traits::supertraits(tcx, ty::Binder::dummy(trait_ref)) .flat_map(|super_trait_ref| { - tcx.associated_items(super_trait_ref.def_id()).map(move |item| (super_trait_ref, item)) + tcx.associated_items(super_trait_ref.def_id()) + .iter() + .map(move |item| (super_trait_ref, item)) }) .filter(|(_, item)| item.kind == ty::AssocKind::Type) .collect::<Vec<_>>(); diff --git a/src/librustc/traits/project.rs b/src/librustc/traits/project.rs index fffcf66075f..8ea990d1e93 100644 --- a/src/librustc/traits/project.rs +++ b/src/librustc/traits/project.rs @@ -1436,7 +1436,7 @@ fn assoc_ty_def( { return specialization_graph::NodeItem { node: specialization_graph::Node::Impl(impl_def_id), - item, + item: *item, }; } } diff --git a/src/librustc/traits/types/specialization_graph.rs b/src/librustc/traits/types/specialization_graph.rs index 3086850db6d..36a84369d4a 100644 --- a/src/librustc/traits/types/specialization_graph.rs +++ b/src/librustc/traits/types/specialization_graph.rs @@ -81,7 +81,7 @@ impl<'tcx> Node { } /// Iterate over the items defined directly by the given (impl or trait) node. - pub fn items(&self, tcx: TyCtxt<'tcx>) -> ty::AssocItemsIterator<'tcx> { + pub fn items(&self, tcx: TyCtxt<'tcx>) -> &'tcx [ty::AssocItem] { tcx.associated_items(self.def_id()) } @@ -98,8 +98,10 @@ impl<'tcx> Node { ) -> Option<ty::AssocItem> { use crate::ty::AssocKind::*; - tcx.associated_items(self.def_id()).find(move |impl_item| { - match (trait_item_kind, impl_item.kind) { + tcx.associated_items(self.def_id()) + .iter() + .find(move |impl_item| { + match (trait_item_kind, impl_item.kind) { | (Const, Const) | (Method, Method) | (Type, Type) @@ -112,7 +114,8 @@ impl<'tcx> Node { | (OpaqueTy, _) => false, } - }) + }) + .copied() } pub fn def_id(&self) -> DefId { diff --git a/src/librustc/traits/wf.rs b/src/librustc/traits/wf.rs index 9fa3c874779..c44d45e7580 100644 --- a/src/librustc/traits/wf.rs +++ b/src/librustc/traits/wf.rs @@ -166,7 +166,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { let extend_cause_with_original_assoc_item_obligation = |cause: &mut traits::ObligationCause<'_>, pred: &ty::Predicate<'_>, - trait_assoc_items: ty::AssocItemsIterator<'_>| { + trait_assoc_items: &[ty::AssocItem]| { let trait_item = tcx .hir() .as_local_hir_id(trait_ref.def_id) @@ -283,6 +283,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { ) = (&proj.skip_binder().self_ty().kind, item.map(|i| &i.kind)) { if let Some((impl_item, trait_assoc_item)) = trait_assoc_items + .iter() .filter(|i| i.def_id == *item_def_id) .next() .and_then(|trait_assoc_item| { @@ -325,7 +326,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { extend_cause_with_original_assoc_item_obligation( &mut cause, &pred, - trait_assoc_items.clone(), + trait_assoc_items, ); traits::Obligation::new(cause, param_env, pred) }); diff --git a/src/librustc/ty/adjustment.rs b/src/librustc/ty/adjustment.rs index db034d1618c..f4006a1cd40 100644 --- a/src/librustc/ty/adjustment.rs +++ b/src/librustc/ty/adjustment.rs @@ -122,6 +122,7 @@ impl<'tcx> OverloadedDeref<'tcx> { }; let method_def_id = tcx .associated_items(trait_def_id.unwrap()) + .iter() .find(|m| m.kind == ty::AssocKind::Method) .unwrap() .def_id; diff --git a/src/librustc/ty/instance.rs b/src/librustc/ty/instance.rs index 51a18f8eae2..c7f19513f66 100644 --- a/src/librustc/ty/instance.rs +++ b/src/librustc/ty/instance.rs @@ -376,6 +376,7 @@ impl<'tcx> Instance<'tcx> { let fn_once = tcx.lang_items().fn_once_trait().unwrap(); let call_once = tcx .associated_items(fn_once) + .iter() .find(|it| it.kind == ty::AssocKind::Method) .unwrap() .def_id; diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 2538322431e..62dc02eaa03 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2705,14 +2705,15 @@ impl<'tcx> TyCtxt<'tcx> { .for_each(|&body_id| f(self.hir().body_owner_def_id(body_id))); } - pub fn provided_trait_methods(self, id: DefId) -> Vec<AssocItem> { + pub fn provided_trait_methods(self, id: DefId) -> Vec<&'tcx AssocItem> { self.associated_items(id) + .iter() .filter(|item| item.kind == AssocKind::Method && item.defaultness.has_value()) .collect() } pub fn trait_relevant_for_never(self, did: DefId) -> bool { - self.associated_items(did).any(|item| item.relevant_for_never()) + self.associated_items(did).iter().any(|item| item.relevant_for_never()) } pub fn opt_item_name(self, def_id: DefId) -> Option<Ident> { @@ -2974,25 +2975,6 @@ impl<'tcx> TyCtxt<'tcx> { } } -#[derive(Copy, Clone, HashStable)] -pub struct AssocItemsIterator<'tcx> { - pub items: &'tcx [AssocItem], -} - -impl<'tcx> Iterator for AssocItemsIterator<'tcx> { - type Item = AssocItem; - - #[inline] - fn next(&mut self) -> Option<AssocItem> { - if let Some((first, rest)) = self.items.split_first() { - self.items = rest; - Some(*first) - } else { - None - } - } -} - #[derive(Clone, HashStable)] pub struct AdtSizedConstraint<'tcx>(pub &'tcx [Ty<'tcx>]); diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 4c5bc3debde..0718853b1df 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -1066,6 +1066,7 @@ impl<'tcx> ProjectionTy<'tcx> { ) -> ProjectionTy<'tcx> { let item_def_id = tcx .associated_items(trait_ref.def_id) + .iter() .find(|item| { item.kind == ty::AssocKind::Type && tcx.hygienic_eq(item_name, item.ident, trait_ref.def_id) diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index 4dfff85d531..5d5fa4090c8 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -355,7 +355,7 @@ impl<'tcx> TyCtxt<'tcx> { let mut dtor_did = None; let ty = self.type_of(adt_did); self.for_each_relevant_impl(drop_trait, ty, |impl_did| { - if let Some(item) = self.associated_items(impl_did).next() { + if let Some(item) = self.associated_items(impl_did).first() { if validate(self, impl_did).is_ok() { dtor_did = Some(item.def_id); } |
