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/encoding/textpb/decode.go b/encoding/textpb/decode.go
index 040a0e8..38092ac 100644
--- a/encoding/textpb/decode.go
+++ b/encoding/textpb/decode.go
@@ -96,16 +96,16 @@
func (o UnmarshalOptions) unmarshalMessage(tmsg [][2]text.Value, m pref.Message) error {
var nerr errors.NonFatal
- msgType := m.Type()
+ messageDesc := m.Descriptor()
knownFields := m.KnownFields()
// Handle expanded Any message.
- if msgType.FullName() == "google.protobuf.Any" && isExpandedAny(tmsg) {
+ if messageDesc.FullName() == "google.protobuf.Any" && isExpandedAny(tmsg) {
return o.unmarshalAny(tmsg[0], knownFields)
}
- fieldDescs := msgType.Fields()
- reservedNames := msgType.ReservedNames()
+ fieldDescs := messageDesc.Fields()
+ reservedNames := messageDesc.ReservedNames()
xtTypes := knownFields.ExtensionTypes()
var seenNums set.Ints
var seenOneofs set.Ints
@@ -126,7 +126,7 @@
}
case text.String:
// Handle extensions only. This code path is not for Any.
- if msgType.FullName() == "google.protobuf.Any" {
+ if messageDesc.FullName() == "google.protobuf.Any" {
break
}
// Extensions have to be registered first in the message's
@@ -145,7 +145,9 @@
xtTypes.Register(xt)
}
}
- fd = xt
+ if xt != nil {
+ fd = xt.Descriptor()
+ }
}
if fd == nil {
@@ -154,7 +156,7 @@
continue
}
// TODO: Can provide option to ignore unknown message fields.
- return errors.New("%v contains unknown field: %v", msgType.FullName(), tkey)
+ return errors.New("%v contains unknown field: %v", messageDesc.FullName(), tkey)
}
if cardinality := fd.Cardinality(); cardinality == pref.Repeated {