Rollup merge of #96142 - cjgillot:no-crate-def-index, r=petrochenkov

Stop using CRATE_DEF_INDEX outside of metadata encoding.

`CRATE_DEF_ID` and `CrateNum::as_def_id` are almost always what we want.  We should not manipulate raw `DefIndex` outside of metadata encoding.
This commit is contained in:
Dylan DPC 2022-04-19 14:43:21 +02:00 committed by GitHub
commit 9fad214593
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 109 additions and 147 deletions

View File

@ -1,12 +1,10 @@
use std::collections::hash_map::Entry::*; use std::collections::hash_map::Entry::*;
use rustc_ast::expand::allocator::ALLOCATOR_METHODS; use rustc_ast::expand::allocator::ALLOCATOR_METHODS;
use rustc_data_structures::fingerprint::Fingerprint;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
use rustc_hir::Node; use rustc_hir::Node;
use rustc_index::vec::IndexVec;
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
use rustc_middle::middle::exported_symbols::{ use rustc_middle::middle::exported_symbols::{
metadata_symbol_name, ExportedSymbol, SymbolExportLevel, metadata_symbol_name, ExportedSymbol, SymbolExportLevel,
@ -277,17 +275,6 @@ fn upstream_monomorphizations_provider(
let mut instances: DefIdMap<FxHashMap<_, _>> = Default::default(); let mut instances: DefIdMap<FxHashMap<_, _>> = Default::default();
let cnum_stable_ids: IndexVec<CrateNum, Fingerprint> = {
let mut cnum_stable_ids = IndexVec::from_elem_n(Fingerprint::ZERO, cnums.len() + 1);
for &cnum in cnums.iter() {
cnum_stable_ids[cnum] =
tcx.def_path_hash(DefId { krate: cnum, index: CRATE_DEF_INDEX }).0;
}
cnum_stable_ids
};
let drop_in_place_fn_def_id = tcx.lang_items().drop_in_place_fn(); let drop_in_place_fn_def_id = tcx.lang_items().drop_in_place_fn();
for &cnum in cnums.iter() { for &cnum in cnums.iter() {
@ -316,7 +303,7 @@ fn upstream_monomorphizations_provider(
// If there are multiple monomorphizations available, // If there are multiple monomorphizations available,
// we select one deterministically. // we select one deterministically.
let other_cnum = *e.get(); let other_cnum = *e.get();
if cnum_stable_ids[other_cnum] > cnum_stable_ids[cnum] { if tcx.stable_crate_id(other_cnum) > tcx.stable_crate_id(cnum) {
e.insert(cnum); e.insert(cnum);
} }
} }

View File

@ -1,4 +1,4 @@
use crate::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use crate::def_id::DefId;
use crate::hir; use crate::hir;
use rustc_ast as ast; use rustc_ast as ast;
@ -124,9 +124,7 @@ impl DefKind {
pub fn descr(self, def_id: DefId) -> &'static str { pub fn descr(self, def_id: DefId) -> &'static str {
match self { match self {
DefKind::Fn => "function", DefKind::Fn => "function",
DefKind::Mod if def_id.index == CRATE_DEF_INDEX && def_id.krate != LOCAL_CRATE => { DefKind::Mod if def_id.is_crate_root() && !def_id.is_local() => "crate",
"crate"
}
DefKind::Mod => "module", DefKind::Mod => "module",
DefKind::Static(..) => "static", DefKind::Static(..) => "static",
DefKind::Enum => "enum", DefKind::Enum => "enum",

View File

@ -353,11 +353,6 @@ impl Definitions {
} }
} }
/// Retrieves the root definition.
pub fn get_root_def(&self) -> LocalDefId {
LocalDefId { local_def_index: CRATE_DEF_INDEX }
}
/// Adds a definition with a parent definition. /// Adds a definition with a parent definition.
pub fn create_def( pub fn create_def(
&mut self, &mut self,

View File

@ -1,4 +1,4 @@
use crate::def_id::{LocalDefId, CRATE_DEF_INDEX}; use crate::def_id::{LocalDefId, CRATE_DEF_ID};
use std::fmt; use std::fmt;
/// Uniquely identifies a node in the HIR of the current crate. It is /// Uniquely identifies a node in the HIR of the current crate. It is
@ -84,8 +84,5 @@ impl ItemLocalId {
pub const INVALID: ItemLocalId = ItemLocalId::MAX; pub const INVALID: ItemLocalId = ItemLocalId::MAX;
} }
/// The `HirId` corresponding to `CRATE_NODE_ID` and `CRATE_DEF_INDEX`. /// The `HirId` corresponding to `CRATE_NODE_ID` and `CRATE_DEF_ID`.
pub const CRATE_HIR_ID: HirId = HirId { pub const CRATE_HIR_ID: HirId = HirId { owner: CRATE_DEF_ID, local_id: ItemLocalId::from_u32(0) };
owner: LocalDefId { local_def_index: CRATE_DEF_INDEX },
local_id: ItemLocalId::from_u32(0),
};

View File

@ -5,7 +5,7 @@ use crate::native_libs;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_hir::def::{CtorKind, DefKind, Res}; use rustc_hir::def::{CtorKind, DefKind, Res};
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LOCAL_CRATE};
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash}; use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
use rustc_middle::metadata::ModChild; use rustc_middle::metadata::ModChild;
use rustc_middle::middle::exported_symbols::ExportedSymbol; use rustc_middle::middle::exported_symbols::ExportedSymbol;
@ -325,7 +325,7 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
continue; continue;
} }
bfs_queue.push_back(DefId { krate: cnum, index: CRATE_DEF_INDEX }); bfs_queue.push_back(cnum.as_def_id());
} }
let mut add_child = |bfs_queue: &mut VecDeque<_>, child: &ModChild, parent: DefId| { let mut add_child = |bfs_queue: &mut VecDeque<_>, child: &ModChild, parent: DefId| {

View File

@ -1640,7 +1640,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
let hir = tcx.hir(); let hir = tcx.hir();
let proc_macro_decls_static = tcx.proc_macro_decls_static(()).unwrap().local_def_index; let proc_macro_decls_static = tcx.proc_macro_decls_static(()).unwrap().local_def_index;
let stability = tcx.lookup_stability(DefId::local(CRATE_DEF_INDEX)); let stability = tcx.lookup_stability(CRATE_DEF_ID);
let macros = let macros =
self.lazy(tcx.resolutions(()).proc_macros.iter().map(|p| p.local_def_index)); self.lazy(tcx.resolutions(()).proc_macros.iter().map(|p| p.local_def_index));
let spans = self.tcx.sess.parse_sess.proc_macro_quoted_spans(); let spans = self.tcx.sess.parse_sess.proc_macro_quoted_spans();

View File

@ -60,7 +60,7 @@ use crate::mir::mono::MonoItem;
use crate::ty::TyCtxt; use crate::ty::TyCtxt;
use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fingerprint::Fingerprint;
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
use rustc_hir::definitions::DefPathHash; use rustc_hir::definitions::DefPathHash;
use rustc_hir::HirId; use rustc_hir::HirId;
use rustc_query_system::dep_graph::FingerprintStyle; use rustc_query_system::dep_graph::FingerprintStyle;
@ -366,7 +366,7 @@ impl<'tcx> DepNodeParams<TyCtxt<'tcx>> for CrateNum {
#[inline(always)] #[inline(always)]
fn to_fingerprint(&self, tcx: TyCtxt<'tcx>) -> Fingerprint { fn to_fingerprint(&self, tcx: TyCtxt<'tcx>) -> Fingerprint {
let def_id = DefId { krate: *self, index: CRATE_DEF_INDEX }; let def_id = self.as_def_id();
def_id.to_fingerprint(tcx) def_id.to_fingerprint(tcx)
} }

View File

@ -11,7 +11,7 @@ use rustc_errors::{Applicability, Diagnostic};
use rustc_feature::GateIssue; use rustc_feature::GateIssue;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_hir::{self, HirId}; use rustc_hir::{self, HirId};
use rustc_middle::ty::print::with_no_trimmed_paths; use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_session::lint::builtin::{DEPRECATED, DEPRECATED_IN_FUTURE, SOFT_UNSTABLE}; use rustc_session::lint::builtin::{DEPRECATED, DEPRECATED_IN_FUTURE, SOFT_UNSTABLE};
@ -370,8 +370,7 @@ impl<'tcx> TyCtxt<'tcx> {
}; };
} }
let is_staged_api = let is_staged_api = self.lookup_stability(def_id.krate.as_def_id()).is_some();
self.lookup_stability(DefId { index: CRATE_DEF_INDEX, ..def_id }).is_some();
if !is_staged_api { if !is_staged_api {
return EvalResult::Allow; return EvalResult::Allow;
} }

