diff options
author | Rob Pike <r@golang.org> | 2009-12-24 07:41:56 +1100 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2009-12-24 07:41:56 +1100 |
commit | 5ff3d8f868886bb479b0da8b42beb9fa83333a5a (patch) | |
tree | dee9d402a76ec84b9d822fe03f52cd07244a1682 /src/pkg/template/template.go | |
parent | d4cdded14b41adde60fddc5498df073275ca7dab (diff) | |
download | golang-5ff3d8f868886bb479b0da8b42beb9fa83333a5a.tar.gz |
implement .repeats for maps.
Fixes issue 309.
R=rsc
CC=golang-dev
http://codereview.appspot.com/181044
Diffstat (limited to 'src/pkg/template/template.go')
-rw-r--r-- | src/pkg/template/template.go | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/src/pkg/template/template.go b/src/pkg/template/template.go index b46d28613..ef694b24b 100644 --- a/src/pkg/template/template.go +++ b/src/pkg/template/template.go @@ -833,41 +833,35 @@ func (t *Template) executeRepeated(r *repeatedElement, st *state) { } first := true - if array, ok := field.(reflect.ArrayOrSliceValue); ok { - for j := 0; j < array.Len(); j++ { - newst := st.clone(array.Elem(j)) - - // .alternates between elements - if !first && r.altstart >= 0 { - for i := r.altstart; i < r.altend; { - i = t.executeElement(i, newst) - } - } - first = false - - for i := start; i < end; { + // Code common to all the loops. + loopBody := func(newst *state) { + // .alternates between elements + if !first && r.altstart >= 0 { + for i := r.altstart; i < r.altend; { i = t.executeElement(i, newst) } } + first = false + for i := start; i < end; { + i = t.executeElement(i, newst) + } + } + + if array, ok := field.(reflect.ArrayOrSliceValue); ok { + for j := 0; j < array.Len(); j++ { + loopBody(st.clone(array.Elem(j))) + } + } else if m, ok := field.(*reflect.MapValue); ok { + for _, key := range m.Keys() { + loopBody(st.clone(m.Elem(key))) + } } else if ch := iter(field); ch != nil { for { e := ch.Recv() if ch.Closed() { break } - newst := st.clone(e) - - // .alternates between elements - if !first && r.altstart >= 0 { - for i := r.altstart; i < r.altend; { - i = t.executeElement(i, newst) - } - } - first = false - - for i := start; i < end; { - i = t.executeElement(i, newst) - } + loopBody(st.clone(e)) } } else { t.execError(st, r.linenum, ".repeated: cannot repeat %s (type %s)", |