@@ -85,6 +85,7 @@ pub(crate) fn infer_scope_types<'db>(db: &'db dyn Db, scope: ScopeId<'db>) -> Sc
8585fn scope_cycle_recover < ' db > (
8686 db : & ' db dyn Db ,
8787 id : salsa:: Id ,
88+ cycle_heads : & salsa:: CycleHeads ,
8889 previous_inference : & ScopeInference < ' db > ,
8990 mut inference : ScopeInference < ' db > ,
9091 _count : u32 ,
@@ -93,7 +94,7 @@ fn scope_cycle_recover<'db>(
9394 let div = Type :: divergent ( id) ;
9495 for ( expr, ty) in & mut inference. expressions {
9596 let previous_ty = previous_inference. expression_type ( * expr) ;
96- * ty = ty. cycle_normalized ( db, previous_ty, div) ;
97+ * ty = ty. cycle_normalized ( db, previous_ty, div, cycle_heads ) ;
9798 }
9899
99100 inference
@@ -134,32 +135,34 @@ pub(crate) fn infer_definition_types<'db>(
134135fn definition_cycle_recover < ' db > (
135136 db : & ' db dyn Db ,
136137 id : salsa:: Id ,
138+ cycle_heads : & salsa:: CycleHeads ,
137139 previous_inference : & DefinitionInference < ' db > ,
138140 inference : DefinitionInference < ' db > ,
139141 _count : u32 ,
140142 _definition : Definition < ' db > ,
141143) -> DefinitionInference < ' db > {
142- definition_cycle_recover_inner ( db, id, previous_inference, inference)
144+ definition_cycle_recover_inner ( db, id, cycle_heads , previous_inference, inference)
143145}
144146
145147fn definition_cycle_recover_inner < ' db > (
146148 db : & ' db dyn Db ,
147149 id : salsa:: Id ,
150+ cycle_heads : & salsa:: CycleHeads ,
148151 previous_inference : & DefinitionInference < ' db > ,
149152 mut inference : DefinitionInference < ' db > ,
150153) -> DefinitionInference < ' db > {
151154 let div = Type :: divergent ( id) ;
152155 for ( expr, ty) in & mut inference. expressions {
153156 let previous_ty = previous_inference. expression_type ( * expr) ;
154- * ty = ty. cycle_normalized ( db, previous_ty, div) ;
157+ * ty = ty. cycle_normalized ( db, previous_ty, div, cycle_heads ) ;
155158 }
156159 for ( binding, binding_ty) in & mut inference. bindings {
157160 if let Some ( ( _, previous_binding) ) = previous_inference
158161 . bindings
159162 . iter ( )
160163 . find ( |( previous_binding, _) | previous_binding == binding)
161164 {
162- * binding_ty = binding_ty. cycle_normalized ( db, * previous_binding, div) ;
165+ * binding_ty = binding_ty. cycle_normalized ( db, * previous_binding, div, cycle_heads ) ;
163166 } else {
164167 * binding_ty = binding_ty. recursive_type_normalized ( db, div) ;
165168 }
@@ -171,7 +174,7 @@ fn definition_cycle_recover_inner<'db>(
171174 . find ( |( previous_declaration, _) | previous_declaration == declaration)
172175 {
173176 * declaration_ty = declaration_ty. map_type ( |decl_ty| {
174- decl_ty. cycle_normalized ( db, previous_declaration. inner_type ( ) , div)
177+ decl_ty. cycle_normalized ( db, previous_declaration. inner_type ( ) , div, cycle_heads )
175178 } ) ;
176179 } else {
177180 * declaration_ty =
@@ -218,12 +221,13 @@ pub(crate) fn infer_deferred_types<'db>(
218221fn deferred_cycle_recovery < ' db > (
219222 db : & ' db dyn Db ,
220223 id : salsa:: Id ,
224+ cycle_heads : & salsa:: CycleHeads ,
221225 previous_inference : & DefinitionInference < ' db > ,
222226 inference : DefinitionInference < ' db > ,
223227 _count : u32 ,
224228 _definition : Definition < ' db > ,
225229) -> DefinitionInference < ' db > {
226- definition_cycle_recover_inner ( db, id, previous_inference, inference)
230+ definition_cycle_recover_inner ( db, id, cycle_heads , previous_inference, inference)
227231}
228232
229233fn deferred_cycle_initial < ' db > (
@@ -298,6 +302,7 @@ pub(crate) fn infer_isolated_expression<'db>(
298302fn expression_cycle_recover < ' db > (
299303 db : & ' db dyn Db ,
300304 id : salsa:: Id ,
305+ cycle_heads : & salsa:: CycleHeads ,
301306 previous_inference : & ExpressionInference < ' db > ,
302307 mut inference : ExpressionInference < ' db > ,
303308 _count : u32 ,
@@ -314,7 +319,7 @@ fn expression_cycle_recover<'db>(
314319 . find ( |( previous_binding, _) | previous_binding == binding)
315320 } )
316321 {
317- * binding_ty = binding_ty. cycle_normalized ( db, * previous_binding, div) ;
322+ * binding_ty = binding_ty. cycle_normalized ( db, * previous_binding, div, cycle_heads ) ;
318323 } else {
319324 * binding_ty = binding_ty. recursive_type_normalized ( db, div) ;
320325 }
@@ -323,7 +328,7 @@ fn expression_cycle_recover<'db>(
323328
324329 for ( expr, ty) in & mut inference. expressions {
325330 let previous_ty = previous_inference. expression_type ( * expr) ;
326- * ty = ty. cycle_normalized ( db, previous_ty, div) ;
331+ * ty = ty. cycle_normalized ( db, previous_ty, div, cycle_heads ) ;
327332 }
328333
329334 inference
@@ -382,13 +387,14 @@ fn infer_expression_type_impl<'db>(db: &'db dyn Db, input: InferExpression<'db>)
382387fn single_expression_cycle_recover < ' db > (
383388 db : & ' db dyn Db ,
384389 id : salsa:: Id ,
390+ cycle_heads : & salsa:: CycleHeads ,
385391 previous_cycle_value : & Type < ' db > ,
386392 result : Type < ' db > ,
387393 _count : u32 ,
388394 _input : InferExpression < ' db > ,
389395) -> Type < ' db > {
390396 let div = Type :: divergent ( id) ;
391- result. cycle_normalized ( db, * previous_cycle_value, div)
397+ result. cycle_normalized ( db, * previous_cycle_value, div, cycle_heads )
392398}
393399
394400fn single_expression_cycle_initial < ' db > (
@@ -540,6 +546,7 @@ fn unpack_cycle_initial<'db>(
540546fn unpack_cycle_recover < ' db > (
541547 db : & ' db dyn Db ,
542548 id : salsa:: Id ,
549+ cycle_heads : & salsa:: CycleHeads ,
543550 previous_cycle_result : & UnpackResult < ' db > ,
544551 mut result : UnpackResult < ' db > ,
545552 _count : u32 ,
@@ -548,7 +555,7 @@ fn unpack_cycle_recover<'db>(
548555 let div = Type :: divergent ( id) ;
549556 for ( expr, ty) in & mut result. targets {
550557 let previous_ty = previous_cycle_result. expression_type ( * expr) ;
551- * ty = ty. cycle_normalized ( db, previous_ty, div) ;
558+ * ty = ty. cycle_normalized ( db, previous_ty, div, cycle_heads ) ;
552559 }
553560
554561 result
0 commit comments