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/textpb/encode.go b/encoding/textpb/encode.go
index 78ed3a2..b8b2e71 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -74,10 +74,10 @@
 func (o MarshalOptions) marshalMessage(m pref.Message) (text.Value, error) {
 	var nerr errors.NonFatal
 	var msgFields [][2]text.Value
-	msgType := m.Type()
+	messageDesc := m.Descriptor()
 
 	// Handle Any expansion.
-	if msgType.FullName() == "google.protobuf.Any" {
+	if messageDesc.FullName() == "google.protobuf.Any" {
 		msg, err := o.marshalAny(m)
 		if err == nil || nerr.Merge(err) {
 			// Return as is for nil or non-fatal error.
@@ -87,7 +87,7 @@
 	}
 
 	// Handle known fields.
-	fieldDescs := msgType.Fields()
+	fieldDescs := messageDesc.Fields()
 	knownFields := m.KnownFields()
 	size := fieldDescs.Len()
 	for i := 0; i < size; i++ {
@@ -271,18 +271,18 @@
 	var nerr errors.NonFatal
 	var err error
 	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 string type to produce [name] format.
 			tname := text.ValueOf(string(name))
 			pval := knownFields.Get(num)
-			xtFields, err = o.appendField(xtFields, tname, pval, xt)
+			xtFields, err = o.appendField(xtFields, tname, pval, xt.Descriptor())
 			if !nerr.Merge(err) {
 				return false
 			}
@@ -303,17 +303,18 @@
 
 // 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()
 }