preserve nil maps and slices in generated Marshal* methods

master
Felix Lange 8 years ago
parent 9f20d19e75
commit 72fbea27b0
  1. 10
      genmethod.go
  2. 36
      internal/tests/mapconv/output.go
  3. 36
      internal/tests/sliceconv/output.go

@ -206,7 +206,15 @@ func (m *marshalMethod) marshalConversions(from, to Var, format string) (s []Sta
for _, f := range m.mtyp.Fields { for _, f := range m.mtyp.Fields {
accessFrom := Dotted{Receiver: from, Name: f.name} accessFrom := Dotted{Receiver: from, Name: f.name}
accessTo := Dotted{Receiver: to, Name: f.name} accessTo := Dotted{Receiver: to, Name: f.name}
s = append(s, m.convert(accessFrom, accessTo, f.origTyp, f.typ)...) conversion := m.convert(accessFrom, accessTo, f.origTyp, f.typ)
if underlyingMap(f.origTyp) != nil || underlyingSlice(f.origTyp) != nil {
// Preserve nil maps and slices.
conversion = []Statement{If{
Condition: NotEqual{Lhs: accessFrom, Rhs: NIL},
Body: conversion,
}}
}
s = append(s, conversion...)
} }
return s return s
} }

@ -13,13 +13,17 @@ func (x *X) MarshalJSON() ([]byte, error) {
Named namedMap2 Named namedMap2
} }
var enc XJSON var enc XJSON
enc.Map = make(map[replacedString]replacedInt, len(x.Map)) if x.Map != nil {
for k, v := range x.Map { enc.Map = make(map[replacedString]replacedInt, len(x.Map))
enc.Map[replacedString(k)] = replacedInt(v) for k, v := range x.Map {
} enc.Map[replacedString(k)] = replacedInt(v)
enc.Named = make(namedMap2, len(x.Named)) }
for k, v := range x.Named { }
enc.Named[replacedString(k)] = replacedInt(v) if x.Named != nil {
enc.Named = make(namedMap2, len(x.Named))
for k, v := range x.Named {
enc.Named[replacedString(k)] = replacedInt(v)
}
} }
return json.Marshal(&enc) return json.Marshal(&enc)
} }
@ -58,13 +62,17 @@ func (x *X) MarshalYAML() (interface{}, error) {
Named namedMap2 Named namedMap2
} }
var enc XYAML var enc XYAML
enc.Map = make(map[replacedString]replacedInt, len(x.Map)) if x.Map != nil {
for k, v := range x.Map { enc.Map = make(map[replacedString]replacedInt, len(x.Map))
enc.Map[replacedString(k)] = replacedInt(v) for k, v := range x.Map {
} enc.Map[replacedString(k)] = replacedInt(v)
enc.Named = make(namedMap2, len(x.Named)) }
for k, v := range x.Named { }
enc.Named[replacedString(k)] = replacedInt(v) if x.Named != nil {
enc.Named = make(namedMap2, len(x.Named))
for k, v := range x.Named {
enc.Named[replacedString(k)] = replacedInt(v)
}
} }
return &enc, nil return &enc, nil
} }

@ -13,13 +13,17 @@ func (x *X) MarshalJSON() ([]byte, error) {
Named namedSlice2 Named namedSlice2
} }
var enc XJSON var enc XJSON
enc.Slice = make([]replacedInt, len(x.Slice)) if x.Slice != nil {
for k, v := range x.Slice { enc.Slice = make([]replacedInt, len(x.Slice))
enc.Slice[k] = replacedInt(v) for k, v := range x.Slice {
} enc.Slice[k] = replacedInt(v)
enc.Named = make(namedSlice2, len(x.Named)) }
for k, v := range x.Named { }
enc.Named[k] = replacedInt(v) if x.Named != nil {
enc.Named = make(namedSlice2, len(x.Named))
for k, v := range x.Named {
enc.Named[k] = replacedInt(v)
}
} }
return json.Marshal(&enc) return json.Marshal(&enc)
} }
@ -58,13 +62,17 @@ func (x *X) MarshalYAML() (interface{}, error) {
Named namedSlice2 Named namedSlice2
} }
var enc XYAML var enc XYAML
enc.Slice = make([]replacedInt, len(x.Slice)) if x.Slice != nil {
for k, v := range x.Slice { enc.Slice = make([]replacedInt, len(x.Slice))
enc.Slice[k] = replacedInt(v) for k, v := range x.Slice {
} enc.Slice[k] = replacedInt(v)
enc.Named = make(namedSlice2, len(x.Named)) }
for k, v := range x.Named { }
enc.Named[k] = replacedInt(v) if x.Named != nil {
enc.Named = make(namedSlice2, len(x.Named))
for k, v := range x.Named {
enc.Named[k] = replacedInt(v)
}
} }
return &enc, nil return &enc, nil
} }

Loading…
Cancel
Save