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/proto/decode.go b/proto/decode.go
index 51b2068..37334be 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -105,12 +105,12 @@
switch {
case fieldDesc == nil:
err = errUnknown
- case fieldDesc.Cardinality() != protoreflect.Repeated:
- valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldDesc)
- case !fieldDesc.IsMap():
+ case fieldDesc.IsList():
valLen, err = o.unmarshalList(b[tagLen:], wtyp, num, knownFields.Get(num).List(), fieldDesc)
- default:
+ case fieldDesc.IsMap():
valLen, err = o.unmarshalMap(b[tagLen:], wtyp, num, knownFields.Get(num).Map(), fieldDesc)
+ default:
+ valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldDesc)
}
if err == errUnknown {
valLen = wire.ConsumeFieldValue(num, wtyp, b[tagLen:])
@@ -140,7 +140,7 @@
// TODO: C++ merges into oneofs, while v1 does not.
// Evaluate which behavior to pick.
var m protoreflect.Message
- if knownFields.Has(num) && field.Oneof() == nil {
+ if knownFields.Has(num) && field.ContainingOneof() == nil {
m = knownFields.Get(num).Message()
} else {
m = knownFields.NewMessage(num)
@@ -166,8 +166,8 @@
return 0, wire.ParseError(n)
}
var (
- keyField = field.Message().Fields().ByNumber(1)
- valField = field.Message().Fields().ByNumber(2)
+ keyField = field.MapKey()
+ valField = field.MapValue()
key protoreflect.Value
val protoreflect.Value
haveKey bool