aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/except.txt9
-rw-r--r--src/html/template/escape.go2
-rw-r--r--src/text/template/exec.go22
-rw-r--r--src/text/template/parse/node.go40
-rw-r--r--src/text/template/parse/parse.go4
5 files changed, 34 insertions, 43 deletions
diff --git a/api/except.txt b/api/except.txt
index b85003eda2..e104f8e17b 100644
--- a/api/except.txt
+++ b/api/except.txt
@@ -362,15 +362,6 @@ pkg syscall (openbsd-386-cgo), const SYS_KILL = 37
pkg syscall (openbsd-amd64), const SYS_KILL = 37
pkg syscall (openbsd-amd64-cgo), const SYS_KILL = 37
pkg unicode, const Version = "9.0.0"
-pkg text/template/parse, method (*VariableNode) Copy() Node
-pkg text/template/parse, method (*VariableNode) String() string
-pkg text/template/parse, method (VariableNode) Position() Pos
-pkg text/template/parse, method (VariableNode) Type() NodeType
-pkg text/template/parse, type PipeNode struct, Decl []*VariableNode
-pkg text/template/parse, type VariableNode struct
-pkg text/template/parse, type VariableNode struct, Ident []string
-pkg text/template/parse, type VariableNode struct, embedded NodeType
-pkg text/template/parse, type VariableNode struct, embedded Pos
pkg syscall (windows-386), type CertChainPolicyPara struct, ExtraPolicyPara uintptr
pkg syscall (windows-386), type CertChainPolicyStatus struct, ExtraPolicyStatus uintptr
pkg syscall (windows-386), type CertContext struct, CertInfo uintptr
diff --git a/src/html/template/escape.go b/src/html/template/escape.go
index 8517620d3c..f12dafa870 100644
--- a/src/html/template/escape.go
+++ b/src/html/template/escape.go
@@ -142,7 +142,7 @@ func (e *escaper) escape(c context, n parse.Node) context {
// escapeAction escapes an action template node.
func (e *escaper) escapeAction(c context, n *parse.ActionNode) context {
- if len(n.Pipe.Vars) != 0 {
+ if len(n.Pipe.Decl) != 0 {
// A local variable assignment, not an interpolation.
return c
}
diff --git a/src/text/template/exec.go b/src/text/template/exec.go
index 8f8b5fe218..214f72d51b 100644
--- a/src/text/template/exec.go
+++ b/src/text/template/exec.go
@@ -252,7 +252,7 @@ func (s *state) walk(dot reflect.Value, node parse.Node) {
// Do not pop variables so they persist until next end.
// Also, if the action declares variables, don't print the result.
val := s.evalPipeline(dot, node.Pipe)
- if len(node.Pipe.Vars) == 0 {
+ if len(node.Pipe.Decl) == 0 {
s.printValue(node, val)
}
case *parse.IfNode:
@@ -339,11 +339,11 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
mark := s.mark()
oneIteration := func(index, elem reflect.Value) {
// Set top var (lexically the second if there are two) to the element.
- if len(r.Pipe.Vars) > 0 {
+ if len(r.Pipe.Decl) > 0 {
s.setTopVar(1, elem)
}
// Set next var (lexically the first if there are two) to the index.
- if len(r.Pipe.Vars) > 1 {
+ if len(r.Pipe.Decl) > 1 {
s.setTopVar(2, index)
}
s.walk(elem, r.List)
@@ -432,11 +432,11 @@ func (s *state) evalPipeline(dot reflect.Value, pipe *parse.PipeNode) (value ref
value = reflect.ValueOf(value.Interface()) // lovely!
}
}
- for _, variable := range pipe.Vars {
- if pipe.Decl {
- s.push(variable.Ident[0], value)
- } else {
+ for _, variable := range pipe.Decl {
+ if pipe.IsAssign {
s.setVar(variable.Ident[0], value)
+ } else {
+ s.push(variable.Ident[0], value)
}
}
return value
@@ -461,7 +461,7 @@ func (s *state) evalCommand(dot reflect.Value, cmd *parse.CommandNode, final ref
case *parse.PipeNode:
// Parenthesized pipeline. The arguments are all inside the pipeline; final is ignored.
return s.evalPipeline(dot, n)
- case *parse.AssignNode:
+ case *parse.VariableNode:
return s.evalVariableNode(dot, n, cmd.Args, final)
}
s.at(firstWord)
@@ -530,7 +530,7 @@ func (s *state) evalChainNode(dot reflect.Value, chain *parse.ChainNode, args []
return s.evalFieldChain(dot, pipe, chain, chain.Field, args, final)
}
-func (s *state) evalVariableNode(dot reflect.Value, variable *parse.AssignNode, args []parse.Node, final reflect.Value) reflect.Value {
+func (s *state) evalVariableNode(dot reflect.Value, variable *parse.VariableNode, args []parse.Node, final reflect.Value) reflect.Value {
// $x.Field has $x as the first ident, Field as the second. Eval the var, then the fields.
s.at(variable)
value := s.varValue(variable.Ident[0])
@@ -771,7 +771,7 @@ func (s *state) evalArg(dot reflect.Value, typ reflect.Type, n parse.Node) refle
s.errorf("cannot assign nil to %s", typ)
case *parse.FieldNode:
return s.validateType(s.evalFieldNode(dot, arg, []parse.Node{n}, missingVal), typ)
- case *parse.AssignNode:
+ case *parse.VariableNode:
return s.validateType(s.evalVariableNode(dot, arg, nil, missingVal), typ)
case *parse.PipeNode:
return s.validateType(s.evalPipeline(dot, arg), typ)
@@ -889,7 +889,7 @@ func (s *state) evalEmptyInterface(dot reflect.Value, n parse.Node) reflect.Valu
return s.idealConstant(n)
case *parse.StringNode:
return reflect.ValueOf(n.Text)
- case *parse.AssignNode:
+ case *parse.VariableNode:
return s.evalVariableNode(dot, n, nil, missingVal)
case *parse.PipeNode:
return s.evalPipeline(dot, n)
diff --git a/src/text/template/parse/node.go b/src/text/template/parse/node.go
index 0bb96fc2e9..dca83dacce 100644
--- a/src/text/template/parse/node.go
+++ b/src/text/template/parse/node.go
@@ -144,15 +144,15 @@ func (t *TextNode) Copy() Node {
type PipeNode struct {
NodeType
Pos
- tr *Tree
- Line int // The line number in the input. Deprecated: Kept for compatibility.
- Decl bool // The variables are being declared, not assigned
- Vars []*AssignNode // Variables in lexical order.
- Cmds []*CommandNode // The commands in lexical order.
+ tr *Tree
+ Line int // The line number in the input. Deprecated: Kept for compatibility.
+ IsAssign bool // The variables are being assigned, not declared.
+ Decl []*VariableNode // Variables in lexical order.
+ Cmds []*CommandNode // The commands in lexical order.
}
-func (t *Tree) newPipeline(pos Pos, line int, vars []*AssignNode) *PipeNode {
- return &PipeNode{tr: t, NodeType: NodePipe, Pos: pos, Line: line, Vars: vars}
+func (t *Tree) newPipeline(pos Pos, line int, vars []*VariableNode) *PipeNode {
+ return &PipeNode{tr: t, NodeType: NodePipe, Pos: pos, Line: line, Decl: vars}
}
func (p *PipeNode) append(command *CommandNode) {
@@ -161,8 +161,8 @@ func (p *PipeNode) append(command *CommandNode) {
func (p *PipeNode) String() string {
s := ""
- if len(p.Vars) > 0 {
- for i, v := range p.Vars {
+ if len(p.Decl) > 0 {
+ for i, v := range p.Decl {
if i > 0 {
s += ", "
}
@@ -187,12 +187,12 @@ func (p *PipeNode) CopyPipe() *PipeNode {
if p == nil {
return p
}
- var vars []*AssignNode
- for _, d := range p.Vars {
- vars = append(vars, d.Copy().(*AssignNode))
+ var vars []*VariableNode
+ for _, d := range p.Decl {
+ vars = append(vars, d.Copy().(*VariableNode))
}
n := p.tr.newPipeline(p.Pos, p.Line, vars)
- n.Decl = p.Decl
+ n.IsAssign = p.IsAssign
for _, c := range p.Cmds {
n.append(c.Copy().(*CommandNode))
}
@@ -321,18 +321,18 @@ func (i *IdentifierNode) Copy() Node {
// AssignNode holds a list of variable names, possibly with chained field
// accesses. The dollar sign is part of the (first) name.
-type AssignNode struct {
+type VariableNode struct {
NodeType
Pos
tr *Tree
Ident []string // Variable name and fields in lexical order.
}
-func (t *Tree) newVariable(pos Pos, ident string) *AssignNode {
- return &AssignNode{tr: t, NodeType: NodeVariable, Pos: pos, Ident: strings.Split(ident, ".")}
+func (t *Tree) newVariable(pos Pos, ident string) *VariableNode {
+ return &VariableNode{tr: t, NodeType: NodeVariable, Pos: pos, Ident: strings.Split(ident, ".")}
}
-func (v *AssignNode) String() string {
+func (v *VariableNode) String() string {
s := ""
for i, id := range v.Ident {
if i > 0 {
@@ -343,12 +343,12 @@ func (v *AssignNode) String() string {
return s
}
-func (v *AssignNode) tree() *Tree {
+func (v *VariableNode) tree() *Tree {
return v.tr
}
-func (v *AssignNode) Copy() Node {
- return &AssignNode{tr: v.tr, NodeType: NodeVariable, Pos: v.Pos, Ident: append([]string{}, v.Ident...)}
+func (v *VariableNode) Copy() Node {
+ return &VariableNode{tr: v.tr, NodeType: NodeVariable, Pos: v.Pos, Ident: append([]string{}, v.Ident...)}
}
// DotNode holds the special identifier '.'.
diff --git a/src/text/template/parse/parse.go b/src/text/template/parse/parse.go
index 34dc41c620..cb9b44e9da 100644
--- a/src/text/template/parse/parse.go
+++ b/src/text/template/parse/parse.go
@@ -384,7 +384,7 @@ func (t *Tree) action() (n Node) {
// declarations? command ('|' command)*
func (t *Tree) pipeline(context string) (pipe *PipeNode) {
decl := false
- var vars []*AssignNode
+ var vars []*VariableNode
token := t.peekNonSpace()
pos := token.pos
// Are there declarations or assignments?
@@ -422,7 +422,7 @@ func (t *Tree) pipeline(context string) (pipe *PipeNode) {
break
}
pipe = t.newPipeline(pos, token.line, vars)
- pipe.Decl = decl
+ pipe.IsAssign = !decl
for {
switch token := t.nextNonSpace(); token.typ {
case itemRightDelim, itemRightParen: