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/jsonpb/encode.go b/encoding/jsonpb/encode.go
index 9375091..90767ce 100644
--- a/encoding/jsonpb/encode.go
+++ b/encoding/jsonpb/encode.go
@@ -71,7 +71,7 @@
 func (o MarshalOptions) marshalMessage(m pref.Message) error {
 	var nerr errors.NonFatal
 
-	if isCustomType(m.Type().FullName()) {
+	if isCustomType(m.Descriptor().FullName()) {
 		return o.marshalCustomType(m)
 	}
 
@@ -87,7 +87,7 @@
 // marshalFields marshals the fields in the given protoreflect.Message.
 func (o MarshalOptions) marshalFields(m pref.Message) error {
 	var nerr errors.NonFatal
-	fieldDescs := m.Type().Fields()
+	fieldDescs := m.Descriptor().Fields()
 	knownFields := m.KnownFields()
 
 	// Marshal out known fields.
@@ -280,13 +280,13 @@
 	// Get a sorted list based on field key first.
 	entries := make([]xtEntry, 0, xtTypes.Len())
 	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 [name] format for JSON field name.
 			pval := knownFields.Get(num)
@@ -313,7 +313,7 @@
 		if err := o.encoder.WriteName("[" + entry.key + "]"); !nerr.Merge(err) {
 			return err
 		}
-		if err := o.marshalValue(entry.value, entry.xtType); !nerr.Merge(err) {
+		if err := o.marshalValue(entry.value, entry.xtType.Descriptor()); !nerr.Merge(err) {
 			return err
 		}
 	}
@@ -322,16 +322,17 @@
 
 // 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()
 }