]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: Makes XML Marshaler take into account XMLName field from anonymous...
authorAlexander Zhavnerchik <alex.vizor@gmail.com>
Tue, 8 Apr 2014 15:12:51 +0000 (11:12 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 8 Apr 2014 15:12:51 +0000 (11:12 -0400)
Fixes #7614.

LGTM=rsc
R=golang-codereviews, r, rsc, dan.kortschak, applezinc
CC=golang-codereviews
https://golang.org/cl/79210044

src/pkg/encoding/xml/marshal_test.go
src/pkg/encoding/xml/typeinfo.go

index 8bd589644cc1b537080f0acfe7ba47ac524dbe70..ecb9998dacbfb0520822a1bb8f676e7c8b2bd027 100644 (file)
@@ -314,6 +314,31 @@ type MarshalerStruct struct {
        Foo MyMarshalerAttrTest `xml:",attr"`
 }
 
+type InnerStruct struct {
+       XMLName Name `xml:"testns outer"`
+}
+
+type OuterStruct struct {
+       InnerStruct
+       IntAttr int `xml:"int,attr"`
+}
+
+type OuterNamedStruct struct {
+       InnerStruct
+       XMLName Name `xml:"outerns test"`
+       IntAttr int  `xml:"int,attr"`
+}
+
+type OuterNamedOrderedStruct struct {
+       XMLName Name `xml:"outerns test"`
+       InnerStruct
+       IntAttr int `xml:"int,attr"`
+}
+
+type OuterOuterStruct struct {
+       OuterStruct
+}
+
 func ifaceptr(x interface{}) interface{} {
        return &x
 }
@@ -883,6 +908,22 @@ var marshalTests = []struct {
                ExpectXML: `<MarshalerStruct Foo="hello world"></MarshalerStruct>`,
                Value:     &MarshalerStruct{},
        },
+       {
+               ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
+               Value:     &OuterStruct{IntAttr: 10},
+       },
+       {
+               ExpectXML: `<test xmlns="outerns" int="10"></test>`,
+               Value:     &OuterNamedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10},
+       },
+       {
+               ExpectXML: `<test xmlns="outerns" int="10"></test>`,
+               Value:     &OuterNamedOrderedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10},
+       },
+       {
+               ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
+               Value:     &OuterOuterStruct{OuterStruct{IntAttr: 10}},
+       },
 }
 
 func TestMarshal(t *testing.T) {
index 83e65402c00ebf6f0529402771a6879497b5c0c9..22248d20a6d669e348c93f7d4b5feb558eee8e6d 100644 (file)
@@ -75,6 +75,9 @@ func getTypeInfo(typ reflect.Type) (*typeInfo, error) {
                                        if err != nil {
                                                return nil, err
                                        }
+                                       if tinfo.xmlname == nil {
+                                               tinfo.xmlname = inner.xmlname
+                                       }
                                        for _, finfo := range inner.fields {
                                                finfo.idx = append([]int{i}, finfo.idx...)
                                                if err := addFieldInfo(typ, tinfo, &finfo); err != nil {