rustc: Make def_kind
mandatory for all DefId
s
This commit is contained in:
parent
fad6bb80fa
commit
2c23386344
@ -850,7 +850,7 @@ impl MetadataBlob {
|
|||||||
) -> io::Result<()> {
|
) -> io::Result<()> {
|
||||||
let root = blob.get_root();
|
let root = blob.get_root();
|
||||||
|
|
||||||
let def_kind = root.tables.opt_def_kind.get(blob, item).unwrap();
|
let def_kind = root.tables.def_kind.get(blob, item).unwrap();
|
||||||
let def_key = root.tables.def_keys.get(blob, item).unwrap().decode(blob);
|
let def_key = root.tables.def_keys.get(blob, item).unwrap().decode(blob);
|
||||||
let def_name = if item == CRATE_DEF_INDEX {
|
let def_name = if item == CRATE_DEF_INDEX {
|
||||||
rustc_span::symbol::kw::Crate
|
rustc_span::symbol::kw::Crate
|
||||||
@ -1001,14 +1001,11 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn def_kind(self, item_id: DefIndex) -> DefKind {
|
fn def_kind(self, item_id: DefIndex) -> DefKind {
|
||||||
self.root.tables.opt_def_kind.get(self, item_id).unwrap_or_else(|| {
|
self.root
|
||||||
bug!(
|
.tables
|
||||||
"CrateMetadata::def_kind({:?}): id not found, in crate {:?} with number {}",
|
.def_kind
|
||||||
item_id,
|
.get(self, item_id)
|
||||||
self.root.name(),
|
.unwrap_or_else(|| self.missing("def_kind", item_id))
|
||||||
self.cnum,
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_span(self, index: DefIndex, sess: &Session) -> Span {
|
fn get_span(self, index: DefIndex, sess: &Session) -> Span {
|
||||||
|
@ -231,7 +231,7 @@ provide! { tcx, def_id, other, cdata,
|
|||||||
lookup_deprecation_entry => { table }
|
lookup_deprecation_entry => { table }
|
||||||
params_in_repr => { table }
|
params_in_repr => { table }
|
||||||
unused_generic_params => { cdata.root.tables.unused_generic_params.get(cdata, def_id.index) }
|
unused_generic_params => { cdata.root.tables.unused_generic_params.get(cdata, def_id.index) }
|
||||||
opt_def_kind => { table_direct }
|
def_kind => { cdata.def_kind(def_id.index) }
|
||||||
impl_parent => { table }
|
impl_parent => { table }
|
||||||
impl_polarity => { table_direct }
|
impl_polarity => { table_direct }
|
||||||
defaultness => { table_direct }
|
defaultness => { table_direct }
|
||||||
|
@ -1354,9 +1354,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||||||
|
|
||||||
for local_id in tcx.iter_local_def_id() {
|
for local_id in tcx.iter_local_def_id() {
|
||||||
let def_id = local_id.to_def_id();
|
let def_id = local_id.to_def_id();
|
||||||
let def_kind = tcx.opt_def_kind(local_id);
|
let def_kind = tcx.def_kind(local_id);
|
||||||
let Some(def_kind) = def_kind else { continue };
|
self.tables.def_kind.set_some(def_id.index, def_kind);
|
||||||
self.tables.opt_def_kind.set_some(def_id.index, def_kind);
|
|
||||||
if should_encode_span(def_kind) {
|
if should_encode_span(def_kind) {
|
||||||
let def_span = tcx.def_span(local_id);
|
let def_span = tcx.def_span(local_id);
|
||||||
record!(self.tables.def_span[def_id] <- def_span);
|
record!(self.tables.def_span[def_id] <- def_span);
|
||||||
@ -1393,7 +1392,13 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||||||
if should_encode_fn_sig(def_kind) {
|
if should_encode_fn_sig(def_kind) {
|
||||||
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id));
|
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id));
|
||||||
}
|
}
|
||||||
if should_encode_generics(def_kind) {
|
// FIXME: Some anonymous constants produced by `#[rustc_legacy_const_generics]`
|
||||||
|
// do not have corresponding HIR nodes, so some queries usually making sense for
|
||||||
|
// anonymous constants will not work on them and panic. It's not clear whether it
|
||||||
|
// can cause any observable issues or not.
|
||||||
|
let anon_const_without_hir = def_kind == DefKind::AnonConst
|
||||||
|
&& tcx.hir().find(tcx.local_def_id_to_hir_id(local_id)).is_none();
|
||||||
|
if should_encode_generics(def_kind) && !anon_const_without_hir {
|
||||||
let g = tcx.generics_of(def_id);
|
let g = tcx.generics_of(def_id);
|
||||||
record!(self.tables.generics_of[def_id] <- g);
|
record!(self.tables.generics_of[def_id] <- g);
|
||||||
record!(self.tables.explicit_predicates_of[def_id] <- self.tcx.explicit_predicates_of(def_id));
|
record!(self.tables.explicit_predicates_of[def_id] <- self.tcx.explicit_predicates_of(def_id));
|
||||||
@ -1407,7 +1412,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if should_encode_type(tcx, local_id, def_kind) {
|
if should_encode_type(tcx, local_id, def_kind) && !anon_const_without_hir {
|
||||||
record!(self.tables.type_of[def_id] <- self.tcx.type_of(def_id));
|
record!(self.tables.type_of[def_id] <- self.tcx.type_of(def_id));
|
||||||
}
|
}
|
||||||
if should_encode_constness(def_kind) {
|
if should_encode_constness(def_kind) {
|
||||||
@ -1785,7 +1790,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||||||
self.tables.proc_macro_quoted_spans.set_some(i, span);
|
self.tables.proc_macro_quoted_spans.set_some(i, span);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.tables.opt_def_kind.set_some(LOCAL_CRATE.as_def_id().index, DefKind::Mod);
|
self.tables.def_kind.set_some(LOCAL_CRATE.as_def_id().index, DefKind::Mod);
|
||||||
record!(self.tables.def_span[LOCAL_CRATE.as_def_id()] <- tcx.def_span(LOCAL_CRATE.as_def_id()));
|
record!(self.tables.def_span[LOCAL_CRATE.as_def_id()] <- tcx.def_span(LOCAL_CRATE.as_def_id()));
|
||||||
self.encode_attrs(LOCAL_CRATE.as_def_id().expect_local());
|
self.encode_attrs(LOCAL_CRATE.as_def_id().expect_local());
|
||||||
let vis = tcx.local_visibility(CRATE_DEF_ID).map_id(|def_id| def_id.local_def_index);
|
let vis = tcx.local_visibility(CRATE_DEF_ID).map_id(|def_id| def_id.local_def_index);
|
||||||
@ -1833,7 +1838,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||||||
def_key.disambiguated_data.data = DefPathData::MacroNs(name);
|
def_key.disambiguated_data.data = DefPathData::MacroNs(name);
|
||||||
|
|
||||||
let def_id = id.to_def_id();
|
let def_id = id.to_def_id();
|
||||||
self.tables.opt_def_kind.set_some(def_id.index, DefKind::Macro(macro_kind));
|
self.tables.def_kind.set_some(def_id.index, DefKind::Macro(macro_kind));
|
||||||
self.tables.proc_macro.set_some(def_id.index, macro_kind);
|
self.tables.proc_macro.set_some(def_id.index, macro_kind);
|
||||||
self.encode_attrs(id);
|
self.encode_attrs(id);
|
||||||
record!(self.tables.def_keys[def_id] <- def_key);
|
record!(self.tables.def_keys[def_id] <- def_key);
|
||||||
|
@ -405,7 +405,7 @@ define_tables! {
|
|||||||
// so we can take their names, visibilities etc from other encoded tables.
|
// so we can take their names, visibilities etc from other encoded tables.
|
||||||
module_children_non_reexports: Table<DefIndex, LazyArray<DefIndex>>,
|
module_children_non_reexports: Table<DefIndex, LazyArray<DefIndex>>,
|
||||||
associated_item_or_field_def_ids: Table<DefIndex, LazyArray<DefIndex>>,
|
associated_item_or_field_def_ids: Table<DefIndex, LazyArray<DefIndex>>,
|
||||||
opt_def_kind: Table<DefIndex, DefKind>,
|
def_kind: Table<DefIndex, DefKind>,
|
||||||
visibility: Table<DefIndex, LazyValue<ty::Visibility<DefIndex>>>,
|
visibility: Table<DefIndex, LazyValue<ty::Visibility<DefIndex>>>,
|
||||||
def_span: Table<DefIndex, LazyValue<Span>>,
|
def_span: Table<DefIndex, LazyValue<Span>>,
|
||||||
def_ident_span: Table<DefIndex, LazyValue<Span>>,
|
def_ident_span: Table<DefIndex, LazyValue<Span>>,
|
||||||
|
@ -174,21 +174,18 @@ impl<'hir> Map<'hir> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Do not call this function directly. The query should be called.
|
/// Do not call this function directly. The query should be called.
|
||||||
pub(super) fn opt_def_kind(self, local_def_id: LocalDefId) -> Option<DefKind> {
|
pub(super) fn def_kind(self, local_def_id: LocalDefId) -> DefKind {
|
||||||
let hir_id = self.local_def_id_to_hir_id(local_def_id);
|
let hir_id = self.local_def_id_to_hir_id(local_def_id);
|
||||||
let node = match self.find(hir_id) {
|
let node = match self.find(hir_id) {
|
||||||
Some(node) => node,
|
Some(node) => node,
|
||||||
None => match self.def_key(local_def_id).disambiguated_data.data {
|
None => match self.def_key(local_def_id).disambiguated_data.data {
|
||||||
// FIXME: Some anonymous constants do not have corresponding HIR nodes,
|
// FIXME: Some anonymous constants produced by `#[rustc_legacy_const_generics]`
|
||||||
// so many local queries will panic on their def ids. `None` is currently
|
// do not have corresponding HIR nodes, but they are still anonymous constants.
|
||||||
// returned here instead of `DefKind::{Anon,Inline}Const` to avoid such panics.
|
DefPathData::AnonConst => return DefKind::AnonConst,
|
||||||
// Ideally all def ids should have `DefKind`s, we need to create the missing
|
|
||||||
// HIR nodes or feed relevant query results to achieve that.
|
|
||||||
DefPathData::AnonConst => return None,
|
|
||||||
_ => bug!("no HIR node for def id {local_def_id:?}"),
|
_ => bug!("no HIR node for def id {local_def_id:?}"),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
let def_kind = match node {
|
match node {
|
||||||
Node::Item(item) => match item.kind {
|
Node::Item(item) => match item.kind {
|
||||||
ItemKind::Static(_, mt, _) => DefKind::Static(mt),
|
ItemKind::Static(_, mt, _) => DefKind::Static(mt),
|
||||||
ItemKind::Const(..) => DefKind::Const,
|
ItemKind::Const(..) => DefKind::Const,
|
||||||
@ -266,8 +263,7 @@ impl<'hir> Map<'hir> {
|
|||||||
self.span(hir_id),
|
self.span(hir_id),
|
||||||
"unexpected node with def id {local_def_id:?}: {node:?}"
|
"unexpected node with def id {local_def_id:?}: {node:?}"
|
||||||
),
|
),
|
||||||
};
|
}
|
||||||
Some(def_kind)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Finds the id of the parent node to this one.
|
/// Finds the id of the parent node to this one.
|
||||||
@ -895,7 +891,7 @@ impl<'hir> Map<'hir> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn opt_ident(self, id: HirId) -> Option<Ident> {
|
fn opt_ident(self, id: HirId) -> Option<Ident> {
|
||||||
match self.get(id) {
|
match self.find(id)? {
|
||||||
Node::Pat(&Pat { kind: PatKind::Binding(_, _, ident, _), .. }) => Some(ident),
|
Node::Pat(&Pat { kind: PatKind::Binding(_, _, ident, _), .. }) => Some(ident),
|
||||||
// A `Ctor` doesn't have an identifier itself, but its parent
|
// A `Ctor` doesn't have an identifier itself, but its parent
|
||||||
// struct/variant does. Compare with `hir::Map::opt_span`.
|
// struct/variant does. Compare with `hir::Map::opt_span`.
|
||||||
|
@ -202,7 +202,7 @@ pub fn provide(providers: &mut Providers) {
|
|||||||
span_bug!(hir.span(hir_id), "fn_arg_names: unexpected item {:?}", def_id);
|
span_bug!(hir.span(hir_id), "fn_arg_names: unexpected item {:?}", def_id);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
providers.opt_def_kind = |tcx, def_id| tcx.hir().opt_def_kind(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.all_local_trait_impls = |tcx, ()| &tcx.resolutions(()).trait_impls;
|
||||||
providers.expn_that_defined =
|
providers.expn_that_defined =
|
||||||
|tcx, id| tcx.resolutions(()).expn_that_defined.get(&id).copied().unwrap_or(ExpnId::root());
|
|tcx, id| tcx.resolutions(()).expn_that_defined.get(&id).copied().unwrap_or(ExpnId::root());
|
||||||
|
@ -1151,7 +1151,7 @@ rustc_queries! {
|
|||||||
cache_on_disk_if { true }
|
cache_on_disk_if { true }
|
||||||
}
|
}
|
||||||
|
|
||||||
query opt_def_kind(def_id: DefId) -> Option<DefKind> {
|
query def_kind(def_id: DefId) -> DefKind {
|
||||||
desc { |tcx| "looking up definition kind of `{}`", tcx.def_path_str(def_id) }
|
desc { |tcx| "looking up definition kind of `{}`", tcx.def_path_str(def_id) }
|
||||||
cache_on_disk_if { def_id.is_local() }
|
cache_on_disk_if { def_id.is_local() }
|
||||||
separate_provide_extern
|
separate_provide_extern
|
||||||
|
@ -12,7 +12,6 @@ use measureme::StringId;
|
|||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::sync::AtomicU64;
|
use rustc_data_structures::sync::AtomicU64;
|
||||||
use rustc_data_structures::sync::WorkerLocal;
|
use rustc_data_structures::sync::WorkerLocal;
|
||||||
use rustc_hir::def::DefKind;
|
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::hir_id::OwnerId;
|
use rustc_hir::hir_id::OwnerId;
|
||||||
use rustc_query_system::dep_graph::DepNodeIndex;
|
use rustc_query_system::dep_graph::DepNodeIndex;
|
||||||
@ -668,21 +667,5 @@ mod sealed {
|
|||||||
|
|
||||||
pub use sealed::IntoQueryParam;
|
pub use sealed::IntoQueryParam;
|
||||||
|
|
||||||
impl<'tcx> TyCtxt<'tcx> {
|
|
||||||
pub fn def_kind(self, def_id: impl IntoQueryParam<DefId>) -> DefKind {
|
|
||||||
let def_id = def_id.into_query_param();
|
|
||||||
self.opt_def_kind(def_id)
|
|
||||||
.unwrap_or_else(|| bug!("def_kind: unsupported node: {:?}", def_id))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> TyCtxtAt<'tcx> {
|
|
||||||
pub fn def_kind(self, def_id: impl IntoQueryParam<DefId>) -> DefKind {
|
|
||||||
let def_id = def_id.into_query_param();
|
|
||||||
self.opt_def_kind(def_id)
|
|
||||||
.unwrap_or_else(|| bug!("def_kind: unsupported node: {:?}", def_id))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, HashStable)]
|
#[derive(Copy, Clone, Debug, HashStable)]
|
||||||
pub struct CyclePlaceholder(pub ErrorGuaranteed);
|
pub struct CyclePlaceholder(pub ErrorGuaranteed);
|
||||||
|
@ -500,7 +500,7 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let macro_module_def_id = self.tcx.local_parent(local_def_id);
|
let macro_module_def_id = self.tcx.local_parent(local_def_id);
|
||||||
if self.tcx.opt_def_kind(macro_module_def_id) != Some(DefKind::Mod) {
|
if self.tcx.def_kind(macro_module_def_id) != DefKind::Mod {
|
||||||
// The macro's parent doesn't correspond to a `mod`, return early (#63164, #65252).
|
// The macro's parent doesn't correspond to a `mod`, return early (#63164, #65252).
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -325,11 +325,11 @@ pub(crate) fn create_query_frame<
|
|||||||
Some(key.default_span(tcx))
|
Some(key.default_span(tcx))
|
||||||
};
|
};
|
||||||
let def_id = key.key_as_def_id();
|
let def_id = key.key_as_def_id();
|
||||||
let def_kind = if kind == dep_graph::dep_kinds::opt_def_kind || with_no_queries() {
|
let def_kind = if kind == dep_graph::dep_kinds::def_kind || with_no_queries() {
|
||||||
// Try to avoid infinite recursion.
|
// Try to avoid infinite recursion.
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
def_id.and_then(|def_id| def_id.as_local()).and_then(|def_id| tcx.opt_def_kind(def_id))
|
def_id.and_then(|def_id| def_id.as_local()).map(|def_id| tcx.def_kind(def_id))
|
||||||
};
|
};
|
||||||
let hash = || {
|
let hash = || {
|
||||||
tcx.with_stable_hashing_context(|mut hcx| {
|
tcx.with_stable_hashing_context(|mut hcx| {
|
||||||
|
@ -259,7 +259,7 @@ fn associated_type_for_impl_trait_in_trait(
|
|||||||
let local_def_id = trait_assoc_ty.def_id();
|
let local_def_id = trait_assoc_ty.def_id();
|
||||||
let def_id = local_def_id.to_def_id();
|
let def_id = local_def_id.to_def_id();
|
||||||
|
|
||||||
trait_assoc_ty.opt_def_kind(Some(DefKind::AssocTy));
|
trait_assoc_ty.def_kind(DefKind::AssocTy);
|
||||||
|
|
||||||
// There's no HIR associated with this new synthesized `def_id`, so feed
|
// There's no HIR associated with this new synthesized `def_id`, so feed
|
||||||
// `opt_local_def_id_to_hir_id` with `None`.
|
// `opt_local_def_id_to_hir_id` with `None`.
|
||||||
@ -362,7 +362,7 @@ fn associated_type_for_impl_trait_in_impl(
|
|||||||
let local_def_id = impl_assoc_ty.def_id();
|
let local_def_id = impl_assoc_ty.def_id();
|
||||||
let def_id = local_def_id.to_def_id();
|
let def_id = local_def_id.to_def_id();
|
||||||
|
|
||||||
impl_assoc_ty.opt_def_kind(Some(DefKind::AssocTy));
|
impl_assoc_ty.def_kind(DefKind::AssocTy);
|
||||||
|
|
||||||
// There's no HIR associated with this new synthesized `def_id`, so feed
|
// There's no HIR associated with this new synthesized `def_id`, so feed
|
||||||
// `opt_local_def_id_to_hir_id` with `None`.
|
// `opt_local_def_id_to_hir_id` with `None`.
|
||||||
|
@ -148,7 +148,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedAsync {
|
|||||||
// statements, so don't lint at all if there are any such paths.
|
// statements, so don't lint at all if there are any such paths.
|
||||||
if let Some(def_id) = path.res.opt_def_id()
|
if let Some(def_id) = path.res.opt_def_id()
|
||||||
&& let Some(local_def_id) = def_id.as_local()
|
&& let Some(local_def_id) = def_id.as_local()
|
||||||
&& let Some(DefKind::Fn) = cx.tcx.opt_def_kind(def_id)
|
&& cx.tcx.def_kind(def_id) == DefKind::Fn
|
||||||
&& cx.tcx.asyncness(def_id).is_async()
|
&& cx.tcx.asyncness(def_id).is_async()
|
||||||
&& !is_node_func_call(cx.tcx.hir().get_parent(hir_id), path.span)
|
&& !is_node_func_call(cx.tcx.hir().get_parent(hir_id), path.span)
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,6 @@ use clippy_utils::sugg::Sugg;
|
|||||||
use clippy_utils::ty::{is_copy, is_type_diagnostic_item, same_type_and_consts};
|
use clippy_utils::ty::{is_copy, is_type_diagnostic_item, same_type_and_consts};
|
||||||
use clippy_utils::{get_parent_expr, is_trait_method, is_ty_alias, path_to_local};
|
use clippy_utils::{get_parent_expr, is_trait_method, is_ty_alias, path_to_local};
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::def::DefKind;
|
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::{BindingAnnotation, Expr, ExprKind, HirId, MatchSource, Node, PatKind};
|
use rustc_hir::{BindingAnnotation, Expr, ExprKind, HirId, MatchSource, Node, PatKind};
|
||||||
use rustc_infer::infer::TyCtxtInferExt;
|
use rustc_infer::infer::TyCtxtInferExt;
|
||||||
@ -208,7 +207,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessConversion {
|
|||||||
&& let Some(did) = cx.qpath_res(qpath, recv.hir_id).opt_def_id()
|
&& let Some(did) = cx.qpath_res(qpath, recv.hir_id).opt_def_id()
|
||||||
// make sure that the path indeed points to a fn-like item, so that
|
// make sure that the path indeed points to a fn-like item, so that
|
||||||
// `fn_sig` does not ICE. (see #11065)
|
// `fn_sig` does not ICE. (see #11065)
|
||||||
&& cx.tcx.opt_def_kind(did).is_some_and(DefKind::is_fn_like) =>
|
&& cx.tcx.def_kind(did).is_fn_like() =>
|
||||||
{
|
{
|
||||||
Some((
|
Some((
|
||||||
did,
|
did,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user