Skip to content

Commit fbf45f7

Browse files
committed
Clean up DbInterner
1 parent 2c2aad3 commit fbf45f7

31 files changed

+441
-465
lines changed

crates/hir-ty/src/consteval.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -248,19 +248,17 @@ pub(crate) fn const_eval_query(
248248
subst: Substitution,
249249
trait_env: Option<Arc<TraitEnvironment>>,
250250
) -> Result<Const, ConstEvalError> {
251-
crate::next_solver::tls::with_db(db, || {
252-
let body = match def {
253-
GeneralConstId::ConstId(c) => {
254-
db.monomorphized_mir_body(c.into(), subst, db.trait_environment(c.into()))?
255-
}
256-
GeneralConstId::StaticId(s) => {
257-
let krate = s.module(db).krate();
258-
db.monomorphized_mir_body(s.into(), subst, TraitEnvironment::empty(krate))?
259-
}
260-
};
261-
let c = interpret_mir(db, body, false, trait_env)?.0?;
262-
Ok(c)
263-
})
251+
let body = match def {
252+
GeneralConstId::ConstId(c) => {
253+
db.monomorphized_mir_body(c.into(), subst, db.trait_environment(c.into()))?
254+
}
255+
GeneralConstId::StaticId(s) => {
256+
let krate = s.module(db).krate();
257+
db.monomorphized_mir_body(s.into(), subst, TraitEnvironment::empty(krate))?
258+
}
259+
};
260+
let c = interpret_mir(db, body, false, trait_env)?.0?;
261+
Ok(c)
264262
}
265263

266264
pub(crate) fn const_eval_static_query(

crates/hir-ty/src/consteval_nextsolver.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub(crate) fn path_to_const<'a, 'g>(
3737
args: impl FnOnce() -> &'g Generics,
3838
expected_ty: Ty<'a>,
3939
) -> Option<Const<'a>> {
40-
let interner = DbInterner::new();
40+
let interner = DbInterner::new(db);
4141
match resolver.resolve_path_in_value_ns_fully(db, path, HygieneId::ROOT) {
4242
Some(ValueNs::GenericParam(p)) => {
4343
let args = args();
@@ -69,7 +69,7 @@ pub(crate) fn path_to_const<'a, 'g>(
6969

7070
pub fn unknown_const<'db>(ty: Ty<'db>) -> Const<'db> {
7171
Const::new(
72-
DbInterner::new(),
72+
DbInterner::conjure(),
7373
rustc_type_ir::ConstKind::Value(ValueConst::new(ty, ConstScalar::Unknown)),
7474
)
7575
}
@@ -80,7 +80,7 @@ pub fn unknown_const_as_generic<'db>(ty: Ty<'db>) -> GenericArg<'db> {
8080

8181
/// Interns a constant scalar with the given type
8282
pub fn intern_const_scalar<'db>(value: ConstScalar, ty: Ty<'db>) -> Const<'db> {
83-
Const::new(DbInterner::new(), rustc_type_ir::ConstKind::Value(ValueConst::new(ty, value)))
83+
Const::new(DbInterner::conjure(), rustc_type_ir::ConstKind::Value(ValueConst::new(ty, value)))
8484
}
8585

8686
/// Interns a constant scalar with the given type
@@ -115,13 +115,13 @@ pub fn usize_const<'db>(db: &'db dyn HirDatabase, value: Option<u128>, krate: Cr
115115
intern_const_ref(
116116
db,
117117
&value.map_or(LiteralConstRef::Unknown, LiteralConstRef::UInt),
118-
Ty::new_uint(DbInterner::new(), rustc_type_ir::UintTy::Usize),
118+
Ty::new_uint(DbInterner::new(db), rustc_type_ir::UintTy::Usize),
119119
krate,
120120
)
121121
}
122122

