Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/expr.rs')
| -rw-r--r-- | crates/hir-ty/src/diagnostics/expr.rs | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/crates/hir-ty/src/diagnostics/expr.rs b/crates/hir-ty/src/diagnostics/expr.rs index d05814e0e7..7b6fb994ec 100644 --- a/crates/hir-ty/src/diagnostics/expr.rs +++ b/crates/hir-ty/src/diagnostics/expr.rs @@ -23,6 +23,8 @@ use tracing::debug; use triomphe::Arc; use typed_arena::Arena; +use crate::next_solver::DbInterner; +use crate::next_solver::mapping::NextSolverToChalk; use crate::{ Adjust, InferenceResult, Interner, TraitEnvironment, Ty, TyExt, TyKind, db::HirDatabase, @@ -74,8 +76,16 @@ impl BodyValidationDiagnostic { let infer = db.infer(owner); let body = db.body(owner); let env = db.trait_environment_for_body(owner); - let mut validator = - ExprValidator { owner, body, infer, diagnostics: Vec::new(), validate_lints, env }; + let interner = DbInterner::new_with(db, Some(env.krate), env.block); + let mut validator = ExprValidator { + owner, + body, + infer, + diagnostics: Vec::new(), + validate_lints, + env, + interner, + }; validator.validate_body(db); validator.diagnostics } @@ -84,10 +94,11 @@ impl BodyValidationDiagnostic { struct ExprValidator<'db> { owner: DefWithBodyId, body: Arc<Body>, - infer: Arc<InferenceResult>, + infer: Arc<InferenceResult<'db>>, env: Arc<TraitEnvironment<'db>>, diagnostics: Vec<BodyValidationDiagnostic>, validate_lints: bool, + interner: DbInterner<'db>, } impl<'db> ExprValidator<'db> { @@ -175,7 +186,7 @@ impl<'db> ExprValidator<'db> { } if let Some(receiver_ty) = self.infer.type_of_expr_with_adjust(*receiver) { - checker.prev_receiver_ty = Some(receiver_ty.clone()); + checker.prev_receiver_ty = Some(receiver_ty.to_chalk(self.interner)); } } } @@ -190,6 +201,7 @@ impl<'db> ExprValidator<'db> { let Some(scrut_ty) = self.infer.type_of_expr_with_adjust(scrutinee_expr) else { return; }; + let scrut_ty = scrut_ty.to_chalk(self.interner); if scrut_ty.contains_unknown() { return; } @@ -205,6 +217,7 @@ impl<'db> ExprValidator<'db> { let Some(pat_ty) = self.infer.type_of_pat_with_adjust(arm.pat) else { return; }; + let pat_ty = pat_ty.to_chalk(self.interner); if pat_ty.contains_unknown() { return; } @@ -222,7 +235,7 @@ impl<'db> ExprValidator<'db> { if (pat_ty == scrut_ty || scrut_ty .as_reference() - .map(|(match_expr_ty, ..)| match_expr_ty == pat_ty) + .map(|(match_expr_ty, ..)| *match_expr_ty == pat_ty) .unwrap_or(false)) && types_of_subpatterns_do_match(arm.pat, &self.body, &self.infer) { @@ -264,7 +277,7 @@ impl<'db> ExprValidator<'db> { match_expr, uncovered_patterns: missing_match_arms( &cx, - scrut_ty, + &scrut_ty, witnesses, m_arms.is_empty(), self.owner.krate(db), @@ -298,10 +311,12 @@ impl<'db> ExprValidator<'db> { ); value_or_partial.is_none_or(|v| !matches!(v, ValueNs::StaticId(_))) } - Expr::Field { expr, .. } => match self.infer.type_of_expr[*expr].kind(Interner) { - TyKind::Adt(adt, ..) if matches!(adt.0, AdtId::UnionId(_)) => false, - _ => self.is_known_valid_scrutinee(*expr, db), - }, + Expr::Field { expr, .. } => { + match self.infer.type_of_expr[*expr].to_chalk(self.interner).kind(Interner) { + TyKind::Adt(adt, ..) if matches!(adt.0, AdtId::UnionId(_)) => false, + _ => self.is_known_valid_scrutinee(*expr, db), + } + } Expr::Index { base, .. } => self.is_known_valid_scrutinee(*base, db), Expr::Cast { expr, .. } => self.is_known_valid_scrutinee(*expr, db), Expr::Missing => false, @@ -327,6 +342,7 @@ impl<'db> ExprValidator<'db> { } let Some(initializer) = initializer else { continue }; let Some(ty) = self.infer.type_of_expr_with_adjust(initializer) else { continue }; + let ty = ty.to_chalk(self.interner); if ty.contains_unknown() { continue; } @@ -357,7 +373,7 @@ impl<'db> ExprValidator<'db> { pat, uncovered_patterns: missing_match_arms( &cx, - ty, + &ty, witnesses, false, self.owner.krate(db), @@ -542,7 +558,7 @@ impl FilterMapNextChecker { pub fn record_literal_missing_fields( db: &dyn HirDatabase, - infer: &InferenceResult, + infer: &InferenceResult<'_>, id: ExprId, expr: &Expr, ) -> Option<(VariantId, Vec<LocalFieldId>, /*exhaustive*/ bool)> { @@ -572,7 +588,7 @@ pub fn record_literal_missing_fields( pub fn record_pattern_missing_fields( db: &dyn HirDatabase, - infer: &InferenceResult, + infer: &InferenceResult<'_>, id: PatId, pat: &Pat, ) -> Option<(VariantId, Vec<LocalFieldId>, /*exhaustive*/ bool)> { @@ -600,8 +616,8 @@ pub fn record_pattern_missing_fields( Some((variant_def, missed_fields, exhaustive)) } -fn types_of_subpatterns_do_match(pat: PatId, body: &Body, infer: &InferenceResult) -> bool { - fn walk(pat: PatId, body: &Body, infer: &InferenceResult, has_type_mismatches: &mut bool) { +fn types_of_subpatterns_do_match(pat: PatId, body: &Body, infer: &InferenceResult<'_>) -> bool { + fn walk(pat: PatId, body: &Body, infer: &InferenceResult<'_>, has_type_mismatches: &mut bool) { match infer.type_mismatch_for_pat(pat) { Some(_) => *has_type_mismatches = true, None if *has_type_mismatches => (), |