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/testing/prototest/prototest.go b/testing/prototest/prototest.go
index f222e2e..f3a1a9f 100644
--- a/testing/prototest/prototest.go
+++ b/testing/prototest/prototest.go
@@ -20,9 +20,9 @@
// TestMessage runs the provided message through a series of tests
// exercising the protobuf reflection API.
func TestMessage(t testing.TB, message proto.Message) {
- md := message.ProtoReflect().Type()
+ md := message.ProtoReflect().Descriptor()
- m := md.New()
+ m := message.ProtoReflect().New()
for i := 0; i < md.Fields().Len(); i++ {
fd := md.Fields().Get(i)
switch {
@@ -67,13 +67,13 @@
// TODO: Extensions, unknown fields.
// Test round-trip marshal/unmarshal.
- m1 := md.New().Interface()
+ m1 := message.ProtoReflect().New().Interface()
populateMessage(m1.ProtoReflect(), 1, nil)
b, err := proto.Marshal(m1)
if err != nil {
t.Errorf("Marshal() = %v, want nil\n%v", err, marshalText(m1))
}
- m2 := md.New().Interface()
+ m2 := message.ProtoReflect().New().Interface()
if err := proto.Unmarshal(b, m2); err != nil {
t.Errorf("Unmarshal() = %v, want nil\n%v", err, marshalText(m1))
}
@@ -350,7 +350,7 @@
if err != nil {
return fmt.Sprintf("<%v>", err)
}
- return fmt.Sprintf("%v{%v}", v.Type().FullName(), string(b))
+ return fmt.Sprintf("%v{%v}", v.Descriptor().FullName(), string(b))
case string:
return fmt.Sprintf("%q", v)
default:
@@ -418,11 +418,11 @@
//
// The stack parameter is used to avoid infinite recursion when populating circular
// data structures.
-func newValue(m pref.Message, fd pref.FieldDescriptor, n seed, stack []pref.MessageType) pref.Value {
+func newValue(m pref.Message, fd pref.FieldDescriptor, n seed, stack []pref.MessageDescriptor) pref.Value {
num := fd.Number()
switch {
case fd.IsMap():
- mapv := m.Type().New().KnownFields().Get(num).Map()
+ mapv := m.New().KnownFields().Get(num).Map()
if n == 0 {
return pref.ValueOf(mapv)
}
@@ -432,7 +432,7 @@
mapv.Set(newMapKey(fd, n), newMapValue(fd, mapv, 10*n, stack))
return pref.ValueOf(mapv)
case fd.Cardinality() == pref.Repeated:
- list := m.Type().New().KnownFields().Get(num).List()
+ list := m.New().KnownFields().Get(num).List()
if n == 0 {
return pref.ValueOf(list)
}
@@ -448,7 +448,7 @@
}
}
-func newListElement(fd pref.FieldDescriptor, list pref.List, n seed, stack []pref.MessageType) pref.Value {
+func newListElement(fd pref.FieldDescriptor, list pref.List, n seed, stack []pref.MessageDescriptor) pref.Value {
if fd.Message() == nil {
return newScalarValue(fd, n)
}
@@ -460,7 +460,7 @@
return newScalarValue(kd, n).MapKey()
}
-func newMapValue(fd pref.FieldDescriptor, mapv pref.Map, n seed, stack []pref.MessageType) pref.Value {
+func newMapValue(fd pref.FieldDescriptor, mapv pref.Map, n seed, stack []pref.MessageDescriptor) pref.Value {
vd := fd.Message().Fields().ByNumber(2)
if vd.Message() == nil {
return newScalarValue(vd, n)
@@ -545,11 +545,11 @@
panic("unhandled kind")
}
-func populateMessage(m pref.Message, n seed, stack []pref.MessageType) pref.Value {
+func populateMessage(m pref.Message, n seed, stack []pref.MessageDescriptor) pref.Value {
if n == 0 {
return pref.ValueOf(m)
}
- md := m.Type()
+ md := m.Descriptor()
for _, x := range stack {
if md == x {
return pref.ValueOf(m)