]> Cypherpunks repositories - gostls13.git/commitdiff
text/template: fix bug in evaluating a chain starting with a function.
authorRob Pike <r@golang.org>
Wed, 27 Mar 2013 23:31:14 +0000 (16:31 -0700)
committerRob Pike <r@golang.org>
Wed, 27 Mar 2013 23:31:14 +0000 (16:31 -0700)
R=golang-dev, alberto.garcia.hierro
CC=golang-dev
https://golang.org/cl/7861046

src/pkg/text/template/exec.go
src/pkg/text/template/exec_test.go

index 12c40b70f1d5f7cb2f8cc0843f1ea72b2bf5d6ea..8ec8174a162fa48aded879d691543100f96d66f1 100644 (file)
@@ -619,6 +619,8 @@ func (s *state) evalArg(dot reflect.Value, typ reflect.Type, n parse.Node) refle
                return s.validateType(s.evalVariableNode(dot, arg, nil, zero), typ)
        case *parse.PipeNode:
                return s.validateType(s.evalPipeline(dot, arg), typ)
+       case *parse.IdentifierNode:
+               return s.evalFunction(dot, arg, arg, nil, zero)
        }
        switch typ.Kind() {
        case reflect.Bool:
index 0f8beec5ed73252228ddbf4dd8544e21784fc5e3..0ab20acc934a4a3dbc1f3ceddf1230dc2e32b37c 100644 (file)
@@ -499,6 +499,8 @@ var execTests = []execTest{
        {"bug8b", "{{4|dddArg 3}}", "", tVal, false},
        // A bug was introduced that broke map lookups for lower-case names.
        {"bug9", "{{.cause}}", "neglect", map[string]string{"cause": "neglect"}, true},
+       // Field chain starting with function did not work.
+       {"bug10", "{{mapOfThree.three}}-{{(mapOfThree).three}}", "3-3", 0, true},
 }
 
 func zeroArgs() string {
@@ -560,19 +562,24 @@ func stringer(s fmt.Stringer) string {
        return s.String()
 }
 
+func mapOfThree() interface{} {
+       return map[string]int{"three": 3}
+}
+
 func testExecute(execTests []execTest, template *Template, t *testing.T) {
        b := new(bytes.Buffer)
        funcs := FuncMap{
-               "add":      add,
-               "count":    count,
-               "dddArg":   dddArg,
-               "echo":     echo,
-               "makemap":  makemap,
-               "oneArg":   oneArg,
-               "typeOf":   typeOf,
-               "vfunc":    vfunc,
-               "zeroArgs": zeroArgs,
-               "stringer": stringer,
+               "add":        add,
+               "count":      count,
+               "dddArg":     dddArg,
+               "echo":       echo,
+               "makemap":    makemap,
+               "mapOfThree": mapOfThree,
+               "oneArg":     oneArg,
+               "stringer":   stringer,
+               "typeOf":     typeOf,
+               "vfunc":      vfunc,
+               "zeroArgs":   zeroArgs,
        }
        for _, test := range execTests {
                var tmpl *Template