Kaynağa Gözat

reflect/protoreflect: drop the ProtoEnum type

Drop the protoreflect.ProtoEnum type (containing a single method
returning a protoreflect.Enum) and make generated enum types
directly implement protoreflect.Enum instead.

Messages have a two-level type split (ProtoMessage and Message) to
minimize conflicts between reflection methods and field names. Enums
need no such split, since enums do not have fields and therefore have
no source of conflicts.

Change-Id: I2b6222e9404253e6bfef2217859e1b760ffcd29b
Reviewed-on: https://go-review.googlesource.com/c/156902
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
Reviewed-by: Damien Neil <dneil@google.com>
Damien Neil 7 yıl önce
ebeveyn
işleme
a8593bae57

+ 3 - 10
cmd/protoc-gen-go/internal_gengo/reflect.go

@@ -191,7 +191,7 @@ func genReflectFileDescriptor(gen *protogen.Plugin, g *protogen.GeneratedFile, f
 		for i, enum := range f.allEnums {
 			g.P(prototypePackage.Ident("GoEnum"), "(")
 			g.P(enumDescsVar, "[", i, "].Reference(),")
-			g.P("func(_ ", protoreflectPackage.Ident("EnumType"), ", n ", protoreflectPackage.Ident("EnumNumber"), ") ", protoreflectPackage.Ident("ProtoEnum"), " {")
+			g.P("func(_ ", protoreflectPackage.Ident("EnumType"), ", n ", protoreflectPackage.Ident("EnumNumber"), ") ", protoreflectPackage.Ident("Enum"), " {")
 			g.P("return ", enum.GoIdent, "(n)")
 			g.P("},")
 			g.P("),")
@@ -352,19 +352,12 @@ func genReflectEnum(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo
 		return
 	}
 
-	shadowType := shadowTypeName(enum.GoIdent)
-	g.P("type ", shadowType, " ", enum.GoIdent)
-	g.P()
-
 	idx := f.allEnumsByPtr[enum]
 	typesVar := enumTypesVarName(f)
-	g.P("func (e ", enum.GoIdent, ") ProtoReflect() ", protoreflectPackage.Ident("Enum"), " {")
-	g.P("return (", shadowType, ")(e)")
-	g.P("}")
-	g.P("func (e ", shadowType, ") Type() ", protoreflectPackage.Ident("EnumType"), " {")
+	g.P("func (e ", enum.GoIdent, ") Type() ", protoreflectPackage.Ident("EnumType"), " {")
 	g.P("return ", typesVar, "[", idx, "]")
 	g.P("}")
-	g.P("func (e ", shadowType, ") Number() ", protoreflectPackage.Ident("EnumNumber"), " {")
+	g.P("func (e ", enum.GoIdent, ") Number() ", protoreflectPackage.Ident("EnumNumber"), " {")
 	g.P("return ", protoreflectPackage.Ident("EnumNumber"), "(e)")
 	g.P("}")
 }

+ 3 - 8
cmd/protoc-gen-go/testdata/annotations/annotations.pb.go

@@ -22,15 +22,10 @@ const (
 	AnnotationsTestEnum_ANNOTATIONS_TEST_ENUM_VALUE AnnotationsTestEnum = 0
 )
 
-type xxx_AnnotationsTestEnum AnnotationsTestEnum
-
-func (e AnnotationsTestEnum) ProtoReflect() protoreflect.Enum {
-	return (xxx_AnnotationsTestEnum)(e)
-}
-func (e xxx_AnnotationsTestEnum) Type() protoreflect.EnumType {
+func (e AnnotationsTestEnum) Type() protoreflect.EnumType {
 	return xxx_Annotations_ProtoFile_EnumTypes[0]
 }
-func (e xxx_AnnotationsTestEnum) Number() protoreflect.EnumNumber {
+func (e AnnotationsTestEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -167,7 +162,7 @@ var xxx_Annotations_ProtoFile_FileDesc = prototype.File{
 var xxx_Annotations_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Annotations_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return AnnotationsTestEnum(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/comments/deprecated.pb.go

@@ -21,15 +21,10 @@ const (
 	DeprecatedEnum_DEPRECATED DeprecatedEnum = 0 // Deprecated: Do not use.
 )
 
-type xxx_DeprecatedEnum DeprecatedEnum
-
-func (e DeprecatedEnum) ProtoReflect() protoreflect.Enum {
-	return (xxx_DeprecatedEnum)(e)
-}
-func (e xxx_DeprecatedEnum) Type() protoreflect.EnumType {
+func (e DeprecatedEnum) Type() protoreflect.EnumType {
 	return xxx_Deprecated_ProtoFile_EnumTypes[0]
 }
-func (e xxx_DeprecatedEnum) Number() protoreflect.EnumNumber {
+func (e DeprecatedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -153,7 +148,7 @@ var xxx_Deprecated_ProtoFile_FileDesc = prototype.File{
 var xxx_Deprecated_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Deprecated_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return DeprecatedEnum(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go

@@ -24,15 +24,10 @@ const (
 	Enum_ZERO Enum = 0
 )
 
-type xxx_Enum Enum
-
-func (e Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum)(e)
-}
-func (e xxx_Enum) Type() protoreflect.EnumType {
+func (e Enum) Type() protoreflect.EnumType {
 	return xxx_Ext_ProtoFile_EnumTypes[0]
 }
-func (e xxx_Enum) Number() protoreflect.EnumNumber {
+func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -1058,7 +1053,7 @@ var xxx_Ext_ProtoFile_FileDesc = prototype.File{
 var xxx_Ext_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Ext_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go

@@ -23,15 +23,10 @@ const (
 	Enum_ZERO Enum = 0
 )
 
-type xxx_Enum Enum
-
-func (e Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum)(e)
-}
-func (e xxx_Enum) Type() protoreflect.EnumType {
+func (e Enum) Type() protoreflect.EnumType {
 	return xxx_Ext3_ProtoFile_EnumTypes[0]
 }
-func (e xxx_Enum) Number() protoreflect.EnumNumber {
+func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -523,7 +518,7 @@ var xxx_Ext3_ProtoFile_FileDesc = prototype.File{
 var xxx_Ext3_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Ext3_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum(n)
 		},
 	),

+ 9 - 24
cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go

@@ -28,15 +28,10 @@ const (
 	E_ZERO E = 0
 )
 
-type xxx_E E
-
-func (e E) ProtoReflect() protoreflect.Enum {
-	return (xxx_E)(e)
-}
-func (e xxx_E) Type() protoreflect.EnumType {
+func (e E) Type() protoreflect.EnumType {
 	return xxx_A_ProtoFile_EnumTypes[0]
 }
-func (e xxx_E) Number() protoreflect.EnumNumber {
+func (e E) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -77,15 +72,10 @@ const (
 	M_M_ZERO M_Subenum = 0
 )
 
-type xxx_M_Subenum M_Subenum
-
-func (e M_Subenum) ProtoReflect() protoreflect.Enum {
-	return (xxx_M_Subenum)(e)
-}
-func (e xxx_M_Subenum) Type() protoreflect.EnumType {
+func (e M_Subenum) Type() protoreflect.EnumType {
 	return xxx_A_ProtoFile_EnumTypes[1]
 }
-func (e xxx_M_Subenum) Number() protoreflect.EnumNumber {
+func (e M_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -126,15 +116,10 @@ const (
 	M_Submessage_M_SUBMESSAGE_ZERO M_Submessage_Submessage_Subenum = 0
 )
 
-type xxx_M_Submessage_Submessage_Subenum M_Submessage_Submessage_Subenum
-
-func (e M_Submessage_Submessage_Subenum) ProtoReflect() protoreflect.Enum {
-	return (xxx_M_Submessage_Submessage_Subenum)(e)
-}
-func (e xxx_M_Submessage_Submessage_Subenum) Type() protoreflect.EnumType {
+func (e M_Submessage_Submessage_Subenum) Type() protoreflect.EnumType {
 	return xxx_A_ProtoFile_EnumTypes[2]
 }
-func (e xxx_M_Submessage_Submessage_Subenum) Number() protoreflect.EnumNumber {
+func (e M_Submessage_Submessage_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -491,19 +476,19 @@ var xxx_A_ProtoFile_FileDesc = prototype.File{
 var xxx_A_ProtoFile_EnumTypes = [3]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_A_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return E(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_A_ProtoFile_EnumDescs[1].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return M_Subenum(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_A_ProtoFile_EnumDescs[2].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return M_Submessage_Submessage_Subenum(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go

@@ -22,15 +22,10 @@ const (
 	E1_E1_ZERO E1 = 0
 )
 
-type xxx_E1 E1
-
-func (e E1) ProtoReflect() protoreflect.Enum {
-	return (xxx_E1)(e)
-}
-func (e xxx_E1) Type() protoreflect.EnumType {
+func (e E1) Type() protoreflect.EnumType {
 	return xxx_M1_ProtoFile_EnumTypes[0]
 }
-func (e xxx_E1) Number() protoreflect.EnumNumber {
+func (e E1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -201,7 +196,7 @@ var xxx_M1_ProtoFile_FileDesc = prototype.File{
 var xxx_M1_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_M1_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return E1(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go

@@ -22,15 +22,10 @@ const (
 	Enum_ZERO Enum = 0
 )
 
-type xxx_Enum Enum
-
-func (e Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum)(e)
-}
-func (e xxx_Enum) Type() protoreflect.EnumType {
+func (e Enum) Type() protoreflect.EnumType {
 	return xxx_Nopackage_ProtoFile_EnumTypes[0]
 }
-func (e xxx_Enum) Number() protoreflect.EnumNumber {
+func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -174,7 +169,7 @@ var xxx_Nopackage_ProtoFile_FileDesc = prototype.File{
 var xxx_Nopackage_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Nopackage_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum(n)
 		},
 	),

+ 18 - 48
cmd/protoc-gen-go/testdata/proto2/enum.pb.go

@@ -26,15 +26,10 @@ const (
 	EnumType1_TWO EnumType1 = 2
 )
 
-type xxx_EnumType1 EnumType1
-
-func (e EnumType1) ProtoReflect() protoreflect.Enum {
-	return (xxx_EnumType1)(e)
-}
-func (e xxx_EnumType1) Type() protoreflect.EnumType {
+func (e EnumType1) Type() protoreflect.EnumType {
 	return xxx_Enum_ProtoFile_EnumTypes[0]
 }
-func (e xxx_EnumType1) Number() protoreflect.EnumNumber {
+func (e EnumType1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -78,15 +73,10 @@ const (
 	EnumType2_duplicate2 EnumType2 = 1
 )
 
-type xxx_EnumType2 EnumType2
-
-func (e EnumType2) ProtoReflect() protoreflect.Enum {
-	return (xxx_EnumType2)(e)
-}
-func (e xxx_EnumType2) Type() protoreflect.EnumType {
+func (e EnumType2) Type() protoreflect.EnumType {
 	return xxx_Enum_ProtoFile_EnumTypes[1]
 }
-func (e xxx_EnumType2) Number() protoreflect.EnumNumber {
+func (e EnumType2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -131,15 +121,10 @@ const (
 	EnumContainerMessage1_NESTED_1A_VALUE EnumContainerMessage1_NestedEnumType1A = 0
 )
 
-type xxx_EnumContainerMessage1_NestedEnumType1A EnumContainerMessage1_NestedEnumType1A
-
-func (e EnumContainerMessage1_NestedEnumType1A) ProtoReflect() protoreflect.Enum {
-	return (xxx_EnumContainerMessage1_NestedEnumType1A)(e)
-}
-func (e xxx_EnumContainerMessage1_NestedEnumType1A) Type() protoreflect.EnumType {
+func (e EnumContainerMessage1_NestedEnumType1A) Type() protoreflect.EnumType {
 	return xxx_Enum_ProtoFile_EnumTypes[2]
 }
-func (e xxx_EnumContainerMessage1_NestedEnumType1A) Number() protoreflect.EnumNumber {
+func (e EnumContainerMessage1_NestedEnumType1A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -180,15 +165,10 @@ const (
 	EnumContainerMessage1_NESTED_1B_VALUE EnumContainerMessage1_NestedEnumType1B = 0
 )
 
-type xxx_EnumContainerMessage1_NestedEnumType1B EnumContainerMessage1_NestedEnumType1B
-
-func (e EnumContainerMessage1_NestedEnumType1B) ProtoReflect() protoreflect.Enum {
-	return (xxx_EnumContainerMessage1_NestedEnumType1B)(e)
-}
-func (e xxx_EnumContainerMessage1_NestedEnumType1B) Type() protoreflect.EnumType {
+func (e EnumContainerMessage1_NestedEnumType1B) Type() protoreflect.EnumType {
 	return xxx_Enum_ProtoFile_EnumTypes[3]
 }
-func (e xxx_EnumContainerMessage1_NestedEnumType1B) Number() protoreflect.EnumNumber {
+func (e EnumContainerMessage1_NestedEnumType1B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -231,15 +211,10 @@ const (
 	EnumContainerMessage1_EnumContainerMessage2_NESTED_2A_VALUE EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A = 0
 )
 
-type xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A
-
-func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) ProtoReflect() protoreflect.Enum {
-	return (xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A)(e)
-}
-func (e xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Type() protoreflect.EnumType {
+func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Type() protoreflect.EnumType {
 	return xxx_Enum_ProtoFile_EnumTypes[4]
 }
-func (e xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Number() protoreflect.EnumNumber {
+func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -280,15 +255,10 @@ const (
 	EnumContainerMessage1_EnumContainerMessage2_NESTED_2B_VALUE EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B = 0
 )
 
-type xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B
-
-func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) ProtoReflect() protoreflect.Enum {
-	return (xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B)(e)
-}
-func (e xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Type() protoreflect.EnumType {
+func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Type() protoreflect.EnumType {
 	return xxx_Enum_ProtoFile_EnumTypes[5]
 }
-func (e xxx_EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Number() protoreflect.EnumNumber {
+func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -509,37 +479,37 @@ var xxx_Enum_ProtoFile_FileDesc = prototype.File{
 var xxx_Enum_ProtoFile_EnumTypes = [6]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Enum_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return EnumType1(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Enum_ProtoFile_EnumDescs[1].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return EnumType2(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Enum_ProtoFile_EnumDescs[2].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return EnumContainerMessage1_NestedEnumType1A(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Enum_ProtoFile_EnumDescs[3].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return EnumContainerMessage1_NestedEnumType1B(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Enum_ProtoFile_EnumDescs[4].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Enum_ProtoFile_EnumDescs[5].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/proto2/fields.pb.go

@@ -24,15 +24,10 @@ const (
 	FieldTestMessage_ONE  FieldTestMessage_Enum = 1
 )
 
-type xxx_FieldTestMessage_Enum FieldTestMessage_Enum
-
-func (e FieldTestMessage_Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_FieldTestMessage_Enum)(e)
-}
-func (e xxx_FieldTestMessage_Enum) Type() protoreflect.EnumType {
+func (e FieldTestMessage_Enum) Type() protoreflect.EnumType {
 	return xxx_Fields_ProtoFile_EnumTypes[0]
 }
-func (e xxx_FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
+func (e FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -1608,7 +1603,7 @@ var xxx_Fields_ProtoFile_FileDesc = prototype.File{
 var xxx_Fields_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Fields_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return FieldTestMessage_Enum(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/proto3/enum.pb.go

@@ -24,15 +24,10 @@ const (
 	Enum_TWO  Enum = 2
 )
 
-type xxx_Enum Enum
-
-func (e Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum)(e)
-}
-func (e xxx_Enum) Type() protoreflect.EnumType {
+func (e Enum) Type() protoreflect.EnumType {
 	return xxx_Enum_ProtoFile_EnumTypes[0]
 }
-func (e xxx_Enum) Number() protoreflect.EnumNumber {
+func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -95,7 +90,7 @@ var xxx_Enum_ProtoFile_FileDesc = prototype.File{
 var xxx_Enum_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Enum_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum(n)
 		},
 	),

+ 3 - 8
cmd/protoc-gen-go/testdata/proto3/fields.pb.go

@@ -22,15 +22,10 @@ const (
 	FieldTestMessage_ZERO FieldTestMessage_Enum = 0
 )
 
-type xxx_FieldTestMessage_Enum FieldTestMessage_Enum
-
-func (e FieldTestMessage_Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_FieldTestMessage_Enum)(e)
-}
-func (e xxx_FieldTestMessage_Enum) Type() protoreflect.EnumType {
+func (e FieldTestMessage_Enum) Type() protoreflect.EnumType {
 	return xxx_Fields_ProtoFile_EnumTypes[0]
 }
-func (e xxx_FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
+func (e FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -542,7 +537,7 @@ var xxx_Fields_ProtoFile_FileDesc = prototype.File{
 var xxx_Fields_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Fields_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return FieldTestMessage_Enum(n)
 		},
 	),

+ 6 - 16
encoding/textpb/testprotos/pb2/test.pb.go

@@ -31,15 +31,10 @@ const (
 	Enum_TENTH   Enum = 10
 )
 
-type xxx_Enum Enum
-
-func (e Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum)(e)
-}
-func (e xxx_Enum) Type() protoreflect.EnumType {
+func (e Enum) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[0]
 }
-func (e xxx_Enum) Number() protoreflect.EnumNumber {
+func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -88,15 +83,10 @@ const (
 	Enums_DIEZ Enums_NestedEnum = 10
 )
 
-type xxx_Enums_NestedEnum Enums_NestedEnum
-
-func (e Enums_NestedEnum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enums_NestedEnum)(e)
-}
-func (e xxx_Enums_NestedEnum) Type() protoreflect.EnumType {
+func (e Enums_NestedEnum) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[1]
 }
-func (e xxx_Enums_NestedEnum) Number() protoreflect.EnumNumber {
+func (e Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -2216,13 +2206,13 @@ var xxx_Test_ProtoFile_FileDesc = prototype.File{
 var xxx_Test_ProtoFile_EnumTypes = [2]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[1].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enums_NestedEnum(n)
 		},
 	),

+ 6 - 16
encoding/textpb/testprotos/pb3/test.pb.go

@@ -25,15 +25,10 @@ const (
 	Enum_TEN  Enum = 10
 )
 
-type xxx_Enum Enum
-
-func (e Enum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum)(e)
-}
-func (e xxx_Enum) Type() protoreflect.EnumType {
+func (e Enum) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[0]
 }
-func (e xxx_Enum) Number() protoreflect.EnumNumber {
+func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -68,15 +63,10 @@ const (
 	Enums_DIEZ Enums_NestedEnum = 10
 )
 
-type xxx_Enums_NestedEnum Enums_NestedEnum
-
-func (e Enums_NestedEnum) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enums_NestedEnum)(e)
-}
-func (e xxx_Enums_NestedEnum) Type() protoreflect.EnumType {
+func (e Enums_NestedEnum) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[1]
 }
-func (e xxx_Enums_NestedEnum) Number() protoreflect.EnumNumber {
+func (e Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -535,13 +525,13 @@ var xxx_Test_ProtoFile_FileDesc = prototype.File{
 var xxx_Test_ProtoFile_EnumTypes = [2]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[1].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enums_NestedEnum(n)
 		},
 	),

+ 6 - 6
internal/impl/export.go

@@ -18,8 +18,8 @@ type Export struct{}
 // ProtoReflect method, otherwise it wraps the v1 enum to implement
 // the v2 reflective interface.
 func (Export) EnumOf(e interface{}) pref.Enum {
-	if ev, ok := e.(pref.ProtoEnum); ok {
-		return ev.ProtoReflect()
+	if ev, ok := e.(pref.Enum); ok {
+		return ev
 	}
 	return legacyWrapper.EnumOf(e)
 }
@@ -29,8 +29,8 @@ func (Export) EnumOf(e interface{}) pref.Enum {
 // calling the ProtoReflect.Type method, otherwise it derives an enum type
 // from the v1 named int32 type.
 func (Export) EnumTypeOf(e interface{}) pref.EnumType {
-	if ev, ok := e.(pref.ProtoEnum); ok {
-		return ev.ProtoReflect().Type()
+	if ev, ok := e.(pref.Enum); ok {
+		return ev.Type()
 	}
 	return legacyWrapper.EnumTypeOf(e)
 }
@@ -67,8 +67,8 @@ func (Export) ExtensionTypeOf(d pref.ExtensionDescriptor, t interface{}) pref.Ex
 	switch t := t.(type) {
 	case nil:
 		return ptype.GoExtension(d, nil, nil)
-	case pref.ProtoEnum:
-		return ptype.GoExtension(d, t.ProtoReflect().Type(), nil)
+	case pref.Enum:
+		return ptype.GoExtension(d, t.Type(), nil)
 	case pref.ProtoMessage:
 		return ptype.GoExtension(d, nil, t.ProtoReflect().Type())
 	}

+ 2 - 4
internal/impl/message_test.go

@@ -936,7 +936,7 @@ var enumProto2Type = ptype.GoEnum(
 		FullName: "EnumProto2",
 		Values:   []ptype.EnumValue{{Name: "DEAD", Number: 0xdead}, {Name: "BEEF", Number: 0xbeef}},
 	}),
-	func(_ pref.EnumType, n pref.EnumNumber) pref.ProtoEnum {
+	func(_ pref.EnumType, n pref.EnumNumber) pref.Enum {
 		return EnumProto2(n)
 	},
 )
@@ -944,7 +944,6 @@ var enumProto2Type = ptype.GoEnum(
 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) }
-func (e EnumProto2) ProtoReflect() pref.Enum { return e }
 
 type EnumProto3 int32
 
@@ -954,7 +953,7 @@ var enumProto3Type = ptype.GoEnum(
 		FullName: "EnumProto3",
 		Values:   []ptype.EnumValue{{Name: "ALPHA", Number: 0}, {Name: "BRAVO", Number: 1}},
 	}),
-	func(_ pref.EnumType, n pref.EnumNumber) pref.ProtoEnum {
+	func(_ pref.EnumType, n pref.EnumNumber) pref.Enum {
 		return EnumProto3(n)
 	},
 )
@@ -962,7 +961,6 @@ var enumProto3Type = ptype.GoEnum(
 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) }
-func (e EnumProto3) ProtoReflect() pref.Enum { return e }
 
 type EnumMessages struct {
 	EnumP2        *EnumProto2              `protobuf:"1"`

+ 5 - 6
internal/legacy/enum.go

@@ -17,9 +17,9 @@ import (
 	descriptorpb "github.com/golang/protobuf/v2/types/descriptor"
 )
 
-// wrapEnum wraps v as a protoreflect.ProtoEnum,
+// wrapEnum wraps v as a protoreflect.Enum,
 // where v must be a int32 kind and not implement the v2 API already.
-func wrapEnum(v reflect.Value) pref.ProtoEnum {
+func wrapEnum(v reflect.Value) pref.Enum {
 	et := loadEnumType(v.Type())
 	return et.New(pref.EnumNumber(v.Int()))
 }
@@ -37,9 +37,9 @@ func loadEnumType(t reflect.Type) pref.EnumType {
 	// Slow-path: derive enum descriptor and initialize EnumType.
 	var m sync.Map // map[protoreflect.EnumNumber]proto.Enum
 	ed := loadEnumDesc(t)
-	et := ptype.GoEnum(ed, func(et pref.EnumType, n pref.EnumNumber) pref.ProtoEnum {
+	et := ptype.GoEnum(ed, func(et pref.EnumType, n pref.EnumNumber) pref.Enum {
 		if e, ok := m.Load(n); ok {
-			return e.(pref.ProtoEnum)
+			return e.(pref.Enum)
 		}
 		e := &enumWrapper{num: n, pbTyp: et, goTyp: t}
 		m.Store(n, e)
@@ -72,7 +72,6 @@ func (e *enumWrapper) ProtoUnwrap() interface{} {
 
 var (
 	_ pref.Enum        = (*enumWrapper)(nil)
-	_ pref.ProtoEnum   = (*enumWrapper)(nil)
 	_ pvalue.Unwrapper = (*enumWrapper)(nil)
 )
 
@@ -99,7 +98,7 @@ func loadEnumDesc(t reflect.Type) pref.EnumDescriptor {
 	// Derive the enum descriptor from the raw descriptor proto.
 	e := new(ptype.StandaloneEnum)
 	ev := reflect.Zero(t).Interface()
-	if _, ok := ev.(pref.ProtoEnum); ok {
+	if _, ok := ev.(pref.Enum); ok {
 		panic(fmt.Sprintf("%v already implements proto.Enum", t))
 	}
 	if ed, ok := ev.(enumV1); ok {

+ 1 - 1
internal/legacy/export.go

@@ -18,7 +18,7 @@ import (
 type Export struct{}
 
 func (Export) EnumOf(e interface{}) pvalue.LegacyEnum {
-	return wrapEnum(reflect.ValueOf(e)).ProtoReflect().(pvalue.LegacyEnum)
+	return wrapEnum(reflect.ValueOf(e)).(pvalue.LegacyEnum)
 }
 
 func (Export) EnumTypeOf(e interface{}) pref.EnumType {

+ 2 - 2
internal/legacy/message.go

@@ -219,8 +219,8 @@ func (ms *messageDescSet) parseField(tag, tagKey, tagVal string, goType reflect.
 
 	// Populate EnumType and MessageType.
 	if f.EnumType == nil && f.Kind == pref.EnumKind {
-		if ev, ok := reflect.Zero(t).Interface().(pref.ProtoEnum); ok {
-			f.EnumType = ev.ProtoReflect().Type()
+		if ev, ok := reflect.Zero(t).Interface().(pref.Enum); ok {
+			f.EnumType = ev.Type()
 		} else {
 			f.EnumType = loadEnumDesc(t)
 		}

+ 3 - 8
internal/testprotos/test/test.pb.go

@@ -25,15 +25,10 @@ const (
 	TestAllTypes_NEG TestAllTypes_NestedEnum = -1
 )
 
-type xxx_TestAllTypes_NestedEnum TestAllTypes_NestedEnum
-
-func (e TestAllTypes_NestedEnum) ProtoReflect() protoreflect.Enum {
-	return (xxx_TestAllTypes_NestedEnum)(e)
-}
-func (e xxx_TestAllTypes_NestedEnum) Type() protoreflect.EnumType {
+func (e TestAllTypes_NestedEnum) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[0]
 }
-func (e xxx_TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
+func (e TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -1622,7 +1617,7 @@ var xxx_Test_ProtoFile_FileDesc = prototype.File{
 var xxx_Test_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return TestAllTypes_NestedEnum(n)
 		},
 	),

+ 4 - 4
internal/value/convert.go

@@ -31,7 +31,7 @@ var (
 	stringType  = reflect.TypeOf(string(""))
 	bytesType   = reflect.TypeOf([]byte(nil))
 
-	enumIfaceV2    = reflect.TypeOf((*pref.ProtoEnum)(nil)).Elem()
+	enumIfaceV2    = reflect.TypeOf((*pref.Enum)(nil)).Elem()
 	messageIfaceV1 = reflect.TypeOf((*papi.Message)(nil)).Elem()
 	messageIfaceV2 = reflect.TypeOf((*pref.ProtoMessage)(nil)).Elem()
 
@@ -122,14 +122,14 @@ func NewLegacyConverter(t reflect.Type, k pref.Kind, w LegacyWrapper) Converter
 	case pref.EnumKind:
 		// Handle v2 enums, which must satisfy the proto.Enum interface.
 		if t.Kind() != reflect.Ptr && t.Implements(enumIfaceV2) {
-			et := reflect.Zero(t).Interface().(pref.ProtoEnum).ProtoReflect().Type()
+			et := reflect.Zero(t).Interface().(pref.Enum).Type()
 			return Converter{
 				PBValueOf: func(v reflect.Value) pref.Value {
 					if v.Type() != t {
 						panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), t))
 					}
-					e := v.Interface().(pref.ProtoEnum)
-					return pref.ValueOf(e.ProtoReflect().Number())
+					e := v.Interface().(pref.Enum)
+					return pref.ValueOf(e.Number())
 				},
 				GoValueOf: func(v pref.Value) reflect.Value {
 					rv := reflect.ValueOf(et.New(v.Enum()))

+ 0 - 5
reflect/protoreflect/proto.go

@@ -41,11 +41,6 @@ type doNotImplement pragma.DoNotImplement
 // use the proto.Message type instead, which aliases this type.
 type ProtoMessage interface{ ProtoReflect() Message }
 
-// ProtoEnum is the top-level interface that all proto enums implement.
-// This is declared in the protoreflect package to avoid a cyclic dependency;
-// use the proto.Enum type instead, which aliases this type.
-type ProtoEnum interface{ ProtoReflect() Enum }
-
 // Syntax is the language version of the proto file.
 type Syntax syntax
 

+ 1 - 1
reflect/protoreflect/type.go

@@ -470,7 +470,7 @@ type EnumType interface {
 	EnumDescriptor
 
 	// New returns an instance of this enum type with its value set to n.
-	New(n EnumNumber) ProtoEnum
+	New(n EnumNumber) Enum
 
 	// GoType returns the Go type of the enum value.
 	//

+ 1 - 1
reflect/protoreflect/value_union.go

@@ -96,7 +96,7 @@ func ValueOf(v interface{}) Value {
 	case Message, List, Map:
 		return valueOfIface(v)
 	default:
-		// TODO: Special case ProtoEnum, ProtoMessage, *[]T, and *map[K]V?
+		// TODO: Special case Enum, ProtoMessage, *[]T, and *map[K]V?
 		// Note: this would violate the documented invariant in Interface.
 		panic(fmt.Sprintf("invalid type: %v", reflect.TypeOf(v)))
 	}

+ 3 - 3
reflect/protoregistry/registry_test.go

@@ -326,9 +326,9 @@ func TestTypes(t *testing.T) {
 	mt1 := (&testpb.Message1{}).ProtoReflect().Type()
 	mt2 := (&testpb.Message2{}).ProtoReflect().Type()
 	mt3 := (&testpb.Message3{}).ProtoReflect().Type()
-	et1 := testpb.Enum1_ONE.ProtoReflect().Type()
-	et2 := testpb.Enum2_UNO.ProtoReflect().Type()
-	et3 := testpb.Enum3_YI.ProtoReflect().Type()
+	et1 := testpb.Enum1_ONE.Type()
+	et2 := testpb.Enum2_UNO.Type()
+	et3 := testpb.Enum3_YI.Type()
 	// Suffix indicates field number.
 	xt11 := extensionType(testpb.E_StringField)
 	xt12 := extensionType(testpb.E_EnumField)

+ 9 - 24
reflect/protoregistry/testprotos/test.pb.go

@@ -22,15 +22,10 @@ const (
 	Enum1_ONE Enum1 = 1
 )
 
-type xxx_Enum1 Enum1
-
-func (e Enum1) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum1)(e)
-}
-func (e xxx_Enum1) Type() protoreflect.EnumType {
+func (e Enum1) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[0]
 }
-func (e xxx_Enum1) Number() protoreflect.EnumNumber {
+func (e Enum1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -71,15 +66,10 @@ const (
 	Enum2_UNO Enum2 = 1
 )
 
-type xxx_Enum2 Enum2
-
-func (e Enum2) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum2)(e)
-}
-func (e xxx_Enum2) Type() protoreflect.EnumType {
+func (e Enum2) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[1]
 }
-func (e xxx_Enum2) Number() protoreflect.EnumNumber {
+func (e Enum2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -120,15 +110,10 @@ const (
 	Enum3_YI Enum3 = 1
 )
 
-type xxx_Enum3 Enum3
-
-func (e Enum3) ProtoReflect() protoreflect.Enum {
-	return (xxx_Enum3)(e)
-}
-func (e xxx_Enum3) Type() protoreflect.EnumType {
+func (e Enum3) Type() protoreflect.EnumType {
 	return xxx_Test_ProtoFile_EnumTypes[2]
 }
-func (e xxx_Enum3) Number() protoreflect.EnumNumber {
+func (e Enum3) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -492,19 +477,19 @@ var xxx_Test_ProtoFile_FileDesc = prototype.File{
 var xxx_Test_ProtoFile_EnumTypes = [3]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum1(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[1].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum2(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Test_ProtoFile_EnumDescs[2].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return Enum3(n)
 		},
 	),

+ 4 - 4
reflect/prototype/go_type.go

@@ -16,7 +16,7 @@ import (
 
 // GoEnum creates a new protoreflect.EnumType by combining the provided
 // protoreflect.EnumDescriptor with the provided constructor function.
-func GoEnum(ed protoreflect.EnumDescriptor, fn func(protoreflect.EnumType, protoreflect.EnumNumber) protoreflect.ProtoEnum) protoreflect.EnumType {
+func GoEnum(ed protoreflect.EnumDescriptor, fn func(protoreflect.EnumType, protoreflect.EnumNumber) protoreflect.Enum) protoreflect.EnumType {
 	if ed.IsPlaceholder() {
 		panic("enum descriptor must not be a placeholder")
 	}
@@ -25,7 +25,7 @@ func GoEnum(ed protoreflect.EnumDescriptor, fn func(protoreflect.EnumType, proto
 
 type goEnum struct {
 	protoreflect.EnumDescriptor
-	new func(protoreflect.EnumType, protoreflect.EnumNumber) protoreflect.ProtoEnum
+	new func(protoreflect.EnumType, protoreflect.EnumNumber) protoreflect.Enum
 
 	once sync.Once
 	typ  reflect.Type
@@ -35,7 +35,7 @@ func (t *goEnum) GoType() reflect.Type {
 	t.New(0) // initialize t.typ
 	return t.typ
 }
-func (t *goEnum) New(n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+func (t *goEnum) New(n protoreflect.EnumNumber) protoreflect.Enum {
 	e := t.new(t, n)
 	t.once.Do(func() { t.typ = reflect.TypeOf(e) })
 	if t.typ != reflect.TypeOf(e) {
@@ -208,7 +208,7 @@ func (t *goExtension) lazyInit() {
 					return t.enumType.New(t.Default().Enum())
 				}
 				t.valueOf = func(v interface{}) protoreflect.Value {
-					ev := v.(protoreflect.ProtoEnum).ProtoReflect()
+					ev := v.(protoreflect.Enum)
 					return protoreflect.ValueOf(ev.Number())
 				}
 				t.interfaceOf = func(pv protoreflect.Value) interface{} {

+ 18 - 48
types/descriptor/descriptor.pb.go

@@ -44,15 +44,10 @@ const (
 	FieldDescriptorProto_TYPE_SINT64   FieldDescriptorProto_Type = 18
 )
 
-type xxx_FieldDescriptorProto_Type FieldDescriptorProto_Type
-
-func (e FieldDescriptorProto_Type) ProtoReflect() protoreflect.Enum {
-	return (xxx_FieldDescriptorProto_Type)(e)
-}
-func (e xxx_FieldDescriptorProto_Type) Type() protoreflect.EnumType {
+func (e FieldDescriptorProto_Type) Type() protoreflect.EnumType {
 	return xxx_Descriptor_ProtoFile_EnumTypes[0]
 }
-func (e xxx_FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
+func (e FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -130,15 +125,10 @@ const (
 	FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3
 )
 
-type xxx_FieldDescriptorProto_Label FieldDescriptorProto_Label
-
-func (e FieldDescriptorProto_Label) ProtoReflect() protoreflect.Enum {
-	return (xxx_FieldDescriptorProto_Label)(e)
-}
-func (e xxx_FieldDescriptorProto_Label) Type() protoreflect.EnumType {
+func (e FieldDescriptorProto_Label) Type() protoreflect.EnumType {
 	return xxx_Descriptor_ProtoFile_EnumTypes[1]
 }
-func (e xxx_FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
+func (e FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -187,15 +177,10 @@ const (
 	FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3
 )
 
-type xxx_FileOptions_OptimizeMode FileOptions_OptimizeMode
-
-func (e FileOptions_OptimizeMode) ProtoReflect() protoreflect.Enum {
-	return (xxx_FileOptions_OptimizeMode)(e)
-}
-func (e xxx_FileOptions_OptimizeMode) Type() protoreflect.EnumType {
+func (e FileOptions_OptimizeMode) Type() protoreflect.EnumType {
 	return xxx_Descriptor_ProtoFile_EnumTypes[2]
 }
-func (e xxx_FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
+func (e FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -243,15 +228,10 @@ const (
 	FieldOptions_STRING_PIECE FieldOptions_CType = 2
 )
 
-type xxx_FieldOptions_CType FieldOptions_CType
-
-func (e FieldOptions_CType) ProtoReflect() protoreflect.Enum {
-	return (xxx_FieldOptions_CType)(e)
-}
-func (e xxx_FieldOptions_CType) Type() protoreflect.EnumType {
+func (e FieldOptions_CType) Type() protoreflect.EnumType {
 	return xxx_Descriptor_ProtoFile_EnumTypes[3]
 }
-func (e xxx_FieldOptions_CType) Number() protoreflect.EnumNumber {
+func (e FieldOptions_CType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -301,15 +281,10 @@ const (
 	FieldOptions_JS_NUMBER FieldOptions_JSType = 2
 )
 
-type xxx_FieldOptions_JSType FieldOptions_JSType
-
-func (e FieldOptions_JSType) ProtoReflect() protoreflect.Enum {
-	return (xxx_FieldOptions_JSType)(e)
-}
-func (e xxx_FieldOptions_JSType) Type() protoreflect.EnumType {
+func (e FieldOptions_JSType) Type() protoreflect.EnumType {
 	return xxx_Descriptor_ProtoFile_EnumTypes[4]
 }
-func (e xxx_FieldOptions_JSType) Number() protoreflect.EnumNumber {
+func (e FieldOptions_JSType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -359,15 +334,10 @@ const (
 	MethodOptions_IDEMPOTENT          MethodOptions_IdempotencyLevel = 2
 )
 
-type xxx_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel
-
-func (e MethodOptions_IdempotencyLevel) ProtoReflect() protoreflect.Enum {
-	return (xxx_MethodOptions_IdempotencyLevel)(e)
-}
-func (e xxx_MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType {
+func (e MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType {
 	return xxx_Descriptor_ProtoFile_EnumTypes[5]
 }
-func (e xxx_MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
+func (e MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
 }
 
@@ -3035,37 +3005,37 @@ var xxx_Descriptor_ProtoFile_FileDesc = prototype.File{
 var xxx_Descriptor_ProtoFile_EnumTypes = [6]protoreflect.EnumType{
 	prototype.GoEnum(
 		xxx_Descriptor_ProtoFile_EnumDescs[0].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return FieldDescriptorProto_Type(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Descriptor_ProtoFile_EnumDescs[1].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return FieldDescriptorProto_Label(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Descriptor_ProtoFile_EnumDescs[2].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return FileOptions_OptimizeMode(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Descriptor_ProtoFile_EnumDescs[3].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return FieldOptions_CType(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Descriptor_ProtoFile_EnumDescs[4].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return FieldOptions_JSType(n)
 		},
 	),
 	prototype.GoEnum(
 		xxx_Descriptor_ProtoFile_EnumDescs[5].Reference(),
-		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
+		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
 			return MethodOptions_IdempotencyLevel(n)
 		},
 	),