Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/consteval.rs')
| -rw-r--r-- | crates/hir-ty/src/consteval.rs | 102 |
1 files changed, 31 insertions, 71 deletions
diff --git a/crates/hir-ty/src/consteval.rs b/crates/hir-ty/src/consteval.rs index b2daed425e..8b12c5fd89 100644 --- a/crates/hir-ty/src/consteval.rs +++ b/crates/hir-ty/src/consteval.rs @@ -4,8 +4,8 @@ use base_db::Crate; use chalk_ir::{BoundVar, DebruijnIndex, cast::Cast}; use hir_def::{ EnumVariantId, GeneralConstId, HasModule as _, StaticId, - expr_store::{Body, HygieneId, path::Path}, - hir::{Expr, ExprId}, + expr_store::{HygieneId, path::Path}, + hir::Expr, resolver::{Resolver, ValueNs}, type_ref::LiteralConstRef, }; @@ -19,13 +19,12 @@ use crate::{ db::HirDatabase, display::DisplayTarget, generics::Generics, - infer::InferenceContext, lower::ParamLoweringMode, next_solver::{DbInterner, mapping::ChalkToNextSolver}, to_placeholder_idx, }; -use super::mir::{MirEvalError, MirLowerError, interpret_mir, lower_to_mir, pad16}; +use super::mir::{MirEvalError, MirLowerError, interpret_mir, pad16}; /// Extension trait for [`Const`] pub trait ConstExt { @@ -56,12 +55,12 @@ impl ConstExt for Const { } #[derive(Debug, Clone, PartialEq, Eq)] -pub enum ConstEvalError { - MirLowerError(MirLowerError), - MirEvalError(MirEvalError), +pub enum ConstEvalError<'db> { + MirLowerError(MirLowerError<'db>), + MirEvalError(MirEvalError<'db>), } -impl ConstEvalError { +impl ConstEvalError<'_> { pub fn pretty_print( &self, f: &mut String, @@ -80,8 +79,8 @@ impl ConstEvalError { } } -impl From<MirLowerError> for ConstEvalError { - fn from(value: MirLowerError) -> Self { +impl<'db> From<MirLowerError<'db>> for ConstEvalError<'db> { + fn from(value: MirLowerError<'db>) -> Self { match value { MirLowerError::ConstEvalError(_, e) => *e, _ => ConstEvalError::MirLowerError(value), @@ -89,8 +88,8 @@ impl From<MirLowerError> for ConstEvalError { } } -impl From<MirEvalError> for ConstEvalError { - fn from(value: MirEvalError) -> Self { +impl<'db> From<MirEvalError<'db>> for ConstEvalError<'db> { + fn from(value: MirEvalError<'db>) -> Self { ConstEvalError::MirEvalError(value) } } @@ -225,35 +224,35 @@ pub fn try_const_isize(db: &dyn HirDatabase, c: &Const) -> Option<i128> { } } -pub(crate) fn const_eval_cycle_result( - _: &dyn HirDatabase, +pub(crate) fn const_eval_cycle_result<'db>( + _: &'db dyn HirDatabase, _: GeneralConstId, _: Substitution, - _: Option<Arc<TraitEnvironment<'_>>>, -) -> Result<Const, ConstEvalError> { + _: Option<Arc<TraitEnvironment<'db>>>, +) -> Result<Const, ConstEvalError<'db>> { Err(ConstEvalError::MirLowerError(MirLowerError::Loop)) } -pub(crate) fn const_eval_static_cycle_result( - _: &dyn HirDatabase, +pub(crate) fn const_eval_static_cycle_result<'db>( + _: &'db dyn HirDatabase, _: StaticId, -) -> Result<Const, ConstEvalError> { +) -> Result<Const, ConstEvalError<'db>> { Err(ConstEvalError::MirLowerError(MirLowerError::Loop)) } -pub(crate) fn const_eval_discriminant_cycle_result( - _: &dyn HirDatabase, +pub(crate) fn const_eval_discriminant_cycle_result<'db>( + _: &'db dyn HirDatabase, _: EnumVariantId, -) -> Result<i128, ConstEvalError> { +) -> Result<i128, ConstEvalError<'db>> { Err(ConstEvalError::MirLowerError(MirLowerError::Loop)) } -pub(crate) fn const_eval_query( - db: &dyn HirDatabase, +pub(crate) fn const_eval_query<'db>( + db: &'db dyn HirDatabase, def: GeneralConstId, subst: Substitution, - trait_env: Option<Arc<TraitEnvironment<'_>>>, -) -> Result<Const, ConstEvalError> { + trait_env: Option<Arc<TraitEnvironment<'db>>>, +) -> Result<Const, ConstEvalError<'db>> { let body = match def { GeneralConstId::ConstId(c) => { db.monomorphized_mir_body(c.into(), subst, db.trait_environment(c.into()))? @@ -267,10 +266,10 @@ pub(crate) fn const_eval_query( Ok(c) } -pub(crate) fn const_eval_static_query( - db: &dyn HirDatabase, +pub(crate) fn const_eval_static_query<'db>( + db: &'db dyn HirDatabase, def: StaticId, -) -> Result<Const, ConstEvalError> { +) -> Result<Const, ConstEvalError<'db>> { let body = db.monomorphized_mir_body( def.into(), Substitution::empty(Interner), @@ -280,10 +279,10 @@ pub(crate) fn const_eval_static_query( Ok(c) } -pub(crate) fn const_eval_discriminant_variant( - db: &dyn HirDatabase, +pub(crate) fn const_eval_discriminant_variant<'db>( + db: &'db dyn HirDatabase, variant_id: EnumVariantId, -) -> Result<i128, ConstEvalError> { +) -> Result<i128, ConstEvalError<'db>> { let def = variant_id.into(); let body = db.body(def); let loc = variant_id.lookup(db); @@ -317,44 +316,5 @@ pub(crate) fn const_eval_discriminant_variant( Ok(c) } -// FIXME: Ideally constants in const eval should have separate body (issue #7434), and this function should -// get an `InferenceResult` instead of an `InferenceContext`. And we should remove `ctx.clone().resolve_all()` here -// and make this function private. See the fixme comment on `InferenceContext::resolve_all`. -pub(crate) fn eval_to_const( - expr: ExprId, - mode: ParamLoweringMode, - ctx: &mut InferenceContext<'_>, - debruijn: DebruijnIndex, -) -> Const { - let db = ctx.db; - let infer = ctx.fixme_resolve_all_clone(); - fn has_closure(body: &Body, expr: ExprId) -> bool { - if matches!(body[expr], Expr::Closure { .. }) { - return true; - } - let mut r = false; - body.walk_child_exprs(expr, |idx| r |= has_closure(body, idx)); - r - } - if has_closure(ctx.body, expr) { - // Type checking clousres need an isolated body (See the above FIXME). Bail out early to prevent panic. - return unknown_const(infer[expr].clone()); - } - if let Expr::Path(p) = &ctx.body[expr] { - let resolver = &ctx.resolver; - if let Some(c) = - path_to_const(db, resolver, p, mode, || ctx.generics(), debruijn, infer[expr].clone()) - { - return c; - } - } - if let Ok(mir_body) = lower_to_mir(ctx.db, ctx.owner, ctx.body, &infer, expr) - && let Ok((Ok(result), _)) = interpret_mir(db, Arc::new(mir_body), true, None) - { - return result; - } - unknown_const(infer[expr].clone()) -} - #[cfg(test)] mod tests; |