1
0
mirror of https://github.com/golang/go synced 2024-11-23 07:30:05 -07:00

encoding/xml: allow embedded non-structs

The old code just assumed that the only thing
you can embed is a struct. Not true.

Fixes #3803.

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/7743043
This commit is contained in:
Russ Cox 2013-03-11 23:58:20 -04:00
parent 864278ad90
commit aa81eb5901
2 changed files with 22 additions and 11 deletions

View File

@ -266,6 +266,12 @@ type Plain struct {
V interface{}
}
type MyInt int
type EmbedInt struct {
MyInt
}
// Unless explicitly stated as such (or *Plain), all of the
// tests below are two-way tests. When introducing new tests,
// please try to make them two-way as well to ensure that
@ -790,6 +796,12 @@ var marshalTests = []struct {
},
UnmarshalOnly: true,
},
{
ExpectXML: `<EmbedInt><MyInt>42</MyInt></EmbedInt>`,
Value: &EmbedInt{
MyInt: 42,
},
},
}
func TestMarshal(t *testing.T) {

View File

@ -70,20 +70,19 @@ func getTypeInfo(typ reflect.Type) (*typeInfo, error) {
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
if t.Kind() != reflect.Struct {
continue
}
inner, err := getTypeInfo(t)
if err != nil {
return nil, err
}
for _, finfo := range inner.fields {
finfo.idx = append([]int{i}, finfo.idx...)
if err := addFieldInfo(typ, tinfo, &finfo); err != nil {
if t.Kind() == reflect.Struct {
inner, err := getTypeInfo(t)
if err != nil {
return nil, err
}
for _, finfo := range inner.fields {
finfo.idx = append([]int{i}, finfo.idx...)
if err := addFieldInfo(typ, tinfo, &finfo); err != nil {
return nil, err
}
}
continue
}
continue
}
finfo, err := structFieldInfo(typ, &f)