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.rs18
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()
}