Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 5 additions & 147 deletions crates/hir-def/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,16 @@ use triomphe::Arc;

use crate::{
AnonConstId, AnonConstLoc, AssocItemId, AttrDefId, BlockId, BlockLoc, ConstId, ConstLoc,
DefWithBodyId, EnumId, EnumLoc, EnumVariantId, EnumVariantLoc, ExpressionStoreOwner,
ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc, FunctionId, FunctionLoc,
GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc, MacroExpander, MacroId,
MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId, ProcMacroLoc, StaticId,
StaticLoc, StructId, StructLoc, TraitId, TraitLoc, TypeAliasId, TypeAliasLoc, UnionId,
UnionLoc, UseId, UseLoc, VariantId,
EnumId, EnumLoc, EnumVariantId, EnumVariantLoc, ExternBlockId, ExternBlockLoc, ExternCrateId,
ExternCrateLoc, FunctionId, FunctionLoc, GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id,
Macro2Loc, MacroExpander, MacroId, MacroRulesId, MacroRulesLoc, MacroRulesLocFlags,
ProcMacroId, ProcMacroLoc, StaticId, StaticLoc, StructId, StructLoc, TraitId, TraitLoc,
TypeAliasId, TypeAliasLoc, UnionId, UnionLoc, UseId, UseLoc, VariantId,
attrs::AttrFlags,
expr_store::{
Body, BodySourceMap, ExpressionStore, ExpressionStoreSourceMap, scope::ExprScopes,
},
hir::generics::GenericParams,
import_map::ImportMap,
item_tree::{ItemTree, file_item_tree_query},
nameres::crate_def_map,
signatures::{
ConstSignature, EnumSignature, FunctionSignature, ImplSignature, StaticSignature,
StructSignature, TraitSignature, TypeAliasSignature, UnionSignature,
},
visibility::{self, Visibility},
};

Expand Down Expand Up @@ -106,144 +98,10 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
#[salsa::invoke(macro_def)]
fn macro_def(&self, m: MacroId) -> MacroDefId;

// region:data

#[salsa::tracked]
fn trait_signature(&self, trait_: TraitId) -> Arc<TraitSignature> {
self.trait_signature_with_source_map(trait_).0
}

#[salsa::tracked]
fn impl_signature(&self, impl_: ImplId) -> Arc<ImplSignature> {
self.impl_signature_with_source_map(impl_).0
}

#[salsa::tracked]
fn struct_signature(&self, struct_: StructId) -> Arc<StructSignature> {
self.struct_signature_with_source_map(struct_).0
}

#[salsa::tracked]
fn union_signature(&self, union_: UnionId) -> Arc<UnionSignature> {
self.union_signature_with_source_map(union_).0
}

#[salsa::tracked]
fn enum_signature(&self, e: EnumId) -> Arc<EnumSignature> {
self.enum_signature_with_source_map(e).0
}

#[salsa::tracked]
fn const_signature(&self, e: ConstId) -> Arc<ConstSignature> {
self.const_signature_with_source_map(e).0
}

#[salsa::tracked]
fn static_signature(&self, e: StaticId) -> Arc<StaticSignature> {
self.static_signature_with_source_map(e).0
}

#[salsa::tracked]
fn function_signature(&self, e: FunctionId) -> Arc<FunctionSignature> {
self.function_signature_with_source_map(e).0
}

#[salsa::tracked]
fn type_alias_signature(&self, e: TypeAliasId) -> Arc<TypeAliasSignature> {
self.type_alias_signature_with_source_map(e).0
}

#[salsa::invoke(TraitSignature::query)]
fn trait_signature_with_source_map(
&self,
trait_: TraitId,
) -> (Arc<TraitSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(ImplSignature::query)]
fn impl_signature_with_source_map(
&self,
impl_: ImplId,
) -> (Arc<ImplSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(StructSignature::query)]
fn struct_signature_with_source_map(
&self,
struct_: StructId,
) -> (Arc<StructSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(UnionSignature::query)]
fn union_signature_with_source_map(
&self,
union_: UnionId,
) -> (Arc<UnionSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(EnumSignature::query)]
fn enum_signature_with_source_map(
&self,
e: EnumId,
) -> (Arc<EnumSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(ConstSignature::query)]
fn const_signature_with_source_map(
&self,
e: ConstId,
) -> (Arc<ConstSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(StaticSignature::query)]
fn static_signature_with_source_map(
&self,
e: StaticId,
) -> (Arc<StaticSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(FunctionSignature::query)]
fn function_signature_with_source_map(
&self,
e: FunctionId,
) -> (Arc<FunctionSignature>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(TypeAliasSignature::query)]
fn type_alias_signature_with_source_map(
&self,
e: TypeAliasId,
) -> (Arc<TypeAliasSignature>, Arc<ExpressionStoreSourceMap>);

// endregion:data

#[salsa::invoke(Body::body_with_source_map_query)]
#[salsa::lru(512)]
fn body_with_source_map(&self, def: DefWithBodyId) -> (Arc<Body>, Arc<BodySourceMap>);

