reflect/protoreflect: add helper methods to FieldDescriptor
Added API:
FieldDescriptor.IsExtension
FieldDescriptor.IsList
FieldDescriptor.MapKey
FieldDescriptor.MapValue
FieldDescriptor.ContainingOneof
FieldDescriptor.ContainingMessage
Deprecated API (to be removed in subsequent CL):
FieldDescriptor.Oneof
FieldDescriptor.Extendee
These methods help cleanup several common usage patterns.
Change-Id: I9a3ffabc2edb2173c536509b22f330f98bba7cf3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/176977
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/encoding/jsonpb/encode.go b/encoding/jsonpb/encode.go
index 90767ce..256cd74 100644
--- a/encoding/jsonpb/encode.go
+++ b/encoding/jsonpb/encode.go
@@ -118,25 +118,14 @@
// marshalValue marshals the given protoreflect.Value.
func (o MarshalOptions) marshalValue(val pref.Value, fd pref.FieldDescriptor) error {
- var nerr errors.NonFatal
- if fd.Cardinality() == pref.Repeated {
- // Map or repeated fields.
- if fd.IsMap() {
- if err := o.marshalMap(val.Map(), fd); !nerr.Merge(err) {
- return err
- }
- } else {
- if err := o.marshalList(val.List(), fd); !nerr.Merge(err) {
- return err
- }
- }
- } else {
- // Required or optional fields.
- if err := o.marshalSingular(val, fd); !nerr.Merge(err) {
- return err
- }
+ switch {
+ case fd.IsList():
+ return o.marshalList(val.List(), fd)
+ case fd.IsMap():
+ return o.marshalMap(val.Map(), fd)
+ default:
+ return o.marshalSingular(val, fd)
}
- return nerr.E
}
// marshalSingular marshals the given non-repeated field value. This includes
@@ -226,17 +215,13 @@
o.encoder.StartObject()
defer o.encoder.EndObject()
- msgFields := fd.Message().Fields()
- keyType := msgFields.ByNumber(1)
- valType := msgFields.ByNumber(2)
-
// Get a sorted list based on keyType first.
entries := make([]mapEntry, 0, mmap.Len())
mmap.Range(func(key pref.MapKey, val pref.Value) bool {
entries = append(entries, mapEntry{key: key, value: val})
return true
})
- sortMap(keyType.Kind(), entries)
+ sortMap(fd.MapKey().Kind(), entries)
// Write out sorted list.
var nerr errors.NonFatal
@@ -244,7 +229,7 @@
if err := o.encoder.WriteName(entry.key.String()); !nerr.Merge(err) {
return err
}
- if err := o.marshalSingular(entry.value, valType); !nerr.Merge(err) {
+ if err := o.marshalSingular(entry.value, fd.MapValue()); !nerr.Merge(err) {
return err
}
}
@@ -333,6 +318,6 @@
if xd.FullName().Parent() != md.FullName() {
return false
}
- xmd, ok := xd.Extendee().(interface{ IsMessageSet() bool })
+ xmd, ok := xd.ContainingMessage().(interface{ IsMessageSet() bool })
return ok && xmd.IsMessageSet()
}