1
Fork 0

Merge the BTreeMap in hir::Crate.

This commit is contained in:
Camille GILLOT 2021-02-05 15:47:44 +01:00
parent 0443424954
commit 36a28060f1
14 changed files with 268 additions and 119 deletions

View file

@ -82,15 +82,11 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
self.lctx.with_hir_id_owner(item.id, |lctx| match ctxt { self.lctx.with_hir_id_owner(item.id, |lctx| match ctxt {
AssocCtxt::Trait => { AssocCtxt::Trait => {
let hir_item = lctx.lower_trait_item(item); let hir_item = lctx.lower_trait_item(item);
let id = hir_item.trait_item_id(); lctx.insert_trait_item(hir_item);
lctx.trait_items.insert(id, hir_item);
lctx.modules.entry(lctx.current_module).or_default().trait_items.insert(id);
} }
AssocCtxt::Impl => { AssocCtxt::Impl => {
let hir_item = lctx.lower_impl_item(item); let hir_item = lctx.lower_impl_item(item);
let id = hir_item.impl_item_id(); lctx.insert_impl_item(hir_item);
lctx.impl_items.insert(id, hir_item);
lctx.modules.entry(lctx.current_module).or_default().impl_items.insert(id);
} }
}); });
@ -101,9 +97,7 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
self.lctx.allocate_hir_id_counter(item.id); self.lctx.allocate_hir_id_counter(item.id);
self.lctx.with_hir_id_owner(item.id, |lctx| { self.lctx.with_hir_id_owner(item.id, |lctx| {
let hir_item = lctx.lower_foreign_item(item); let hir_item = lctx.lower_foreign_item(item);
let id = hir_item.foreign_item_id(); lctx.insert_foreign_item(hir_item);
lctx.foreign_items.insert(id, hir_item);
lctx.modules.entry(lctx.current_module).or_default().foreign_items.insert(id);
}); });
visit::walk_foreign_item(self, item); visit::walk_foreign_item(self, item);
@ -123,7 +117,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
) -> T { ) -> T {
let old_len = self.in_scope_lifetimes.len(); let old_len = self.in_scope_lifetimes.len();
let parent_generics = match self.items.get(&parent_hir_id).unwrap().kind { let parent_generics = match self.owners[parent_hir_id.def_id].unwrap().expect_item().kind {
hir::ItemKind::Impl(hir::Impl { ref generics, .. }) hir::ItemKind::Impl(hir::Impl { ref generics, .. })
| hir::ItemKind::Trait(_, _, ref generics, ..) => generics.params, | hir::ItemKind::Trait(_, _, ref generics, ..) => generics.params,
_ => &[], _ => &[],
@ -224,7 +218,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
let hir_id = self.lower_node_id(i.id); let hir_id = self.lower_node_id(i.id);
self.lower_attrs(hir_id, &i.attrs); self.lower_attrs(hir_id, &i.attrs);
let body = P(self.lower_mac_args(body)); let body = P(self.lower_mac_args(body));
self.exported_macros.push(hir::MacroDef { self.insert_macro_def(hir::MacroDef {
ident, ident,
vis, vis,
def_id: hir_id.expect_owner(), def_id: hir_id.expect_owner(),

View file

@ -101,13 +101,8 @@ struct LoweringContext<'a, 'hir: 'a> {
arena: &'hir Arena<'hir>, arena: &'hir Arena<'hir>,
/// The items being lowered are collected here. /// The items being lowered are collected here.
items: BTreeMap<hir::ItemId, hir::Item<'hir>>, owners: IndexVec<LocalDefId, Option<hir::OwnerNode<'hir>>>,
trait_items: BTreeMap<hir::TraitItemId, hir::TraitItem<'hir>>,
impl_items: BTreeMap<hir::ImplItemId, hir::ImplItem<'hir>>,
foreign_items: BTreeMap<hir::ForeignItemId, hir::ForeignItem<'hir>>,
bodies: BTreeMap<hir::BodyId, hir::Body<'hir>>, bodies: BTreeMap<hir::BodyId, hir::Body<'hir>>,
exported_macros: Vec<hir::MacroDef<'hir>>,
non_exported_macro_attrs: Vec<ast::Attribute>, non_exported_macro_attrs: Vec<ast::Attribute>,
trait_impls: BTreeMap<DefId, Vec<LocalDefId>>, trait_impls: BTreeMap<DefId, Vec<LocalDefId>>,
@ -330,15 +325,11 @@ pub fn lower_crate<'a, 'hir>(
resolver, resolver,
nt_to_tokenstream, nt_to_tokenstream,
arena, arena,
items: BTreeMap::new(), owners: IndexVec::default(),
trait_items: BTreeMap::new(),
impl_items: BTreeMap::new(),
foreign_items: BTreeMap::new(),
bodies: BTreeMap::new(), bodies: BTreeMap::new(),
trait_impls: BTreeMap::new(), trait_impls: BTreeMap::new(),
modules: BTreeMap::new(), modules: BTreeMap::new(),
attrs: BTreeMap::default(), attrs: BTreeMap::default(),
exported_macros: Vec::new(),
non_exported_macro_attrs: Vec::new(), non_exported_macro_attrs: Vec::new(),
catch_scopes: Vec::new(), catch_scopes: Vec::new(),
loop_scopes: Vec::new(), loop_scopes: Vec::new(),
@ -558,12 +549,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let krate = hir::Crate { let krate = hir::Crate {
item: module, item: module,
exported_macros: self.arena.alloc_from_iter(self.exported_macros),
non_exported_macro_attrs: self.arena.alloc_from_iter(self.non_exported_macro_attrs), non_exported_macro_attrs: self.arena.alloc_from_iter(self.non_exported_macro_attrs),
items: self.items, owners: self.owners,
trait_items: self.trait_items,
impl_items: self.impl_items,
foreign_items: self.foreign_items,
bodies: self.bodies, bodies: self.bodies,
body_ids, body_ids,
trait_impls: self.trait_impls, trait_impls: self.trait_impls,
@ -576,12 +563,48 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
} }
fn insert_item(&mut self, item: hir::Item<'hir>) -> hir::ItemId { fn insert_item(&mut self, item: hir::Item<'hir>) -> hir::ItemId {
let id = hir::ItemId { def_id: item.def_id }; let id = item.item_id();
self.items.insert(id, item); let item = self.arena.alloc(item);
self.owners.ensure_contains_elem(id.def_id, || None);
self.owners[id.def_id] = Some(hir::OwnerNode::Item(item));
self.modules.entry(self.current_module).or_default().items.insert(id); self.modules.entry(self.current_module).or_default().items.insert(id);
id id
} }
fn insert_foreign_item(&mut self, item: hir::ForeignItem<'hir>) -> hir::ForeignItemId {
let id = item.foreign_item_id();
let item = self.arena.alloc(item);
self.owners.ensure_contains_elem(id.def_id, || None);
self.owners[id.def_id] = Some(hir::OwnerNode::ForeignItem(item));
self.modules.entry(self.current_module).or_default().foreign_items.insert(id);
id
}
fn insert_impl_item(&mut self, item: hir::ImplItem<'hir>) -> hir::ImplItemId {
let id = item.impl_item_id();
let item = self.arena.alloc(item);
self.owners.ensure_contains_elem(id.def_id, || None);
self.owners[id.def_id] = Some(hir::OwnerNode::ImplItem(item));
self.modules.entry(self.current_module).or_default().impl_items.insert(id);
id
}
fn insert_trait_item(&mut self, item: hir::TraitItem<'hir>) -> hir::TraitItemId {
let id = item.trait_item_id();
let item = self.arena.alloc(item);
self.owners.ensure_contains_elem(id.def_id, || None);
self.owners[id.def_id] = Some(hir::OwnerNode::TraitItem(item));
self.modules.entry(self.current_module).or_default().trait_items.insert(id);
id
}
fn insert_macro_def(&mut self, item: hir::MacroDef<'hir>) {
let def_id = item.def_id;
let item = self.arena.alloc(item);
self.owners.ensure_contains_elem(def_id, || None);
self.owners[def_id] = Some(hir::OwnerNode::MacroDef(item));
}
fn allocate_hir_id_counter(&mut self, owner: NodeId) -> hir::HirId { fn allocate_hir_id_counter(&mut self, owner: NodeId) -> hir::HirId {
// Set up the counter if needed. // Set up the counter if needed.
self.item_local_id_counters.entry(owner).or_insert(0); self.item_local_id_counters.entry(owner).or_insert(0);

View file

@ -29,7 +29,9 @@ macro_rules! arena_types {
[] fn_decl: rustc_hir::FnDecl<$tcx>, [] fn_decl: rustc_hir::FnDecl<$tcx>,
[] foreign_item: rustc_hir::ForeignItem<$tcx>, [] foreign_item: rustc_hir::ForeignItem<$tcx>,
[few] foreign_item_ref: rustc_hir::ForeignItemRef<$tcx>, [few] foreign_item_ref: rustc_hir::ForeignItemRef<$tcx>,
[] impl_item: rustc_hir::ImplItem<$tcx>,
[] impl_item_ref: rustc_hir::ImplItemRef<$tcx>, [] impl_item_ref: rustc_hir::ImplItemRef<$tcx>,
[] item: rustc_hir::Item<$tcx>,
[few] inline_asm: rustc_hir::InlineAsm<$tcx>, [few] inline_asm: rustc_hir::InlineAsm<$tcx>,
[few] llvm_inline_asm: rustc_hir::LlvmInlineAsm<$tcx>, [few] llvm_inline_asm: rustc_hir::LlvmInlineAsm<$tcx>,
[] local: rustc_hir::Local<$tcx>, [] local: rustc_hir::Local<$tcx>,
@ -42,6 +44,7 @@ macro_rules! arena_types {
[] qpath: rustc_hir::QPath<$tcx>, [] qpath: rustc_hir::QPath<$tcx>,
[] stmt: rustc_hir::Stmt<$tcx>, [] stmt: rustc_hir::Stmt<$tcx>,
[] field_def: rustc_hir::FieldDef<$tcx>, [] field_def: rustc_hir::FieldDef<$tcx>,
[] trait_item: rustc_hir::TraitItem<$tcx>,
[] trait_item_ref: rustc_hir::TraitItemRef, [] trait_item_ref: rustc_hir::TraitItemRef,
[] ty: rustc_hir::Ty<$tcx>, [] ty: rustc_hir::Ty<$tcx>,
[] type_binding: rustc_hir::TypeBinding<$tcx>, [] type_binding: rustc_hir::TypeBinding<$tcx>,

View file

@ -12,6 +12,7 @@ pub use rustc_ast::{CaptureBy, Movability, Mutability};
use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece}; use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::{par_for_each_in, Send, Sync}; use rustc_data_structures::sync::{par_for_each_in, Send, Sync};
use rustc_index::vec::IndexVec;
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::source_map::Spanned; use rustc_span::source_map::Spanned;
use rustc_span::symbol::{kw, sym, Ident, Symbol}; use rustc_span::symbol::{kw, sym, Ident, Symbol};
@ -628,21 +629,10 @@ pub struct ModuleItems {
#[derive(Debug)] #[derive(Debug)]
pub struct Crate<'hir> { pub struct Crate<'hir> {
pub item: Mod<'hir>, pub item: Mod<'hir>,
pub exported_macros: &'hir [MacroDef<'hir>],
// Attributes from non-exported macros, kept only for collecting the library feature list. // Attributes from non-exported macros, kept only for collecting the library feature list.
pub non_exported_macro_attrs: &'hir [Attribute], pub non_exported_macro_attrs: &'hir [Attribute],
// N.B., we use a `BTreeMap` here so that `visit_all_items` iterates pub owners: IndexVec<LocalDefId, Option<OwnerNode<'hir>>>,
// over the ids in increasing order. In principle it should not
// matter what order we visit things in, but in *practice* it
// does, because it can affect the order in which errors are
// detected, which in turn can make UI tests yield
// slightly different results.
pub items: BTreeMap<ItemId, Item<'hir>>,
pub trait_items: BTreeMap<TraitItemId, TraitItem<'hir>>,
pub impl_items: BTreeMap<ImplItemId, ImplItem<'hir>>,
pub foreign_items: BTreeMap<ForeignItemId, ForeignItem<'hir>>,
pub bodies: BTreeMap<BodyId, Body<'hir>>, pub bodies: BTreeMap<BodyId, Body<'hir>>,
pub trait_impls: BTreeMap<DefId, Vec<LocalDefId>>, pub trait_impls: BTreeMap<DefId, Vec<LocalDefId>>,
@ -668,20 +658,20 @@ pub struct Crate<'hir> {
} }
impl Crate<'hir> { impl Crate<'hir> {
pub fn item(&self, id: ItemId) -> &Item<'hir> { pub fn item(&self, id: ItemId) -> &'hir Item<'hir> {
&self.items[&id] self.owners[id.def_id].as_ref().unwrap().expect_item()
} }
pub fn trait_item(&self, id: TraitItemId) -> &TraitItem<'hir> { pub fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir> {
&self.trait_items[&id] self.owners[id.def_id].as_ref().unwrap().expect_trait_item()
} }
pub fn impl_item(&self, id: ImplItemId) -> &ImplItem<'hir> { pub fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir> {
&self.impl_items[&id] self.owners[id.def_id].as_ref().unwrap().expect_impl_item()
} }
pub fn foreign_item(&self, id: ForeignItemId) -> &ForeignItem<'hir> { pub fn foreign_item(&self, id: ForeignItemId) -> &'hir ForeignItem<'hir> {
&self.foreign_items[&id] self.owners[id.def_id].as_ref().unwrap().expect_foreign_item()
} }
pub fn body(&self, id: BodyId) -> &Body<'hir> { pub fn body(&self, id: BodyId) -> &Body<'hir> {
@ -702,20 +692,14 @@ impl Crate<'_> {
where where
V: itemlikevisit::ItemLikeVisitor<'hir>, V: itemlikevisit::ItemLikeVisitor<'hir>,
{ {
for item in self.items.values() { for owner in self.owners.iter().filter_map(Option::as_ref) {
visitor.visit_item(item); match owner {
OwnerNode::Item(item) => visitor.visit_item(item),
OwnerNode::ForeignItem(item) => visitor.visit_foreign_item(item),
OwnerNode::ImplItem(item) => visitor.visit_impl_item(item),
OwnerNode::TraitItem(item) => visitor.visit_trait_item(item),
OwnerNode::MacroDef(_) => {}
} }
for trait_item in self.trait_items.values() {
visitor.visit_trait_item(trait_item);
}
for impl_item in self.impl_items.values() {
visitor.visit_impl_item(impl_item);
}
for foreign_item in self.foreign_items.values() {
visitor.visit_foreign_item(foreign_item);
} }
} }
@ -724,28 +708,27 @@ impl Crate<'_> {
where where
V: itemlikevisit::ParItemLikeVisitor<'hir> + Sync + Send, V: itemlikevisit::ParItemLikeVisitor<'hir> + Sync + Send,
{ {
parallel!( par_for_each_in(&self.owners.raw, |owner| match owner {
{ Some(OwnerNode::Item(item)) => visitor.visit_item(item),
par_for_each_in(&self.items, |(_, item)| { Some(OwnerNode::ForeignItem(item)) => visitor.visit_foreign_item(item),
visitor.visit_item(item); Some(OwnerNode::ImplItem(item)) => visitor.visit_impl_item(item),
}); Some(OwnerNode::TraitItem(item)) => visitor.visit_trait_item(item),
}, Some(OwnerNode::MacroDef(_)) | None => {}
{ })
par_for_each_in(&self.trait_items, |(_, trait_item)| {
visitor.visit_trait_item(trait_item);
});
},
{
par_for_each_in(&self.impl_items, |(_, impl_item)| {
visitor.visit_impl_item(impl_item);
});
},
{
par_for_each_in(&self.foreign_items, |(_, foreign_item)| {
visitor.visit_foreign_item(foreign_item);
});
} }
);
pub fn items<'hir>(&'hir self) -> impl Iterator<Item = &'hir Item<'hir>> + 'hir {
self.owners.iter().filter_map(|owner| match owner {
Some(OwnerNode::Item(item)) => Some(*item),
_ => None,
})
}
pub fn exported_macros<'hir>(&'hir self) -> impl Iterator<Item = &'hir MacroDef<'hir>> + 'hir {
self.owners.iter().filter_map(|owner| match owner {
Some(OwnerNode::MacroDef(macro_def)) => Some(*macro_def),
_ => None,
})
} }
} }
@ -2953,6 +2936,163 @@ pub struct TraitCandidate {
pub import_ids: SmallVec<[LocalDefId; 1]>, pub import_ids: SmallVec<[LocalDefId; 1]>,
} }
#[derive(Copy, Clone, Debug, HashStable_Generic)]
pub enum OwnerNode<'hir> {
Item(&'hir Item<'hir>),
ForeignItem(&'hir ForeignItem<'hir>),
TraitItem(&'hir TraitItem<'hir>),
ImplItem(&'hir ImplItem<'hir>),
MacroDef(&'hir MacroDef<'hir>),
}
impl<'hir> OwnerNode<'hir> {
pub fn ident(&self) -> Ident {
match self {
OwnerNode::Item(Item { ident, .. })
| OwnerNode::ForeignItem(ForeignItem { ident, .. })
| OwnerNode::ImplItem(ImplItem { ident, .. })
| OwnerNode::TraitItem(TraitItem { ident, .. })
| OwnerNode::MacroDef(MacroDef { ident, .. }) => *ident,
}
}
pub fn fn_decl(&self) -> Option<&FnDecl<'hir>> {
match self {
OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
| OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
| OwnerNode::Item(Item { kind: ItemKind::Fn(fn_sig, _, _), .. }) => Some(fn_sig.decl),
OwnerNode::ForeignItem(ForeignItem {
kind: ForeignItemKind::Fn(fn_decl, _, _),
..
}) => Some(fn_decl),
_ => None,
}
}
pub fn body_id(&self) -> Option<BodyId> {
match self {
OwnerNode::TraitItem(TraitItem {
kind: TraitItemKind::Fn(_, TraitFn::Provided(body_id)),
..
})
| OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(_, body_id), .. })
| OwnerNode::Item(Item { kind: ItemKind::Fn(.., body_id), .. }) => Some(*body_id),
_ => None,
}
}
pub fn generics(&self) -> Option<&'hir Generics<'hir>> {
match self {
OwnerNode::TraitItem(TraitItem { generics, .. })
| OwnerNode::ImplItem(ImplItem { generics, .. }) => Some(generics),
OwnerNode::Item(item) => item.kind.generics(),
_ => None,
}
}
pub fn def_id(self) -> LocalDefId {
match self {
OwnerNode::Item(Item { def_id, .. })
| OwnerNode::TraitItem(TraitItem { def_id, .. })
| OwnerNode::ImplItem(ImplItem { def_id, .. })
| OwnerNode::ForeignItem(ForeignItem { def_id, .. })
| OwnerNode::MacroDef(MacroDef { def_id, .. }) => *def_id,
}
}
pub fn expect_item(self) -> &'hir Item<'hir> {
match self {
OwnerNode::Item(n) => n,
OwnerNode::ForeignItem(_)
| OwnerNode::ImplItem(_)
| OwnerNode::TraitItem(_)
| OwnerNode::MacroDef(_) => panic!(),
}
}
pub fn expect_foreign_item(self) -> &'hir ForeignItem<'hir> {
match self {
OwnerNode::ForeignItem(n) => n,
OwnerNode::Item(_)
| OwnerNode::ImplItem(_)
| OwnerNode::TraitItem(_)
| OwnerNode::MacroDef(_) => panic!(),
}
}
pub fn expect_impl_item(self) -> &'hir ImplItem<'hir> {
match self {
OwnerNode::ImplItem(n) => n,
OwnerNode::ForeignItem(_)
| OwnerNode::Item(_)
| OwnerNode::TraitItem(_)
| OwnerNode::MacroDef(_) => panic!(),
}
}
pub fn expect_trait_item(self) -> &'hir TraitItem<'hir> {
match self {
OwnerNode::TraitItem(n) => n,
OwnerNode::ForeignItem(_)
| OwnerNode::ImplItem(_)
| OwnerNode::Item(_)
| OwnerNode::MacroDef(_) => panic!(),
}
}
pub fn expect_macro_def(self) -> &'hir MacroDef<'hir> {
match self {
OwnerNode::MacroDef(n) => n,
OwnerNode::ForeignItem(_)
| OwnerNode::ImplItem(_)
| OwnerNode::TraitItem(_)
| OwnerNode::Item(_) => panic!(),
}
}
}
impl<'hir> Into<OwnerNode<'hir>> for &'hir Item<'hir> {
fn into(self) -> OwnerNode<'hir> {
OwnerNode::Item(self)
}
}
impl<'hir> Into<OwnerNode<'hir>> for &'hir ForeignItem<'hir> {
fn into(self) -> OwnerNode<'hir> {
OwnerNode::ForeignItem(self)
}
}
impl<'hir> Into<OwnerNode<'hir>> for &'hir ImplItem<'hir> {
fn into(self) -> OwnerNode<'hir> {
OwnerNode::ImplItem(self)
}
}
impl<'hir> Into<OwnerNode<'hir>> for &'hir TraitItem<'hir> {
fn into(self) -> OwnerNode<'hir> {
OwnerNode::TraitItem(self)
}
}
impl<'hir> Into<OwnerNode<'hir>> for &'hir MacroDef<'hir> {
fn into(self) -> OwnerNode<'hir> {
OwnerNode::MacroDef(self)
}
}
impl<'hir> Into<Node<'hir>> for OwnerNode<'hir> {
fn into(self) -> Node<'hir> {
match self {
OwnerNode::Item(n) => Node::Item(n),
OwnerNode::ForeignItem(n) => Node::ForeignItem(n),
OwnerNode::ImplItem(n) => Node::ImplItem(n),
OwnerNode::TraitItem(n) => Node::TraitItem(n),
OwnerNode::MacroDef(n) => Node::MacroDef(n),
}
}
}
#[derive(Copy, Clone, Debug, HashStable_Generic)] #[derive(Copy, Clone, Debug, HashStable_Generic)]
pub enum Node<'hir> { pub enum Node<'hir> {
Param(&'hir Param<'hir>), Param(&'hir Param<'hir>),

View file

@ -479,7 +479,7 @@ pub trait Visitor<'v>: Sized {
/// Walks the contents of a crate. See also `Crate::visit_all_items`. /// Walks the contents of a crate. See also `Crate::visit_all_items`.
pub fn walk_crate<'v, V: Visitor<'v>>(visitor: &mut V, krate: &'v Crate<'v>) { pub fn walk_crate<'v, V: Visitor<'v>>(visitor: &mut V, krate: &'v Crate<'v>) {
visitor.visit_mod(&krate.item, krate.item.inner, CRATE_HIR_ID); visitor.visit_mod(&krate.item, krate.item.inner, CRATE_HIR_ID);
walk_list!(visitor, visit_macro_def, krate.exported_macros); walk_list!(visitor, visit_macro_def, krate.exported_macros());
for (&id, attrs) in krate.attrs.iter() { for (&id, attrs) in krate.attrs.iter() {
for a in *attrs { for a in *attrs {
visitor.visit_attribute(id, a) visitor.visit_attribute(id, a)

View file

@ -570,7 +570,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc {
fn check_crate(&mut self, cx: &LateContext<'_>, krate: &hir::Crate<'_>) { fn check_crate(&mut self, cx: &LateContext<'_>, krate: &hir::Crate<'_>) {
self.check_missing_docs_attrs(cx, hir::CRATE_HIR_ID, krate.item.inner, "the", "crate"); self.check_missing_docs_attrs(cx, hir::CRATE_HIR_ID, krate.item.inner, "the", "crate");
for macro_def in krate.exported_macros { for macro_def in krate.exported_macros() {
// Non exported macros should be skipped, since `missing_docs` only // Non exported macros should be skipped, since `missing_docs` only
// applies to externally visible items. // applies to externally visible items.
if !cx.access_levels.is_exported(macro_def.hir_id()) { if !cx.access_levels.is_exported(macro_def.hir_id()) {

View file

@ -33,11 +33,11 @@ fn lint_levels(tcx: TyCtxt<'_>, (): ()) -> LintLevelMap {
let mut builder = LintLevelMapBuilder { levels, tcx, store }; let mut builder = LintLevelMapBuilder { levels, tcx, store };
let krate = tcx.hir().krate(); let krate = tcx.hir().krate();
builder.levels.id_to_set.reserve(krate.exported_macros.len() + 1); builder.levels.id_to_set.reserve(krate.owners.len() + 1);
let push = builder.levels.push(tcx.hir().attrs(hir::CRATE_HIR_ID), &store, true); let push = builder.levels.push(tcx.hir().attrs(hir::CRATE_HIR_ID), &store, true);
builder.levels.register_id(hir::CRATE_HIR_ID); builder.levels.register_id(hir::CRATE_HIR_ID);
for macro_def in krate.exported_macros { for macro_def in krate.exported_macros() {
builder.levels.register_id(macro_def.hir_id()); builder.levels.register_id(macro_def.hir_id());
} }
intravisit::walk_crate(&mut builder, krate); intravisit::walk_crate(&mut builder, krate);

View file

@ -448,7 +448,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
} }
krate.visit_all_item_likes(&mut self.as_deep_visitor()); krate.visit_all_item_likes(&mut self.as_deep_visitor());
for macro_def in krate.exported_macros { for macro_def in krate.exported_macros() {
self.visit_macro_def(macro_def); self.visit_macro_def(macro_def);
} }
} }

View file

@ -81,14 +81,10 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
let Crate { let Crate {
ref item, ref item,
// These fields are handled separately: // These fields are handled separately:
exported_macros: _,
non_exported_macro_attrs: _, non_exported_macro_attrs: _,
items: _, owners: _,
trait_items: _,
impl_items: _,
foreign_items: _,
bodies: _,
trait_impls: _, trait_impls: _,
bodies: _,
body_ids: _, body_ids: _,
modules: _, modules: _,
proc_macros: _, proc_macros: _,

View file

@ -554,8 +554,8 @@ impl<'hir> Map<'hir> {
where where
V: Visitor<'hir>, V: Visitor<'hir>,
{ {
for id in self.krate().exported_macros { for macro_def in self.krate().exported_macros() {
visitor.visit_macro_def(self.expect_macro_def(id.hir_id())); visitor.visit_macro_def(macro_def);
} }
} }

View file

@ -2307,7 +2307,7 @@ define_print_and_forward_display! {
fn for_each_def(tcx: TyCtxt<'_>, mut collect_fn: impl for<'b> FnMut(&'b Ident, Namespace, DefId)) { fn for_each_def(tcx: TyCtxt<'_>, mut collect_fn: impl for<'b> FnMut(&'b Ident, Namespace, DefId)) {
// Iterate all local crate items no matter where they are defined. // Iterate all local crate items no matter where they are defined.
let hir = tcx.hir(); let hir = tcx.hir();
for item in hir.krate().items.values() { for item in hir.krate().items() {
if item.ident.name.as_str().is_empty() || matches!(item.kind, ItemKind::Use(_, _)) { if item.ident.name.as_str().is_empty() || matches!(item.kind, ItemKind::Use(_, _)) {
continue; continue;
} }

View file

@ -108,7 +108,7 @@ fn diagnostic_items<'tcx>(tcx: TyCtxt<'tcx>, cnum: CrateNum) -> FxHashMap<Symbol
// Collect diagnostic items in this crate. // Collect diagnostic items in this crate.
tcx.hir().krate().visit_all_item_likes(&mut collector); tcx.hir().krate().visit_all_item_likes(&mut collector);
for m in tcx.hir().krate().exported_macros { for m in tcx.hir().krate().exported_macros() {
collector.observe_item(m.def_id); collector.observe_item(m.def_id);
} }

View file

@ -1015,21 +1015,14 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id); let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
// Ensure that the parent of the def is an item, not HRTB // Ensure that the parent of the def is an item, not HRTB
let parent_id = self.tcx.hir().get_parent_node(hir_id); let parent_id = self.tcx.hir().get_parent_node(hir_id);
let parent_is_item = if let Some(parent_def_id) = // FIXME(cjgillot) Can this check be replaced by
parent_id.as_owner() // `let parent_is_item = parent_id.is_owner();`?
{ let parent_is_item =
let parent_item_id = hir::ItemId { def_id: parent_def_id }; if let Some(parent_def_id) = parent_id.as_owner() {
let parent_impl_id = hir::ImplItemId { def_id: parent_def_id }; matches!(
let parent_trait_id = self.tcx.hir().krate().owners.get(parent_def_id),
hir::TraitItemId { def_id: parent_def_id }; Some(Some(_)),
let parent_foreign_id = )
hir::ForeignItemId { def_id: parent_def_id };
let krate = self.tcx.hir().krate();
krate.items.contains_key(&parent_item_id)
|| krate.impl_items.contains_key(&parent_impl_id)
|| krate.trait_items.contains_key(&parent_trait_id)
|| krate.foreign_items.contains_key(&parent_foreign_id)
} else { } else {
false false
}; };

View file

@ -83,7 +83,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
// In the case of macros 2.0 (`pub macro`), and for built-in `derive`s or attributes as // In the case of macros 2.0 (`pub macro`), and for built-in `derive`s or attributes as
// well (_e.g._, `Copy`), these are wrongly bundled in there too, so we need to fix that by // well (_e.g._, `Copy`), these are wrongly bundled in there too, so we need to fix that by
// moving them back to their correct locations. // moving them back to their correct locations.
'exported_macros: for def in krate.exported_macros { 'exported_macros: for def in krate.exported_macros() {
// The `def` of a macro in `exported_macros` should correspond to either: // The `def` of a macro in `exported_macros` should correspond to either:
// - a `#[macro_export] macro_rules!` macro, // - a `#[macro_export] macro_rules!` macro,
// - a built-in `derive` (or attribute) macro such as the ones in `::core`, // - a built-in `derive` (or attribute) macro such as the ones in `::core`,