Refactor: Distinguish scrutinee expression from match expression

This commit is contained in:
iDawer 2023-03-10 18:43:50 +05:00
parent 5e8c586f3b
commit 17b9d35b31

View file

@ -147,15 +147,15 @@ impl ExprValidator {
fn validate_match( fn validate_match(
&mut self, &mut self,
id: ExprId,
match_expr: ExprId, match_expr: ExprId,
scrutinee_expr: ExprId,
arms: &[MatchArm], arms: &[MatchArm],
db: &dyn HirDatabase, db: &dyn HirDatabase,
) { ) {
let body = db.body(self.owner); let body = db.body(self.owner);
let match_expr_ty = &self.infer[match_expr]; let scrut_ty = &self.infer[scrutinee_expr];
if match_expr_ty.is_unknown() { if scrut_ty.is_unknown() {
return; return;
} }
@ -167,17 +167,17 @@ impl ExprValidator {
for arm in arms { for arm in arms {
if let Some(pat_ty) = self.infer.type_of_pat.get(arm.pat) { if let Some(pat_ty) = self.infer.type_of_pat.get(arm.pat) {
// We only include patterns whose type matches the type // We only include patterns whose type matches the type
// of the match expression. If we had an InvalidMatchArmPattern // of the scrutinee expression. If we had an InvalidMatchArmPattern
// diagnostic or similar we could raise that in an else // diagnostic or similar we could raise that in an else
// block here. // block here.
// //
// When comparing the types, we also have to consider that rustc // When comparing the types, we also have to consider that rustc
// will automatically de-reference the match expression type if // will automatically de-reference the scrutinee expression type if
// necessary. // necessary.
// //
// FIXME we should use the type checker for this. // FIXME we should use the type checker for this.
if (pat_ty == match_expr_ty if (pat_ty == scrut_ty
|| match_expr_ty || scrut_ty
.as_reference() .as_reference()
.map(|(match_expr_ty, ..)| match_expr_ty == pat_ty) .map(|(match_expr_ty, ..)| match_expr_ty == pat_ty)
.unwrap_or(false)) .unwrap_or(false))
@ -205,7 +205,7 @@ impl ExprValidator {
return; return;
} }
let report = compute_match_usefulness(&cx, &m_arms, match_expr_ty); let report = compute_match_usefulness(&cx, &m_arms, scrut_ty);
// FIXME Report unreacheble arms // FIXME Report unreacheble arms
// https://github.com/rust-lang/rust/blob/f31622a50/compiler/rustc_mir_build/src/thir/pattern/check_match.rs#L200 // https://github.com/rust-lang/rust/blob/f31622a50/compiler/rustc_mir_build/src/thir/pattern/check_match.rs#L200
@ -213,8 +213,8 @@ impl ExprValidator {
let witnesses = report.non_exhaustiveness_witnesses; let witnesses = report.non_exhaustiveness_witnesses;
if !witnesses.is_empty() { if !witnesses.is_empty() {
self.diagnostics.push(BodyValidationDiagnostic::MissingMatchArms { self.diagnostics.push(BodyValidationDiagnostic::MissingMatchArms {
match_expr: id, match_expr,
uncovered_patterns: missing_match_arms(&cx, match_expr_ty, witnesses, arms), uncovered_patterns: missing_match_arms(&cx, scrut_ty, witnesses, arms),
}); });
} }
} }