From d9c914e98563a3e7358133842ccef3b1e4b9eda6 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Thu, 30 Jul 2009 18:17:07 -0700 Subject: [PATCH] dotted names R=rsc DELTA=28 (19 added, 0 deleted, 9 changed) OCL=32550 CL=32554 --- src/pkg/rpc/debug.go | 4 ++-- src/pkg/template/template.go | 18 +++++++++++++----- src/pkg/template/template_test.go | 11 +++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/pkg/rpc/debug.go b/src/pkg/rpc/debug.go index 7cc79333ad..3b927cf247 100644 --- a/src/pkg/rpc/debug.go +++ b/src/pkg/rpc/debug.go @@ -33,8 +33,8 @@ const debugText = MethodCalls {.repeated section meth} - {name}({.section m}{argType}, {replyType}) os.Error - {numCalls}{.end} + {name}({m.argType}, {m.replyType}) os.Error + {m.numCalls} {.end} diff --git a/src/pkg/template/template.go b/src/pkg/template/template.go index 7c38b778fc..dbbadeedfd 100644 --- a/src/pkg/template/template.go +++ b/src/pkg/template/template.go @@ -563,19 +563,27 @@ func (t *Template) parse() { // -- Execution // If the data for this template is a struct, find the named variable. +// Names of the form a.b.c are walked down the data tree. // The special name "@" (the "cursor") denotes the current data. func (st *state) findVar(s string) reflect.Value { if s == "@" { return st.data } data := reflect.Indirect(st.data); - typ, ok := data.Type().(*reflect.StructType); - if ok { - if field, ok := typ.FieldByName(s); ok { - return data.(*reflect.StructValue).Field(field.Index) + elems := strings.Split(s, ".", 0); + for i := 0; i < len(elems); i++ { + // Look up field; data must be a struct. + typ, ok := data.Type().(*reflect.StructType); + if !ok { + return nil } + field, ok := typ.FieldByName(elems[i]); + if !ok { + return nil + } + data = reflect.Indirect(data.(*reflect.StructValue).Field(field.Index)); } - return nil + return data } // Is there no data to look at? diff --git a/src/pkg/template/template_test.go b/src/pkg/template/template_test.go index 138978b6e5..7aeec6d379 100644 --- a/src/pkg/template/template_test.go +++ b/src/pkg/template/template_test.go @@ -27,6 +27,7 @@ type S struct { header string; integer int; raw string; + innerT T; data []T; pdata []*T; empty []*T; @@ -199,6 +200,15 @@ var tests = []*Test { "ItemNumber2=ValueNumber2\n" }, + // Nested names + &Test{ + "{.section @ }\n" + "{innerT.item}={innerT.value}\n" + "{.end}", + + "ItemNumber1=ValueNumber1\n" + }, + // Formatters &Test{ "{.section pdata }\n" @@ -232,6 +242,7 @@ func TestAll(t *testing.T) { s.header = "Header"; s.integer = 77; s.raw = "&<>!@ #$%^"; + s.innerT = t1; s.data = []T{ t1, t2 }; s.pdata = []*T{ &t1, &t2 }; s.empty = []*T{ }; -- 2.48.1