123123
pub fn try_const_usize<'db>(db: &'db dyn HirDatabase, c: &Const<'db>) -> Option<u128> {
124-
let interner = DbInterner::new_with(db, None, None);
124+
let interner = DbInterner::new(db);
125125
match c.clone().kind() {
126126
ConstKind::Param(_) => None,
127127
ConstKind::Infer(_) => None,

crates/hir-ty/src/db.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
307307
#[salsa::cycle(cycle_result = crate::drop::has_drop_glue_cycle_result)]
308308
fn has_drop_glue(&self, ty: Ty, env: Arc<TraitEnvironment>) -> DropGlue;
309309

310+
// next trait solver
311+
310312
#[salsa::invoke(crate::layout_nextsolver::layout_of_adt_query)]
311313
#[salsa::cycle(cycle_result = crate::layout_nextsolver::layout_of_adt_cycle_result)]
312314
fn layout_of_adt_ns<'db>(

crates/hir-ty/src/infer.rs

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -89,54 +89,52 @@ pub(crate) use closure::{CaptureKind, CapturedItem, CapturedItemWithoutTy};
8989
/// The entry point of type inference.
9090
pub(crate) fn infer_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult> {
9191
crate::next_solver::with_new_cache(|| {
92-
crate::next_solver::tls::with_db(db, || {
93-
let _p = tracing::info_span!("infer_query").entered();
94-
let resolver = def.resolver(db);
95-
let body = db.body(def);
96-
let mut ctx = InferenceContext::new(db, def, &body, resolver);
97-
98-
match def {
99-
DefWithBodyId::FunctionId(f) => {
100-
ctx.collect_fn(f);
101-
}
102-
DefWithBodyId::ConstId(c) => ctx.collect_const(c, &db.const_signature(c)),
103-
DefWithBodyId::StaticId(s) => ctx.collect_static(&db.static_signature(s)),
104-
DefWithBodyId::VariantId(v) => {
105-
ctx.return_ty = TyBuilder::builtin(
106-
match db.enum_signature(v.lookup(db).parent).variant_body_type() {
107-
hir_def::layout::IntegerType::Pointer(signed) => match signed {
108-
true => BuiltinType::Int(BuiltinInt::Isize),
109-
false => BuiltinType::Uint(BuiltinUint::Usize),
110-
},
111-
hir_def::layout::IntegerType::Fixed(size, signed) => match signed {
112-
true => BuiltinType::Int(match size {
113-
Integer::I8 => BuiltinInt::I8,
114-
Integer::I16 => BuiltinInt::I16,
115-
Integer::I32 => BuiltinInt::I32,
116-
Integer::I64 => BuiltinInt::I64,
117-
Integer::I128 => BuiltinInt::I128,
118-
}),
119-
false => BuiltinType::Uint(match size {
120-
Integer::I8 => BuiltinUint::U8,
121-
Integer::I16 => BuiltinUint::U16,
122-
Integer::I32 => BuiltinUint::U32,
123-
Integer::I64 => BuiltinUint::U64,
124-
Integer::I128 => BuiltinUint::U128,
125-
}),
126-
},
92+
let _p = tracing::info_span!("infer_query").entered();
93+
let resolver = def.resolver(db);
94+
let body = db.body(def);
95+
let mut ctx = InferenceContext::new(db, def, &body, resolver);
96+
97+
match def {
98+
DefWithBodyId::FunctionId(f) => {
99+
ctx.collect_fn(f);
100+
}
101+
DefWithBodyId::ConstId(c) => ctx.collect_const(c, &db.const_signature(c)),
102+
DefWithBodyId::StaticId(s) => ctx.collect_static(&db.static_signature(s)),
103+
DefWithBodyId::VariantId(v) => {
104+
ctx.return_ty = TyBuilder::builtin(
105+
match db.enum_signature(v.lookup(db).parent).variant_body_type() {
106+
hir_def::layout::IntegerType::Pointer(signed) => match signed {
107+
true => BuiltinType::Int(BuiltinInt::Isize),
108+
false => BuiltinType::Uint(BuiltinUint::Usize),
127109
},
128-
);
129-
}
110+
hir_def::layout::IntegerType::Fixed(size, signed) => match signed {
111+
true => BuiltinType::Int(match size {
112+
Integer::I8 => BuiltinInt::I8,
113+
Integer::I16 => BuiltinInt::I16,
114+
Integer::I32 => BuiltinInt::I32,
115+
Integer::I64 => BuiltinInt::I64,
116+
Integer::I128 => BuiltinInt::I128,
117+
}),
118+
false => BuiltinType::Uint(match size {
119+
Integer::I8 => BuiltinUint::U8,
120+
Integer::I16 => BuiltinUint::U16,
121+
Integer::I32 => BuiltinUint::U32,
122+
Integer::I64 => BuiltinUint::U64,
123+
Integer::I128 => BuiltinUint::U128,
124+
}),
125+
},
126+
},
127+
);
130128
}
129+
}
131130

132-
ctx.infer_body();
131+
ctx.infer_body();
133132

134-
ctx.infer_mut_body();
133+
ctx.infer_mut_body();
135134

136-
ctx.infer_closures();
135+
ctx.infer_closures();
137136

138-
Arc::new(ctx.resolve_all())
139-
})
137+
Arc::new(ctx.resolve_all())
140138
})
141139
}
142140

crates/hir-ty/src/layout_nextsolver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ fn field_ty<'a>(
335335
fd: LocalFieldId,
336336
args: &GenericArgs<'a>,
337337
) -> Ty<'a> {
338-
db.field_types_ns(def)[fd].clone().instantiate(DbInterner::new(), args)
338+
db.field_types_ns(def)[fd].clone().instantiate(DbInterner::new(db), args)
339339
}
340340

341341
fn scalar_unit(dl: &TargetDataLayout, value: Primitive) -> Scalar {

crates/hir-ty/src/layout_nextsolver/adt.rs

Lines changed: 66 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -26,80 +26,74 @@ pub fn layout_of_adt_query<'db>(
2626
args: GenericArgs<'db>,
2727
trait_env: Arc<TraitEnvironment>,
2828
) -> Result<Arc<Layout>, LayoutError> {
29-
crate::next_solver::tls::with_db(db, || {
30-
let krate = trait_env.krate;
31-
let Ok(target) = db.target_data_layout(krate) else {
32-
return Err(LayoutError::TargetLayoutNotAvailable);
33-
};
34-
let dl = &*target;
35-
let cx = LayoutCx::new(dl);
36-
let handle_variant = |def: VariantId, var: &VariantFields| {
37-
var.fields()
29+
let krate = trait_env.krate;
30+
let Ok(target) = db.target_data_layout(krate) else {
31+
return Err(LayoutError::TargetLayoutNotAvailable);
32+
};
33+
let dl = &*target;
34+
let cx = LayoutCx::new(dl);
35+
let handle_variant = |def: VariantId, var: &VariantFields| {
36+
var.fields()
37+
.iter()
38+
.map(|(fd, _)| layout_of_ty_query(db, field_ty(db, def, fd, &args), trait_env.clone()))
39+
.collect::<Result<Vec<_>, _>>()
40+
};
41+
let (variants, repr, is_special_no_niche) = match def {
42+
AdtId::StructId(s) => {
43+
let data = db.struct_signature(s);
44+
let mut r = SmallVec::<[_; 1]>::new();
45+
r.push(handle_variant(s.into(), s.fields(db))?);
46+
(
47+
r,
48+
data.repr.unwrap_or_default(),
49+
data.flags.intersects(StructFlags::IS_UNSAFE_CELL | StructFlags::IS_UNSAFE_PINNED),
50+
)
51+
}
52+
AdtId::UnionId(id) => {
53+
let data = db.union_signature(id);
54+
let mut r = SmallVec::new();
55+
r.push(handle_variant(id.into(), id.fields(db))?);
56+
(r, data.repr.unwrap_or_default(), false)
57+
}
58+
AdtId::EnumId(e) => {
59+
let variants = e.enum_variants(db);
60+
let r = variants
61+
.variants
3862
.iter()
39-
.map(|(fd, _)| {
40-
layout_of_ty_query(db, field_ty(db, def, fd, &args), trait_env.clone())
41-
})
42-
.collect::<Result<Vec<_>, _>>()
43-
};
44-
let (variants, repr, is_special_no_niche) = match def {
45-
AdtId::StructId(s) => {
46-
let data = db.struct_signature(s);
47-
let mut r = SmallVec::<[_; 1]>::new();
48-
r.push(handle_variant(s.into(), s.fields(db))?);
49-
(
50-
r,
51-
data.repr.unwrap_or_default(),
52-
data.flags
53-
.intersects(StructFlags::IS_UNSAFE_CELL | StructFlags::IS_UNSAFE_PINNED),
54-
)
55-
}
56-
AdtId::UnionId(id) => {
57-
let data = db.union_signature(id);
58-
let mut r = SmallVec::new();
59-
r.push(handle_variant(id.into(), id.fields(db))?);
60-
(r, data.repr.unwrap_or_default(), false)
61-
}
62-
AdtId::EnumId(e) => {
63-
let variants = e.enum_variants(db);
64-
let r = variants
65-
.variants
63+
.map(|&(v, _, _)| handle_variant(v.into(), v.fields(db)))
64+
.collect::<Result<SmallVec<_>, _>>()?;
65+
(r, db.enum_signature(e).repr.unwrap_or_default(), false)
66+
}
67+
};
68+
let variants = variants
69+
.iter()
70+
.map(|it| it.iter().map(|it| &**it).collect::<Vec<_>>())
71+
.collect::<SmallVec<[_; 1]>>();
72+
let variants = variants.iter().map(|it| it.iter().collect()).collect::<IndexVec<_, _>>();
73+
let result = if matches!(def, AdtId::UnionId(..)) {
74+
cx.calc.layout_of_union(&repr, &variants)?
75+
} else {
76+
cx.calc.layout_of_struct_or_enum(
77+
&repr,
78+
&variants,
79+
matches!(def, AdtId::EnumId(..)),
80+
is_special_no_niche,
81+
layout_scalar_valid_range(db, def),
82+
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
83+
variants.iter_enumerated().filter_map(|(id, _)| {
84+
let AdtId::EnumId(e) = def else { return None };
85+
let d = db.const_eval_discriminant(e.enum_variants(db).variants[id.0].0).ok()?;
86+
Some((id, d))
87+
}),
88+
!matches!(def, AdtId::EnumId(..))
89+
&& variants
6690
.iter()
67-
.map(|&(v, _, _)| handle_variant(v.into(), v.fields(db)))
68-
.collect::<Result<SmallVec<_>, _>>()?;
69-
(r, db.enum_signature(e).repr.unwrap_or_default(), false)
70-
}
71-
};
72-
let variants = variants
73-
.iter()
74-
.map(|it| it.iter().map(|it| &**it).collect::<Vec<_>>())
75-
.collect::<SmallVec<[_; 1]>>();
76-
let variants = variants.iter().map(|it| it.iter().collect()).collect::<IndexVec<_, _>>();
77-
let result = if matches!(def, AdtId::UnionId(..)) {
78-
cx.calc.layout_of_union(&repr, &variants)?
79-
} else {
80-
cx.calc.layout_of_struct_or_enum(
81-
&repr,
82-
&variants,
83-
matches!(def, AdtId::EnumId(..)),
84-
is_special_no_niche,
85-
layout_scalar_valid_range(db, def),
86-
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
87-
variants.iter_enumerated().filter_map(|(id, _)| {
88-
let AdtId::EnumId(e) = def else { return None };
89-
let d =
90-
db.const_eval_discriminant(e.enum_variants(db).variants[id.0].0).ok()?;
91-
Some((id, d))
92-
}),
93-
!matches!(def, AdtId::EnumId(..))
94-
&& variants
95-
.iter()
96-
.next()
97-
.and_then(|it| it.iter().last().map(|it| !it.is_unsized()))
98-
.unwrap_or(true),
99-
)?
100-
};
101-
Ok(Arc::new(result))
102-
})
91+
.next()
92+
.and_then(|it| it.iter().last().map(|it| !it.is_unsized()))
93+
.unwrap_or(true),
94+
)?
95+
};
96+
Ok(Arc::new(result))
10397
}
10498

10599
pub(crate) fn layout_of_adt_cycle_result<'db>(

0 commit comments

Comments
 (0)