reflect/protoreflect: add Descriptor specific methods
Added methods:
Enum.Descriptor
Message.Descriptor
EnumType.Descriptor
MessageType.Descriptor
ExtensionType.Descriptor
Message.New
All functionality is switched over to use those methods instead of
implicitly relying on the fact that {Enum,Message}Type implicitly
implement the associated descriptor interface.
This CL does not yet remove {Enum,Message}.Type or prevent
{Enum,Message,Extension}Type from implementating a descriptor.
That is a subsequent CL.
The Message.New method is also added to replace functionality
that will be lost when the Type methods are removed.
Change-Id: I7fefde1673bbd40bfdac489aca05cec9a6c98eb1
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/174918
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/proto/decode.go b/proto/decode.go
index fa6d443..51b2068 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -70,8 +70,8 @@
}
func (o UnmarshalOptions) unmarshalMessage(b []byte, m protoreflect.Message) error {
- messageType := m.Type()
- fieldTypes := messageType.Fields()
+ messageDesc := m.Descriptor()
+ fieldDescs := messageDesc.Fields()
knownFields := m.KnownFields()
unknownFields := m.UnknownFields()
var nerr errors.NonFatal
@@ -83,31 +83,34 @@
}
// Parse the field value.
- fieldType := fieldTypes.ByNumber(num)
- if fieldType == nil {
- fieldType = knownFields.ExtensionTypes().ByNumber(num)
- if fieldType == nil && messageType.ExtensionRanges().Has(num) {
- extType, err := o.Resolver.FindExtensionByNumber(messageType.FullName(), num)
+ fieldDesc := fieldDescs.ByNumber(num)
+ if fieldDesc == nil {
+ extType := knownFields.ExtensionTypes().ByNumber(num)
+ if extType == nil && messageDesc.ExtensionRanges().Has(num) {
+ var err error
+ extType, err = o.Resolver.FindExtensionByNumber(messageDesc.FullName(), num)
if err != nil && err != protoregistry.NotFound {
return err
}
if extType != nil {
knownFields.ExtensionTypes().Register(extType)
- fieldType = extType
}
}
+ if extType != nil {
+ fieldDesc = extType.Descriptor()
+ }
}
var err error
var valLen int
switch {
- case fieldType == nil:
+ case fieldDesc == nil:
err = errUnknown
- case fieldType.Cardinality() != protoreflect.Repeated:
- valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldType)
- case !fieldType.IsMap():
- valLen, err = o.unmarshalList(b[tagLen:], wtyp, num, knownFields.Get(num).List(), fieldType)
+ case fieldDesc.Cardinality() != protoreflect.Repeated:
+ valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldDesc)
+ case !fieldDesc.IsMap():
+ valLen, err = o.unmarshalList(b[tagLen:], wtyp, num, knownFields.Get(num).List(), fieldDesc)
default:
- valLen, err = o.unmarshalMap(b[tagLen:], wtyp, num, knownFields.Get(num).Map(), fieldType)
+ valLen, err = o.unmarshalMap(b[tagLen:], wtyp, num, knownFields.Get(num).Map(), fieldDesc)
}
if err == errUnknown {
valLen = wire.ConsumeFieldValue(num, wtyp, b[tagLen:])