]> Cypherpunks repositories - gostls13.git/commitdiff
exp/template: plain actions with declarations should produce no output.
authorRob Pike <r@golang.org>
Fri, 22 Jul 2011 00:51:40 +0000 (10:51 +1000)
committerRob Pike <r@golang.org>
Fri, 22 Jul 2011 00:51:40 +0000 (10:51 +1000)
This is already the behavior for pipelines producing values for if, with, and range.

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/4808050

src/pkg/exp/template/doc.go
src/pkg/exp/template/exec.go
src/pkg/exp/template/exec_test.go

index 0a458e14c75913ed2e7d2c6cec15148f034f959b..c374acec802a9b20aac4146a2cc31e6557d8d18f 100644 (file)
@@ -158,7 +158,8 @@ The initialization has syntax
 
        $variable := pipeline
 
-where $variable is the name of the variable.
+where $variable is the name of the variable. An action that declares a
+variable produces no output.
 
 If a "range" action initializes a variable, the variable is set to the
 successive elements of the iteration.  Also, a "range" may declare two
index 74d529c2f68e987d224e2050b3da729e0abef8e7..33ef5f140890f3b6517b9fda4bd0477e9500830a 100644 (file)
@@ -99,7 +99,11 @@ func (s *state) walk(dot reflect.Value, n node) {
        case *actionNode:
                s.line = n.line
                // Do not pop variables so they persist until next end.
-               s.printValue(n, s.evalPipeline(dot, n.pipe))
+               // Also, if the action declares variables, don't print the result.
+               val := s.evalPipeline(dot, n.pipe)
+               if len(n.pipe.decl) == 0 {
+                       s.printValue(n, val)
+               }
        case *ifNode:
                s.line = n.line
                s.walkIfOrWith(nodeIf, dot, n.pipe, n.list, n.elseList)
index cba0d5a97c1b8b6cde73c672aa09cadf8f425ecb..05f3b90ebfe52f5f95760df9a31eba67cb53984e 100644 (file)
@@ -197,7 +197,7 @@ var execTests = []execTest{
        {"$ int", "{{$}}", "123", 123, true},
        {"$.I", "{{$.I}}", "17", tVal, true},
        {"$.U.V", "{{$.U.V}}", "v", tVal, true},
-       {"declare in action", "{{$x := $.U.V}},{{$x}}", "v,v", tVal, true},
+       {"declare in action", "{{$x := $.U.V}}{{$x}}", "v", tVal, true},
 
        // Pointers.
        {"*int", "{{.PI}}", "23", tVal, true},
@@ -312,7 +312,7 @@ var execTests = []execTest{
        {"with empty interface, struct field", "{{with .Empty4}}{{.V}}{{end}}", "UinEmpty", tVal, true},
        {"with $x int", "{{with $x := .I}}{{$x}}{{end}}", "17", tVal, true},
        {"with $x struct.U.V", "{{with $x := $}}{{$x.U.V}}{{end}}", "v", tVal, true},
-       {"with variable and action", "{{with $x := $}}{{$y := $.U.V}},{{$y}}{{end}}", "v,v", tVal, true},
+       {"with variable and action", "{{with $x := $}}{{$y := $.U.V}}{{$y}}{{end}}", "v", tVal, true},
 
        // Range.
        {"range []int", "{{range .SI}}-{{.}}-{{end}}", "-3--4--5-", tVal, true},
@@ -331,7 +331,7 @@ var execTests = []execTest{
        {"range $x MSIone", "{{range $x := .MSIone}}<{{$x}}>{{end}}", "<1>", tVal, true},
        {"range $x $y MSIone", "{{range $x, $y := .MSIone}}<{{$x}}={{$y}}>{{end}}", "<one=1>", tVal, true},
        {"range $x PSI", "{{range $x := .PSI}}<{{$x}}>{{end}}", "<21><22><23>", tVal, true},
-       {"declare in range", "{{range $x := .PSI}}<{{$foo:=$x}}>{{end}}", "<21><22><23>", tVal, true},
+       {"declare in range", "{{range $x := .PSI}}<{{$foo:=$x}}{{$x}}>{{end}}", "<21><22><23>", tVal, true},
 
        // Cute examples.
        {"or as if true", `{{or .SI "slice is empty"}}`, "[3 4 5]", tVal, true},