From 11820899a58094be1afa22987ce080cb2fb66b86 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Tue, 24 Apr 2012 13:11:59 +1000 Subject: [PATCH] text/template: improve the error reporting for unexported fields. 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 | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/pkg/text/template/exec.go b/src/pkg/text/template/exec.go index b8d23d43f9..0c633e6bab 100644 --- a/src/pkg/text/template/exec.go +++ b/src/pkg/text/template/exec.go @@ -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() -- 2.48.1