#[salsa::invoke(Body::body_query)]
fn body(&self, def: DefWithBodyId) -> Arc<Body>;

#[salsa::invoke(ExprScopes::body_expr_scopes_query)]
fn body_expr_scopes(&self, def: DefWithBodyId) -> Arc<ExprScopes>;

#[salsa::invoke(ExprScopes::sig_expr_scopes_query)]
fn sig_expr_scopes(&self, def: GenericDefId) -> Arc<ExprScopes>;

#[salsa::transparent]
#[salsa::invoke(ExprScopes::expr_scopes_query)]
fn expr_scopes(&self, def: ExpressionStoreOwner) -> Arc<ExprScopes>;

#[salsa::transparent]
#[salsa::invoke(GenericParams::new)]
fn generic_params(&self, def: GenericDefId) -> Arc<GenericParams>;

#[salsa::transparent]
#[salsa::invoke(GenericParams::generic_params_and_store)]
fn generic_params_and_store(
&self,
def: GenericDefId,
) -> (Arc<GenericParams>, Arc<ExpressionStore>);

#[salsa::transparent]
#[salsa::invoke(GenericParams::generic_params_and_store_and_source_map)]
fn generic_params_and_store_and_source_map(
&self,
def: GenericDefId,
) -> (Arc<GenericParams>, Arc<ExpressionStore>, Arc<ExpressionStoreSourceMap>);

#[salsa::invoke(ImportMap::import_map_query)]
fn import_map(&self, krate: Crate) -> Arc<ImportMap>;

Expand Down
94 changes: 81 additions & 13 deletions crates/hir-def/src/expr_store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,7 @@ pub mod scope;
#[cfg(test)]
mod tests;

use std::{
ops::{Deref, Index},
sync::LazyLock,
};
use std::ops::{Deref, Index};

use cfg::{CfgExpr, CfgOptions};
use either::Either;
Expand All @@ -23,11 +20,10 @@ use smallvec::SmallVec;
use span::{Edition, SyntaxContext};
use syntax::{AstPtr, SyntaxNodePtr, ast};
use thin_vec::ThinVec;
use triomphe::Arc;
use tt::TextRange;

