goprotobuf: Repeated extensions.
Also picks up a tweak to the JSON tags of the XXX_ fields.
R=r
CC=golang-dev
http://codereview.appspot.com/6175045
diff --git a/proto/text_parser.go b/proto/text_parser.go
index 2124308..3800188 100644
--- a/proto/text_parser.go
+++ b/proto/text_parser.go
@@ -350,14 +350,33 @@
return err
}
+ rep := desc.repeated()
+
// Read the extension structure, and set it in
// the value we're constructing.
- ext := reflect.New(typ).Elem()
+ var ext reflect.Value
+ if !rep {
+ ext = reflect.New(typ).Elem()
+ } else {
+ ext = reflect.New(typ.Elem()).Elem()
+ }
if err := p.readAny(ext, props); err != nil {
return err
}
- SetExtension(sv.Addr().Interface().(extendableProto),
- desc, ext.Interface())
+ ep := sv.Addr().Interface().(extendableProto)
+ if !rep {
+ SetExtension(ep, desc, ext.Interface())
+ } else {
+ old, err := GetExtension(ep, desc)
+ var sl reflect.Value
+ if err == nil {
+ sl = reflect.ValueOf(old) // existing slice
+ } else {
+ sl = reflect.MakeSlice(typ, 0, 1)
+ }
+ sl = reflect.Append(sl, ext)
+ SetExtension(ep, desc, sl.Interface())
+ }
} else {
// This is a normal, non-extension field.
fi, props, ok := structFieldByName(st, tok.value)