View File

@ -15,7 +15,7 @@ use crate::ty::{AdtDef, InstanceDef, Region, ScalarInt, UserTypeAnnotationIndex}
use rustc_errors::ErrorGuaranteed; use rustc_errors::ErrorGuaranteed;
use rustc_hir::def::{CtorKind, Namespace}; use rustc_hir::def::{CtorKind, Namespace};
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID};
use rustc_hir::{self, GeneratorKind}; use rustc_hir::{self, GeneratorKind};
use rustc_hir::{self as hir, HirId}; use rustc_hir::{self as hir, HirId};
use rustc_session::Session; use rustc_session::Session;
@ -385,7 +385,7 @@ impl<'tcx> Body<'tcx> {
pub fn new_cfg_only(basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>) -> Self { pub fn new_cfg_only(basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>) -> Self {
let mut body = Body { let mut body = Body {
phase: MirPhase::Built, phase: MirPhase::Built,
source: MirSource::item(DefId::local(CRATE_DEF_INDEX)), source: MirSource::item(CRATE_DEF_ID.to_def_id()),
basic_blocks, basic_blocks,
source_scopes: IndexVec::new(), source_scopes: IndexVec::new(),
generator: None, generator: None,

View File

@ -36,7 +36,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_data_structures::tagged_ptr::CopyTaggedPtr; use rustc_data_structures::tagged_ptr::CopyTaggedPtr;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap, CRATE_DEF_INDEX}; use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap, CRATE_DEF_ID};
use rustc_hir::Node; use rustc_hir::Node;
use rustc_macros::HashStable; use rustc_macros::HashStable;
use rustc_query_system::ich::StableHashingContext; use rustc_query_system::ich::StableHashingContext;
@ -320,7 +320,7 @@ impl Visibility {
pub fn from_hir(visibility: &hir::Visibility<'_>, id: hir::HirId, tcx: TyCtxt<'_>) -> Self { pub fn from_hir(visibility: &hir::Visibility<'_>, id: hir::HirId, tcx: TyCtxt<'_>) -> Self {
match visibility.node { match visibility.node {
hir::VisibilityKind::Public => Visibility::Public, hir::VisibilityKind::Public => Visibility::Public,
hir::VisibilityKind::Crate(_) => Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)), hir::VisibilityKind::Crate(_) => Visibility::Restricted(CRATE_DEF_ID.to_def_id()),
hir::VisibilityKind::Restricted { ref path, .. } => match path.res { hir::VisibilityKind::Restricted { ref path, .. } => match path.res {
// If there is no resolution, `resolve` will have already reported an error, so // If there is no resolution, `resolve` will have already reported an error, so
// assume that the visibility is public to avoid reporting more privacy errors. // assume that the visibility is public to avoid reporting more privacy errors.
@ -1993,8 +1993,8 @@ impl<'tcx> TyCtxt<'tcx> {
} }
fn opt_item_name(self, def_id: DefId) -> Option<Symbol> { fn opt_item_name(self, def_id: DefId) -> Option<Symbol> {
if def_id.index == CRATE_DEF_INDEX { if let Some(cnum) = def_id.as_crate_root() {
Some(self.crate_name(def_id.krate)) Some(self.crate_name(cnum))
} else { } else {
let def_key = self.def_key(def_id); let def_key = self.def_key(def_id);
match def_key.disambiguated_data.data { match def_key.disambiguated_data.data {

View File

@ -6,7 +6,7 @@ use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sso::SsoHashSet; use rustc_data_structures::sso::SsoHashSet;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{self, CtorKind, DefKind, Namespace}; use rustc_hir::def::{self, CtorKind, DefKind, Namespace};
use rustc_hir::def_id::{DefId, DefIdSet, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, DefIdSet, CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::definitions::{DefPathData, DefPathDataName, DisambiguatedDefPathData}; use rustc_hir::definitions::{DefPathData, DefPathDataName, DisambiguatedDefPathData};
use rustc_session::config::TrimmedDefPaths; use rustc_session::config::TrimmedDefPaths;
use rustc_session::cstore::{ExternCrate, ExternCrateSource}; use rustc_session::cstore::{ExternCrate, ExternCrateSource};
@ -335,9 +335,7 @@ pub trait PrettyPrinter<'tcx>:
// If `def_id` is a direct or injected extern crate, return the // If `def_id` is a direct or injected extern crate, return the
// path to the crate followed by the path to the item within the crate. // path to the crate followed by the path to the item within the crate.
if def_id.index == CRATE_DEF_INDEX { if let Some(cnum) = def_id.as_crate_root() {
let cnum = def_id.krate;
if cnum == LOCAL_CRATE { if cnum == LOCAL_CRATE {
return Ok((self.path_crate(cnum)?, true)); return Ok((self.path_crate(cnum)?, true));
} }
@ -2227,11 +2225,11 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
ty::BrNamed(_, _) => br.kind, ty::BrNamed(_, _) => br.kind,
ty::BrAnon(i) => { ty::BrAnon(i) => {
let name = region_map[&(i + 1)]; let name = region_map[&(i + 1)];
ty::BrNamed(DefId::local(CRATE_DEF_INDEX), name) ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
} }
ty::BrEnv => { ty::BrEnv => {
let name = region_map[&0]; let name = region_map[&0];
ty::BrNamed(DefId::local(CRATE_DEF_INDEX), name) ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
} }
}; };
self.tcx.mk_region(ty::ReLateBound( self.tcx.mk_region(ty::ReLateBound(
@ -2257,7 +2255,7 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
} }
}; };
do_continue(&mut self, name); do_continue(&mut self, name);
ty::BrNamed(DefId::local(CRATE_DEF_INDEX), name) ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
} }
}; };
tcx.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BoundRegion { var: br.var, kind })) tcx.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BoundRegion { var: br.var, kind }))
@ -2697,7 +2695,7 @@ fn for_each_def(tcx: TyCtxt<'_>, mut collect_fn: impl for<'b> FnMut(&'b Ident, N
let mut seen_defs: DefIdSet = Default::default(); let mut seen_defs: DefIdSet = Default::default();
for &cnum in tcx.crates(()).iter() { for &cnum in tcx.crates(()).iter() {
let def_id = DefId { krate: cnum, index: CRATE_DEF_INDEX }; let def_id = cnum.as_def_id();
// Ignore crates that are not direct dependencies. // Ignore crates that are not direct dependencies.
match tcx.extern_crate(def_id) { match tcx.extern_crate(def_id) {

View File

@ -10,7 +10,6 @@ use crate::ty::{self, InferConst, Lift, Term, Ty, TyCtxt};
use rustc_data_structures::functor::IdFunctor; use rustc_data_structures::functor::IdFunctor;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::Namespace; use rustc_hir::def::Namespace;
use rustc_hir::def_id::CRATE_DEF_INDEX;
use rustc_index::vec::{Idx, IndexVec}; use rustc_index::vec::{Idx, IndexVec};
use std::fmt; use std::fmt;
@ -71,7 +70,7 @@ impl fmt::Debug for ty::BoundRegionKind {
match *self { match *self {
ty::BrAnon(n) => write!(f, "BrAnon({:?})", n), ty::BrAnon(n) => write!(f, "BrAnon({:?})", n),
ty::BrNamed(did, name) => { ty::BrNamed(did, name) => {
if did.index == CRATE_DEF_INDEX { if did.is_crate_root() {
write!(f, "BrNamed({})", name) write!(f, "BrNamed({})", name)
} else { } else {
write!(f, "BrNamed({:?}, {})", did, name) write!(f, "BrNamed({:?}, {})", did, name)

View File

@ -2,7 +2,7 @@ use std::collections::hash_map::Entry;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, LOCAL_CRATE};
use rustc_hir::definitions::DefPathDataName; use rustc_hir::definitions::DefPathDataName;
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
use rustc_middle::middle::exported_symbols::SymbolExportLevel; use rustc_middle::middle::exported_symbols::SymbolExportLevel;
@ -335,10 +335,10 @@ fn compute_codegen_unit_name(
let mut cgu_def_id = None; let mut cgu_def_id = None;
// Walk backwards from the item we want to find the module for. // Walk backwards from the item we want to find the module for.
loop { loop {
if current_def_id.index == CRATE_DEF_INDEX { if current_def_id.is_crate_root() {
if cgu_def_id.is_none() { if cgu_def_id.is_none() {
// If we have not found a module yet, take the crate root. // If we have not found a module yet, take the crate root.
cgu_def_id = Some(DefId { krate: def_id.krate, index: CRATE_DEF_INDEX }); cgu_def_id = Some(def_id.krate.as_def_id());
} }
break; break;
} else if tcx.def_kind(current_def_id) == DefKind::Mod { } else if tcx.def_kind(current_def_id) == DefKind::Mod {

View File

@ -1,21 +1,18 @@
use rustc_ast::entry::EntryPointType; use rustc_ast::entry::EntryPointType;
use rustc_errors::struct_span_err; use rustc_errors::struct_span_err;
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_hir::itemlikevisit::ItemLikeVisitor;
use rustc_hir::{ForeignItem, ImplItem, Item, ItemKind, Node, TraitItem, CRATE_HIR_ID}; use rustc_hir::{ForeignItem, ImplItem, Item, ItemKind, Node, TraitItem, CRATE_HIR_ID};
use rustc_middle::hir::map::Map;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::{DefIdTree, TyCtxt};
use rustc_session::config::{CrateType, EntryFnType}; use rustc_session::config::{CrateType, EntryFnType};
use rustc_session::parse::feature_err; use rustc_session::parse::feature_err;
use rustc_session::Session; use rustc_session::Session;
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::{Span, DUMMY_SP}; use rustc_span::{Span, DUMMY_SP};
struct EntryContext<'a, 'tcx> { struct EntryContext<'tcx> {
session: &'a Session, tcx: TyCtxt<'tcx>,
map: Map<'tcx>,
/// The function that has attribute named `main`. /// The function that has attribute named `main`.
attr_main_fn: Option<(LocalDefId, Span)>, attr_main_fn: Option<(LocalDefId, Span)>,
@ -28,10 +25,9 @@ struct EntryContext<'a, 'tcx> {
non_main_fns: Vec<Span>, non_main_fns: Vec<Span>,
} }
impl<'a, 'tcx> ItemLikeVisitor<'tcx> for EntryContext<'a, 'tcx> { impl<'tcx> ItemLikeVisitor<'tcx> for EntryContext<'tcx> {
fn visit_item(&mut self, item: &'tcx Item<'tcx>) { fn visit_item(&mut self, item: &'tcx Item<'tcx>) {
let def_key = self.map.def_key(item.def_id); let at_root = self.tcx.local_parent(item.def_id) == Some(CRATE_DEF_ID);
let at_root = def_key.parent == Some(CRATE_DEF_INDEX);
find_item(item, self, at_root); find_item(item, self, at_root);
} }
@ -60,13 +56,8 @@ fn entry_fn(tcx: TyCtxt<'_>, (): ()) -> Option<(DefId, EntryFnType)> {
return None; return None;
} }
let mut ctxt = EntryContext { let mut ctxt =
session: tcx.sess, EntryContext { tcx, attr_main_fn: None, start_fn: None, non_main_fns: Vec::new() };
map: tcx.hir(),
attr_main_fn: None,
start_fn: None,
non_main_fns: Vec::new(),
};
tcx.hir().visit_all_item_likes(&mut ctxt); tcx.hir().visit_all_item_likes(&mut ctxt);
@ -75,11 +66,11 @@ fn entry_fn(tcx: TyCtxt<'_>, (): ()) -> Option<(DefId, EntryFnType)> {
// Beware, this is duplicated in `librustc_builtin_macros/test_harness.rs` // Beware, this is duplicated in `librustc_builtin_macros/test_harness.rs`
// (with `ast::Item`), so make sure to keep them in sync. // (with `ast::Item`), so make sure to keep them in sync.
fn entry_point_type(ctxt: &EntryContext<'_, '_>, item: &Item<'_>, at_root: bool) -> EntryPointType { fn entry_point_type(ctxt: &EntryContext<'_>, item: &Item<'_>, at_root: bool) -> EntryPointType {
let attrs = ctxt.map.attrs(item.hir_id()); let attrs = ctxt.tcx.hir().attrs(item.hir_id());
if ctxt.session.contains_name(attrs, sym::start) { if ctxt.tcx.sess.contains_name(attrs, sym::start) {
EntryPointType::Start EntryPointType::Start
} else if ctxt.session.contains_name(attrs, sym::rustc_main) { } else if ctxt.tcx.sess.contains_name(attrs, sym::rustc_main) {
EntryPointType::MainAttr EntryPointType::MainAttr
} else if item.ident.name == sym::main { } else if item.ident.name == sym::main {
if at_root { if at_root {
@ -98,16 +89,16 @@ fn throw_attr_err(sess: &Session, span: Span, attr: &str) {
.emit(); .emit();
} }
fn find_item(item: &Item<'_>, ctxt: &mut EntryContext<'_, '_>, at_root: bool) { fn find_item(item: &Item<'_>, ctxt: &mut EntryContext<'_>, at_root: bool) {
match entry_point_type(ctxt, item, at_root) { match entry_point_type(ctxt, item, at_root) {
EntryPointType::None => (), EntryPointType::None => (),
_ if !matches!(item.kind, ItemKind::Fn(..)) => { _ if !matches!(item.kind, ItemKind::Fn(..)) => {
let attrs = ctxt.map.attrs(item.hir_id()); let attrs = ctxt.tcx.hir().attrs(item.hir_id());
if let Some(attr) = ctxt.session.find_by_name(attrs, sym::start) { if let Some(attr) = ctxt.tcx.sess.find_by_name(attrs, sym::start) {
throw_attr_err(&ctxt.session, attr.span, "start"); throw_attr_err(&ctxt.tcx.sess, attr.span, "start");
} }
if let Some(attr) = ctxt.session.find_by_name(attrs, sym::rustc_main) { if let Some(attr) = ctxt.tcx.sess.find_by_name(attrs, sym::rustc_main) {
throw_attr_err(&ctxt.session, attr.span, "rustc_main"); throw_attr_err(&ctxt.tcx.sess, attr.span, "rustc_main");
} }
} }
EntryPointType::MainNamed => (), EntryPointType::MainNamed => (),
@ -119,7 +110,7 @@ fn find_item(item: &Item<'_>, ctxt: &mut EntryContext<'_, '_>, at_root: bool) {
ctxt.attr_main_fn = Some((item.def_id, item.span)); ctxt.attr_main_fn = Some((item.def_id, item.span));
} else { } else {
struct_span_err!( struct_span_err!(
ctxt.session, ctxt.tcx.sess,
item.span, item.span,
E0137, E0137,
"multiple functions with a `#[main]` attribute" "multiple functions with a `#[main]` attribute"
@ -133,7 +124,7 @@ fn find_item(item: &Item<'_>, ctxt: &mut EntryContext<'_, '_>, at_root: bool) {
if ctxt.start_fn.is_none() { if ctxt.start_fn.is_none() {
ctxt.start_fn = Some((item.def_id, item.span)); ctxt.start_fn = Some((item.def_id, item.span));
} else { } else {
struct_span_err!(ctxt.session, item.span, E0138, "multiple `start` functions") struct_span_err!(ctxt.tcx.sess, item.span, E0138, "multiple `start` functions")
.span_label(ctxt.start_fn.unwrap().1, "previous `#[start]` function here") .span_label(ctxt.start_fn.unwrap().1, "previous `#[start]` function here")
.span_label(item.span, "multiple `start` functions") .span_label(item.span, "multiple `start` functions")
.emit(); .emit();
@ -142,7 +133,7 @@ fn find_item(item: &Item<'_>, ctxt: &mut EntryContext<'_, '_>, at_root: bool) {
} }
} }
fn configure_main(tcx: TyCtxt<'_>, visitor: &EntryContext<'_, '_>) -> Option<(DefId, EntryFnType)> { fn configure_main(tcx: TyCtxt<'_>, visitor: &EntryContext<'_>) -> Option<(DefId, EntryFnType)> {
if let Some((def_id, _)) = visitor.start_fn { if let Some((def_id, _)) = visitor.start_fn {
Some((def_id.to_def_id(), EntryFnType::Start)) Some((def_id.to_def_id(), EntryFnType::Start))
} else if let Some((def_id, _)) = visitor.attr_main_fn { } else if let Some((def_id, _)) = visitor.attr_main_fn {
@ -177,7 +168,7 @@ fn configure_main(tcx: TyCtxt<'_>, visitor: &EntryContext<'_, '_>) -> Option<(De
} }
} }
fn no_main_err(tcx: TyCtxt<'_>, visitor: &EntryContext<'_, '_>) { fn no_main_err(tcx: TyCtxt<'_>, visitor: &EntryContext<'_>) {
let sp = tcx.def_span(CRATE_DEF_ID); let sp = tcx.def_span(CRATE_DEF_ID);
if *tcx.sess.parse_sess.reached_eof.borrow() { if *tcx.sess.parse_sess.reached_eof.borrow() {
// There's an unclosed brace that made the parser reach `Eof`, we shouldn't complain about // There's an unclosed brace that made the parser reach `Eof`, we shouldn't complain about

View File

@ -1,7 +1,7 @@
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::sync::Lock; use rustc_data_structures::sync::Lock;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
use rustc_hir::intravisit; use rustc_hir::intravisit;
use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_hir::itemlikevisit::ItemLikeVisitor;
use rustc_hir::{HirId, ItemLocalId}; use rustc_hir::{HirId, ItemLocalId};
@ -89,7 +89,7 @@ impl<'a, 'hir> HirIdValidator<'a, 'hir> {
self.owner = Some(owner); self.owner = Some(owner);
walk(self); walk(self);
if owner.local_def_index == CRATE_DEF_INDEX { if owner == CRATE_DEF_ID {
return; return;
} }

View File

@ -6,7 +6,7 @@ use rustc_data_structures::fx::{FxHashSet, FxIndexMap};
use rustc_errors::struct_span_err; use rustc_errors::struct_span_err;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID, CRATE_DEF_INDEX}; use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
use rustc_hir::hir_id::CRATE_HIR_ID; use rustc_hir::hir_id::CRATE_HIR_ID;
use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::{FieldDef, Generics, HirId, Item, TraitRef, Ty, TyKind, Variant}; use rustc_hir::{FieldDef, Generics, HirId, Item, TraitRef, Ty, TyKind, Variant};
@ -703,7 +703,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'tcx> {
let Some(cnum) = self.tcx.extern_mod_stmt_cnum(item.def_id) else { let Some(cnum) = self.tcx.extern_mod_stmt_cnum(item.def_id) else {
return; return;
}; };
let def_id = DefId { krate: cnum, index: CRATE_DEF_INDEX }; let def_id = cnum.as_def_id();
self.tcx.check_stability(def_id, Some(item.hir_id()), item.span, None); self.tcx.check_stability(def_id, Some(item.hir_id()), item.span, None);
} }

View File

@ -1,7 +1,7 @@
use measureme::{StringComponent, StringId}; use measureme::{StringComponent, StringId};
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::profiling::SelfProfiler; use rustc_data_structures::profiling::SelfProfiler;
use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, LOCAL_CRATE};
use rustc_hir::definitions::DefPathData; use rustc_hir::definitions::DefPathData;
use rustc_middle::ty::{TyCtxt, WithOptConstParam}; use rustc_middle::ty::{TyCtxt, WithOptConstParam};
use rustc_query_system::query::QueryCache; use rustc_query_system::query::QueryCache;
@ -143,7 +143,7 @@ impl SpecIntoSelfProfilingString for CrateNum {
&self, &self,
builder: &mut QueryKeyStringBuilder<'_, '_, '_>, builder: &mut QueryKeyStringBuilder<'_, '_, '_>,
) -> StringId { ) -> StringId {
builder.def_id_to_string_id(DefId { krate: *self, index: CRATE_DEF_INDEX }) builder.def_id_to_string_id(self.as_def_id())
} }
} }

View File

@ -23,7 +23,7 @@ use rustc_errors::{struct_span_err, Applicability};
use rustc_expand::base::SyntaxExtension; use rustc_expand::base::SyntaxExtension;
use rustc_expand::expand::AstFragment; use rustc_expand::expand::AstFragment;
use rustc_hir::def::{self, *}; use rustc_hir::def::{self, *};
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID};
use rustc_metadata::creader::LoadedMacro; use rustc_metadata::creader::LoadedMacro;
use rustc_middle::bug; use rustc_middle::bug;
use rustc_middle::metadata::ModChild; use rustc_middle::metadata::ModChild;
@ -140,8 +140,8 @@ impl<'a> Resolver<'a> {
let parent = def_key.parent.map(|index| { let parent = def_key.parent.map(|index| {
self.get_nearest_non_block_module(DefId { index, krate: def_id.krate }) self.get_nearest_non_block_module(DefId { index, krate: def_id.krate })
}); });
let name = if def_id.index == CRATE_DEF_INDEX { let name = if let Some(cnum) = def_id.as_crate_root() {
self.cstore().crate_name(def_id.krate) self.cstore().crate_name(cnum)
} else { } else {
def_key.disambiguated_data.data.get_opt_name().expect("module without name") def_key.disambiguated_data.data.get_opt_name().expect("module without name")
}; };
@ -250,7 +250,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
match vis.kind { match vis.kind {
ast::VisibilityKind::Public => Ok(ty::Visibility::Public), ast::VisibilityKind::Public => Ok(ty::Visibility::Public),
ast::VisibilityKind::Crate(..) => { ast::VisibilityKind::Crate(..) => {
Ok(ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))) Ok(ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id()))
} }
ast::VisibilityKind::Inherited => { ast::VisibilityKind::Inherited => {
Ok(match self.parent_scope.module.kind { Ok(match self.parent_scope.module.kind {
@ -758,7 +758,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
let mut ctor_vis = if vis == ty::Visibility::Public let mut ctor_vis = if vis == ty::Visibility::Public
&& self.r.session.contains_name(&item.attrs, sym::non_exhaustive) && self.r.session.contains_name(&item.attrs, sym::non_exhaustive)
{ {
ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)) ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id())
} else { } else {
vis vis
}; };
@ -1107,7 +1107,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
root_span: span, root_span: span,
span, span,
module_path: Vec::new(), module_path: Vec::new(),
vis: Cell::new(ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))), vis: Cell::new(ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id())),
used: Cell::new(false), used: Cell::new(false),
}) })
}; };
@ -1243,7 +1243,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
let vis = if is_macro_export { let vis = if is_macro_export {
ty::Visibility::Public ty::Visibility::Public
} else { } else {
ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)) ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id())
}; };
let binding = (res, vis, span, expansion).to_name_binding(self.r.arenas); let binding = (res, vis, span, expansion).to_name_binding(self.r.arenas);
self.r.set_binding_parent_module(binding, parent_scope.module); self.r.set_binding_parent_module(binding, parent_scope.module);
@ -1489,7 +1489,7 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
let ctor_vis = if vis == ty::Visibility::Public let ctor_vis = if vis == ty::Visibility::Public
&& self.r.session.contains_name(&variant.attrs, sym::non_exhaustive) && self.r.session.contains_name(&variant.attrs, sym::non_exhaustive)
{ {
ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)) ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id())
} else { } else {
vis vis
}; };

View File

@ -10,7 +10,7 @@ use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed
use rustc_feature::BUILTIN_ATTRIBUTES; use rustc_feature::BUILTIN_ATTRIBUTES;
use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::Namespace::{self, *};
use rustc_hir::def::{self, CtorKind, CtorOf, DefKind, NonMacroAttrKind, PerNS}; use rustc_hir::def::{self, CtorKind, CtorOf, DefKind, NonMacroAttrKind, PerNS};
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::PrimTy; use rustc_hir::PrimTy;
use rustc_middle::bug; use rustc_middle::bug;
use rustc_middle::ty::DefIdTree; use rustc_middle::ty::DefIdTree;
@ -1167,7 +1167,7 @@ impl<'a> Resolver<'a> {
} }
Scope::ExternPrelude => { Scope::ExternPrelude => {
suggestions.extend(this.extern_prelude.iter().filter_map(|(ident, _)| { suggestions.extend(this.extern_prelude.iter().filter_map(|(ident, _)| {
let res = Res::Def(DefKind::Mod, DefId::local(CRATE_DEF_INDEX)); let res = Res::Def(DefKind::Mod, CRATE_DEF_ID.to_def_id());
filter_fn(res).then_some(TypoSuggestion::typo_from_res(ident.name, res)) filter_fn(res).then_some(TypoSuggestion::typo_from_res(ident.name, res))
})); }));
} }

View File

@ -19,7 +19,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_errors::DiagnosticId; use rustc_errors::DiagnosticId;
use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::Namespace::{self, *};
use rustc_hir::def::{self, CtorKind, DefKind, PartialRes, PerNS}; use rustc_hir::def::{self, CtorKind, DefKind, PartialRes, PerNS};
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{DefId, CRATE_DEF_ID};
use rustc_hir::{PrimTy, TraitCandidate}; use rustc_hir::{PrimTy, TraitCandidate};
use rustc_middle::ty::DefIdTree; use rustc_middle::ty::DefIdTree;
use rustc_middle::{bug, span_bug}; use rustc_middle::{bug, span_bug};
@ -2751,7 +2751,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
// trait to resolve. In that case, we leave the `B` // trait to resolve. In that case, we leave the `B`
// segment to be resolved by type-check. // segment to be resolved by type-check.
return Ok(Some(PartialRes::with_unresolved_segments( return Ok(Some(PartialRes::with_unresolved_segments(
Res::Def(DefKind::Mod, DefId::local(CRATE_DEF_INDEX)), Res::Def(DefKind::Mod, CRATE_DEF_ID.to_def_id()),
path.len(), path.len(),
))); )));
} }

View File

@ -20,7 +20,7 @@ use rustc_errors::{
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::Namespace::{self, *};
use rustc_hir::def::{self, CtorKind, CtorOf, DefKind}; use rustc_hir::def::{self, CtorKind, CtorOf, DefKind};
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::PrimTy; use rustc_hir::PrimTy;
use rustc_session::parse::feature_err; use rustc_session::parse::feature_err;
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
@ -352,7 +352,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
} }
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let crate_def_id = DefId::local(CRATE_DEF_INDEX); let crate_def_id = CRATE_DEF_ID.to_def_id();
if candidates.is_empty() && is_expected(Res::Def(DefKind::Enum, crate_def_id)) { if candidates.is_empty() && is_expected(Res::Def(DefKind::Enum, crate_def_id)) {
let mut enum_candidates: Vec<_> = self let mut enum_candidates: Vec<_> = self
.r .r
@ -1332,10 +1332,8 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
names.extend(extern_prelude.iter().flat_map(|(ident, _)| { names.extend(extern_prelude.iter().flat_map(|(ident, _)| {
self.r.crate_loader.maybe_process_path_extern(ident.name).and_then( self.r.crate_loader.maybe_process_path_extern(ident.name).and_then(
|crate_id| { |crate_id| {
let crate_mod = Res::Def( let crate_mod =
DefKind::Mod, Res::Def(DefKind::Mod, crate_id.as_def_id());
DefId { krate: crate_id, index: CRATE_DEF_INDEX },
);
if filter_fn(crate_mod) { if filter_fn(crate_mod) {
Some(TypoSuggestion::typo_from_res( Some(TypoSuggestion::typo_from_res(

View File

@ -38,7 +38,7 @@ use rustc_expand::base::{DeriveResolutions, SyntaxExtension, SyntaxExtensionKind
use rustc_hir::def::Namespace::*; use rustc_hir::def::Namespace::*;
use rustc_hir::def::{self, CtorOf, DefKind, PartialRes}; use rustc_hir::def::{self, CtorOf, DefKind, PartialRes};
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefPathHash, LocalDefId}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefPathHash, LocalDefId};
use rustc_hir::def_id::{CRATE_DEF_ID, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::definitions::{DefKey, DefPathData, Definitions}; use rustc_hir::definitions::{DefKey, DefPathData, Definitions};
use rustc_hir::TraitCandidate; use rustc_hir::TraitCandidate;
use rustc_index::vec::IndexVec; use rustc_index::vec::IndexVec;
@ -796,7 +796,7 @@ impl<'a> NameBinding<'a> {
NameBindingKind::Module(&ModuleData { NameBindingKind::Module(&ModuleData {
kind: ModuleKind::Def(DefKind::Mod, def_id, _), kind: ModuleKind::Def(DefKind::Mod, def_id, _),
.. ..
}) => def_id.index == CRATE_DEF_INDEX, }) => def_id.is_crate_root(),
_ => false, _ => false,
} }
} }
@ -1248,18 +1248,17 @@ impl<'a> Resolver<'a> {
); );
let definitions = Definitions::new(session.local_stable_crate_id(), krate.spans.inner_span); let definitions = Definitions::new(session.local_stable_crate_id(), krate.spans.inner_span);
let root = definitions.get_root_def();
let mut visibilities = FxHashMap::default(); let mut visibilities = FxHashMap::default();
visibilities.insert(CRATE_DEF_ID, ty::Visibility::Public); visibilities.insert(CRATE_DEF_ID, ty::Visibility::Public);
let mut def_id_to_node_id = IndexVec::default(); let mut def_id_to_node_id = IndexVec::default();
assert_eq!(def_id_to_node_id.push(CRATE_NODE_ID), root); assert_eq!(def_id_to_node_id.push(CRATE_NODE_ID), CRATE_DEF_ID);
let mut node_id_to_def_id = FxHashMap::default(); let mut node_id_to_def_id = FxHashMap::default();
node_id_to_def_id.insert(CRATE_NODE_ID, root); node_id_to_def_id.insert(CRATE_NODE_ID, CRATE_DEF_ID);
let mut invocation_parents = FxHashMap::default(); let mut invocation_parents = FxHashMap::default();
invocation_parents.insert(LocalExpnId::ROOT, (root, ImplTraitContext::Existential)); invocation_parents.insert(LocalExpnId::ROOT, (CRATE_DEF_ID, ImplTraitContext::Existential));
let mut extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'_>> = session let mut extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'_>> = session
.opts .opts

View File

@ -283,8 +283,19 @@ impl DefId {
self.as_local().unwrap_or_else(|| panic!("DefId::expect_local: `{:?}` isn't local", self)) self.as_local().unwrap_or_else(|| panic!("DefId::expect_local: `{:?}` isn't local", self))
} }
#[inline]
pub fn is_crate_root(self) -> bool {
self.index == CRATE_DEF_INDEX
}
#[inline]
pub fn as_crate_root(self) -> Option<CrateNum> {
if self.is_crate_root() { Some(self.krate) } else { None }
}
#[inline]
pub fn is_top_level_module(self) -> bool { pub fn is_top_level_module(self) -> bool {
self.is_local() && self.index == CRATE_DEF_INDEX self.is_local() && self.is_crate_root()
} }
} }
@ -357,7 +368,7 @@ impl LocalDefId {
#[inline] #[inline]
pub fn is_top_level_module(self) -> bool { pub fn is_top_level_module(self) -> bool {
self.local_def_index == CRATE_DEF_INDEX self == CRATE_DEF_ID
} }
} }

View File

@ -15,7 +15,7 @@ use rustc_attr as attr;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{CtorKind, DefKind, Res}; use rustc_hir::def::{CtorKind, DefKind, Res};
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, LOCAL_CRATE};
use rustc_infer::infer::region_constraints::{Constraint, RegionConstraintData}; use rustc_infer::infer::region_constraints::{Constraint, RegionConstraintData};
use rustc_middle::middle::resolve_lifetime as rl; use rustc_middle::middle::resolve_lifetime as rl;
use rustc_middle::ty::fold::TypeFolder; use rustc_middle::ty::fold::TypeFolder;
@ -1975,7 +1975,7 @@ fn clean_extern_crate(
// this is the ID of the `extern crate` statement // this is the ID of the `extern crate` statement
let cnum = cx.tcx.extern_mod_stmt_cnum(krate.def_id).unwrap_or(LOCAL_CRATE); let cnum = cx.tcx.extern_mod_stmt_cnum(krate.def_id).unwrap_or(LOCAL_CRATE);
// this is the ID of the crate itself // this is the ID of the crate itself
let crate_def_id = DefId { krate: cnum, index: CRATE_DEF_INDEX }; let crate_def_id = cnum.as_def_id();
let attrs = cx.tcx.hir().attrs(krate.hir_id()); let attrs = cx.tcx.hir().attrs(krate.hir_id());
let ty_vis = cx.tcx.visibility(krate.def_id); let ty_vis = cx.tcx.visibility(krate.def_id);
let please_inline = ty_vis.is_public() let please_inline = ty_vis.is_public()
@ -2094,7 +2094,7 @@ fn clean_use_statement(
} else { } else {
if inline_attr.is_none() { if inline_attr.is_none() {
if let Res::Def(DefKind::Mod, did) = path.res { if let Res::Def(DefKind::Mod, did) = path.res {
if !did.is_local() && did.index == CRATE_DEF_INDEX { if !did.is_local() && did.is_crate_root() {
// if we're `pub use`ing an extern crate root, don't inline it unless we // if we're `pub use`ing an extern crate root, don't inline it unless we
// were specifically asked for it // were specifically asked for it
denied = true; denied = true;

View File

@ -20,7 +20,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::thin_vec::ThinVec; use rustc_data_structures::thin_vec::ThinVec;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{CtorKind, DefKind, Res}; use rustc_hir::def::{CtorKind, DefKind, Res};
use rustc_hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
use rustc_hir::lang_items::LangItem; use rustc_hir::lang_items::LangItem;
use rustc_hir::{BodyId, Mutability}; use rustc_hir::{BodyId, Mutability};
use rustc_index::vec::IndexVec; use rustc_index::vec::IndexVec;
@ -104,14 +104,6 @@ impl ItemId {
ItemId::Primitive(_, krate) => krate, ItemId::Primitive(_, krate) => krate,
} }
} }
#[inline]
crate fn index(self) -> Option<DefIndex> {
match self {
ItemId::DefId(id) => Some(id.index),
_ => None,
}
}
} }
impl From<DefId> for ItemId { impl From<DefId> for ItemId {
@ -160,7 +152,7 @@ impl ExternalCrate {
#[inline] #[inline]
crate fn def_id(&self) -> DefId { crate fn def_id(&self) -> DefId {
DefId { krate: self.crate_num, index: CRATE_DEF_INDEX } self.crate_num.as_def_id()
} }
crate fn src(&self, tcx: TyCtxt<'_>) -> FileName { crate fn src(&self, tcx: TyCtxt<'_>) -> FileName {
@ -217,7 +209,7 @@ impl ExternalCrate {
// Failing that, see if there's an attribute specifying where to find this // Failing that, see if there's an attribute specifying where to find this
// external crate // external crate
let did = DefId { krate: self.crate_num, index: CRATE_DEF_INDEX }; let did = self.crate_num.as_def_id();
tcx.get_attrs(did) tcx.get_attrs(did)
.lists(sym::doc) .lists(sym::doc)
.filter(|a| a.has_name(sym::html_root_url)) .filter(|a| a.has_name(sym::html_root_url))
@ -559,7 +551,7 @@ impl Item {
} }
crate fn is_crate(&self) -> bool { crate fn is_crate(&self) -> bool {
self.is_mod() && self.item_id.as_def_id().map_or(false, |did| did.index == CRATE_DEF_INDEX) self.is_mod() && self.item_id.as_def_id().map_or(false, |did| did.is_crate_root())
} }
crate fn is_mod(&self) -> bool { crate fn is_mod(&self) -> bool {
self.type_() == ItemType::Module self.type_() == ItemType::Module

View File

@ -1,7 +1,7 @@
use std::mem; use std::mem;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{CrateNum, DefId};
use rustc_middle::middle::privacy::AccessLevels; use rustc_middle::middle::privacy::AccessLevels;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_span::{sym, Symbol}; use rustc_span::{sym, Symbol};
@ -302,7 +302,7 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> {
// A crate has a module at its root, containing all items, // A crate has a module at its root, containing all items,
// which should not be indexed. The crate-item itself is // which should not be indexed. The crate-item itself is
// inserted later on when serializing the search-index. // inserted later on when serializing the search-index.
if item.item_id.index().map_or(false, |idx| idx != CRATE_DEF_INDEX) { if item.item_id.as_def_id().map_or(false, |idx| !idx.is_crate_root()) {
let desc = item.doc_value().map_or_else(String::new, |x| { let desc = item.doc_value().map_or_else(String::new, |x| {
short_markdown_summary(x.as_str(), &item.link_names(self.cache)) short_markdown_summary(x.as_str(), &item.link_names(self.cache))
}); });

View File

@ -18,7 +18,6 @@ use rustc_hir::def_id::DefId;
use rustc_middle::ty; use rustc_middle::ty;
use rustc_middle::ty::DefIdTree; use rustc_middle::ty::DefIdTree;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_span::def_id::CRATE_DEF_INDEX;
use rustc_span::{sym, Symbol}; use rustc_span::{sym, Symbol};
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi;
@ -1312,7 +1311,7 @@ impl clean::Visibility {
// visibility, so it shouldn't matter. // visibility, so it shouldn't matter.
let parent_module = find_nearest_parent_module(cx.tcx(), item_did.expect_def_id()); let parent_module = find_nearest_parent_module(cx.tcx(), item_did.expect_def_id());
if vis_did.index == CRATE_DEF_INDEX { if vis_did.is_crate_root() {
"pub(crate) ".to_owned() "pub(crate) ".to_owned()
} else if parent_module == Some(vis_did) { } else if parent_module == Some(vis_did) {
// `pub(in foo)` where `foo` is the parent module // `pub(in foo)` where `foo` is the parent module
@ -1360,7 +1359,7 @@ impl clean::Visibility {
// visibility, so it shouldn't matter. // visibility, so it shouldn't matter.
let parent_module = find_nearest_parent_module(tcx, item_did); let parent_module = find_nearest_parent_module(tcx, item_did);
if vis_did.index == CRATE_DEF_INDEX { if vis_did.is_crate_root() {
"pub(crate) ".to_owned() "pub(crate) ".to_owned()
} else if parent_module == Some(vis_did) { } else if parent_module == Some(vis_did) {
// `pub(in foo)` where `foo` is the parent module // `pub(in foo)` where `foo` is the parent module

View File

@ -10,7 +10,6 @@ use std::fmt;
use rustc_ast::ast; use rustc_ast::ast;
use rustc_hir::{def::CtorKind, def_id::DefId}; use rustc_hir::{def::CtorKind, def_id::DefId};
use rustc_middle::ty::{self, TyCtxt}; use rustc_middle::ty::{self, TyCtxt};
use rustc_span::def_id::CRATE_DEF_INDEX;
use rustc_span::Pos; use rustc_span::Pos;
use rustc_target::spec::abi::Abi as RustcAbi; use rustc_target::spec::abi::Abi as RustcAbi;
@ -83,7 +82,7 @@ impl JsonRenderer<'_> {
match v { match v {
Public => Visibility::Public, Public => Visibility::Public,
Inherited => Visibility::Default, Inherited => Visibility::Default,
Restricted(did) if did.index == CRATE_DEF_INDEX => Visibility::Crate, Restricted(did) if did.is_crate_root() => Visibility::Crate,
Restricted(did) => Visibility::Restricted { Restricted(did) => Visibility::Restricted {
parent: from_item_id(did.into()), parent: from_item_id(did.into()),
path: self.tcx.def_path(did).to_string_no_crate_verbose(), path: self.tcx.def_path(did).to_string_no_crate_verbose(),

View File

@ -1,6 +1,6 @@
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{CrateNum, DefId};
use rustc_middle::middle::privacy::{AccessLevel, AccessLevels}; use rustc_middle::middle::privacy::{AccessLevel, AccessLevels};
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
@ -29,7 +29,7 @@ impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> {
} }
crate fn visit_lib(&mut self, cnum: CrateNum) { crate fn visit_lib(&mut self, cnum: CrateNum) {
let did = DefId { krate: cnum, index: CRATE_DEF_INDEX }; let did = cnum.as_def_id();
self.update(did, Some(AccessLevel::Public)); self.update(did, Some(AccessLevel::Public));
self.visit_mod(did); self.visit_mod(did);
} }

View File

@ -10,7 +10,7 @@ use clippy_utils::diagnostics::span_lint;
use rustc_ast::ast; use rustc_ast::ast;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::ty; use rustc_middle::ty::{self, DefIdTree};
use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_session::{declare_tool_lint, impl_lint_pass};
use rustc_span::def_id::CRATE_DEF_ID; use rustc_span::def_id::CRATE_DEF_ID;
use rustc_span::source_map::Span; use rustc_span::source_map::Span;
@ -114,8 +114,8 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc {
hir::ItemKind::Fn(..) => { hir::ItemKind::Fn(..) => {
// ignore main() // ignore main()
if it.ident.name == sym::main { if it.ident.name == sym::main {
let def_key = cx.tcx.hir().def_key(it.def_id); let at_root = cx.tcx.local_parent(it.def_id) == Some(CRATE_DEF_ID);
if def_key.parent == Some(hir::def_id::CRATE_DEF_INDEX) { if at_root {
return; return;
} }
} }