@@ -374,45 +374,81 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
374374 }
375375
376376 pub fn decompose_generator ( & self , ty : & Type ) -> Option < ( Type , Type , Type ) > {
377- let yield_ty = self . fresh_var ( ) ;
378- let send_ty = self . fresh_var ( ) ;
379- let return_ty = self . fresh_var ( ) ;
380- let generator_ty = self . heap . mk_class_type ( self . stdlib . generator (
381- yield_ty. to_type ( self . heap ) ,
382- send_ty. to_type ( self . heap ) ,
383- return_ty. to_type ( self . heap ) ,
384- ) ) ;
385- if self . is_subset_eq ( & generator_ty, ty) {
386- let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
387- let send_ty = self
388- . resolve_var_opt ( ty, send_ty)
389- . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
390- let return_ty = self
391- . resolve_var_opt ( ty, return_ty)
392- . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
393- Some ( ( yield_ty, send_ty, return_ty) )
394- } else {
395- None
377+ match ty {
378+ Type :: Union ( box Union { members, .. } ) => {
379+ let results: Option < Vec < _ > > = members
380+ . iter ( )
381+ . map ( |member| self . decompose_generator ( member) )
382+ . collect ( ) ;
383+ let ( yield_tys, send_tys, return_tys) = results?. into_iter ( ) . fold (
384+ ( Vec :: new ( ) , Vec :: new ( ) , Vec :: new ( ) ) ,
385+ |mut acc, ( yield_ty, send_ty, return_ty) | {
386+ acc. 0 . push ( yield_ty) ;
387+ acc. 1 . push ( send_ty) ;
388+ acc. 2 . push ( return_ty) ;
389+ acc
390+ } ,
391+ ) ;
392+ Some ( (
393+ self . unions ( yield_tys) ,
394+ self . unions ( send_tys) ,
395+ self . unions ( return_tys) ,
396+ ) )
397+ }
398+ _ => {
399+ let yield_ty = self . fresh_var ( ) ;
400+ let send_ty = self . fresh_var ( ) ;
401+ let return_ty = self . fresh_var ( ) ;
402+ let generator_ty = self . heap . mk_class_type ( self . stdlib . generator (
403+ yield_ty. to_type ( self . heap ) ,
404+ send_ty. to_type ( self . heap ) ,
405+ return_ty. to_type ( self . heap ) ,
406+ ) ) ;
407+ if self . is_subset_eq ( & generator_ty, ty) {
408+ let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
409+ let send_ty = self
410+ . resolve_var_opt ( ty, send_ty)
411+ . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
412+ let return_ty = self
413+ . resolve_var_opt ( ty, return_ty)
414+ . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
415+ Some ( ( yield_ty, send_ty, return_ty) )
416+ } else {
417+ None
418+ }
419+ }
396420 }
397421 }
398422
399423 pub fn decompose_async_generator ( & self , ty : & Type ) -> Option < ( Type , Type ) > {
400- let yield_ty = self . fresh_var ( ) ;
401- let send_ty = self . fresh_var ( ) ;
402- let async_generator_ty = self . heap . mk_class_type (
403- self . stdlib
404- . async_generator ( yield_ty. to_type ( self . heap ) , send_ty. to_type ( self . heap ) ) ,
405- ) ;
406- if self . is_subset_eq ( & async_generator_ty, ty) {
407- let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
408- let send_ty = self
409- . resolve_var_opt ( ty, send_ty)
410- . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
411- Some ( ( yield_ty, send_ty) )
412- } else if ty. is_any ( ) {
413- Some ( ( self . heap . mk_any_explicit ( ) , self . heap . mk_any_explicit ( ) ) )
414- } else {
415- None
424+ match ty {
425+ Type :: Union ( box Union { members, .. } ) => {
426+ let results: Option < Vec < _ > > = members
427+ . iter ( )
428+ . map ( |member| self . decompose_async_generator ( member) )
429+ . collect ( ) ;
430+ let ( yield_tys, send_tys) = results?. into_iter ( ) . unzip ( ) ;
431+ Some ( ( self . unions ( yield_tys) , self . unions ( send_tys) ) )
432+ }
433+ _ => {
434+ let yield_ty = self . fresh_var ( ) ;
435+ let send_ty = self . fresh_var ( ) ;
436+ let async_generator_ty = self . heap . mk_class_type (
437+ self . stdlib
438+ . async_generator ( yield_ty. to_type ( self . heap ) , send_ty. to_type ( self . heap ) ) ,
439+ ) ;
440+ if self . is_subset_eq ( & async_generator_ty, ty) {
441+ let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
442+ let send_ty = self
443+ . resolve_var_opt ( ty, send_ty)
444+ . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
445+ Some ( ( yield_ty, send_ty) )
446+ } else if ty. is_any ( ) {
447+ Some ( ( self . heap . mk_any_explicit ( ) , self . heap . mk_any_explicit ( ) ) )
448+ } else {
449+ None
450+ }
451+ }
416452 }
417453 }
418454
0 commit comments