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 }