use std::io;
use std::result::Result::Err;
-use crate::ty::TyCtxt;
+use crate::ty::query::Providers;
pub mod blocks;
mod collector;
})
}
- pub fn get_generics_span(&self, id: DefId) -> Option<Span> {
- self.get_generics(id).map(|generics| generics.span).filter(|sp| *sp != DUMMY_SP)
- }
-
/// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found.
pub fn find(&self, id: NodeId) -> Option<Node<'hir>> {
let hir_id = self.node_to_hir_id(id);
}
}
+ /// Returns the `HirId` of this pattern, or, if this is an `async fn` desugaring, the `HirId`
+ /// of the original pattern that the user wrote.
+ pub fn original_pat_of_argument(&self, arg: &'hir Arg) -> &'hir Pat {
+ match &arg.source {
+ ArgSource::Normal => &*arg.pat,
+ ArgSource::AsyncFn(hir_id) => match self.find_by_hir_id(*hir_id) {
+ Some(Node::Pat(pat)) | Some(Node::Binding(pat)) => &pat,
+ Some(Node::Local(local)) => &*local.pat,
+ x => bug!("ArgSource::AsyncFn HirId not a pattern/binding/local: {:?}", x),
+ },
+ }
+ }
+
pub fn is_const_scope(&self, hir_id: HirId) -> bool {
self.walk_parent_nodes(hir_id, |node| match *node {
Node::Item(Item { node: ItemKind::Const(_, _), .. }) => true,
}
}
-pub fn def_kind(tcx: TyCtxt<'_, '_, '_>, def_id: DefId) -> Option<DefKind> {
- if let Some(node_id) = tcx.hir().as_local_node_id(def_id) {
- tcx.hir().def_kind(node_id)
- } else {
- bug!("Calling local def_kind query provider for upstream DefId: {:?}",
- def_id)
- }
+pub fn provide(providers: &mut Providers<'_>) {
+ providers.def_kind = |tcx, def_id| {
+ if let Some(node_id) = tcx.hir().as_local_node_id(def_id) {
+ tcx.hir().def_kind(node_id)
+ } else {
+ bug!("Calling local def_kind query provider for upstream DefId: {:?}",
+ def_id)
+ }
+ };
}