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.rs46
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 => (),