mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-28 22:19:59 +02:00
@@ -395,6 +395,22 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
|
||||
s.walk(elem, r.List)
|
||||
}
|
||||
switch val.Kind() {
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
||||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||
if len(r.Pipe.Decl) > 1 {
|
||||
s.errorf("can't use %v to iterate over more than one variable", val)
|
||||
break
|
||||
}
|
||||
run := false
|
||||
for v := range val.Seq() {
|
||||
run = true
|
||||
// Pass element as second value, as we do for channels.
|
||||
oneIteration(reflect.Value{}, v)
|
||||
}
|
||||
if !run {
|
||||
break
|
||||
}
|
||||
return
|
||||
case reflect.Array, reflect.Slice:
|
||||
if val.Len() == 0 {
|
||||
break
|
||||
@@ -434,6 +450,43 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
|
||||
return
|
||||
case reflect.Invalid:
|
||||
break // An invalid value is likely a nil map, etc. and acts like an empty map.
|
||||
case reflect.Func:
|
||||
if val.Type().CanSeq() {
|
||||
if len(r.Pipe.Decl) > 1 {
|
||||
s.errorf("can't use %v iterate over more than one variable", val)
|
||||
break
|
||||
}
|
||||
run := false
|
||||
for v := range val.Seq() {
|
||||
run = true
|
||||
// Pass element as second value,
|
||||
// as we do for channels.
|
||||
oneIteration(reflect.Value{}, v)
|
||||
}
|
||||
if !run {
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
if val.Type().CanSeq2() {
|
||||
run := false
|
||||
for i, v := range val.Seq2() {
|
||||
run = true
|
||||
if len(r.Pipe.Decl) > 1 {
|
||||
oneIteration(i, v)
|
||||
} else {
|
||||
// If there is only one range variable,
|
||||
// oneIteration will use the
|
||||
// second value.
|
||||
oneIteration(reflect.Value{}, i)
|
||||
}
|
||||
}
|
||||
if !run {
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
fallthrough
|
||||
default:
|
||||
s.errorf("range can't iterate over %v", val)
|
||||
}
|
||||
@@ -757,7 +810,7 @@ func (s *state) evalCallOld(dot, fun reflect.Value, isBuiltin bool, node parse.N
|
||||
return v
|
||||
}
|
||||
}
|
||||
if final != missingVal {
|
||||
if !final.Equal(missingVal) {
|
||||
// The last argument to and/or is coming from
|
||||
// the pipeline. We didn't short circuit on an earlier
|
||||
// argument, so we are going to return this one.
|
||||
@@ -803,7 +856,13 @@ func (s *state) evalCallOld(dot, fun reflect.Value, isBuiltin bool, node parse.N
|
||||
// Special case for the "call" builtin.
|
||||
// Insert the name of the callee function as the first argument.
|
||||
if isBuiltin && name == "call" {
|
||||
calleeName := args[0].String()
|
||||
var calleeName string
|
||||
if len(args) == 0 {
|
||||
// final must be present or we would have errored out above.
|
||||
calleeName = final.String()
|
||||
} else {
|
||||
calleeName = args[0].String()
|
||||
}
|
||||
argv = append([]reflect.Value{reflect.ValueOf(calleeName)}, argv...)
|
||||
fun = reflect.ValueOf(call)
|
||||
}
|
||||
|
Reference in New Issue
Block a user