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.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs
index 08843a6c99..80cd0c9c79 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,
@@ -86,6 +87,7 @@ diagnostics![
UnresolvedMacroCall,
UnresolvedMethodCall,
UnresolvedModule,
+ UnresolvedIdent,
UnresolvedProcMacro,
UnusedMut,
UnusedVariable,
@@ -242,6 +244,11 @@ pub struct UnresolvedAssocItem {
}
#[derive(Debug)]
+pub struct UnresolvedIdent {
+ pub expr: InFile<AstPtr<ast::Expr>>,
+}
+
+#[derive(Debug)]
pub struct PrivateField {
pub expr: InFile<AstPtr<ast::Expr>>,
pub field: Field,
@@ -281,6 +288,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 +469,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).
@@ -565,6 +594,10 @@ impl AnyDiagnostic {
};
UnresolvedAssocItem { expr_or_pat }.into()
}
+ &InferenceDiagnostic::UnresolvedIdent { expr } => {
+ let expr = expr_syntax(expr);
+ UnresolvedIdent { expr }.into()
+ }
&InferenceDiagnostic::BreakOutsideOfLoop { expr, is_break, bad_value_break } => {
let expr = expr_syntax(expr);
BreakOutsideOfLoop { expr, is_break, bad_value_break }.into()