Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/db.rs')
-rw-r--r--crates/hir-ty/src/db.rs96
1 files changed, 80 insertions, 16 deletions
diff --git a/crates/hir-ty/src/db.rs b/crates/hir-ty/src/db.rs
index a0fb75397a..3bf2d9a6a6 100644
--- a/crates/hir-ty/src/db.rs
+++ b/crates/hir-ty/src/db.rs
@@ -7,7 +7,7 @@ use hir_def::{
AdtId, BuiltinDeriveImplId, CallableDefId, ConstId, ConstParamId, DefWithBodyId, EnumVariantId,
ExpressionStoreOwnerId, FunctionId, GenericDefId, ImplId, LifetimeParamId, LocalFieldId,
StaticId, TraitId, TypeAliasId, VariantId, builtin_derive::BuiltinDeriveImplMethod,
- db::DefDatabase, hir::ExprId, layout::TargetDataLayout,
+ db::DefDatabase, expr_store::ExpressionStore, hir::ExprId, layout::TargetDataLayout,
};
use la_arena::ArenaMap;
use salsa::plumbing::AsId;
@@ -21,8 +21,8 @@ use crate::{
lower::{Diagnostics, GenericDefaults},
mir::{BorrowckResult, MirBody, MirLowerError},
next_solver::{
- Const, EarlyBinder, GenericArgs, ParamEnv, PolyFnSig, StoredEarlyBinder, StoredGenericArgs,
- StoredTy, TraitRef, Ty, VariancesOf,
+ Allocation, EarlyBinder, GenericArgs, ParamEnv, PolyFnSig, StoredEarlyBinder,
+ StoredGenericArgs, StoredTy, TraitRef, Ty, VariancesOf,
},
traits::{ParamEnvAndCrate, StoredParamEnvAndCrate},
};
@@ -68,11 +68,11 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
def: ConstId,
subst: GenericArgs<'db>,
trait_env: Option<ParamEnvAndCrate<'db>>,
- ) -> Result<Const<'db>, ConstEvalError>;
+ ) -> Result<Allocation<'db>, ConstEvalError>;
#[salsa::invoke(crate::consteval::const_eval_static)]
#[salsa::transparent]
- fn const_eval_static<'db>(&'db self, def: StaticId) -> Result<Const<'db>, ConstEvalError>;
+ fn const_eval_static<'db>(&'db self, def: StaticId) -> Result<Allocation<'db>, ConstEvalError>;
#[salsa::invoke(crate::consteval::const_eval_discriminant_variant)]
#[salsa::cycle(cycle_result = crate::consteval::const_eval_discriminant_cycle_result)]
@@ -200,12 +200,6 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
#[salsa::interned]
fn intern_impl_trait_id(&self, id: ImplTraitId) -> InternedOpaqueTyId;
- #[salsa::interned]
- fn intern_closure(&self, id: InternedClosure) -> InternedClosureId;
-
- #[salsa::interned]
- fn intern_coroutine(&self, id: InternedCoroutine) -> InternedCoroutineId;
-
#[salsa::invoke(crate::variance::variances_of)]
#[salsa::transparent]
fn variances_of<'db>(&'db self, def: GenericDefId) -> VariancesOf<'db>;
@@ -238,17 +232,87 @@ pub struct InternedOpaqueTyId {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct InternedClosure(pub ExpressionStoreOwnerId, pub ExprId);
-#[salsa_macros::interned(no_lifetime, debug, revisions = usize::MAX)]
+#[salsa_macros::interned(constructor = new_impl, no_lifetime, debug, revisions = usize::MAX)]
#[derive(PartialOrd, Ord)]
pub struct InternedClosureId {
pub loc: InternedClosure,
}
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
-pub struct InternedCoroutine(pub ExpressionStoreOwnerId, pub ExprId);
+impl InternedClosureId {
+ #[inline]
+ pub fn new(db: &dyn HirDatabase, loc: InternedClosure) -> Self {
+ if cfg!(debug_assertions) {
+ let store = ExpressionStore::of(db, loc.0);
+ let expr = &store[loc.1];
+ assert!(
+ matches!(
+ expr,
+ hir_def::hir::Expr::Closure {
+ closure_kind: hir_def::hir::ClosureKind::Closure,
+ ..
+ }
+ ),
+ "expected a closure, found {expr:?}"
+ );
+ }
+
+ Self::new_impl(db, loc)
+ }
+}
-#[salsa_macros::interned(no_lifetime, debug, revisions = usize::MAX)]
+#[salsa_macros::interned(constructor = new_impl, no_lifetime, debug, revisions = usize::MAX)]
#[derive(PartialOrd, Ord)]
pub struct InternedCoroutineId {
- pub loc: InternedCoroutine,
+ pub loc: InternedClosure,
+}
+
+impl InternedCoroutineId {
+ #[inline]
+ pub fn new(db: &dyn HirDatabase, loc: InternedClosure) -> Self {
+ if cfg!(debug_assertions) {
+ let store = ExpressionStore::of(db, loc.0);
+ let expr = &store[loc.1];
+ assert!(
+ matches!(
+ expr,
+ hir_def::hir::Expr::Closure {
+ closure_kind: hir_def::hir::ClosureKind::Coroutine(_)
+ | hir_def::hir::ClosureKind::AsyncBlock { .. },
+ ..
+ }
+ ),
+ "expected a coroutine, found {expr:?}"
+ );
+ }
+
+ Self::new_impl(db, loc)
+ }
+}
+
+#[salsa_macros::interned(constructor = new_impl, no_lifetime, debug, revisions = usize::MAX)]
+#[derive(PartialOrd, Ord)]
+pub struct InternedCoroutineClosureId {
+ pub loc: InternedClosure,
+}
+
+impl InternedCoroutineClosureId {
+ #[inline]
+ pub fn new(db: &dyn HirDatabase, loc: InternedClosure) -> Self {
+ if cfg!(debug_assertions) {
+ let store = ExpressionStore::of(db, loc.0);
+ let expr = &store[loc.1];
+ assert!(
+ matches!(
+ expr,
+ hir_def::hir::Expr::Closure {
+ closure_kind: hir_def::hir::ClosureKind::AsyncClosure,
+ ..
+ }
+ ),
+ "expected a coroutine closure, found {expr:?}"
+ );
+ }
+
+ Self::new_impl(db, loc)
+ }
}