]> Cypherpunks repositories - gostls13.git/commitdiff
text/template: change IsTrue to take interface{} instead of reflect.Value.
authorDavid Symonds <dsymonds@golang.org>
Thu, 1 Oct 2015 04:21:37 +0000 (14:21 +1000)
committerDavid Symonds <dsymonds@golang.org>
Thu, 1 Oct 2015 04:36:35 +0000 (04:36 +0000)
This is a follow-up to a326c3e to avoid reflect being in the API.

Fixes #12801.

Change-Id: Ic4c2e592e2c35b5911f75d88f1d9c44787c80f30
Reviewed-on: https://go-review.googlesource.com/15240
Run-TryBot: David Symonds <dsymonds@golang.org>
Reviewed-by: Andrew Gerrand <adg@golang.org>
src/html/template/template.go
src/text/template/exec.go
src/text/template/funcs.go

index 4c38f36e67116ded2e5fb771a5a19f2a2ffca3b6..5cfac49d087eb8ae75a47845f7c8bee116ddbcba 100644 (file)
@@ -9,7 +9,6 @@ import (
        "io"
        "io/ioutil"
        "path/filepath"
-       "reflect"
        "sync"
        "text/template"
        "text/template/parse"
@@ -420,6 +419,6 @@ func parseGlob(t *Template, pattern string) (*Template, error) {
 // IsTrue reports whether the value is 'true', in the sense of not the zero of its type,
 // and whether the value has a meaningful truth value. This is the definition of
 // truth used by if and other such actions.
-func IsTrue(val reflect.Value) (truth, ok bool) {
+func IsTrue(val interface{}) (truth, ok bool) {
        return template.IsTrue(val)
 }
index 8d7425507012db1613abe0f277e3bb12cf5b66fe..16839a8d6dd6c8db1fa8d68530f4d2f948ac0090 100644 (file)
@@ -242,7 +242,7 @@ func (s *state) walk(dot reflect.Value, node parse.Node) {
 func (s *state) walkIfOrWith(typ parse.NodeType, dot reflect.Value, pipe *parse.PipeNode, list, elseList *parse.ListNode) {
        defer s.pop(s.mark())
        val := s.evalPipeline(dot, pipe)
-       truth, ok := IsTrue(val)
+       truth, ok := isTrue(val)
        if !ok {
                s.errorf("if/with can't use %v", val)
        }
@@ -260,7 +260,11 @@ func (s *state) walkIfOrWith(typ parse.NodeType, dot reflect.Value, pipe *parse.
 // IsTrue reports whether the value is 'true', in the sense of not the zero of its type,
 // and whether the value has a meaningful truth value. This is the definition of
 // truth used by if and other such actions.
-func IsTrue(val reflect.Value) (truth, ok bool) {
+func IsTrue(val interface{}) (truth, ok bool) {
+       return isTrue(reflect.ValueOf(val))
+}
+
+func isTrue(val reflect.Value) (truth, ok bool) {
        if !val.IsValid() {
                // Something like var x interface{}, never set. It's a form of nil.
                return false, true
index 6eda73183481f14d2681a87ec4bc183249a76f23..49e9e7419a49f58624655c1a12a8e2407e3589e4 100644 (file)
@@ -265,7 +265,7 @@ func call(fn interface{}, args ...interface{}) (interface{}, error) {
 // Boolean logic.
 
 func truth(a interface{}) bool {
-       t, _ := IsTrue(reflect.ValueOf(a))
+       t, _ := IsTrue(a)
        return t
 }