Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-def/src/data.rs2
-rw-r--r--crates/hir-def/src/db.rs1
-rw-r--r--crates/hir-def/src/item_tree.rs36
-rw-r--r--crates/hir-def/src/visibility.rs12
4 files changed, 31 insertions, 20 deletions
diff --git a/crates/hir-def/src/data.rs b/crates/hir-def/src/data.rs
index 4338163672..8cf1e15f31 100644
--- a/crates/hir-def/src/data.rs
+++ b/crates/hir-def/src/data.rs
@@ -323,7 +323,7 @@ impl TraitAliasData {
pub struct ImplData {
pub target_trait: Option<Interned<TraitRef>>,
pub self_ty: Interned<TypeRef>,
- pub items: Vec<AssocItemId>,
+ pub items: Box<[AssocItemId]>,
pub is_negative: bool,
pub is_unsafe: bool,
// box it as the vec is usually empty anyways
diff --git a/crates/hir-def/src/db.rs b/crates/hir-def/src/db.rs
index eb45ad343e..0eb9e7d30b 100644
--- a/crates/hir-def/src/db.rs
+++ b/crates/hir-def/src/db.rs
@@ -193,6 +193,7 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba
#[salsa::invoke(Attrs::fields_attrs_query)]
fn fields_attrs(&self, def: VariantId) -> Arc<ArenaMap<LocalFieldId, Attrs>>;
+ // should this really be a query?
#[salsa::invoke(crate::attr::fields_attrs_source_map)]
fn fields_attrs_source_map(
&self,
diff --git a/crates/hir-def/src/item_tree.rs b/crates/hir-def/src/item_tree.rs
index be74d15814..7650dfe9f3 100644
--- a/crates/hir-def/src/item_tree.rs
+++ b/crates/hir-def/src/item_tree.rs
@@ -616,24 +616,30 @@ impl Index<RawVisibilityId> for ItemTree {
type Output = RawVisibility;
fn index(&self, index: RawVisibilityId) -> &Self::Output {
static VIS_PUB: RawVisibility = RawVisibility::Public;
- static VIS_PRIV_IMPLICIT: RawVisibility = RawVisibility::Module(
- ModPath::from_kind(PathKind::SELF),
- VisibilityExplicitness::Implicit,
- );
- static VIS_PRIV_EXPLICIT: RawVisibility = RawVisibility::Module(
- ModPath::from_kind(PathKind::SELF),
- VisibilityExplicitness::Explicit,
- );
- static VIS_PUB_CRATE: RawVisibility = RawVisibility::Module(
- ModPath::from_kind(PathKind::Crate),
- VisibilityExplicitness::Explicit,
- );
+ static VIS_PRIV_IMPLICIT: OnceCell<RawVisibility> = OnceCell::new();
+ static VIS_PRIV_EXPLICIT: OnceCell<RawVisibility> = OnceCell::new();
+ static VIS_PUB_CRATE: OnceCell<RawVisibility> = OnceCell::new();
match index {
- RawVisibilityId::PRIV_IMPLICIT => &VIS_PRIV_IMPLICIT,
- RawVisibilityId::PRIV_EXPLICIT => &VIS_PRIV_EXPLICIT,
+ RawVisibilityId::PRIV_IMPLICIT => VIS_PRIV_IMPLICIT.get_or_init(|| {
+ RawVisibility::Module(
+ Interned::new(ModPath::from_kind(PathKind::SELF)),
+ VisibilityExplicitness::Implicit,
+ )
+ }),
+ RawVisibilityId::PRIV_EXPLICIT => VIS_PRIV_EXPLICIT.get_or_init(|| {
+ RawVisibility::Module(
+ Interned::new(ModPath::from_kind(PathKind::SELF)),
+ VisibilityExplicitness::Explicit,
+ )
+ }),
RawVisibilityId::PUB => &VIS_PUB,
- RawVisibilityId::PUB_CRATE => &VIS_PUB_CRATE,
+ RawVisibilityId::PUB_CRATE => VIS_PUB_CRATE.get_or_init(|| {
+ RawVisibility::Module(
+ Interned::new(ModPath::from_kind(PathKind::Crate)),
+ VisibilityExplicitness::Explicit,
+ )
+ }),
_ => &self.data().vis.arena[Idx::from_raw(index.0.into())],
}
}
diff --git a/crates/hir-def/src/visibility.rs b/crates/hir-def/src/visibility.rs
index e08718fc83..11d91513f1 100644
--- a/crates/hir-def/src/visibility.rs
+++ b/crates/hir-def/src/visibility.rs
@@ -2,6 +2,7 @@
use std::iter;
+use intern::Interned;
use la_arena::ArenaMap;
use span::SyntaxContextId;
use syntax::ast;
@@ -20,14 +21,17 @@ use crate::{
pub enum RawVisibility {
/// `pub(in module)`, `pub(crate)` or `pub(super)`. Also private, which is
/// equivalent to `pub(self)`.
- Module(ModPath, VisibilityExplicitness),
+ Module(Interned<ModPath>, VisibilityExplicitness),
/// `pub`.
Public,
}
impl RawVisibility {
- pub(crate) const fn private() -> RawVisibility {
- RawVisibility::Module(ModPath::from_kind(PathKind::SELF), VisibilityExplicitness::Implicit)
+ pub(crate) fn private() -> RawVisibility {
+ RawVisibility::Module(
+ Interned::new(ModPath::from_kind(PathKind::SELF)),
+ VisibilityExplicitness::Implicit,
+ )
}
pub(crate) fn from_ast(
@@ -60,7 +64,7 @@ impl RawVisibility {
ast::VisibilityKind::PubSelf => ModPath::from_kind(PathKind::SELF),
ast::VisibilityKind::Pub => return RawVisibility::Public,
};
- RawVisibility::Module(path, VisibilityExplicitness::Explicit)
+ RawVisibility::Module(Interned::new(path), VisibilityExplicitness::Explicit)
}
pub fn resolve(