do not access associated_item
map directly
This commit is contained in:
parent
f35ff22fe8
commit
b11da34afb
@ -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.
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user