all: remove {Enum,Message,Extension}Type.GoType methods

These methods are difficult or impossible to use correctly; types
created by the dynamicpb package, for example, all have the same GoType.

Fixes golang/protobuf#938

Change-Id: I33d4ef381579ff18569b11df501d0ba7f38a6b5c
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/199060
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/enum.go b/internal/impl/enum.go
index eceff8a..8c1eab4 100644
--- a/internal/impl/enum.go
+++ b/internal/impl/enum.go
@@ -18,5 +18,4 @@
 func (t *EnumInfo) New(n pref.EnumNumber) pref.Enum {
 	return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(pref.Enum)
 }
-func (t *EnumInfo) GoType() reflect.Type            { return t.GoReflectType }
 func (t *EnumInfo) Descriptor() pref.EnumDescriptor { return t.Desc }
diff --git a/internal/impl/enum_test.go b/internal/impl/enum_test.go
index d122a6c..7e04500 100644
--- a/internal/impl/enum_test.go
+++ b/internal/impl/enum_test.go
@@ -5,7 +5,6 @@
 package impl_test
 
 import (
-	"reflect"
 	"testing"
 
 	pref "google.golang.org/protobuf/reflect/protoreflect"
@@ -15,9 +14,6 @@
 
 func TestEnum(t *testing.T) {
 	et := testpb.ForeignEnum_FOREIGN_FOO.Type()
-	if got, want := et.GoType(), reflect.TypeOf(testpb.ForeignEnum_FOREIGN_FOO); got != want {
-		t.Errorf("testpb.ForeignEnum_FOREIGN_FOO.Type().GoType() = %v, want %v", got, want)
-	}
 	if got, want := et.New(pref.EnumNumber(testpb.ForeignEnum_FOREIGN_FOO)), pref.Enum(testpb.ForeignEnum_FOREIGN_FOO); got != want {
 		t.Errorf("testpb.ForeignEnum_FOREIGN_FOO.Type().New() = %[1]T(%[1]v), want %[2]T(%[2]v)", got, want)
 	}
diff --git a/internal/impl/extension.go b/internal/impl/extension.go
index 723bdb0..541f4a7 100644
--- a/internal/impl/extension.go
+++ b/internal/impl/extension.go
@@ -46,16 +46,12 @@
 	// Deprecated: Use the ExtendedType method instead.
 	ExtendedType piface.MessageV1
 
-	// ExtensionType is zero value of the extension type.
+	// ExtensionType is the zero value of the extension type.
 	//
-	// For historical reasons, reflect.TypeOf(ExtensionType) and Type.GoType
-	// may not be identical:
-	//	* for scalars (except []byte), where ExtensionType uses *T,
-	//	while Type.GoType uses T.
-	//	* for repeated fields, where ExtensionType uses []T,
-	//	while Type.GoType uses *[]T.
+	// For historical reasons, reflect.TypeOf(ExtensionType) and the
+	// type returned by InterfaceOf may not be identical.
 	//
-	// Deprecated: Use the GoType method instead.
+	// Deprecated: Use InterfaceOf(xt.Zero()) instead.
 	ExtensionType interface{}
 
 	// Field is the field number of the extension.
@@ -110,10 +106,6 @@
 func (xi *ExtensionInfo) IsValidInterface(v interface{}) bool {
 	return xi.lazyInit().IsValidGo(reflect.ValueOf(v))
 }
-func (xi *ExtensionInfo) GoType() reflect.Type {
-	xi.lazyInit()
-	return xi.goType
-}
 func (xi *ExtensionInfo) TypeDescriptor() pref.ExtensionTypeDescriptor {
 	if atomic.LoadUint32(&xi.init) < extensionInfoDescInit {
 		xi.lazyInitSlow()
diff --git a/internal/impl/legacy_enum.go b/internal/impl/legacy_enum.go
index c92eadf..b4d26ef 100644
--- a/internal/impl/legacy_enum.go
+++ b/internal/impl/legacy_enum.go
@@ -76,9 +76,6 @@
 	t.m.Store(n, e)
 	return e
 }
-func (t *legacyEnumType) GoType() reflect.Type {
-	return t.goType
-}
 func (t *legacyEnumType) Descriptor() pref.EnumDescriptor {
 	return t.desc
 }
diff --git a/internal/impl/legacy_test.go b/internal/impl/legacy_test.go
index 46d8c36..f55c0d3 100644
--- a/internal/impl/legacy_test.go
+++ b/internal/impl/legacy_test.go
@@ -473,7 +473,6 @@
 				xt := xt
 				go func() { xt.New() }()
 				go func() { xt.Zero() }()
-				go func() { xt.GoType() }()
 				go func() { xt.TypeDescriptor() }()
 			}
 
@@ -527,7 +526,6 @@
 				cmp.Transformer("", func(xt pref.ExtensionType) map[string]interface{} {
 					return map[string]interface{}{
 						"Descriptor": xt.TypeDescriptor(),
-						"GoType":     xt.GoType(),
 					}
 				}),
 				cmp.Transformer("", func(v pref.Value) interface{} {
diff --git a/internal/impl/message.go b/internal/impl/message.go
index 2e35c51..fe8f039 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -198,9 +198,6 @@
 	return si
 }
 
-func (mi *MessageInfo) GoType() reflect.Type {
-	return mi.GoReflectType
-}
 func (mi *MessageInfo) New() protoreflect.Message {
 	return mi.MessageOf(reflect.New(mi.GoReflectType.Elem()).Interface())
 }
diff --git a/internal/impl/message_reflect_test.go b/internal/impl/message_reflect_test.go
index 6148d4d..9026e6e 100644
--- a/internal/impl/message_reflect_test.go
+++ b/internal/impl/message_reflect_test.go
@@ -940,7 +940,6 @@
 func (e EnumProto2) Type() pref.EnumType             { return e }
 func (e EnumProto2) Enum() *EnumProto2               { return &e }
 func (e EnumProto2) Number() pref.EnumNumber         { return pref.EnumNumber(e) }
-func (t EnumProto2) GoType() reflect.Type            { return reflect.TypeOf(t) }
 func (t EnumProto2) New(n pref.EnumNumber) pref.Enum { return EnumProto2(n) }
 
 type EnumProto3 int32
@@ -954,7 +953,6 @@
 func (e EnumProto3) Type() pref.EnumType             { return e }
 func (e EnumProto3) Enum() *EnumProto3               { return &e }
 func (e EnumProto3) Number() pref.EnumNumber         { return pref.EnumNumber(e) }
-func (t EnumProto3) GoType() reflect.Type            { return reflect.TypeOf(t) }
 func (t EnumProto3) New(n pref.EnumNumber) pref.Enum { return EnumProto3(n) }
 
 type EnumMessages struct {
diff --git a/internal/testprotos/irregular/irregular.go b/internal/testprotos/irregular/irregular.go
index b328edb..69220ba 100644
--- a/internal/testprotos/irregular/irregular.go
+++ b/internal/testprotos/irregular/irregular.go
@@ -5,8 +5,6 @@
 package irregular
 
 import (
-	"reflect"
-
 	"google.golang.org/protobuf/encoding/prototext"
 	"google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
@@ -27,7 +25,6 @@
 func (m *message) Type() pref.MessageType             { return m }
 func (m *message) New() pref.Message                  { return &message{} }
 func (m *message) Zero() pref.Message                 { return (*message)(nil) }
-func (m *message) GoType() reflect.Type               { return reflect.TypeOf(&message{}) }
 func (m *message) Interface() pref.ProtoMessage       { return (*IrregularMessage)(m) }
 
 var fieldDescS = fileDesc.Messages().Get(0).Fields().Get(0)