resolve: Feed the def_kind
query immediately on DefId
creation
This commit is contained in:
parent
46a24ed2f4
commit
f0dc906319
15 changed files with 162 additions and 173 deletions
|
@ -9,7 +9,7 @@ use rustc_data_structures::svh::Svh;
|
|||
use rustc_data_structures::sync::{par_for_each_in, try_par_for_each_in, DynSend, DynSync};
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId, LocalModDefId, LOCAL_CRATE};
|
||||
use rustc_hir::definitions::{DefKey, DefPath, DefPathData, DefPathHash};
|
||||
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::*;
|
||||
use rustc_index::Idx;
|
||||
|
@ -168,98 +168,6 @@ impl<'hir> Map<'hir> {
|
|||
self.tcx.definitions_untracked().def_path_hash(def_id)
|
||||
}
|
||||
|
||||
/// Do not call this function directly. The query should be called.
|
||||
pub(super) fn def_kind(self, local_def_id: LocalDefId) -> DefKind {
|
||||
let hir_id = self.tcx.local_def_id_to_hir_id(local_def_id);
|
||||
let node = match self.find(hir_id) {
|
||||
Some(node) => node,
|
||||
None => match self.def_key(local_def_id).disambiguated_data.data {
|
||||
// FIXME: Some anonymous constants produced by `#[rustc_legacy_const_generics]`
|
||||
// do not have corresponding HIR nodes, but they are still anonymous constants.
|
||||
DefPathData::AnonConst => return DefKind::AnonConst,
|
||||
_ => bug!("no HIR node for def id {local_def_id:?}"),
|
||||
},
|
||||
};
|
||||
match node {
|
||||
Node::Item(item) => match item.kind {
|
||||
ItemKind::Static(_, mt, _) => DefKind::Static(mt),
|
||||
ItemKind::Const(..) => DefKind::Const,
|
||||
ItemKind::Fn(..) => DefKind::Fn,
|
||||
ItemKind::Macro(_, macro_kind) => DefKind::Macro(macro_kind),
|
||||
ItemKind::Mod(..) => DefKind::Mod,
|
||||
ItemKind::OpaqueTy(..) => DefKind::OpaqueTy,
|
||||
ItemKind::TyAlias(..) => DefKind::TyAlias,
|
||||
ItemKind::Enum(..) => DefKind::Enum,
|
||||
ItemKind::Struct(..) => DefKind::Struct,
|
||||
ItemKind::Union(..) => DefKind::Union,
|
||||
ItemKind::Trait(..) => DefKind::Trait,
|
||||
ItemKind::TraitAlias(..) => DefKind::TraitAlias,
|
||||
ItemKind::ExternCrate(_) => DefKind::ExternCrate,
|
||||
ItemKind::Use(..) => DefKind::Use,
|
||||
ItemKind::ForeignMod { .. } => DefKind::ForeignMod,
|
||||
ItemKind::GlobalAsm(..) => DefKind::GlobalAsm,
|
||||
ItemKind::Impl(impl_) => DefKind::Impl { of_trait: impl_.of_trait.is_some() },
|
||||
},
|
||||
Node::ForeignItem(item) => match item.kind {
|
||||
ForeignItemKind::Fn(..) => DefKind::Fn,
|
||||
ForeignItemKind::Static(_, mt) => DefKind::Static(mt),
|
||||
ForeignItemKind::Type => DefKind::ForeignTy,
|
||||
},
|
||||
Node::TraitItem(item) => match item.kind {
|
||||
TraitItemKind::Const(..) => DefKind::AssocConst,
|
||||
TraitItemKind::Fn(..) => DefKind::AssocFn,
|
||||
TraitItemKind::Type(..) => DefKind::AssocTy,
|
||||
},
|
||||
Node::ImplItem(item) => match item.kind {
|
||||
ImplItemKind::Const(..) => DefKind::AssocConst,
|
||||
ImplItemKind::Fn(..) => DefKind::AssocFn,
|
||||
ImplItemKind::Type(..) => DefKind::AssocTy,
|
||||
},
|
||||
Node::Variant(_) => DefKind::Variant,
|
||||
Node::Ctor(variant_data) => {
|
||||
let ctor_of = match self.find_parent(hir_id) {
|
||||
Some(Node::Item(..)) => def::CtorOf::Struct,
|
||||
Some(Node::Variant(..)) => def::CtorOf::Variant,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
match variant_data.ctor_kind() {
|
||||
Some(kind) => DefKind::Ctor(ctor_of, kind),
|
||||
None => bug!("constructor node without a constructor"),
|
||||
}
|
||||
}
|
||||
Node::AnonConst(_) => DefKind::AnonConst,
|
||||
Node::ConstBlock(_) => DefKind::InlineConst,
|
||||
Node::Field(_) => DefKind::Field,
|
||||
Node::Expr(expr) => match expr.kind {
|
||||
ExprKind::Closure(_) => DefKind::Closure,
|
||||
_ => bug!("def_kind: unsupported node: {}", self.node_to_string(hir_id)),
|
||||
},
|
||||
Node::GenericParam(param) => match param.kind {
|
||||
GenericParamKind::Lifetime { .. } => DefKind::LifetimeParam,
|
||||
GenericParamKind::Type { .. } => DefKind::TyParam,
|
||||
GenericParamKind::Const { .. } => DefKind::ConstParam,
|
||||
},
|
||||
Node::Crate(_) => DefKind::Mod,
|
||||
Node::Stmt(_)
|
||||
| Node::PathSegment(_)
|
||||
| Node::Ty(_)
|
||||
| Node::TypeBinding(_)
|
||||
| Node::Infer(_)
|
||||
| Node::TraitRef(_)
|
||||
| Node::Pat(_)
|
||||
| Node::PatField(_)
|
||||
| Node::ExprField(_)
|
||||
| Node::Local(_)
|
||||
| Node::Param(_)
|
||||
| Node::Arm(_)
|
||||
| Node::Lifetime(_)
|
||||
| Node::Block(_) => span_bug!(
|
||||
self.span(hir_id),
|
||||
"unexpected node with def id {local_def_id:?}: {node:?}"
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
/// Finds the id of the parent node to this one.
|
||||
///
|
||||
/// If calling repeatedly and iterating over parents, prefer [`Map::parent_iter`].
|
||||
|
|
|
@ -202,7 +202,6 @@ pub fn provide(providers: &mut Providers) {
|
|||
span_bug!(hir.span(hir_id), "fn_arg_names: unexpected item {:?}", def_id);
|
||||
}
|
||||
};
|
||||
providers.def_kind = |tcx, def_id| tcx.hir().def_kind(def_id);
|
||||
providers.all_local_trait_impls = |tcx, ()| &tcx.resolutions(()).trait_impls;
|
||||
providers.expn_that_defined =
|
||||
|tcx, id| tcx.resolutions(()).expn_that_defined.get(&id).copied().unwrap_or(ExpnId::root());
|
||||
|
|
|
@ -501,6 +501,9 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
pub fn feed_local_crate(self) -> TyCtxtFeed<'tcx, CrateNum> {
|
||||
TyCtxtFeed { tcx: self, key: LOCAL_CRATE }
|
||||
}
|
||||
pub fn feed_local_def_id(self, key: LocalDefId) -> TyCtxtFeed<'tcx, LocalDefId> {
|
||||
TyCtxtFeed { tcx: self, key }
|
||||
}
|
||||
|
||||
/// In order to break cycles involving `AnonConst`, we need to set the expected type by side
|
||||
/// effect. However, we do not want this as a general capability, so this interface restricts
|
||||
|
@ -973,6 +976,7 @@ impl<'tcx> TyCtxtAt<'tcx> {
|
|||
self,
|
||||
parent: LocalDefId,
|
||||
data: hir::definitions::DefPathData,
|
||||
def_kind: DefKind,
|
||||
) -> TyCtxtFeed<'tcx, LocalDefId> {
|
||||
// This function modifies `self.definitions` using a side-effect.
|
||||
// We need to ensure that these side effects are re-run by the incr. comp. engine.
|
||||
|
@ -997,6 +1001,7 @@ impl<'tcx> TyCtxtAt<'tcx> {
|
|||
let key = self.untracked.definitions.write().create_def(parent, data);
|
||||
|
||||
let feed = TyCtxtFeed { tcx: self.tcx, key };
|
||||
feed.def_kind(def_kind);
|
||||
feed.def_span(self.span);
|
||||
feed
|
||||
}
|
||||
|
|
|
@ -202,9 +202,6 @@ pub struct ResolverAstLowering {
|
|||
pub def_id_to_node_id: IndexVec<LocalDefId, ast::NodeId>,
|
||||
|
||||
pub trait_map: NodeMap<Vec<hir::TraitCandidate>>,
|
||||
/// A small map keeping true kinds of built-in macros that appear to be fn-like on
|
||||
/// the surface (`macro` items in libcore), but are actually attributes or derives.
|
||||
pub builtin_macro_kinds: FxHashMap<LocalDefId, MacroKind>,
|
||||
/// List functions and methods for which lifetime elision was successful.
|
||||
pub lifetime_elision_allowed: FxHashSet<ast::NodeId>,
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue