Skip to content

Commit bff5839

Browse files
Merge pull request #21182 from ChayimFriedman2/param-env
internal: Remove `TraitEnvironment`
2 parents d9beb0a + 3a06666 commit bff5839

40 files changed

+436
-459
lines changed

src/tools/rust-analyzer/crates/hir-ty/src/autoderef.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ use std::fmt;
88
use hir_def::{TraitId, TypeAliasId};
99
use rustc_type_ir::inherent::{IntoKind, Ty as _};
1010
use tracing::debug;
11-
use triomphe::Arc;
1211

1312
use crate::{
14-
TraitEnvironment,
13+
ParamEnvAndCrate,
1514
db::HirDatabase,
1615
infer::InferenceContext,
1716
next_solver::{
@@ -35,13 +34,13 @@ const AUTODEREF_RECURSION_LIMIT: usize = 20;
3534
/// detects a cycle in the deref chain.
3635
pub fn autoderef<'db>(
3736
db: &'db dyn HirDatabase,
38-
env: Arc<TraitEnvironment<'db>>,
37+
env: ParamEnvAndCrate<'db>,
3938
ty: Canonical<'db, Ty<'db>>,
4039
) -> impl Iterator<Item = Ty<'db>> + use<'db> {
4140
let interner = DbInterner::new_with(db, env.krate);
4241
let infcx = interner.infer_ctxt().build(TypingMode::PostAnalysis);
4342
let (ty, _) = infcx.instantiate_canonical(&ty);
44-
let autoderef = Autoderef::new(&infcx, &env, ty);
43+
let autoderef = Autoderef::new(&infcx, env.param_env, ty);
4544
let mut v = Vec::new();
4645
for (ty, _steps) in autoderef {
4746
// `ty` may contain unresolved inference variables. Since there's no chance they would be
@@ -111,21 +110,21 @@ struct AutoderefTraits {
111110
// borrows it.
112111
pub(crate) trait AutoderefCtx<'db> {
113112
fn infcx(&self) -> &InferCtxt<'db>;
114-
fn env(&self) -> &TraitEnvironment<'db>;
113+
fn param_env(&self) -> ParamEnv<'db>;
115114
}
116115

117116
pub(crate) struct DefaultAutoderefCtx<'a, 'db> {
118117
infcx: &'a InferCtxt<'db>,
119-
env: &'a TraitEnvironment<'db>,
118+
param_env: ParamEnv<'db>,
120119
}
121120
impl<'db> AutoderefCtx<'db> for DefaultAutoderefCtx<'_, 'db> {
122121
#[inline]
123122
fn infcx(&self) -> &InferCtxt<'db> {
124123
self.infcx
125124
}
126125
#[inline]
127-
fn env(&self) -> &TraitEnvironment<'db> {
128-
self.env
126+
fn param_env(&self) -> ParamEnv<'db> {
127+
self.param_env
129128
}
130129
}
131130

@@ -136,8 +135,8 @@ impl<'db> AutoderefCtx<'db> for InferenceContextAutoderefCtx<'_, '_, 'db> {
136135
&self.0.table.infer_ctxt
137136
}
138137
#[inline]
139-
fn env(&self) -> &TraitEnvironment<'db> {
140-
&self.0.table.trait_env
138+
fn param_env(&self) -> ParamEnv<'db> {
139+
self.0.table.param_env
141140
}
142141
}
143142

@@ -201,7 +200,7 @@ where
201200
// autoderef expect this type to have been structurally normalized.
202201
if let TyKind::Alias(..) = ty.kind() {
203202
let (normalized_ty, obligations) =
204-
structurally_normalize_ty(self.infcx(), self.env().env, ty)?;
203+
structurally_normalize_ty(self.infcx(), self.param_env(), ty)?;
205204
self.state.obligations.extend(obligations);
206205
(AutoderefKind::Builtin, normalized_ty)
207206
} else {
@@ -231,10 +230,10 @@ impl<'a, 'db> Autoderef<'a, 'db> {
231230
#[inline]
232231
pub(crate) fn new_with_tracking(
233232
infcx: &'a InferCtxt<'db>,
234-
env: &'a TraitEnvironment<'db>,
233+
param_env: ParamEnv<'db>,
235234
base_ty: Ty<'db>,
236235
) -> Self {
237-
Self::new_impl(DefaultAutoderefCtx { infcx, env }, base_ty)
236+
Self::new_impl(DefaultAutoderefCtx { infcx, param_env }, base_ty)
238237
}
239238
}
240239

@@ -257,10 +256,10 @@ impl<'a, 'db> Autoderef<'a, 'db, usize> {
257256
#[inline]
258257
pub(crate) fn new(
259258
infcx: &'a InferCtxt<'db>,
260-
env: &'a TraitEnvironment<'db>,
259+
param_env: ParamEnv<'db>,
261260
base_ty: Ty<'db>,
262261
) -> Self {
263-
Self::new_impl(DefaultAutoderefCtx { infcx, env }, base_ty)
262+
Self::new_impl(DefaultAutoderefCtx { infcx, param_env }, base_ty)
264263
}
265264
}
266265

@@ -292,8 +291,8 @@ where
292291
}
293292

294293
#[inline]
295-
fn env(&self) -> &TraitEnvironment<'db> {
296-
self.ctx.env()
294+
fn param_env(&self) -> ParamEnv<'db> {
295+
self.ctx.param_env()
297296
}
298297

299298
#[inline]
@@ -339,7 +338,7 @@ where
339338

340339
let trait_ref = TraitRef::new(interner, trait_.into(), [ty]);
341340
let obligation =
342-
Obligation::new(interner, ObligationCause::new(), self.env().env, trait_ref);
341+
Obligation::new(interner, ObligationCause::new(), self.param_env(), trait_ref);
343342
// We detect whether the self type implements `Deref` before trying to
344343
// structurally normalize. We use `predicate_may_hold_opaque_types_jank`
345344
// to support not-yet-defined opaque types. It will succeed for `impl Deref`
@@ -351,7 +350,7 @@ where
351350

352351
let (normalized_ty, obligations) = structurally_normalize_ty(
353352
self.infcx(),
354-
self.env().env,
353+
self.param_env(),
355354
Ty::new_projection(interner, trait_target.into(), [ty]),
356355
)?;
357356
debug!("overloaded_deref_ty({:?}) = ({:?}, {:?})", ty, normalized_ty, obligations);

src/tools/rust-analyzer/crates/hir-ty/src/consteval.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod tests;
55

66
use base_db::Crate;
77
use hir_def::{
8-
ConstId, EnumVariantId, GeneralConstId, StaticId,
8+
ConstId, EnumVariantId, GeneralConstId, HasModule, StaticId,
99
attrs::AttrFlags,
1010
expr_store::Body,
1111
hir::{Expr, ExprId},
@@ -16,14 +16,14 @@ use rustc_type_ir::inherent::IntoKind;
1616
use triomphe::Arc;
1717

1818
use crate::{
19-
LifetimeElisionKind, MemoryMap, TraitEnvironment, TyLoweringContext,
19+
LifetimeElisionKind, MemoryMap, ParamEnvAndCrate, TyLoweringContext,
2020
db::HirDatabase,
2121
display::DisplayTarget,
2222
infer::InferenceContext,
2323
mir::{MirEvalError, MirLowerError},
2424
next_solver::{
25-
Const, ConstBytes, ConstKind, DbInterner, ErrorGuaranteed, GenericArg, GenericArgs, Ty,
26-
ValueConst,
25+
Const, ConstBytes, ConstKind, DbInterner, ErrorGuaranteed, GenericArg, GenericArgs,
26+
ParamEnv, Ty, ValueConst,
2727
},
2828
};
2929

@@ -85,7 +85,7 @@ pub fn intern_const_ref<'a>(
8585
krate: Crate,
8686
) -> Const<'a> {
8787
let interner = DbInterner::new_no_crate(db);
88-
let layout = db.layout_of_ty(ty, TraitEnvironment::empty(krate));
88+
let layout = db.layout_of_ty(ty, ParamEnvAndCrate { param_env: ParamEnv::empty(), krate });
8989
let kind = match value {
9090
LiteralConstRef::Int(i) => {
9191
// FIXME: We should handle failure of layout better.
@@ -207,7 +207,7 @@ pub(crate) fn const_eval_discriminant_variant<'db>(
207207
let mir_body = db.monomorphized_mir_body(
208208
def,
209209
GenericArgs::new_from_iter(interner, []),
210-
db.trait_environment_for_body(def),
210+
ParamEnvAndCrate { param_env: db.trait_environment_for_body(def), krate: def.krate(db) },
211211
)?;
212212
let c = interpret_mir(db, mir_body, false, None)?.0?;
213213
let c = if is_signed {
@@ -259,7 +259,7 @@ pub(crate) fn const_eval_cycle_result<'db>(
259259
_: &'db dyn HirDatabase,
260260
_: ConstId,
261261
_: GenericArgs<'db>,
262-
_: Option<Arc<TraitEnvironment<'db>>>,
262+
_: Option<ParamEnvAndCrate<'db>>,
263263
) -> Result<Const<'db>, ConstEvalError<'db>> {
264264
Err(ConstEvalError::MirLowerError(MirLowerError::Loop))
265265
}
@@ -282,9 +282,13 @@ pub(crate) fn const_eval_query<'db>(
282282
db: &'db dyn HirDatabase,
283283
def: ConstId,
284284
subst: GenericArgs<'db>,
285-
trait_env: Option<Arc<TraitEnvironment<'db>>>,
285+
trait_env: Option<ParamEnvAndCrate<'db>>,
286286
) -> Result<Const<'db>, ConstEvalError<'db>> {
287-
let body = db.monomorphized_mir_body(def.into(), subst, db.trait_environment(def.into()))?;
287+
let body = db.monomorphized_mir_body(
288+
def.into(),
289+
subst,
290+
ParamEnvAndCrate { param_env: db.trait_environment(def.into()), krate: def.krate(db) },
291+
)?;
288292
let c = interpret_mir(db, body, false, trait_env)?.0?;
289293
Ok(c)
290294
}
@@ -297,7 +301,10 @@ pub(crate) fn const_eval_static_query<'db>(
297301
let body = db.monomorphized_mir_body(
298302
def.into(),
299303
GenericArgs::new_from_iter(interner, []),
300-
db.trait_environment_for_body(def.into()),
304+
ParamEnvAndCrate {
305+
param_env: db.trait_environment_for_body(def.into()),
306+
krate: def.krate(db),
307+
},
301308
)?;
302309
let c = interpret_mir(db, body, false, None)?.0?;
303310
Ok(c)

src/tools/rust-analyzer/crates/hir-ty/src/db.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ use salsa::plumbing::AsId;
1212
use triomphe::Arc;
1313

1414
use crate::{
15-
ImplTraitId, TraitEnvironment, TyDefId, ValueTyDefId,
15+
ImplTraitId, TyDefId, ValueTyDefId,
1616
consteval::ConstEvalError,
1717
dyn_compatibility::DynCompatibilityViolation,
1818
layout::{Layout, LayoutError},
1919
lower::{Diagnostics, GenericDefaults},
2020
mir::{BorrowckResult, MirBody, MirLowerError},
21-
next_solver::{Const, EarlyBinder, GenericArgs, PolyFnSig, TraitRef, Ty, VariancesOf},
21+
next_solver::{
22+
Const, EarlyBinder, GenericArgs, ParamEnv, PolyFnSig, TraitRef, Ty, VariancesOf,
23+
},
24+
traits::ParamEnvAndCrate,
2225
};
2326

2427
#[query_group::query_group]
@@ -46,15 +49,15 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
4649
&'db self,
4750
def: DefWithBodyId,
4851
subst: GenericArgs<'db>,
49-
env: Arc<TraitEnvironment<'db>>,
52+
env: ParamEnvAndCrate<'db>,
5053
) -> Result<Arc<MirBody<'db>>, MirLowerError<'db>>;
5154

5255
#[salsa::invoke(crate::mir::monomorphized_mir_body_for_closure_query)]
5356
fn monomorphized_mir_body_for_closure<'db>(
5457
&'db self,
5558
def: InternedClosureId,
5659
subst: GenericArgs<'db>,
57-
env: Arc<TraitEnvironment<'db>>,
60+
env: ParamEnvAndCrate<'db>,
5861
) -> Result<Arc<MirBody<'db>>, MirLowerError<'db>>;
5962

6063
#[salsa::invoke(crate::mir::borrowck_query)]
@@ -70,7 +73,7 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
7073
&'db self,
7174
def: ConstId,
7275
subst: GenericArgs<'db>,
73-
trait_env: Option<Arc<TraitEnvironment<'db>>>,
76+
trait_env: Option<ParamEnvAndCrate<'db>>,
7477
) -> Result<Const<'db>, ConstEvalError<'db>>;
7578

7679
#[salsa::invoke(crate::consteval::const_eval_static_query)]
@@ -88,7 +91,7 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
8891
#[salsa::transparent]
8992
fn lookup_impl_method<'db>(
9093
&'db self,
91-
env: Arc<TraitEnvironment<'db>>,
94+
env: ParamEnvAndCrate<'db>,
9295
func: FunctionId,
9396
fn_subst: GenericArgs<'db>,
9497
) -> (FunctionId, GenericArgs<'db>);
@@ -101,15 +104,15 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
101104
&'db self,
102105
def: AdtId,
103106
args: GenericArgs<'db>,
104-
trait_env: Arc<TraitEnvironment<'db>>,
107+
trait_env: ParamEnvAndCrate<'db>,
105108
) -> Result<Arc<Layout>, LayoutError>;
106109

107110
#[salsa::invoke(crate::layout::layout_of_ty_query)]
108111
#[salsa::cycle(cycle_result = crate::layout::layout_of_ty_cycle_result)]
109112
fn layout_of_ty<'db>(
110113
&'db self,
111114
ty: Ty<'db>,
112-
env: Arc<TraitEnvironment<'db>>,
115+
env: ParamEnvAndCrate<'db>,
113116
) -> Result<Arc<Layout>, LayoutError>;
114117

115118
#[salsa::invoke(crate::layout::target_data_layout_query)]
@@ -186,11 +189,10 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
186189

187190
#[salsa::invoke(crate::lower::trait_environment_for_body_query)]
188191
#[salsa::transparent]
189-
fn trait_environment_for_body<'db>(&'db self, def: DefWithBodyId)
190-
-> Arc<TraitEnvironment<'db>>;
192+
fn trait_environment_for_body<'db>(&'db self, def: DefWithBodyId) -> ParamEnv<'db>;
191193

192194
#[salsa::invoke(crate::lower::trait_environment_query)]
193-
fn trait_environment<'db>(&'db self, def: GenericDefId) -> Arc<TraitEnvironment<'db>>;
195+
fn trait_environment<'db>(&'db self, def: GenericDefId) -> ParamEnv<'db>;
194196

195197
#[salsa::invoke(crate::lower::generic_defaults_with_diagnostics_query)]
196198
#[salsa::cycle(cycle_result = crate::lower::generic_defaults_with_diagnostics_cycle_result)]

src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/expr.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ use triomphe::Arc;
2525
use typed_arena::Arena;
2626

2727
use crate::{
28-
Adjust, InferenceResult, TraitEnvironment,
28+
Adjust, InferenceResult,
2929
db::HirDatabase,
3030
diagnostics::match_check::{
3131
self,
3232
pat_analysis::{self, DeconstructedPat, MatchCheckCtx, WitnessPat},
3333
},
3434
display::{DisplayTarget, HirDisplay},
3535
next_solver::{
36-
DbInterner, Ty, TyKind, TypingMode,
36+
DbInterner, ParamEnv, Ty, TyKind, TypingMode,
3737
infer::{DbInternerInferExt, InferCtxt},
3838
},
3939
};
@@ -79,7 +79,7 @@ impl BodyValidationDiagnostic {
7979
let infer = InferenceResult::for_body(db, owner);
8080
let body = db.body(owner);
8181
let env = db.trait_environment_for_body(owner);
82-
let interner = DbInterner::new_with(db, env.krate);
82+
let interner = DbInterner::new_with(db, owner.krate(db));
8383
let infcx =
8484
interner.infer_ctxt().build(TypingMode::typeck_for_body(interner, owner.into()));
8585
let mut validator = ExprValidator {
@@ -100,7 +100,7 @@ struct ExprValidator<'db> {
100100
owner: DefWithBodyId,
101101
body: Arc<Body>,
102102
infer: &'db InferenceResult<'db>,
103-
env: Arc<TraitEnvironment<'db>>,
103+
env: ParamEnv<'db>,
104104
diagnostics: Vec<BodyValidationDiagnostic>,
105105
validate_lints: bool,
106106
infcx: InferCtxt<'db>,
@@ -210,7 +210,7 @@ impl<'db> ExprValidator<'db> {
210210
return;
211211
}
212212

213-
let cx = MatchCheckCtx::new(self.owner.module(self.db()), &self.infcx, self.env.clone());
213+
let cx = MatchCheckCtx::new(self.owner.module(self.db()), &self.infcx, self.env);
214214

215215
let pattern_arena = Arena::new();
216216
let mut m_arms = Vec::with_capacity(arms.len());
@@ -332,7 +332,7 @@ impl<'db> ExprValidator<'db> {
332332
return;
333333
};
334334
let pattern_arena = Arena::new();
335-
let cx = MatchCheckCtx::new(self.owner.module(self.db()), &self.infcx, self.env.clone());
335+
let cx = MatchCheckCtx::new(self.owner.module(self.db()), &self.infcx, self.env);
336336
for stmt in &**statements {
337337
let &Statement::Let { pat, initializer, else_branch: None, .. } = stmt else {
338338
continue;

0 commit comments

Comments
 (0)