Преглед изворни кода

types/dynamicpb: New->NewMessage, add NewMessageType

Rename New to NewMessage, since messages are not the only type in this
package.

Add NewMessageType to allow creating a MessageType without first
creating a Message.

Fixes golang/protobuf#934

Change-Id: I9c59594a436dec75d3e26078b0055a4aa08e0169
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/193157
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
Damien Neil пре 6 година
родитељ
комит
dfae831ab7
2 измењених фајлова са 34 додато и 24 уклоњено
  1. 32 22
      types/dynamicpb/dynamic.go
  2. 2 2
      types/dynamicpb/dynamic_test.go

+ 32 - 22
types/dynamicpb/dynamic.go

@@ -30,16 +30,16 @@ import (
 //
 // Operations which modify a Message are not safe for concurrent use.
 type Message struct {
-	desc    pref.MessageDescriptor
+	typ     messageType
 	known   map[pref.FieldNumber]pref.Value
 	ext     map[pref.FieldNumber]pref.FieldDescriptor
 	unknown pref.RawFields
 }
 
-// New creates a new message with the provided descriptor.
-func New(desc pref.MessageDescriptor) *Message {
+// NewMessage creates a new message with the provided descriptor.
+func NewMessage(desc pref.MessageDescriptor) *Message {
 	return &Message{
-		desc:  desc,
+		typ:   messageType{desc},
 		known: make(map[pref.FieldNumber]pref.Value),
 		ext:   make(map[pref.FieldNumber]pref.FieldDescriptor),
 	}
@@ -57,12 +57,12 @@ func (m *Message) String() string {
 
 // Descriptor returns the message descriptor.
 func (m *Message) Descriptor() pref.MessageDescriptor {
-	return m.desc
+	return m.typ.desc
 }
 
 // Type returns the message type.
 func (m *Message) Type() pref.MessageType {
-	return (*messageType)(m)
+	return m.typ
 }
 
 // New returns a newly allocated empty message with the same descriptor.
@@ -137,7 +137,7 @@ func (m *Message) Get(fd pref.FieldDescriptor) pref.Value {
 	case fd.IsList():
 		return pref.ValueOf(emptyList{desc: fd})
 	case fd.Message() != nil:
-		return pref.ValueOf(&Message{desc: fd.Message()})
+		return pref.ValueOf(&Message{typ: messageType{fd.Message()}})
 	case fd.Kind() == pref.BytesKind:
 		return pref.ValueOf(append([]byte(nil), fd.Default().Bytes()...))
 	default:
@@ -214,7 +214,7 @@ func (m *Message) NewMessage(fd pref.FieldDescriptor) pref.Message {
 	if fd.Cardinality() == pref.Repeated || md == nil {
 		panic(errors.New("%v: field is not of non-repeated message type", fd.FullName()))
 	}
-	return New(md).ProtoReflect()
+	return NewMessage(md).ProtoReflect()
 }
 
 // NewField returns a new value for assignable to the field of a given descriptor.
@@ -232,7 +232,7 @@ func (m *Message) NewField(fd pref.FieldDescriptor) pref.Value {
 	case fd.IsList():
 		return pref.ValueOf(&dynamicList{desc: fd})
 	case fd.Message() != nil:
-		return pref.ValueOf(New(fd.Message()).ProtoReflect())
+		return pref.ValueOf(NewMessage(fd.Message()).ProtoReflect())
 	default:
 		return fd.Default()
 	}
@@ -260,7 +260,7 @@ func (m *Message) GetUnknown() pref.RawFields {
 // See protoreflect.Message for details.
 func (m *Message) SetUnknown(r pref.RawFields) {
 	if m.known == nil {
-		panic(errors.New("%v: modification of read-only message", m.desc.FullName()))
+		panic(errors.New("%v: modification of read-only message", m.typ.desc.FullName()))
 	}
 	m.unknown = r
 }
@@ -282,12 +282,22 @@ func (m *Message) checkField(fd pref.FieldDescriptor) {
 	}
 }
 
-type messageType Message
+type messageType struct {
+	desc pref.MessageDescriptor
+}
+
+// NewMessageType creates a new MessageType with the provided descriptor.
+//
+// MessageTypes created by this package are equal if their descriptors are equal.
+// That is, if md1 == md2, then NewMessageType(md1) == NewMessageType(md2).
+func NewMessageType(desc pref.MessageDescriptor) pref.MessageType {
+	return messageType{desc}
+}
 
-func (mt *messageType) New() pref.Message                  { return New(mt.desc) }
-func (mt *messageType) Zero() pref.Message                 { return New(mt.desc) }
-func (mt *messageType) GoType() reflect.Type               { return reflect.TypeOf((*Message)(nil)) }
-func (mt *messageType) Descriptor() pref.MessageDescriptor { return mt.desc }
+func (mt messageType) New() pref.Message                  { return NewMessage(mt.desc) }
+func (mt messageType) Zero() pref.Message                 { return NewMessage(mt.desc) }
+func (mt messageType) GoType() reflect.Type               { return reflect.TypeOf((*Message)(nil)) }
+func (mt messageType) Descriptor() pref.MessageDescriptor { return mt.desc }
 
 type emptyList struct {
 	desc pref.FieldDescriptor
@@ -303,7 +313,7 @@ func (x emptyList) NewMessage() pref.Message {
 	if md == nil {
 		panic(errors.New("list is not of message type"))
 	}
-	return New(md).ProtoReflect()
+	return NewMessage(md).ProtoReflect()
 }
 func (x emptyList) NewElement() pref.Value {
 	return newListEntry(x.desc)
@@ -345,7 +355,7 @@ func (x *dynamicList) NewMessage() pref.Message {
 	if md == nil {
 		panic(errors.New("list is not of message type"))
 	}
-	return New(md).ProtoReflect()
+	return NewMessage(md).ProtoReflect()
 }
 
 func (x *dynamicList) NewElement() pref.Value {
@@ -371,11 +381,11 @@ func (x *dynamicMap) NewMessage() pref.Message {
 	if md == nil {
 		panic(errors.New("map value is not of message type"))
 	}
-	return New(md).ProtoReflect()
+	return NewMessage(md).ProtoReflect()
 }
 func (x *dynamicMap) NewValue() pref.Value {
 	if md := x.desc.MapValue().Message(); md != nil {
-		return pref.ValueOf(New(md).ProtoReflect())
+		return pref.ValueOf(NewMessage(md).ProtoReflect())
 	}
 	return x.desc.MapValue().Default()
 }
@@ -517,7 +527,7 @@ func newListEntry(fd pref.FieldDescriptor) pref.Value {
 	case pref.BytesKind:
 		return pref.ValueOf(([]byte)(nil))
 	case pref.MessageKind, pref.GroupKind:
-		return pref.ValueOf(New(fd.Message()).ProtoReflect())
+		return pref.ValueOf(NewMessage(fd.Message()).ProtoReflect())
 	}
 	panic(errors.New("%v: unknown kind %v", fd.FullName(), fd.Kind()))
 }
@@ -563,7 +573,7 @@ func (xt extensionType) New() pref.Value {
 	case xt.desc.IsList():
 		return pref.ValueOf(&dynamicList{desc: xt.desc})
 	case xt.desc.Message() != nil:
-		return pref.ValueOf(New(xt.desc.Message()))
+		return pref.ValueOf(NewMessage(xt.desc.Message()))
 	default:
 		return xt.desc.Default()
 	}
@@ -576,7 +586,7 @@ func (xt extensionType) Zero() pref.Value {
 	case xt.desc.Cardinality() == pref.Repeated:
 		return pref.ValueOf(emptyList{desc: xt.desc})
 	case xt.desc.Message() != nil:
-		return pref.ValueOf(&Message{desc: xt.desc.Message()})
+		return pref.ValueOf(&Message{typ: messageType{xt.desc.Message()}})
 	default:
 		return xt.desc.Default()
 	}

+ 2 - 2
types/dynamicpb/dynamic_test.go

@@ -23,7 +23,7 @@ func TestConformance(t *testing.T) {
 		(*test3pb.TestAllTypes)(nil),
 		(*testpb.TestAllExtensions)(nil),
 	} {
-		prototest.TestMessage(t, dynamicpb.New(message.ProtoReflect().Descriptor()), prototest.MessageOptions{})
+		prototest.TestMessage(t, dynamicpb.NewMessage(message.ProtoReflect().Descriptor()), prototest.MessageOptions{})
 	}
 }
 
@@ -40,7 +40,7 @@ func TestDynamicExtensions(t *testing.T) {
 	for i := 0; i < file.Extensions().Len(); i++ {
 		opts.ExtensionTypes = append(opts.ExtensionTypes, dynamicpb.NewExtensionType(file.Extensions().Get(i)))
 	}
-	prototest.TestMessage(t, dynamicpb.New(md), opts)
+	prototest.TestMessage(t, dynamicpb.NewMessage(md), opts)
 }
 
 type extResolver struct{}