From 3e79c958c4586d2bd70b0e5fd752c74565db6b30 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Fri, 22 Jul 2011 10:51:40 +1000 Subject: [PATCH] exp/template: plain actions with declarations should produce no output. 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 | 3 ++- src/pkg/exp/template/exec.go | 6 +++++- src/pkg/exp/template/exec_test.go | 6 +++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/pkg/exp/template/doc.go b/src/pkg/exp/template/doc.go index 0a458e14c75..c374acec802 100644 --- a/src/pkg/exp/template/doc.go +++ b/src/pkg/exp/template/doc.go @@ -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 diff --git a/src/pkg/exp/template/exec.go b/src/pkg/exp/template/exec.go index 74d529c2f68..33ef5f14089 100644 --- a/src/pkg/exp/template/exec.go +++ b/src/pkg/exp/template/exec.go @@ -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) diff --git a/src/pkg/exp/template/exec_test.go b/src/pkg/exp/template/exec_test.go index cba0d5a97c1..05f3b90ebfe 100644 --- a/src/pkg/exp/template/exec_test.go +++ b/src/pkg/exp/template/exec_test.go @@ -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}}", "", 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},