@@ -2749,6 +2749,104 @@ func main() {
27492749` )
27502750}
27512751
2752+ func TestForRangeFunc0 (t * testing.T ) {
2753+ // Test range over func(yield func() bool) - 0 values
2754+ pkg := newMainPackage ()
2755+ // Define iterator function type: func(yield func() bool)
2756+ yieldSig := types .NewSignatureType (nil , nil , nil , nil , types .NewTuple (types .NewVar (token .NoPos , nil , "" , types .Typ [types .Bool ])), false )
2757+ yieldParam := pkg .NewParam (token .NoPos , "yield" , yieldSig )
2758+ iterSig := types .NewTuple (yieldParam )
2759+
2760+ // Define foo function
2761+ pkg .NewFunc (nil , "foo" , iterSig , nil , false ).BodyStart (pkg ).
2762+ End ()
2763+
2764+ pkg .NewFunc (nil , "main" , nil , nil , false ).BodyStart (pkg ).
2765+ ForRange ().Val (ctxRef (pkg , "foo" )).RangeAssignThen (token .NoPos ).
2766+ Val (pkg .Import ("fmt" ).Ref ("Println" )).Val ("Hi" ).Call (1 ).EndStmt ().
2767+ End ().
2768+ End ()
2769+ domTest (t , pkg , `package main
2770+
2771+ import "fmt"
2772+
2773+ func foo(yield func() bool) {
2774+ }
2775+ func main() {
2776+ for range foo {
2777+ fmt.Println("Hi")
2778+ }
2779+ }
2780+ ` )
2781+ }
2782+
2783+ func TestForRangeFunc1 (t * testing.T ) {
2784+ // Test range over func(yield func(V) bool) - 1 value
2785+ pkg := newMainPackage ()
2786+ // Define iterator function type: func(yield func(string) bool)
2787+ yieldParamV := types .NewVar (token .NoPos , nil , "v" , types .Typ [types .String ])
2788+ yieldRet := types .NewVar (token .NoPos , nil , "" , types .Typ [types .Bool ])
2789+ yieldSig := types .NewSignatureType (nil , nil , nil , types .NewTuple (yieldParamV ), types .NewTuple (yieldRet ), false )
2790+ iterParam := pkg .NewParam (token .NoPos , "yield" , yieldSig )
2791+ iterSig := types .NewTuple (iterParam )
2792+
2793+ // Define bar function
2794+ pkg .NewFunc (nil , "bar" , iterSig , nil , false ).BodyStart (pkg ).
2795+ End ()
2796+
2797+ pkg .NewFunc (nil , "main" , nil , nil , false ).BodyStart (pkg ).
2798+ ForRange ("v" ).Val (ctxRef (pkg , "bar" )).RangeAssignThen (token .NoPos ).
2799+ Val (pkg .Import ("fmt" ).Ref ("Println" )).Val (ctxRef (pkg , "v" )).Call (1 ).EndStmt ().
2800+ End ().
2801+ End ()
2802+ domTest (t , pkg , `package main
2803+
2804+ import "fmt"
2805+
2806+ func bar(yield func(v string) bool) {
2807+ }
2808+ func main() {
2809+ for v := range bar {
2810+ fmt.Println(v)
2811+ }
2812+ }
2813+ ` )
2814+ }
2815+
2816+ func TestForRangeFunc2 (t * testing.T ) {
2817+ // Test range over func(yield func(K, V) bool) - 2 values (key-value pairs)
2818+ pkg := newMainPackage ()
2819+ // Define iterator function type: func(yield func(string, int) bool)
2820+ yieldParamK := types .NewVar (token .NoPos , nil , "k" , types .Typ [types .String ])
2821+ yieldParamV := types .NewVar (token .NoPos , nil , "v" , types .Typ [types .Int ])
2822+ yieldRet := types .NewVar (token .NoPos , nil , "" , types .Typ [types .Bool ])
2823+ yieldSig := types .NewSignatureType (nil , nil , nil , types .NewTuple (yieldParamK , yieldParamV ), types .NewTuple (yieldRet ), false )
2824+ iterParam := pkg .NewParam (token .NoPos , "yield" , yieldSig )
2825+ iterSig := types .NewTuple (iterParam )
2826+
2827+ // Define weekdays function
2828+ pkg .NewFunc (nil , "weekdays" , iterSig , nil , false ).BodyStart (pkg ).
2829+ End ()
2830+
2831+ pkg .NewFunc (nil , "main" , nil , nil , false ).BodyStart (pkg ).
2832+ ForRange ("k" , "v" ).Val (ctxRef (pkg , "weekdays" )).RangeAssignThen (token .NoPos ).
2833+ Val (pkg .Import ("fmt" ).Ref ("Println" )).Val (ctxRef (pkg , "k" )).Val (ctxRef (pkg , "v" )).Call (2 ).EndStmt ().
2834+ End ().
2835+ End ()
2836+ domTest (t , pkg , `package main
2837+
2838+ import "fmt"
2839+
2840+ func weekdays(yield func(k string, v int) bool) {
2841+ }
2842+ func main() {
2843+ for k, v := range weekdays {
2844+ fmt.Println(k, v)
2845+ }
2846+ }
2847+ ` )
2848+ }
2849+
27522850func TestReturn (t * testing.T ) {
27532851 pkg := newMainPackage ()
27542852 format := pkg .NewParam (token .NoPos , "format" , types .Typ [types .String ])
0 commit comments