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.rs | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs index 401bbd4a59..b34c7b20c3 100644 --- a/crates/hir/src/diagnostics.rs +++ b/crates/hir/src/diagnostics.rs @@ -31,7 +31,7 @@ use syntax::{ }; use triomphe::Arc; -use crate::{AssocItem, Field, Function, GenericDef, Local, Trait, Type}; +use crate::{AssocItem, Field, Function, GenericDef, Local, Trait, Type, Variant}; pub use hir_def::VariantId; pub use hir_ty::{ @@ -128,6 +128,7 @@ diagnostics![AnyDiagnostic<'db> -> NonExhaustiveRecordExpr, NoSuchField, MismatchedArrayPatLen, + DuplicateField, PatternArgInExternFn, PrivateAssocItem, PrivateField, @@ -268,6 +269,12 @@ pub struct NoSuchField { } #[derive(Debug)] +pub struct DuplicateField { + pub field: InFile<AstPtr<Either<ast::RecordExprField, ast::RecordPatField>>>, + pub variant: Variant, +} + +#[derive(Debug)] pub struct PrivateAssocItem { pub expr_or_pat: InFile<ExprOrPatPtr>, pub item: AssocItem, @@ -764,6 +771,15 @@ impl<'db> AnyDiagnostic<'db> { let pat = pat_syntax(pat)?.map(Into::into); MismatchedArrayPatLen { pat, expected, found, has_rest }.into() } + &InferenceDiagnostic::DuplicateField { field: expr, variant } => { + let expr_or_pat = match expr { + ExprOrPatId::ExprId(expr) => { + source_map.field_syntax(expr).map(AstPtr::wrap_left) + } + ExprOrPatId::PatId(pat) => source_map.pat_field_syntax(pat), + }; + DuplicateField { field: expr_or_pat, variant: variant.into() }.into() + } &InferenceDiagnostic::MismatchedArgCount { call_expr, expected, found } => { MismatchedArgCount { call_expr: expr_syntax(call_expr)?, expected, found }.into() } |