Skip to content

Commit 78b5c6e

Browse files
committed
refactor: Intern TraitEnvironment into salsa
1 parent c8a5e43 commit 78b5c6e

File tree

99 files changed

+1190
-1077
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+1190
-1077
lines changed

crates/hir-ty/src/autoderef.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use chalk_ir::cast::Cast;
99
use hir_def::lang_item::LangItem;
1010
use hir_expand::name::Name;
1111
use intern::sym;
12-
use triomphe::Arc;
1312

1413
use crate::{
1514
Canonical, Goal, Interner, ProjectionTyExt, TraitEnvironment, Ty, TyBuilder, TyKind,
@@ -33,7 +32,7 @@ pub(crate) enum AutoderefKind {
3332
/// detects a cycle in the deref chain.
3433
pub fn autoderef(
3534
db: &dyn HirDatabase,
36-
env: Arc<TraitEnvironment>,
35+
env: TraitEnvironment<'_>,
3736
ty: Canonical<Ty>,
3837
) -> impl Iterator<Item = Ty> {
3938
let mut table = InferenceTable::new(db, env);
@@ -198,15 +197,16 @@ pub(crate) fn deref_by_trait(
198197
// blanked impl on `Deref`.
199198
#[expect(clippy::overly_complex_bool_expr)]
200199
if use_receiver_trait && false {
201-
if let Some(receiver) =
202-
db.lang_item(table.trait_env.krate, LangItem::Receiver).and_then(|l| l.as_trait())
200+
if let Some(receiver) = db
201+
.lang_item(table.trait_env.krate(db), LangItem::Receiver)
202+
.and_then(|l| l.as_trait())
203203
{
204204
return Some(receiver);
205205
}
206206
}
207207
// Old rustc versions might not have `Receiver` trait.
208208
// Fallback to `Deref` if they don't
209-
db.lang_item(table.trait_env.krate, LangItem::Deref).and_then(|l| l.as_trait())
209+
db.lang_item(table.trait_env.krate(db), LangItem::Deref).and_then(|l| l.as_trait())
210210
};
211211
let trait_id = trait_id()?;
212212
let target = db

crates/hir-ty/src/chalk_ext.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ impl TyExt for Ty {
376376
let trait_ref = TyBuilder::trait_ref(db, copy_trait).push(self).build();
377377
let env = db.trait_environment_for_body(owner);
378378
let goal = Canonical {
379-
value: InEnvironment::new(&env.env, trait_ref.cast(Interner)),
379+
value: InEnvironment::new(env.env(db), trait_ref.cast(Interner)),
380380
binders: CanonicalVarKinds::empty(Interner),
381381
};
382382
db.trait_solve(crate_id, None, goal).is_some()

crates/hir-ty/src/consteval.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ pub fn intern_const_ref(
165165
ty: Ty,
166166
krate: Crate,
167167
) -> Const {
168-
let layout = db.layout_of_ty(ty.clone(), TraitEnvironment::empty(krate));
168+
let layout = db.layout_of_ty(ty.clone(), TraitEnvironment::empty(db, krate));
169169
let bytes = match value {
170170
LiteralConstRef::Int(i) => {
171171
// FIXME: We should handle failure of layout better.
@@ -233,7 +233,7 @@ pub(crate) fn const_eval_recover(
233233
_: HirDatabaseData,
234234
_: GeneralConstId,
235235
_: Substitution,
236-
_: Option<Arc<TraitEnvironment>>,
236+
_: Option<TraitEnvironment<'_>>,
237237
) -> Result<Const, ConstEvalError> {
238238
Err(ConstEvalError::MirLowerError(MirLowerError::Loop))
239239
}
@@ -258,15 +258,15 @@ pub(crate) fn const_eval_query(
258258
db: &dyn HirDatabase,
259259
def: GeneralConstId,
260260
subst: Substitution,
261-
trait_env: Option<Arc<TraitEnvironment>>,
261+
trait_env: Option<TraitEnvironment<'_>>,
262262
) -> Result<Const, ConstEvalError> {
263263
let body = match def {
264264
GeneralConstId::ConstId(c) => {
265265
db.monomorphized_mir_body(c.into(), subst, db.trait_environment(c.into()))?
266266
}
267267
GeneralConstId::StaticId(s) => {
268268
let krate = s.module(db.upcast()).krate();
269-
db.monomorphized_mir_body(s.into(), subst, TraitEnvironment::empty(krate))?
269+
db.monomorphized_mir_body(s.into(), subst, TraitEnvironment::empty(db, krate))?
270270
}
271271
GeneralConstId::ConstBlockId(c) => {
272272
let ConstBlockLoc { parent, root } = db.lookup_intern_anonymous_const(c);

crates/hir-ty/src/db.rs

+27-22
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use crate::{
2828
mir::{BorrowckResult, MirBody, MirLowerError},
2929
};
3030

31+
#[allow(clippy::needless_lifetimes)]
3132
#[query_group::query_group]
3233
pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
3334
#[salsa::invoke_actual(crate::infer::infer_query)]
@@ -44,19 +45,19 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
4445

4546
#[salsa::invoke(crate::mir::monomorphized_mir_body_query)]
4647
#[salsa::cycle(crate::mir::monomorphized_mir_body_recover)]
47-
fn monomorphized_mir_body(
48-
&self,
48+
fn monomorphized_mir_body<'db>(
49+
&'db self,
4950
def: DefWithBodyId,
5051
subst: Substitution,
51-
env: Arc<TraitEnvironment>,
52+
env: TraitEnvironment<'db>,
5253
) -> Result<Arc<MirBody>, MirLowerError>;
5354

5455
#[salsa::invoke(crate::mir::monomorphized_mir_body_for_closure_query)]
55-
fn monomorphized_mir_body_for_closure(
56-
&self,
56+
fn monomorphized_mir_body_for_closure<'db>(
57+
&'db self,
5758
def: ClosureId,
5859
subst: Substitution,
59-
env: Arc<TraitEnvironment>,
60+
env: TraitEnvironment<'db>,
6061
) -> Result<Arc<MirBody>, MirLowerError>;
6162

6263
#[salsa::invoke(crate::mir::borrowck_query)]
@@ -65,11 +66,11 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
6566

6667
#[salsa::invoke(crate::consteval::const_eval_query)]
6768
#[salsa::cycle(crate::consteval::const_eval_recover)]
68-
fn const_eval(
69-
&self,
69+
fn const_eval<'db>(
70+
&'db self,
7071
def: GeneralConstId,
7172
subst: Substitution,
72-
trait_env: Option<Arc<TraitEnvironment>>,
73+
trait_env: Option<TraitEnvironment<'db>>,
7374
) -> Result<Const, ConstEvalError>;
7475

7576
#[salsa::invoke_actual(crate::consteval::const_eval_static_query)]
@@ -81,9 +82,9 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
8182
fn const_eval_discriminant(&self, def: EnumVariantId) -> Result<i128, ConstEvalError>;
8283

8384
#[salsa::invoke(crate::method_resolution::lookup_impl_method_query)]
84-
fn lookup_impl_method(
85-
&self,
86-
env: Arc<TraitEnvironment>,
85+
fn lookup_impl_method<'db>(
86+
&'db self,
87+
env: TraitEnvironment<'db>,
8788
func: FunctionId,
8889
fn_subst: Substitution,
8990
) -> (FunctionId, Substitution);
@@ -92,16 +93,20 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
9293

9394
#[salsa::invoke(crate::layout::layout_of_adt_query)]
9495
#[salsa::cycle(crate::layout::layout_of_adt_recover)]
95-
fn layout_of_adt(
96-
&self,
96+
fn layout_of_adt<'db>(
97+
&'db self,
9798
def: AdtId,
9899
subst: Substitution,
99-
env: Arc<TraitEnvironment>,
100+
env: TraitEnvironment<'db>,
100101
) -> Result<Arc<Layout>, LayoutError>;
101102

102103
#[salsa::invoke(crate::layout::layout_of_ty_query)]
103104
#[salsa::cycle(crate::layout::layout_of_ty_recover)]
104-
fn layout_of_ty(&self, ty: Ty, env: Arc<TraitEnvironment>) -> Result<Arc<Layout>, LayoutError>;
105+
fn layout_of_ty<'db>(
106+
&'db self,
107+
ty: Ty,
108+
env: TraitEnvironment<'db>,
109+
) -> Result<Arc<Layout>, LayoutError>;
105110

106111
#[salsa::invoke_actual(crate::layout::target_data_layout_query)]
107112
fn target_data_layout(&self, krate: Crate) -> Result<Arc<TargetDataLayout>, Arc<str>>;
@@ -181,10 +186,10 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
181186

182187
#[salsa::invoke_actual(crate::lower::trait_environment_for_body_query)]
183188
#[salsa::transparent]
184-
fn trait_environment_for_body(&self, def: DefWithBodyId) -> Arc<TraitEnvironment>;
189+
fn trait_environment_for_body<'db>(&'db self, def: DefWithBodyId) -> TraitEnvironment<'db>;
185190

186191
#[salsa::invoke_actual(crate::lower::trait_environment_query)]
187-
fn trait_environment(&self, def: GenericDefId) -> Arc<TraitEnvironment>;
192+
fn trait_environment<'db>(&'db self, def: GenericDefId) -> TraitEnvironment<'db>;
188193

189194
#[salsa::invoke_actual(crate::lower::generic_defaults_with_diagnostics_query)]
190195
#[salsa::cycle(crate::lower::generic_defaults_with_diagnostics_recover)]
@@ -286,10 +291,10 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
286291

287292
#[salsa::invoke(crate::traits::normalize_projection_query)]
288293
#[salsa::transparent]
289-
fn normalize_projection(
290-
&self,
294+
fn normalize_projection<'db>(
295+
&'db self,
291296
projection: crate::ProjectionTy,
292-
env: Arc<TraitEnvironment>,
297+
env: TraitEnvironment<'db>,
293298
) -> Ty;
294299

295300
#[salsa::invoke(crate::traits::trait_solve_query)]
@@ -310,7 +315,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> + std::fmt::Debug {
310315

311316
#[salsa::invoke(crate::drop::has_drop_glue)]
312317
#[salsa::cycle(crate::drop::has_drop_glue_recover)]
313-
fn has_drop_glue(&self, ty: Ty, env: Arc<TraitEnvironment>) -> DropGlue;
318+
fn has_drop_glue<'db>(&'db self, ty: Ty, env: TraitEnvironment<'db>) -> DropGlue;
314319
}
315320

316321
#[test]

crates/hir-ty/src/display.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ use rustc_hash::FxHashSet;
3838
use smallvec::SmallVec;
3939
use span::Edition;
4040
use stdx::never;
41-
use triomphe::Arc;
4241

4342
use crate::{
4443
AdtId, AliasEq, AliasTy, Binders, CallableDefId, CallableSig, ConcreteConst, Const,
@@ -682,8 +681,8 @@ fn render_const_scalar(
682681
memory_map: &MemoryMap,
683682
ty: &Ty,
684683
) -> Result<(), HirDisplayError> {
685-
let trait_env = TraitEnvironment::empty(f.krate());
686-
let ty = normalize(f.db, trait_env.clone(), ty.clone());
684+
let trait_env = TraitEnvironment::empty(f.db, f.krate());
685+
let ty = normalize(f.db, trait_env, ty.clone());
687686
match ty.kind(Interner) {
688687
TyKind::Scalar(s) => match s {
689688
Scalar::Bool => write!(f, "{}", b[0] != 0),
@@ -816,7 +815,7 @@ fn render_const_scalar(
816815
}
817816
},
818817
TyKind::Tuple(_, subst) => {
819-
let Ok(layout) = f.db.layout_of_ty(ty.clone(), trait_env.clone()) else {
818+
let Ok(layout) = f.db.layout_of_ty(ty.clone(), trait_env) else {
820819
return f.write_str("<layout-error>");
821820
};
822821
f.write_str("(")?;
@@ -829,7 +828,7 @@ fn render_const_scalar(
829828
}
830829
let ty = ty.assert_ty_ref(Interner); // Tuple only has type argument
831830
let offset = layout.fields.offset(id).bytes_usize();
832-
let Ok(layout) = f.db.layout_of_ty(ty.clone(), trait_env.clone()) else {
831+
let Ok(layout) = f.db.layout_of_ty(ty.clone(), trait_env) else {
833832
f.write_str("<layout-error>")?;
834833
continue;
835834
};
@@ -839,7 +838,7 @@ fn render_const_scalar(
839838
f.write_str(")")
840839
}
841840
TyKind::Adt(adt, subst) => {
842-
let Ok(layout) = f.db.layout_of_adt(adt.0, subst.clone(), trait_env.clone()) else {
841+
let Ok(layout) = f.db.layout_of_adt(adt.0, subst.clone(), trait_env) else {
843842
return f.write_str("<layout-error>");
844843
};
845844
match adt.0 {
@@ -862,7 +861,8 @@ fn render_const_scalar(
862861
write!(f, "{}", f.db.union_data(u).name.display(f.db.upcast(), f.edition()))
863862
}
864863
hir_def::AdtId::EnumId(e) => {
865-
let Ok(target_data_layout) = f.db.target_data_layout(trait_env.krate) else {
864+
let Ok(target_data_layout) = f.db.target_data_layout(trait_env.krate(f.db))
865+
else {
866866
return f.write_str("<target-layout-not-available>");
867867
};
868868
let Some((var_id, var_layout)) =
@@ -935,7 +935,7 @@ fn render_variant_after_name(
935935
data: &VariantData,
936936
f: &mut HirFormatter<'_>,
937937
field_types: &ArenaMap<LocalFieldId, Binders<Ty>>,
938-
trait_env: Arc<TraitEnvironment>,
938+
trait_env: TraitEnvironment<'_>,
939939
layout: &Layout,
940940
subst: &Substitution,
941941
b: &[u8],
@@ -946,7 +946,7 @@ fn render_variant_after_name(
946946
let render_field = |f: &mut HirFormatter<'_>, id: LocalFieldId| {
947947
let offset = layout.fields.offset(u32::from(id.into_raw()) as usize).bytes_usize();
948948
let ty = field_types[id].clone().substitute(Interner, subst);
949-
let Ok(layout) = f.db.layout_of_ty(ty.clone(), trait_env.clone()) else {
949+
let Ok(layout) = f.db.layout_of_ty(ty.clone(), trait_env) else {
950950
return f.write_str("<layout-error>");
951951
};
952952
let size = layout.size.bytes_usize();

crates/hir-ty/src/drop.rs

+13-20
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use hir_def::AdtId;
55
use hir_def::data::adt::StructFlags;
66
use hir_def::lang_item::LangItem;
77
use stdx::never;
8-
use triomphe::Arc;
98

109
use crate::db::HirDatabaseData;
1110
use crate::{
@@ -47,7 +46,7 @@ pub enum DropGlue {
4746
HasDropGlue,
4847
}
4948

50-
pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironment>) -> DropGlue {
49+
pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: TraitEnvironment<'_>) -> DropGlue {
5150
match ty.kind(Interner) {
5251
TyKind::Adt(adt, subst) => {
5352
if has_destructor(db, adt.0) {
@@ -61,10 +60,7 @@ pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironm
6160
db.field_types(id.into())
6261
.iter()
6362
.map(|(_, field_ty)| {
64-
db.has_drop_glue(
65-
field_ty.clone().substitute(Interner, subst),
66-
env.clone(),
67-
)
63+
db.has_drop_glue(field_ty.clone().substitute(Interner, subst), env)
6864
})
6965
.max()
7066
.unwrap_or(DropGlue::None)
@@ -79,10 +75,7 @@ pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironm
7975
db.field_types(variant.into())
8076
.iter()
8177
.map(|(_, field_ty)| {
82-
db.has_drop_glue(
83-
field_ty.clone().substitute(Interner, subst),
84-
env.clone(),
85-
)
78+
db.has_drop_glue(field_ty.clone().substitute(Interner, subst), env)
8679
})
8780
.max()
8881
.unwrap_or(DropGlue::None)
@@ -94,7 +87,7 @@ pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironm
9487
TyKind::Tuple(_, subst) => subst
9588
.iter(Interner)
9689
.map(|ty| ty.assert_ty_ref(Interner))
97-
.map(|ty| db.has_drop_glue(ty.clone(), env.clone()))
90+
.map(|ty| db.has_drop_glue(ty.clone(), env))
9891
.max()
9992
.unwrap_or(DropGlue::None),
10093
TyKind::Array(ty, len) => {
@@ -124,7 +117,7 @@ pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironm
124117
let env = db.trait_environment_for_body(owner);
125118
captures
126119
.iter()
127-
.map(|capture| db.has_drop_glue(capture.ty(subst), env.clone()))
120+
.map(|capture| db.has_drop_glue(capture.ty(subst), env))
128121
.max()
129122
.unwrap_or(DropGlue::None)
130123
}
@@ -169,11 +162,11 @@ pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironm
169162

170163
fn projection_has_drop_glue(
171164
db: &dyn HirDatabase,
172-
env: Arc<TraitEnvironment>,
165+
env: TraitEnvironment<'_>,
173166
projection: ProjectionTy,
174167
ty: Ty,
175168
) -> DropGlue {
176-
let normalized = db.normalize_projection(projection, env.clone());
169+
let normalized = db.normalize_projection(projection, env);
177170
match normalized.kind(Interner) {
178171
TyKind::Alias(AliasTy::Projection(_)) | TyKind::AssociatedType(..) => {
179172
if is_copy(db, ty, env) { DropGlue::None } else { DropGlue::DependOnParams }
@@ -182,25 +175,25 @@ fn projection_has_drop_glue(
182175
}
183176
}
184177

185-
fn is_copy(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironment>) -> bool {
186-
let Some(copy_trait) = db.lang_item(env.krate, LangItem::Copy).and_then(|it| it.as_trait())
187-
else {
178+
fn is_copy(db: &dyn HirDatabase, ty: Ty, env: TraitEnvironment<'_>) -> bool {
179+
let krate = env.krate(db);
180+
let Some(copy_trait) = db.lang_item(krate, LangItem::Copy).and_then(|it| it.as_trait()) else {
188181
return false;
189182
};
190183
let trait_ref = TyBuilder::trait_ref(db, copy_trait).push(ty).build();
191184
let goal = Canonical {
192-
value: InEnvironment::new(&env.env, trait_ref.cast(Interner)),
185+
value: InEnvironment::new(env.env(db), trait_ref.cast(Interner)),
193186
binders: CanonicalVarKinds::empty(Interner),
194187
};
195-
db.trait_solve(env.krate, env.block, goal).is_some()
188+
db.trait_solve(krate, env.block(db), goal).is_some()
196189
}
197190

198191
pub(crate) fn has_drop_glue_recover(
199192
_db: &dyn HirDatabase,
200193
_cycle: &salsa::Cycle,
201194
_: HirDatabaseData,
202195
_ty: Ty,
203-
_env: Arc<TraitEnvironment>,
196+
_env: TraitEnvironment<'_>,
204197
) -> DropGlue {
205198
DropGlue::None
206199
}

crates/hir-ty/src/infer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ pub(crate) fn infer_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<Infer
149149
///
150150
/// This is appropriate to use only after type-check: it assumes
151151
/// that normalization will succeed, for example.
152-
pub(crate) fn normalize(db: &dyn HirDatabase, trait_env: Arc<TraitEnvironment>, ty: Ty) -> Ty {
152+
pub(crate) fn normalize(db: &dyn HirDatabase, trait_env: TraitEnvironment<'_>, ty: Ty) -> Ty {
153153
// FIXME: TypeFlags::HAS_CT_PROJECTION is not implemented in chalk, so TypeFlags::HAS_PROJECTION only
154154
// works for the type case, so we check array unconditionally. Remove the array part
155155
// when the bug in chalk becomes fixed.

0 commit comments

Comments
 (0)