tpl: Support text/template/parse API change in go1.11
authorAnthony Fok <foka@debian.org>
Wed, 13 Jun 2018 13:33:59 +0000 (07:33 -0600)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 14 Jun 2018 06:58:42 +0000 (08:58 +0200)
Thanks to @rjoleary for the investigation.

Fixes #4784

tpl/tplimpl/template_ast_transformers.go
tpl/tplimpl/template_ast_transformers_go1_10.go [new file with mode: 0644]
tpl/tplimpl/template_ast_transformers_go1_11.go [new file with mode: 0644]

index bbd0f28a46f91cdc89f9b4d45547f105db947bd7..f0899dcbccd22183fbca3428d47799e441919e46 100644 (file)
@@ -91,54 +91,6 @@ func applyTemplateTransformers(templ *parse.Tree, lookupFn func(name string) *pa
        return nil
 }
 
-// paramsKeysToLower is made purposely non-generic to make it not so tempting
-// to do more of these hard-to-maintain AST transformations.
-func (c *templateContext) paramsKeysToLower(n parse.Node) {
-       switch x := n.(type) {
-       case *parse.ListNode:
-               if x != nil {
-                       c.paramsKeysToLowerForNodes(x.Nodes...)
-               }
-       case *parse.ActionNode:
-               c.paramsKeysToLowerForNodes(x.Pipe)
-       case *parse.IfNode:
-               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
-       case *parse.WithNode:
-               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
-       case *parse.RangeNode:
-               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
-       case *parse.TemplateNode:
-               subTempl := c.getIfNotVisited(x.Name)
-               if subTempl != nil {
-                       c.paramsKeysToLowerForNodes(subTempl.Root)
-               }
-       case *parse.PipeNode:
-               for i, elem := range x.Decl {
-                       if len(x.Cmds) > i {
-                               // maps $site => .Site etc.
-                               c.decl[elem.Ident[0]] = x.Cmds[i].String()
-                       }
-               }
-
-               for _, cmd := range x.Cmds {
-                       c.paramsKeysToLower(cmd)
-               }
-
-       case *parse.CommandNode:
-               for _, elem := range x.Args {
-                       switch an := elem.(type) {
-                       case *parse.FieldNode:
-                               c.updateIdentsIfNeeded(an.Ident)
-                       case *parse.VariableNode:
-                               c.updateIdentsIfNeeded(an.Ident)
-                       case *parse.PipeNode:
-                               c.paramsKeysToLower(an)
-                       }
-
-               }
-       }
-}
-
 func (c *templateContext) paramsKeysToLowerForNodes(nodes ...parse.Node) {
        for _, node := range nodes {
                c.paramsKeysToLower(node)
diff --git a/tpl/tplimpl/template_ast_transformers_go1_10.go b/tpl/tplimpl/template_ast_transformers_go1_10.go
new file mode 100644 (file)
index 0000000..4e2a34c
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright 2016 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build !go1.11
+
+package tplimpl
+
+import (
+       "text/template/parse"
+)
+
+// paramsKeysToLower is made purposely non-generic to make it not so tempting
+// to do more of these hard-to-maintain AST transformations.
+func (c *templateContext) paramsKeysToLower(n parse.Node) {
+       switch x := n.(type) {
+       case *parse.ListNode:
+               if x != nil {
+                       c.paramsKeysToLowerForNodes(x.Nodes...)
+               }
+       case *parse.ActionNode:
+               c.paramsKeysToLowerForNodes(x.Pipe)
+       case *parse.IfNode:
+               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
+       case *parse.WithNode:
+               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
+       case *parse.RangeNode:
+               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
+       case *parse.TemplateNode:
+               subTempl := c.getIfNotVisited(x.Name)
+               if subTempl != nil {
+                       c.paramsKeysToLowerForNodes(subTempl.Root)
+               }
+       case *parse.PipeNode:
+               for i, elem := range x.Decl {
+                       if len(x.Cmds) > i {
+                               // maps $site => .Site etc.
+                               c.decl[elem.Ident[0]] = x.Cmds[i].String()
+                       }
+               }
+
+               for _, cmd := range x.Cmds {
+                       c.paramsKeysToLower(cmd)
+               }
+
+       case *parse.CommandNode:
+               for _, elem := range x.Args {
+                       switch an := elem.(type) {
+                       case *parse.FieldNode:
+                               c.updateIdentsIfNeeded(an.Ident)
+                       case *parse.VariableNode:
+                               c.updateIdentsIfNeeded(an.Ident)
+                       case *parse.PipeNode:
+                               c.paramsKeysToLower(an)
+                       }
+
+               }
+       }
+}
diff --git a/tpl/tplimpl/template_ast_transformers_go1_11.go b/tpl/tplimpl/template_ast_transformers_go1_11.go
new file mode 100644 (file)
index 0000000..d7fdada
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright 2016 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build go1.11
+
+package tplimpl
+
+import (
+       "text/template/parse"
+)
+
+// paramsKeysToLower is made purposely non-generic to make it not so tempting
+// to do more of these hard-to-maintain AST transformations.
+func (c *templateContext) paramsKeysToLower(n parse.Node) {
+       switch x := n.(type) {
+       case *parse.ListNode:
+               if x != nil {
+                       c.paramsKeysToLowerForNodes(x.Nodes...)
+               }
+       case *parse.ActionNode:
+               c.paramsKeysToLowerForNodes(x.Pipe)
+       case *parse.IfNode:
+               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
+       case *parse.WithNode:
+               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
+       case *parse.RangeNode:
+               c.paramsKeysToLowerForNodes(x.Pipe, x.List, x.ElseList)
+       case *parse.TemplateNode:
+               subTempl := c.getIfNotVisited(x.Name)
+               if subTempl != nil {
+                       c.paramsKeysToLowerForNodes(subTempl.Root)
+               }
+       case *parse.PipeNode:
+               for i, elem := range x.Vars {
+                       if len(x.Cmds) > i {
+                               // maps $site => .Site etc.
+                               c.decl[elem.Ident[0]] = x.Cmds[i].String()
+                       }
+               }
+
+               for _, cmd := range x.Cmds {
+                       c.paramsKeysToLower(cmd)
+               }
+
+       case *parse.CommandNode:
+               for _, elem := range x.Args {
+                       switch an := elem.(type) {
+                       case *parse.FieldNode:
+                               c.updateIdentsIfNeeded(an.Ident)
+                       case *parse.AssignNode:
+                               c.updateIdentsIfNeeded(an.Ident)
+                       case *parse.PipeNode:
+                               c.paramsKeysToLower(an)
+                       }
+
+               }
+       }
+}