@@ -29,8 +29,9 @@ use crate::{
2929 builtin_type:: { BuiltinFloat , BuiltinInt , BuiltinUint } ,
3030 db:: DefDatabase ,
3131 expr:: {
32- dummy_expr_id, Array , BindingAnnotation , Expr , ExprId , FloatTypeWrapper , Label , LabelId ,
33- Literal , MatchArm , Pat , PatId , RecordFieldPat , RecordLitField , Statement ,
32+ dummy_expr_id, Array , BindingAnnotation , ClosureKind , Expr , ExprId , FloatTypeWrapper ,
33+ Label , LabelId , Literal , MatchArm , Movability , Pat , PatId , RecordFieldPat , RecordLitField ,
34+ Statement ,
3435 } ,
3536 intern:: Interned ,
3637 item_scope:: BuiltinShadowMode ,
@@ -97,6 +98,7 @@ pub(super) fn lower(
9798 name_to_pat_grouping : Default :: default ( ) ,
9899 is_lowering_inside_or_pat : false ,
99100 is_lowering_assignee_expr : false ,
101+ is_lowering_generator : false ,
100102 }
101103 . collect ( params, body)
102104}
@@ -111,6 +113,7 @@ struct ExprCollector<'a> {
111113 name_to_pat_grouping : FxHashMap < Name , Vec < PatId > > ,
112114 is_lowering_inside_or_pat : bool ,
113115 is_lowering_assignee_expr : bool ,
116+ is_lowering_generator : bool ,
114117}
115118
116119impl ExprCollector < ' _ > {
@@ -358,6 +361,7 @@ impl ExprCollector<'_> {
358361 self . alloc_expr ( Expr :: Return { expr } , syntax_ptr)
359362 }
360363 ast:: Expr :: YieldExpr ( e) => {
364+ self . is_lowering_generator = true ;
361365 let expr = e. expr ( ) . map ( |e| self . collect_expr ( e) ) ;
362366 self . alloc_expr ( Expr :: Yield { expr } , syntax_ptr)
363367 }
@@ -459,13 +463,31 @@ impl ExprCollector<'_> {
459463 . ret_type ( )
460464 . and_then ( |r| r. ty ( ) )
461465 . map ( |it| Interned :: new ( TypeRef :: from_ast ( & self . ctx ( ) , it) ) ) ;
466+
467+ let prev_is_lowering_generator = self . is_lowering_generator ;
468+ self . is_lowering_generator = false ;
469+
462470 let body = self . collect_expr_opt ( e. body ( ) ) ;
471+
472+ let closure_kind = if self . is_lowering_generator {
473+ let movability = if e. static_token ( ) . is_some ( ) {
474+ Movability :: Static
475+ } else {
476+ Movability :: Movable
477+ } ;
478+ ClosureKind :: Generator ( movability)
479+ } else {
480+ ClosureKind :: Closure
481+ } ;
482+ self . is_lowering_generator = prev_is_lowering_generator;
483+
463484 self . alloc_expr (
464485 Expr :: Closure {
465486 args : args. into ( ) ,
466487 arg_types : arg_types. into ( ) ,
467488 ret_type,
468489 body,
490+ closure_kind,
469491 } ,
470492 syntax_ptr,
471493 )
0 commit comments