do not access `associated_item` map directly

This commit is contained in:
Niko Matsakis 2017-04-18 10:54:47 -04:00
parent f35ff22fe8
commit b11da34afb
4 changed files with 40 additions and 25 deletions

View File

@ -2139,6 +2139,26 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
}) })
} }
pub fn opt_associated_item(self, def_id: DefId) -> Option<AssociatedItem> {
let is_associated_item = if let Some(node_id) = self.hir.as_local_node_id(def_id) {
match self.hir.get(node_id) {
hir_map::NodeTraitItem(_) | hir_map::NodeImplItem(_) => true,
_ => false,
}
} else {
match self.sess.cstore.describe_def(def_id).expect("no def for def-id") {
Def::AssociatedConst(_) | Def::Method(_) | Def::AssociatedTy(_) => true,
_ => false,
}
};
if is_associated_item {
Some(self.associated_item(def_id))
} else {
None
}
}
fn associated_item_from_trait_item_ref(self, fn associated_item_from_trait_item_ref(self,
parent_def_id: DefId, parent_def_id: DefId,
parent_vis: &hir::Visibility, parent_vis: &hir::Visibility,
@ -2391,7 +2411,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
None None
} }
} else { } else {
self.maps.associated_item.borrow().get(&def_id).cloned() self.opt_associated_item(def_id)
}; };
match item { match item {
@ -2412,15 +2432,13 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
if def_id.krate != LOCAL_CRATE { if def_id.krate != LOCAL_CRATE {
return self.sess.cstore.trait_of_item(def_id); return self.sess.cstore.trait_of_item(def_id);
} }
match self.maps.associated_item.borrow().get(&def_id) { self.opt_associated_item(def_id)
Some(associated_item) => { .and_then(|associated_item| {
match associated_item.container { match associated_item.container {
TraitContainer(def_id) => Some(def_id), TraitContainer(def_id) => Some(def_id),
ImplContainer(_) => None ImplContainer(_) => None
} }
} })
None => None
}
} }
/// Construct a parameter environment suitable for static contexts or other contexts where there /// Construct a parameter environment suitable for static contexts or other contexts where there
@ -2588,11 +2606,12 @@ fn associated_item<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId)
} }
} }
ref r => { _ => { }
panic!("unexpected container of associated items: {:?}", r)
}
} }
panic!("associated item not found for def_id: {:?}", def_id);
span_bug!(parent_item.span,
"unexpected parent of trait or impl item or item not found: {:?}",
parent_item.node)
} }
/// Calculates the Sized-constraint. /// Calculates the Sized-constraint.

View File

@ -27,19 +27,15 @@ pub enum MethodLateContext {
PlainImpl, PlainImpl,
} }
pub fn method_context(cx: &LateContext, id: ast::NodeId, span: Span) -> MethodLateContext { pub fn method_context(cx: &LateContext, id: ast::NodeId) -> MethodLateContext {
let def_id = cx.tcx.hir.local_def_id(id); let def_id = cx.tcx.hir.local_def_id(id);
match cx.tcx.maps.associated_item.borrow().get(&def_id) { let item = cx.tcx.associated_item(def_id);
None => span_bug!(span, "missing method descriptor?!"), match item.container {
Some(item) => { ty::TraitContainer(..) => MethodLateContext::TraitDefaultImpl,
match item.container { ty::ImplContainer(cid) => {
ty::TraitContainer(..) => MethodLateContext::TraitDefaultImpl, match cx.tcx.impl_trait_ref(cid) {
ty::ImplContainer(cid) => { Some(_) => MethodLateContext::TraitImpl,
match cx.tcx.impl_trait_ref(cid) { None => MethodLateContext::PlainImpl,
Some(_) => MethodLateContext::TraitImpl,
None => MethodLateContext::PlainImpl,
}
}
} }
} }
} }
@ -244,7 +240,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase {
id: ast::NodeId) { id: ast::NodeId) {
match fk { match fk {
FnKind::Method(name, ..) => { FnKind::Method(name, ..) => {
match method_context(cx, id, span) { match method_context(cx, id) {
MethodLateContext::PlainImpl => { MethodLateContext::PlainImpl => {
self.check_snake_case(cx, "method", &name.as_str(), Some(span)) self.check_snake_case(cx, "method", &name.as_str(), Some(span))
} }

View File

@ -432,7 +432,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc {
fn check_impl_item(&mut self, cx: &LateContext, impl_item: &hir::ImplItem) { fn check_impl_item(&mut self, cx: &LateContext, impl_item: &hir::ImplItem) {
// If the method is an impl for a trait, don't doc. // If the method is an impl for a trait, don't doc.
if method_context(cx, impl_item.id, impl_item.span) == MethodLateContext::TraitImpl { if method_context(cx, impl_item.id) == MethodLateContext::TraitImpl {
return; return;
} }

View File

@ -827,7 +827,7 @@ impl<'a, 'tcx> CrateMetadata {
EntryKind::AssociatedType(container) => { EntryKind::AssociatedType(container) => {
(ty::AssociatedKind::Type, container, false) (ty::AssociatedKind::Type, container, false)
} }
_ => bug!() _ => bug!("cannot get associated-item of `{:?}`", def_key)
}; };
ty::AssociatedItem { ty::AssociatedItem {