use crate::{
BlockId, SyntheticSyntax,
AdtId, BlockId, ExpressionStoreOwnerId, GenericDefId, SyntheticSyntax,
db::DefDatabase,
expr_store::path::Path,
hir::{
Expand Down Expand Up @@ -431,13 +427,85 @@ impl ExpressionStoreBuilder {
}

impl ExpressionStore {
pub fn empty_singleton() -> (Arc<ExpressionStore>, Arc<ExpressionStoreSourceMap>) {
static EMPTY: LazyLock<(Arc<ExpressionStore>, Arc<ExpressionStoreSourceMap>)> =
LazyLock::new(|| {
let (store, source_map) = ExpressionStoreBuilder::default().finish();
(Arc::new(store), Arc::new(source_map))
});
EMPTY.clone()
pub fn of(db: &dyn DefDatabase, def: ExpressionStoreOwnerId) -> &ExpressionStore {
match def {
ExpressionStoreOwnerId::Signature(def) => {
use crate::signatures::{
ConstSignature, EnumSignature, FunctionSignature, ImplSignature,
StaticSignature, StructSignature, TraitSignature, TypeAliasSignature,
UnionSignature,
};
match def {
GenericDefId::AdtId(AdtId::EnumId(id)) => &EnumSignature::of(db, id).store,
GenericDefId::AdtId(AdtId::StructId(id)) => &StructSignature::of(db, id).store,
GenericDefId::AdtId(AdtId::UnionId(id)) => &UnionSignature::of(db, id).store,
GenericDefId::ConstId(id) => &ConstSignature::of(db, id).store,
GenericDefId::FunctionId(id) => &FunctionSignature::of(db, id).store,
GenericDefId::ImplId(id) => &ImplSignature::of(db, id).store,
GenericDefId::StaticId(id) => &StaticSignature::of(db, id).store,
GenericDefId::TraitId(id) => &TraitSignature::of(db, id).store,
GenericDefId::TypeAliasId(id) => &TypeAliasSignature::of(db, id).store,
}
}
ExpressionStoreOwnerId::Body(body) => &Body::of(db, body).store,
}
}

pub fn with_source_map(
db: &dyn DefDatabase,
def: ExpressionStoreOwnerId,
) -> (&ExpressionStore, &ExpressionStoreSourceMap) {
match def {
ExpressionStoreOwnerId::Signature(def) => {
use crate::signatures::{
ConstSignature, EnumSignature, FunctionSignature, ImplSignature,
StaticSignature, StructSignature, TraitSignature, TypeAliasSignature,
UnionSignature,
};
match def {
GenericDefId::AdtId(AdtId::EnumId(id)) => {
let sig = EnumSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::AdtId(AdtId::StructId(id)) => {
let sig = StructSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::AdtId(AdtId::UnionId(id)) => {
let sig = UnionSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::ConstId(id) => {
let sig = ConstSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::FunctionId(id) => {
let sig = FunctionSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::ImplId(id) => {
let sig = ImplSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::StaticId(id) => {
let sig = StaticSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::TraitId(id) => {
let sig = TraitSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
GenericDefId::TypeAliasId(id) => {
let sig = TypeAliasSignature::with_source_map(db, id);
(&sig.0.store, &sig.1)
}
}
}
ExpressionStoreOwnerId::Body(body) => {
let (store, sm) = Body::with_source_map(db, body);
(&store.store, &sm.store)
}
}
}

/// Returns all const expression root `ExprId`s found in this store.
Expand Down
16 changes: 9 additions & 7 deletions crates/hir-def/src/expr_store/body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,10 @@ impl ops::Deref for BodySourceMap {
}
}

#[salsa::tracked]
impl Body {
pub(crate) fn body_with_source_map_query(
db: &dyn DefDatabase,
def: DefWithBodyId,
) -> (Arc<Body>, Arc<BodySourceMap>) {
#[salsa::tracked(lru = 512, returns(ref))]
pub fn with_source_map(db: &dyn DefDatabase, def: DefWithBodyId) -> (Arc<Body>, BodySourceMap) {
let _p = tracing::info_span!("body_with_source_map_query").entered();
let mut params = None;

Expand Down Expand Up @@ -106,13 +105,16 @@ impl Body {
let module = def.module(db);
let (body, source_map) = lower_body(db, def, file_id, module, params, body, is_async_fn);

(Arc::new(body), Arc::new(source_map))
(Arc::new(body), source_map)
}

pub(crate) fn body_query(db: &dyn DefDatabase, def: DefWithBodyId) -> Arc<Body> {
db.body_with_source_map(def).0
#[salsa::tracked(returns(deref))]
pub fn of(db: &dyn DefDatabase, def: DefWithBodyId) -> Arc<Body> {
Self::with_source_map(db, def).0.clone()
}
}

impl Body {
pub fn pretty_print(
&self,
db: &dyn DefDatabase,
Expand Down
7 changes: 4 additions & 3 deletions crates/hir-def/src/expr_store/lower.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ use crate::{
item_tree::FieldsShape,
lang_item::{LangItemTarget, LangItems},
nameres::{DefMap, LocalDefMap, MacroSubNs, block_def_map},
signatures::StructSignature,
type_ref::{
ArrayType, ConstRef, FnType, LifetimeRef, LifetimeRefId, Mutability, PathId, Rawness,
RefType, TraitBoundModifier, TraitRef, TypeBound, TypeRef, TypeRefId, UseArgRef,
Expand Down Expand Up @@ -200,13 +201,13 @@ pub(crate) fn lower_generic_params(
file_id: HirFileId,
param_list: Option<ast::GenericParamList>,
where_clause: Option<ast::WhereClause>,
) -> (Arc<ExpressionStore>, Arc<GenericParams>, ExpressionStoreSourceMap) {
) -> (ExpressionStore, Arc<GenericParams>, ExpressionStoreSourceMap) {
let mut expr_collector = ExprCollector::signature(db, module, file_id);
let mut collector = generics::GenericParamsCollector::new(def);
collector.lower(&mut expr_collector, param_list, where_clause);
let params = collector.finish();
let (store, source_map) = expr_collector.store.finish();
(Arc::new(store), params, source_map)
(store, params, source_map)
}

pub(crate) fn lower_impl(
Expand Down Expand Up @@ -2363,7 +2364,7 @@ impl<'db> ExprCollector<'db> {
}
Some(ModuleDefId::AdtId(AdtId::StructId(s)))
// FIXME: This can cause a cycle if the user is writing invalid code
if self.db.struct_signature(s).shape != FieldsShape::Record =>
if StructSignature::of(self.db, s).shape != FieldsShape::Record =>
{
(None, Pat::Path(name.into()))
}
Expand Down
8 changes: 4 additions & 4 deletions crates/hir-def/src/expr_store/pretty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,8 @@ pub fn print_signature(db: &dyn DefDatabase, owner: GenericDefId, edition: Editi
match owner {
GenericDefId::AdtId(id) => match id {
AdtId::StructId(id) => {
let signature = db.struct_signature(id);
print_struct(db, id, &signature, edition)
let signature = StructSignature::of(db, id);
print_struct(db, id, signature, edition)
}
AdtId::UnionId(id) => {
format!("unimplemented {id:?}")
Expand All @@ -180,8 +180,8 @@ pub fn print_signature(db: &dyn DefDatabase, owner: GenericDefId, edition: Editi
},
GenericDefId::ConstId(id) => format!("unimplemented {id:?}"),
GenericDefId::FunctionId(id) => {
let signature = db.function_signature(id);
print_function(db, id, &signature, edition)
let signature = FunctionSignature::of(db, id);
print_function(db, id, signature, edition)
}
GenericDefId::ImplId(id) => format!("unimplemented {id:?}"),
GenericDefId::StaticId(id) => format!("unimplemented {id:?}"),
Expand Down
Loading