]> Cypherpunks repositories - gostls13.git/commitdiff
text/template: improve the error reporting for unexported fields.
authorRob Pike <r@golang.org>
Tue, 24 Apr 2012 03:11:59 +0000 (13:11 +1000)
committerRob Pike <r@golang.org>
Tue, 24 Apr 2012 03:11:59 +0000 (13:11 +1000)
Changes suggested by rsc after last CL.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6117044

src/pkg/text/template/exec.go

index b8d23d43f97b59bb8e63c26af31bc4ed5609a5ca..0c633e6bab7f66185d83c720064e3a05d94f0556 100644 (file)
@@ -12,8 +12,6 @@ import (
        "sort"
        "strings"
        "text/template/parse"
-       "unicode"
-       "unicode/utf8"
 )
 
 // state represents the state of an execution. It's not part of the
@@ -426,17 +424,16 @@ func (s *state) evalField(dot reflect.Value, fieldName string, args []parse.Node
                tField, ok := receiver.Type().FieldByName(fieldName)
                if ok {
                        field := receiver.FieldByIndex(tField.Index)
-                       if tField.PkgPath == "" { // field is exported
-                               // If it's a function, we must call it.
-                               if hasArgs {
-                                       s.errorf("%s has arguments but cannot be invoked as function", fieldName)
-                               }
-                               return field
+                       if tField.PkgPath != "" { // field is unexported
+                               s.errorf("%s is an unexported field of struct type %s", fieldName, typ)
                        }
+                       // If it's a function, we must call it.
+                       if hasArgs {
+                               s.errorf("%s has arguments but cannot be invoked as function", fieldName)
+                       }
+                       return field
                }
-               if !isExported(fieldName) {
-                       s.errorf("%s is not an exported field of struct type %s", fieldName, typ)
-               }
+               s.errorf("%s is not a field of struct type %s", fieldName, typ)
        case reflect.Map:
                // If it's a map, attempt to use the field name as a key.
                nameVal := reflect.ValueOf(fieldName)
@@ -451,12 +448,6 @@ func (s *state) evalField(dot reflect.Value, fieldName string, args []parse.Node
        panic("not reached")
 }
 
-// isExported reports whether the field name (which starts with a period) can be accessed.
-func isExported(fieldName string) bool {
-       r, _ := utf8.DecodeRuneInString(fieldName[1:]) // drop the period
-       return unicode.IsUpper(r)
-}
-
 var (
        errorType       = reflect.TypeOf((*error)(nil)).Elem()
        fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()