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:
parent
864278ad90
commit
aa81eb5901
@ -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) {
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user