internal/catmsg: pass language to nested compiles Change-Id: I24b5b38cf70213c816053a783be3eae8ace596d0 Reviewed-on: https://go-review.googlesource.com/58910 Run-TryBot: Marcel van Lohuizen <mpvl@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/internal/catmsg/catmsg_test.go b/internal/catmsg/catmsg_test.go index d06502b..df913a1 100644 --- a/internal/catmsg/catmsg_test.go +++ b/internal/catmsg/catmsg_test.go
@@ -111,6 +111,10 @@ }, tests: single("foo|BAZ", ""), }, { + desc: "nested value", + m: nestedLang{nestedLang{empty{}}}, + tests: single("nl|nl", ""), + }, { desc: "not shadowed variable", m: seq{ &Var{"bar", String("baz")}, @@ -207,8 +211,9 @@ dec := NewDecoder(language.Und, r, macros) for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { - - data, err := Compile(language.Und, macros, tc.m) + // Use a language other than Und so that we can test + // passing the language to nested values. + data, err := Compile(language.Dutch, macros, tc.m) if failErr(err, tc.encErr) { t.Errorf("encoding error: got %+q; want %+q", err, tc.encErr) } @@ -265,6 +270,23 @@ return ErrIncomplete } +var msgNested = Register( + "golang.org/x/text/internal/catmsg.nested", + func(d *Decoder) bool { + d.Render(d.DecodeString()) + d.ExecuteMessage() + return true + }) + +type nestedLang struct{ Message } + +func (n nestedLang) Compile(e *Encoder) (err error) { + e.EncodeMessageType(msgNested) + e.EncodeString(e.Language().String()) + e.EncodeMessage(n.Message) + return nil +} + type errorCompileMsg struct{} var errCompileTest = errors.New("catmsg: compile error test")
diff --git a/internal/catmsg/codec.go b/internal/catmsg/codec.go index e959b08..ab587f8 100755 --- a/internal/catmsg/codec.go +++ b/internal/catmsg/codec.go
@@ -99,7 +99,7 @@ // EncodeMessage serializes the given message inline at the current position. func (e *Encoder) EncodeMessage(m Message) error { - e = &Encoder{root: e.root, parent: e} + e = &Encoder{root: e.root, parent: e, tag: e.tag} err := m.Compile(e) if _, ok := m.(*Var); !ok { e.flushTo(e.parent)