@@ -441,60 +441,64 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) reflect.Type {
441
441
442
442
case "all" , "none" , "any" , "one" :
443
443
collection := v .visit (node .Arguments [0 ])
444
+ if ! isArray (collection ) {
445
+ panic (v .error (node .Arguments [0 ], "builtin %v takes only array (got %v)" , node .Name , collection ))
446
+ }
444
447
445
448
v .collections = append (v .collections , collection )
446
449
closure := v .visit (node .Arguments [1 ])
447
450
v .collections = v .collections [:len (v .collections )- 1 ]
448
451
449
- if isArray (collection ) {
450
- if isFunc (closure ) &&
451
- closure .NumOut () == 1 && isBool (closure .Out (0 )) &&
452
- closure .NumIn () == 1 && isInterface (closure .In (0 )) {
453
-
454
- return boolType
452
+ if isFunc (closure ) &&
453
+ closure .NumOut () == 1 &&
454
+ closure .NumIn () == 1 && isInterface (closure .In (0 )) {
455
455
456
+ if ! isBool (closure .Out (0 )) {
457
+ panic (v .error (node .Arguments [1 ], "closure should return boolean (got %v)" , closure .Out (0 ).String ()))
456
458
}
457
- panic ( v . error ( node . Arguments [ 1 ], "closure should return bool" ))
459
+ return boolType
458
460
}
459
- panic (v .error (node .Arguments [0 ], "builtin %v takes only array (got %v)" , node . Name , collection ))
461
+ panic (v .error (node .Arguments [1 ], "closure should has one input and one output param" ))
460
462
461
463
case "filter" :
462
464
collection := v .visit (node .Arguments [0 ])
465
+ if ! isArray (collection ) {
466
+ panic (v .error (node .Arguments [0 ], "builtin %v takes only array (got %v)" , node .Name , collection ))
467
+ }
463
468
464
469
v .collections = append (v .collections , collection )
465
470
closure := v .visit (node .Arguments [1 ])
466
471
v .collections = v .collections [:len (v .collections )- 1 ]
467
472
468
- if isArray (collection ) {
469
- if isFunc (closure ) &&
470
- closure .NumOut () == 1 && isBool (closure .Out (0 )) &&
471
- closure .NumIn () == 1 && isInterface (closure .In (0 )) {
472
-
473
- return collection
473
+ if isFunc (closure ) &&
474
+ closure .NumOut () == 1 &&
475
+ closure .NumIn () == 1 && isInterface (closure .In (0 )) {
474
476
477
+ if ! isBool (closure .Out (0 )) {
478
+ panic (v .error (node .Arguments [1 ], "closure should return boolean (got %v)" , closure .Out (0 ).String ()))
475
479
}
476
- panic ( v . error ( node . Arguments [ 1 ], "closure should return bool" ))
480
+ return arrayType
477
481
}
478
- panic (v .error (node .Arguments [0 ], "builtin %v takes only array (got %v)" , node . Name , collection ))
482
+ panic (v .error (node .Arguments [1 ], "closure should has one input and one output param" ))
479
483
480
484
case "map" :
481
485
collection := v .visit (node .Arguments [0 ])
486
+ if ! isArray (collection ) {
487
+ panic (v .error (node .Arguments [0 ], "builtin %v takes only array (got %v)" , node .Name , collection ))
488
+ }
482
489
483
490
v .collections = append (v .collections , collection )
484
491
closure := v .visit (node .Arguments [1 ])
485
492
v .collections = v .collections [:len (v .collections )- 1 ]
486
493
487
- if isArray (collection ) {
488
- if isFunc (closure ) &&
489
- closure .NumOut () == 1 &&
490
- closure .NumIn () == 1 && isInterface (closure .In (0 )) {
494
+ if isFunc (closure ) &&
495
+ closure .NumOut () == 1 &&
496
+ closure .NumIn () == 1 && isInterface (closure .In (0 )) {
491
497
492
- return reflect .ArrayOf (0 , closure .Out (0 ))
498
+ return reflect .ArrayOf (0 , closure .Out (0 ))
493
499
494
- }
495
- panic (v .error (node .Arguments [1 ], "closure should has one input and one output param" ))
496
500
}
497
- panic (v .error (node .Arguments [0 ], "builtin %v takes only array (got %v)" , node . Name , collection ))
501
+ panic (v .error (node .Arguments [1 ], "closure should has one input and one output param" ))
498
502
499
503
case "count" :
500
504
collection := v .visit (node .Arguments [0 ])
0 commit comments