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/internal/impl/message_test.go b/internal/impl/message_test.go
index b5a9af2..49e3a0a 100644
--- a/internal/impl/message_test.go
+++ b/internal/impl/message_test.go
@@ -228,13 +228,18 @@
},
)}
+// TODO: Remove this.
func (m *ScalarProto2) Type() pref.MessageType { return scalarProto2Type.PBType }
+func (m *ScalarProto2) Descriptor() pref.MessageDescriptor {
+ return scalarProto2Type.PBType.Descriptor()
+}
func (m *ScalarProto2) KnownFields() pref.KnownFields {
return scalarProto2Type.MessageOf(m).KnownFields()
}
func (m *ScalarProto2) UnknownFields() pref.UnknownFields {
return scalarProto2Type.MessageOf(m).UnknownFields()
}
+func (m *ScalarProto2) New() pref.Message { return new(ScalarProto2) }
func (m *ScalarProto2) Interface() pref.ProtoMessage { return m }
func (m *ScalarProto2) ProtoReflect() pref.Message { return m }
@@ -338,13 +343,18 @@
},
)}
+// TODO: Remove this.
func (m *ScalarProto3) Type() pref.MessageType { return scalarProto3Type.PBType }
+func (m *ScalarProto3) Descriptor() pref.MessageDescriptor {
+ return scalarProto3Type.PBType.Descriptor()
+}
func (m *ScalarProto3) KnownFields() pref.KnownFields {
return scalarProto3Type.MessageOf(m).KnownFields()
}
func (m *ScalarProto3) UnknownFields() pref.UnknownFields {
return scalarProto3Type.MessageOf(m).UnknownFields()
}
+func (m *ScalarProto3) New() pref.Message { return new(ScalarProto3) }
func (m *ScalarProto3) Interface() pref.ProtoMessage { return m }
func (m *ScalarProto3) ProtoReflect() pref.Message { return m }
@@ -464,13 +474,16 @@
},
)}
-func (m *ListScalars) Type() pref.MessageType { return listScalarsType.PBType }
+// TODO: Remove this.
+func (m *ListScalars) Type() pref.MessageType { return listScalarsType.PBType }
+func (m *ListScalars) Descriptor() pref.MessageDescriptor { return listScalarsType.PBType.Descriptor() }
func (m *ListScalars) KnownFields() pref.KnownFields {
return listScalarsType.MessageOf(m).KnownFields()
}
func (m *ListScalars) UnknownFields() pref.UnknownFields {
return listScalarsType.MessageOf(m).UnknownFields()
}
+func (m *ListScalars) New() pref.Message { return new(ListScalars) }
func (m *ListScalars) Interface() pref.ProtoMessage { return m }
func (m *ListScalars) ProtoReflect() pref.Message { return m }
@@ -659,13 +672,16 @@
},
)}
-func (m *MapScalars) Type() pref.MessageType { return mapScalarsType.PBType }
+// TODO: Remove this.
+func (m *MapScalars) Type() pref.MessageType { return mapScalarsType.PBType }
+func (m *MapScalars) Descriptor() pref.MessageDescriptor { return mapScalarsType.PBType.Descriptor() }
func (m *MapScalars) KnownFields() pref.KnownFields {
return mapScalarsType.MessageOf(m).KnownFields()
}
func (m *MapScalars) UnknownFields() pref.UnknownFields {
return mapScalarsType.MessageOf(m).UnknownFields()
}
+func (m *MapScalars) New() pref.Message { return new(MapScalars) }
func (m *MapScalars) Interface() pref.ProtoMessage { return m }
func (m *MapScalars) ProtoReflect() pref.Message { return m }
@@ -821,13 +837,18 @@
},
)}
+// TODO: Remove this.
func (m *OneofScalars) Type() pref.MessageType { return oneofScalarsType.PBType }
+func (m *OneofScalars) Descriptor() pref.MessageDescriptor {
+ return oneofScalarsType.PBType.Descriptor()
+}
func (m *OneofScalars) KnownFields() pref.KnownFields {
return oneofScalarsType.MessageOf(m).KnownFields()
}
func (m *OneofScalars) UnknownFields() pref.UnknownFields {
return oneofScalarsType.MessageOf(m).UnknownFields()
}
+func (m *OneofScalars) New() pref.Message { return new(OneofScalars) }
func (m *OneofScalars) Interface() pref.ProtoMessage { return m }
func (m *OneofScalars) ProtoReflect() pref.Message { return m }
@@ -977,9 +998,11 @@
},
)
-func (e EnumProto2) Enum() *EnumProto2 { return &e }
-func (e EnumProto2) Type() pref.EnumType { return enumProto2Type }
-func (e EnumProto2) Number() pref.EnumNumber { return pref.EnumNumber(e) }
+// TODO: Remove this.
+func (e EnumProto2) Type() pref.EnumType { return enumProto2Type }
+func (e EnumProto2) Descriptor() pref.EnumDescriptor { return enumProto2Type.Descriptor() }
+func (e EnumProto2) Enum() *EnumProto2 { return &e }
+func (e EnumProto2) Number() pref.EnumNumber { return pref.EnumNumber(e) }
type EnumProto3 int32
@@ -994,9 +1017,11 @@
},
)
-func (e EnumProto3) Enum() *EnumProto3 { return &e }
-func (e EnumProto3) Type() pref.EnumType { return enumProto3Type }
-func (e EnumProto3) Number() pref.EnumNumber { return pref.EnumNumber(e) }
+// TODO: Remove this.
+func (e EnumProto3) Type() pref.EnumType { return enumProto3Type }
+func (e EnumProto3) Descriptor() pref.EnumDescriptor { return enumProto3Type.Descriptor() }
+func (e EnumProto3) Enum() *EnumProto3 { return &e }
+func (e EnumProto3) Number() pref.EnumNumber { return pref.EnumNumber(e) }
type EnumMessages struct {
EnumP2 *EnumProto2 `protobuf:"1"`
@@ -1015,18 +1040,18 @@
Syntax: pref.Proto2,
FullName: "EnumMessages",
Fields: []ptype.Field{
- {Name: "f1", Number: 1, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BEEF"), EnumType: enumProto2Type},
- {Name: "f2", Number: 2, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BRAVO"), EnumType: enumProto3Type},
- {Name: "f3", Number: 3, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: pimpl.Export{}.MessageOf(new(proto2_20180125.Message)).Type()},
+ {Name: "f1", Number: 1, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BEEF"), EnumType: enumProto2Type.Descriptor()},
+ {Name: "f2", Number: 2, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BRAVO"), EnumType: enumProto3Type.Descriptor()},
+ {Name: "f3", Number: 3, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: pimpl.Export{}.MessageDescriptorOf(new(proto2_20180125.Message))},
{Name: "f4", Number: 4, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("EnumMessages")},
- {Name: "f5", Number: 5, Cardinality: pref.Repeated, Kind: pref.EnumKind, EnumType: enumProto2Type},
- {Name: "f6", Number: 6, Cardinality: pref.Repeated, Kind: pref.MessageKind, MessageType: scalarProto2Type.PBType},
+ {Name: "f5", Number: 5, Cardinality: pref.Repeated, Kind: pref.EnumKind, EnumType: enumProto2Type.Descriptor()},
+ {Name: "f6", Number: 6, Cardinality: pref.Repeated, Kind: pref.MessageKind, MessageType: scalarProto2Type.PBType.Descriptor()},
{Name: "f7", Number: 7, Cardinality: pref.Repeated, Kind: pref.MessageKind, MessageType: enumMapDesc},
{Name: "f8", Number: 8, Cardinality: pref.Repeated, Kind: pref.MessageKind, MessageType: messageMapDesc},
- {Name: "f9", Number: 9, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BEEF"), OneofName: "union", EnumType: enumProto2Type},
- {Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BRAVO"), OneofName: "union", EnumType: enumProto3Type},
- {Name: "f11", Number: 11, Cardinality: pref.Optional, Kind: pref.MessageKind, OneofName: "union", MessageType: scalarProto2Type.PBType},
- {Name: "f12", Number: 12, Cardinality: pref.Optional, Kind: pref.MessageKind, OneofName: "union", MessageType: scalarProto3Type.PBType},
+ {Name: "f9", Number: 9, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BEEF"), OneofName: "union", EnumType: enumProto2Type.Descriptor()},
+ {Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BRAVO"), OneofName: "union", EnumType: enumProto3Type.Descriptor()},
+ {Name: "f11", Number: 11, Cardinality: pref.Optional, Kind: pref.MessageKind, OneofName: "union", MessageType: scalarProto2Type.PBType.Descriptor()},
+ {Name: "f12", Number: 12, Cardinality: pref.Optional, Kind: pref.MessageKind, OneofName: "union", MessageType: scalarProto3Type.PBType.Descriptor()},
},
Oneofs: []ptype.Oneof{{Name: "union"}},
}),
@@ -1040,7 +1065,7 @@
FullName: "EnumMessages.F7Entry",
Fields: []ptype.Field{
{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: pref.StringKind},
- {Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.EnumKind, EnumType: enumProto3Type},
+ {Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.EnumKind, EnumType: enumProto3Type.Descriptor()},
},
Options: &descriptorpb.MessageOptions{MapEntry: scalar.Bool(true)},
IsMapEntry: true,
@@ -1051,19 +1076,24 @@
FullName: "EnumMessages.F8Entry",
Fields: []ptype.Field{
{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: pref.StringKind},
- {Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: scalarProto3Type.PBType},
+ {Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: scalarProto3Type.PBType.Descriptor()},
},
Options: &descriptorpb.MessageOptions{MapEntry: scalar.Bool(true)},
IsMapEntry: true,
})
+// TODO: Remove this.
func (m *EnumMessages) Type() pref.MessageType { return enumMessagesType.PBType }
+func (m *EnumMessages) Descriptor() pref.MessageDescriptor {
+ return enumMessagesType.PBType.Descriptor()
+}
func (m *EnumMessages) KnownFields() pref.KnownFields {
return enumMessagesType.MessageOf(m).KnownFields()
}
func (m *EnumMessages) UnknownFields() pref.UnknownFields {
return enumMessagesType.MessageOf(m).UnknownFields()
}
+func (m *EnumMessages) New() pref.Message { return new(EnumMessages) }
func (m *EnumMessages) Interface() pref.ProtoMessage { return m }
func (m *EnumMessages) ProtoReflect() pref.Message { return m }