Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/diagnostics.rs')
-rw-r--r--crates/hir/src/diagnostics.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs
index 08843a6c99..d351e257d2 100644
--- a/crates/hir/src/diagnostics.rs
+++ b/crates/hir/src/diagnostics.rs
@@ -64,6 +64,7 @@ diagnostics![
MissingUnsafe,
MovedOutOfRef,
NeedMut,
+ NonExhaustiveLet,
NoSuchField,
PrivateAssocItem,
PrivateField,
@@ -281,6 +282,12 @@ pub struct MissingMatchArms {
}
#[derive(Debug)]
+pub struct NonExhaustiveLet {
+ pub pat: InFile<AstPtr<ast::Pat>>,
+ pub uncovered_patterns: String,
+}
+
+#[derive(Debug)]
pub struct TypeMismatch {
pub expr_or_pat: InFile<AstPtr<Either<ast::Expr, ast::Pat>>>,
pub expected: Type,
@@ -456,6 +463,22 @@ impl AnyDiagnostic {
Err(SyntheticSyntax) => (),
}
}
+ BodyValidationDiagnostic::NonExhaustiveLet { pat, uncovered_patterns } => {
+ match source_map.pat_syntax(pat) {
+ Ok(source_ptr) => {
+ if let Some(ast_pat) = source_ptr.value.cast::<ast::Pat>() {
+ return Some(
+ NonExhaustiveLet {
+ pat: InFile::new(source_ptr.file_id, ast_pat),
+ uncovered_patterns,
+ }
+ .into(),
+ );
+ }
+ }
+ Err(SyntheticSyntax) => {}
+ }
+ }
BodyValidationDiagnostic::RemoveTrailingReturn { return_expr } => {
if let Ok(source_ptr) = source_map.expr_syntax(return_expr) {
// Filters out desugared return expressions (e.g. desugared try operators).