22
33use std:: iter:: repeat_with;
44
5- use chalk_ir:: Mutability ;
65use hir_def:: {
76 body:: Body ,
87 hir:: { Binding , BindingAnnotation , BindingId , Expr , ExprId , ExprOrPatId , Literal , Pat , PatId } ,
98 path:: Path ,
109} ;
1110use hir_expand:: name:: Name ;
11+ use stdx:: TupleExt ;
1212
1313use crate :: {
1414 consteval:: { try_const_usize, usize_const} ,
1515 error_lifetime,
1616 infer:: { BindingMode , Expectation , InferenceContext , TypeMismatch } ,
1717 lower:: lower_to_chalk_mutability,
1818 primitive:: UintTy ,
19- static_lifetime, InferenceDiagnostic , Interner , Scalar , Substitution , Ty , TyBuilder , TyExt ,
20- TyKind ,
19+ static_lifetime, InferenceDiagnostic , Interner , Mutability , Scalar , Substitution , Ty ,
20+ TyBuilder , TyExt , TyKind ,
2121} ;
2222
2323/// Used to generalize patterns and assignee expressions.
@@ -90,9 +90,6 @@ impl InferenceContext<'_> {
9090
9191 self . unify ( & ty, expected) ;
9292
93- let substs =
94- ty. as_adt ( ) . map ( |( _, s) | s. clone ( ) ) . unwrap_or_else ( || Substitution :: empty ( Interner ) ) ;
95-
9693 match def {
9794 _ if subs. is_empty ( ) => { }
9895 Some ( def) => {
@@ -109,26 +106,28 @@ impl InferenceContext<'_> {
109106 let pre_iter = pre. iter ( ) . enumerate ( ) ;
110107 let post_iter = ( post_idx_offset..) . zip ( post. iter ( ) ) ;
111108
109+ let substs = ty. as_adt ( ) . map ( TupleExt :: tail) ;
110+
112111 for ( i, & subpat) in pre_iter. chain ( post_iter) {
113- let field_def = {
112+ let expected_ty = {
114113 match variant_data. field ( & Name :: new_tuple_field ( i) ) {
115114 Some ( local_id) => {
116115 if !visibilities[ local_id]
117116 . is_visible_from ( self . db . upcast ( ) , self . resolver . module ( ) )
118117 {
119118 // FIXME(DIAGNOSE): private tuple field
120119 }
121- Some ( local_id)
120+ let f = field_types[ local_id] . clone ( ) ;
121+ let expected_ty = match substs {
122+ Some ( substs) => f. substitute ( Interner , substs) ,
123+ None => f. substitute ( Interner , & Substitution :: empty ( Interner ) ) ,
124+ } ;
125+ self . normalize_associated_types_in ( expected_ty)
122126 }
123- None => None ,
127+ None => self . err_ty ( ) ,
124128 }
125129 } ;
126130
127- let expected_ty = field_def. map_or ( self . err_ty ( ) , |f| {
128- field_types[ f] . clone ( ) . substitute ( Interner , & substs)
129- } ) ;
130- let expected_ty = self . normalize_associated_types_in ( expected_ty) ;
131-
132131 T :: infer ( self , subpat, & expected_ty, default_bm) ;
133132 }
134133 }
@@ -159,18 +158,17 @@ impl InferenceContext<'_> {
159158
160159 self . unify ( & ty, expected) ;
161160
162- let substs =
163- ty. as_adt ( ) . map ( |( _, s) | s. clone ( ) ) . unwrap_or_else ( || Substitution :: empty ( Interner ) ) ;
164-
165161 match def {
166162 _ if subs. len ( ) == 0 => { }
167163 Some ( def) => {
168164 let field_types = self . db . field_types ( def) ;
169165 let variant_data = def. variant_data ( self . db . upcast ( ) ) ;
170166 let visibilities = self . db . field_visibilities ( def) ;
171167
168+ let substs = ty. as_adt ( ) . map ( TupleExt :: tail) ;
169+
172170 for ( name, inner) in subs {
173- let field_def = {
171+ let expected_ty = {
174172 match variant_data. field ( & name) {
175173 Some ( local_id) => {
176174 if !visibilities[ local_id]
@@ -181,23 +179,23 @@ impl InferenceContext<'_> {
181179 private : true ,
182180 } ) ;
183181 }
184- Some ( local_id)
182+ let f = field_types[ local_id] . clone ( ) ;
183+ let expected_ty = match substs {
184+ Some ( substs) => f. substitute ( Interner , substs) ,
185+ None => f. substitute ( Interner , & Substitution :: empty ( Interner ) ) ,
186+ } ;
187+ self . normalize_associated_types_in ( expected_ty)
185188 }
186189 None => {
187190 self . push_diagnostic ( InferenceDiagnostic :: NoSuchField {
188191 field : inner. into ( ) ,
189192 private : false ,
190193 } ) ;
191- None
194+ self . err_ty ( )
192195 }
193196 }
194197 } ;
195198
196- let expected_ty = field_def. map_or ( self . err_ty ( ) , |f| {
197- field_types[ f] . clone ( ) . substitute ( Interner , & substs)
198- } ) ;
199- let expected_ty = self . normalize_associated_types_in ( expected_ty) ;
200-
201199 T :: infer ( self , inner, & expected_ty, default_bm) ;
202200 }
203201 }
0 commit comments