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
9191self . unify ( & ty, expected) ;
9292
93- let substs =
94- ty. as_adt ( ) . map ( |( _, s) | s. clone ( ) ) . unwrap_or_else ( || Substitution :: empty ( Interner ) ) ;
95-
9693match def {
9794 _ if subs. is_empty ( ) => { }
9895Some ( def) => {
@@ -109,26 +106,28 @@ impl InferenceContext<'_> {
109106let pre_iter = pre. iter ( ) . enumerate ( ) ;
110107let post_iter = ( post_idx_offset..) . zip ( post. iter ( ) ) ;
111108
109+ let substs = ty. as_adt ( ) . map ( TupleExt :: tail) ;
110+
112111for ( i, & subpat) in pre_iter. chain ( post_iter) {
113- let field_def = {
112+ let expected_ty = {
114113match variant_data. field ( & Name :: new_tuple_field ( i) ) {
115114Some ( local_id) => {
116115if !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-
132131T :: infer ( self , subpat, & expected_ty, default_bm) ;
133132}
134133}
@@ -159,18 +158,17 @@ impl InferenceContext<'_> {
159158
160159self . unify ( & ty, expected) ;
161160
162- let substs =
163- ty. as_adt ( ) . map ( |( _, s) | s. clone ( ) ) . unwrap_or_else ( || Substitution :: empty ( Interner ) ) ;
164-
165161match def {
166162 _ if subs. len ( ) == 0 => { }
167163Some ( def) => {
168164let field_types = self . db . field_types ( def) ;
169165let variant_data = def. variant_data ( self . db . upcast ( ) ) ;
170166let visibilities = self . db . field_visibilities ( def) ;
171167
168+ let substs = ty. as_adt ( ) . map ( TupleExt :: tail) ;
169+
172170for ( name, inner) in subs {
173- let field_def = {
171+ let expected_ty = {
174172match variant_data. field ( & name) {
175173Some ( local_id) => {
176174if !visibilities[ local_id]
@@ -181,23 +179,23 @@ impl InferenceContext<'_> {
181179private : 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}
186189None => {
187190self . push_diagnostic ( InferenceDiagnostic :: NoSuchField {
188191field : inner. into ( ) ,
189192private : 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-
201199T :: infer ( self , inner, & expected_ty, default_bm) ;
202200}
203201}
0 commit comments