reflect: switch MessageType.New to return Message

Most usages of New actually prefer to interact with the reflective view
rather than the native Go type. Thus, change New to return that instead.
This parallels reflect.New, which returns the reflective view
(i.e., reflect.Value) instead of native type (i.e., interface{}).
We make the equivalent change to KnownFields.NewMessage, List.NewMessage,
and Map.NewMessage for consistency.

Since this is a subtle change where the type system will not always
catch the changed type, this change was made by both changing the type
and renaming the function to NewXXX and manually looking at every usage
of the the function to ensure that the usage correctly operates
on either the native Go type or the reflective view of the type.
After the entire codebase was cleaned up, a rename was performed to convert
NewXXX back to New.

Change-Id: I153fef627b4bf0a427e4039ce0aaec52e20c7950
Reviewed-on: https://go-review.googlesource.com/c/157077
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/encoding/textpb/decode.go b/encoding/textpb/decode.go
index 27d7bf1..c2bfc0e 100644
--- a/encoding/textpb/decode.go
+++ b/encoding/textpb/decode.go
@@ -178,7 +178,7 @@
 		if input.Type() != text.Message {
 			return errors.New("%v contains invalid message/group value: %v", fd.FullName(), input)
 		}
-		m := knownFields.NewMessage(num).ProtoReflect()
+		m := knownFields.NewMessage(num)
 		if err := o.unmarshalMessage(input.Message(), m); !nerr.Merge(err) {
 			return err
 		}
@@ -294,7 +294,7 @@
 			if input.Type() != text.Message {
 				return errors.New("%v contains invalid message/group value: %v", fd.FullName(), input)
 			}
-			m := list.NewMessage().ProtoReflect()
+			m := list.NewMessage()
 			if err := o.unmarshalMessage(input.Message(), m); !nerr.Merge(err) {
 				return err
 			}
@@ -403,7 +403,7 @@
 	if input.Type() != 0 {
 		value = input.Message()
 	}
-	m := mmap.NewMessage().ProtoReflect()
+	m := mmap.NewMessage()
 	if err := o.unmarshalMessage(value, m); !nerr.Merge(err) {
 		return err
 	}
diff --git a/encoding/textpb/encode.go b/encoding/textpb/encode.go
index 2062ec2..fbbdd0f 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -378,7 +378,7 @@
 	if !nerr.Merge(err) {
 		return text.Value{}, err
 	}
-	em := emt.New()
+	em := emt.New().Interface()
 	// TODO: Need to set types registry in binary unmarshaling.
 	err = proto.Unmarshal(value.Bytes(), em)
 	if !nerr.Merge(err) {
diff --git a/encoding/textpb/other_test.go b/encoding/textpb/other_test.go
index 907c444..4092976 100644
--- a/encoding/textpb/other_test.go
+++ b/encoding/textpb/other_test.go
@@ -156,7 +156,7 @@
 			if err != nil {
 				t.Errorf("Marshal() returned error: %v\n\n", err)
 			}
-			gotMessage := tt.message.ProtoReflect().Type().New()
+			gotMessage := tt.message.ProtoReflect().Type().New().Interface()
 			err = textpb.Unmarshal(gotMessage, b)
 			if err != nil {
 				t.Errorf("Unmarshal() returned error: %v\n\n", err)
diff --git a/encoding/textpb/testprotos/pb2/test.pb.go b/encoding/textpb/testprotos/pb2/test.pb.go
index e3e9dea..3654e8e 100644
--- a/encoding/textpb/testprotos/pb2/test.pb.go
+++ b/encoding/textpb/testprotos/pb2/test.pb.go
@@ -2239,116 +2239,116 @@
 var xxx_Test_ProtoFile_MessageTypes = [26]protoimpl.MessageType{
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[0].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Scalars)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Scalars{new(Scalars)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[1].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Repeats)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Repeats{new(Repeats)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[2].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Enums)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Enums{new(Enums)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[3].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nests)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Nests{new(Nests)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[4].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nested)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Nested{new(Nested)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[5].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Requireds)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Requireds{new(Requireds)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[6].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(PartialRequired)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_PartialRequired{new(PartialRequired)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[7].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Oneofs)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Oneofs{new(Oneofs)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[8].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Maps)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Maps{new(Maps)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[9].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(NestedWithRequired)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_NestedWithRequired{new(NestedWithRequired)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[10].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(IndirectRequired)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_IndirectRequired{new(IndirectRequired)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[11].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Extensions)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Extensions{new(Extensions)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[12].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(ExtensionsContainer)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_ExtensionsContainer{new(ExtensionsContainer)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[13].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(MessageSet)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_MessageSet{new(MessageSet)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[14].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(MessageSetExtension)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_MessageSetExtension{new(MessageSetExtension)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[15].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(KnownTypes)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_KnownTypes{new(KnownTypes)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[16].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nests_OptGroup)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Nests_OptGroup{new(Nests_OptGroup)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[17].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nests_RptGroup)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Nests_RptGroup{new(Nests_RptGroup)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[18].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nests_OptGroup_OptNestedGroup)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Nests_OptGroup_OptNestedGroup{new(Nests_OptGroup_OptNestedGroup)}
 		},
 	)},
 	{ /* no message type for Maps_Int32ToStrEntry */ },
diff --git a/encoding/textpb/testprotos/pb3/test.pb.go b/encoding/textpb/testprotos/pb3/test.pb.go
index 839054b..50a7695 100644
--- a/encoding/textpb/testprotos/pb3/test.pb.go
+++ b/encoding/textpb/testprotos/pb3/test.pb.go
@@ -559,26 +559,26 @@
 var xxx_Test_ProtoFile_MessageTypes = [4]protoimpl.MessageType{
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[0].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Scalars)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Scalars{new(Scalars)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[1].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Enums)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Enums{new(Enums)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[2].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nests)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Nests{new(Nests)}
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[3].Reference(),
-		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nested)
+		func(protoreflect.MessageType) protoreflect.Message {
+			return xxx_Nested{new(Nested)}
 		},
 	)},
 }