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/encode.go b/encoding/textpb/encode.go
index 78ed3a2..b8b2e71 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -74,10 +74,10 @@
func (o MarshalOptions) marshalMessage(m pref.Message) (text.Value, error) {
var nerr errors.NonFatal
var msgFields [][2]text.Value
- msgType := m.Type()
+ messageDesc := m.Descriptor()
// Handle Any expansion.
- if msgType.FullName() == "google.protobuf.Any" {
+ if messageDesc.FullName() == "google.protobuf.Any" {
msg, err := o.marshalAny(m)
if err == nil || nerr.Merge(err) {
// Return as is for nil or non-fatal error.
@@ -87,7 +87,7 @@
}
// Handle known fields.
- fieldDescs := msgType.Fields()
+ fieldDescs := messageDesc.Fields()
knownFields := m.KnownFields()
size := fieldDescs.Len()
for i := 0; i < size; i++ {
@@ -271,18 +271,18 @@
var nerr errors.NonFatal
var err error
xtTypes.Range(func(xt pref.ExtensionType) bool {
- name := xt.FullName()
+ name := xt.Descriptor().FullName()
// If extended type is a MessageSet, set field name to be the message type name.
if isMessageSetExtension(xt) {
- name = xt.Message().FullName()
+ name = xt.Descriptor().Message().FullName()
}
- num := xt.Number()
+ num := xt.Descriptor().Number()
if knownFields.Has(num) {
// Use string type to produce [name] format.
tname := text.ValueOf(string(name))
pval := knownFields.Get(num)
- xtFields, err = o.appendField(xtFields, tname, pval, xt)
+ xtFields, err = o.appendField(xtFields, tname, pval, xt.Descriptor())
if !nerr.Merge(err) {
return false
}
@@ -303,17 +303,18 @@
// isMessageSetExtension reports whether extension extends a message set.
func isMessageSetExtension(xt pref.ExtensionType) bool {
- if xt.Name() != "message_set_extension" {
+ xd := xt.Descriptor()
+ if xd.Name() != "message_set_extension" {
return false
}
- md := xt.Message()
+ md := xd.Message()
if md == nil {
return false
}
- if xt.FullName().Parent() != md.FullName() {
+ if xd.FullName().Parent() != md.FullName() {
return false
}
- xmd, ok := xt.Extendee().(interface{ IsMessageSet() bool })
+ xmd, ok := xd.Extendee().(interface{ IsMessageSet() bool })
return ok && xmd.IsMessageSet()
}