Use BTreeMap to store attributes.
This commit is contained in:
parent
90a562c7ff
commit
38d9d09a58
10 changed files with 117 additions and 47 deletions
|
@ -132,11 +132,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
|
|||
hcx,
|
||||
hir_body_nodes,
|
||||
map: (0..definitions.def_index_count())
|
||||
.map(|id| HirOwnerData {
|
||||
attrs: krate.attrs.get_owner(Idx::new(id)),
|
||||
signature: None,
|
||||
with_bodies: None,
|
||||
})
|
||||
.map(|_| HirOwnerData { signature: None, with_bodies: None })
|
||||
.collect(),
|
||||
};
|
||||
collector.insert_entry(
|
||||
|
|
|
@ -88,7 +88,6 @@ fn is_body_owner<'hir>(node: Node<'hir>, hir_id: HirId) -> bool {
|
|||
|
||||
#[derive(Debug)]
|
||||
pub(super) struct HirOwnerData<'hir> {
|
||||
pub(super) attrs: &'hir IndexVec<ItemLocalId, &'hir [ast::Attribute]>,
|
||||
pub(super) signature: Option<&'hir Owner<'hir>>,
|
||||
pub(super) with_bodies: Option<&'hir mut OwnerNodes<'hir>>,
|
||||
}
|
||||
|
@ -851,7 +850,7 @@ impl<'hir> Map<'hir> {
|
|||
/// Given a node ID, gets a list of attributes associated with the AST
|
||||
/// corresponding to the node-ID.
|
||||
pub fn attrs(&self, id: HirId) -> &'hir [ast::Attribute] {
|
||||
self.tcx.hir_attrs(id.owner).get(id.local_id).copied().unwrap_or(&[])
|
||||
self.tcx.hir_attrs(id.owner).get(id.local_id)
|
||||
}
|
||||
|
||||
/// Gets the span of the definition of the specified HIR node.
|
||||
|
|
|
@ -9,6 +9,7 @@ pub mod place;
|
|||
use crate::ich::StableHashingContext;
|
||||
use crate::ty::query::Providers;
|
||||
use crate::ty::TyCtxt;
|
||||
use rustc_ast::Attribute;
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
|
@ -16,6 +17,7 @@ use rustc_hir::def_id::{LocalDefId, LOCAL_CRATE};
|
|||
use rustc_hir::*;
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_span::DUMMY_SP;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Owner<'tcx> {
|
||||
|
@ -55,6 +57,48 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for OwnerNodes<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct AttributeMap<'tcx> {
|
||||
map: &'tcx BTreeMap<HirId, &'tcx [Attribute]>,
|
||||
prefix: LocalDefId,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for AttributeMap<'tcx> {
|
||||
fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
|
||||
let range = self.range();
|
||||
|
||||
range.clone().count().hash_stable(hcx, hasher);
|
||||
for (key, value) in range {
|
||||
key.hash_stable(hcx, hasher);
|
||||
value.hash_stable(hcx, hasher);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> std::fmt::Debug for AttributeMap<'tcx> {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("AttributeMap")
|
||||
.field("prefix", &self.prefix)
|
||||
.field("range", &&self.range().collect::<Vec<_>>()[..])
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> AttributeMap<'tcx> {
|
||||
fn get(&self, id: ItemLocalId) -> &'tcx [Attribute] {
|
||||
self.map.get(&HirId { owner: self.prefix, local_id: id }).copied().unwrap_or(&[])
|
||||
}
|
||||
|
||||
fn range(&self) -> std::collections::btree_map::Range<'_, rustc_hir::HirId, &[Attribute]> {
|
||||
let local_zero = ItemLocalId::from_u32(0);
|
||||
let range = HirId { owner: self.prefix, local_id: local_zero }..HirId {
|
||||
owner: LocalDefId { local_def_index: self.prefix.local_def_index + 1 },
|
||||
local_id: local_zero,
|
||||
};
|
||||
self.map.range(range)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TyCtxt<'tcx> {
|
||||
#[inline(always)]
|
||||
pub fn hir(self) -> map::Map<'tcx> {
|
||||
|
@ -76,7 +120,7 @@ pub fn provide(providers: &mut Providers) {
|
|||
providers.hir_module_items = |tcx, id| &tcx.untracked_crate.modules[&id];
|
||||
providers.hir_owner = |tcx, id| tcx.index_hir(LOCAL_CRATE).map[id].signature;
|
||||
providers.hir_owner_nodes = |tcx, id| tcx.index_hir(LOCAL_CRATE).map[id].with_bodies.as_deref();
|
||||
providers.hir_attrs = |tcx, id| &tcx.index_hir(LOCAL_CRATE).map[id].attrs;
|
||||
providers.hir_attrs = |tcx, id| AttributeMap { map: &tcx.untracked_crate.attrs, prefix: id };
|
||||
providers.def_span = |tcx, def_id| tcx.hir().span_if_local(def_id).unwrap_or(DUMMY_SP);
|
||||
providers.fn_arg_names = |tcx, id| {
|
||||
let hir = tcx.hir();
|
||||
|
|
|
@ -65,7 +65,7 @@ rustc_queries! {
|
|||
///
|
||||
/// This can be conveniently accessed by methods on `tcx.hir()`.
|
||||
/// Avoid calling this query directly.
|
||||
query hir_attrs(key: LocalDefId) -> &'tcx IndexVec<ItemLocalId, &'tcx [ast::Attribute]> {
|
||||
query hir_attrs(key: LocalDefId) -> rustc_middle::hir::AttributeMap<'tcx> {
|
||||
eval_always
|
||||
desc { |tcx| "HIR owner attributes in `{}`", tcx.def_path_str(key.to_def_id()) }
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue