@@ -15,6 +15,7 @@ use rustc_hash::FxHashSet;
15
15
use crate :: {
16
16
db:: HirDatabase ,
17
17
diagnostics:: { MissingFields , MissingOkInTailExpr } ,
18
+ utils:: variant_data,
18
19
ApplicationTy , InferenceResult , Ty , TypeCtor ,
19
20
} ;
20
21
@@ -27,6 +28,7 @@ pub use hir_def::{
27
28
ArithOp , Array , BinaryOp , BindingAnnotation , CmpOp , Expr , ExprId , Literal , LogicOp ,
28
29
MatchArm , Ordering , Pat , PatId , RecordFieldPat , RecordLitField , Statement , UnaryOp ,
29
30
} ,
31
+ VariantId ,
30
32
} ;
31
33
32
34
pub struct ExprValidator < ' a , ' b : ' a > {
@@ -69,17 +71,19 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
69
71
) {
70
72
if spread. is_some ( ) {
71
73
return ;
74
+ } ;
75
+ let variant_def: VariantId = match self . infer . variant_resolution_for_expr ( id) {
76
+ Some ( VariantId :: UnionId ( _) ) | None => return ,
77
+ Some ( it) => it,
78
+ } ;
79
+ if let VariantId :: UnionId ( _) = variant_def {
80
+ return ;
72
81
}
73
82
74
- let struct_def = match self . infer [ id] . as_adt ( ) {
75
- Some ( ( AdtId :: StructId ( s) , _) ) => s,
76
- _ => return ,
77
- } ;
78
- let struct_data = db. struct_data ( struct_def) ;
83
+ let variant_data = variant_data ( db, variant_def) ;
79
84
80
85
let lit_fields: FxHashSet < _ > = fields. iter ( ) . map ( |f| & f. name ) . collect ( ) ;
81
- let missed_fields: Vec < Name > = struct_data
82
- . variant_data
86
+ let missed_fields: Vec < Name > = variant_data
83
87
. fields ( )
84
88
. iter ( )
85
89
. filter_map ( |( _f, d) | {
0 commit comments