Explorar o código

reflect/protoreflect: add Enum.Type and Message.Type

CL/174938 removed these methods in favor of a method that returned
only the descriptors. This CL adds back in the Type methods alongside
the Descriptor methods.

In a vast majority of protobuf usages, only the descriptor information
is needed. However, there is a small percentage that legitimately needs
the Go type information. We should provide both, but document that the
descriptor-only information is preferred.

Change-Id: Ia0a098997fb1bd009994940ae8ea5257ccd87cae
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/184578
Reviewed-by: Damien Neil <dneil@google.com>
Joe Tsai %!s(int64=6) %!d(string=hai) anos
pai
achega
d421150c3b
Modificáronse 44 ficheiros con 720 adicións e 67 borrados
  1. 6 0
      cmd/protoc-gen-go/internal_gengo/reflect.go
  2. 4 0
      cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
  3. 1 1
      cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
  4. 4 0
      cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
  5. 4 0
      cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
  6. 4 0
      cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
  7. 12 0
      cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
  8. 4 0
      cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
  9. 4 0
      cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
  10. 24 0
      cmd/protoc-gen-go/testdata/proto2/enum.pb.go
  11. 4 0
      cmd/protoc-gen-go/testdata/proto2/fields.pb.go
  12. 4 0
      cmd/protoc-gen-go/testdata/proto3/enum.pb.go
  13. 4 0
      cmd/protoc-gen-go/testdata/proto3/fields.pb.go
  14. 8 10
      encoding/protojson/encode.go
  15. 2 2
      encoding/protojson/well_known_types.go
  16. 9 11
      encoding/prototext/encode.go
  17. 8 0
      encoding/testprotos/pb2/test.pb.go
  18. 8 0
      encoding/testprotos/pb3/test.pb.go
  19. 3 0
      internal/cmd/generate-types/impl.go
  20. 2 2
      internal/impl/codec_message.go
  21. 3 0
      internal/impl/legacy_enum.go
  22. 8 8
      internal/impl/legacy_extension.go
  23. 9 9
      internal/impl/legacy_test.go
  24. 4 4
      internal/impl/message.go
  25. 6 0
      internal/impl/message_reflect_gen.go
  26. 2 0
      internal/impl/message_test.go
  27. 236 0
      internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_8.pb.go
  28. 168 0
      internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_3.pb.go
  29. 8 0
      internal/testprotos/conformance/conformance.pb.go
  30. 8 0
      internal/testprotos/conformance/test_messages_proto2.pb.go
  31. 12 0
      internal/testprotos/conformance/test_messages_proto3.pb.go
  32. 14 4
      internal/testprotos/irregular/irregular.go
  33. 16 0
      internal/testprotos/test/test.pb.go
  34. 4 0
      internal/testprotos/test/test_import.pb.go
  35. 8 0
      internal/testprotos/test3/test.pb.go
  36. 4 0
      internal/testprotos/test3/test_import.pb.go
  37. 14 0
      reflect/protoreflect/value.go
  38. 5 5
      reflect/protoregistry/registry.go
  39. 3 3
      reflect/protoregistry/registry_test.go
  40. 12 0
      reflect/protoregistry/testprotos/test.pb.go
  41. 24 0
      types/descriptorpb/descriptor.pb.go
  42. 17 8
      types/dynamicpb/dynamic.go
  43. 4 0
      types/known/structpb/struct.pb.go
  44. 12 0
      types/known/typepb/type.pb.go

+ 6 - 0
cmd/protoc-gen-go/internal_gengo/reflect.go

@@ -280,6 +280,12 @@ func genReflectEnum(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo
 	g.P("}")
 	g.P()
 
+	// Type method.
+	g.P("func (", enum.GoIdent, ") Type() ", protoreflectPackage.Ident("EnumType"), " {")
+	g.P("return &", typesVar, "[", idx, "]")
+	g.P("}")
+	g.P()
+
 	// Number method.
 	g.P("func (x ", enum.GoIdent, ") Number() ", protoreflectPackage.Ident("EnumNumber"), " {")
 	g.P("return ", protoreflectPackage.Ident("EnumNumber"), "(x)")

+ 4 - 0
cmd/protoc-gen-go/testdata/annotations/annotations.pb.go

@@ -45,6 +45,10 @@ func (AnnotationsTestEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_annotations_annotations_proto_enumTypes[0].EnumDescriptor
 }
 
+func (AnnotationsTestEnum) Type() protoreflect.EnumType {
+	return &file_annotations_annotations_proto_enumTypes[0]
+}
+
 func (x AnnotationsTestEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 1 - 1
cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta

@@ -1 +1 @@
-annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:571 end:590} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:607 end:654} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1761 end:1783} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1839 end:1859} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:2835 end:2858}
+annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:571 end:590} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:607 end:654} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1879 end:1901} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1957 end:1977} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:2953 end:2976}

+ 4 - 0
cmd/protoc-gen-go/testdata/comments/deprecated.pb.go

@@ -44,6 +44,10 @@ func (DeprecatedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_comments_deprecated_proto_enumTypes[0].EnumDescriptor
 }
 
+func (DeprecatedEnum) Type() protoreflect.EnumType {
+	return &file_comments_deprecated_proto_enumTypes[0]
+}
+
 func (x DeprecatedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go

@@ -48,6 +48,10 @@ func (Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_extensions_ext_ext_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_extensions_ext_ext_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go

@@ -47,6 +47,10 @@ func (Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_extensions_proto3_ext3_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_extensions_proto3_ext3_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 12 - 0
cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go

@@ -52,6 +52,10 @@ func (E) Descriptor() protoreflect.EnumDescriptor {
 	return file_import_public_sub_a_proto_enumTypes[0].EnumDescriptor
 }
 
+func (E) Type() protoreflect.EnumType {
+	return &file_import_public_sub_a_proto_enumTypes[0]
+}
+
 func (x E) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -99,6 +103,10 @@ func (M_Subenum) Descriptor() protoreflect.EnumDescriptor {
 	return file_import_public_sub_a_proto_enumTypes[1].EnumDescriptor
 }
 
+func (M_Subenum) Type() protoreflect.EnumType {
+	return &file_import_public_sub_a_proto_enumTypes[1]
+}
+
 func (x M_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -146,6 +154,10 @@ func (M_Submessage_Submessage_Subenum) Descriptor() protoreflect.EnumDescriptor
 	return file_import_public_sub_a_proto_enumTypes[2].EnumDescriptor
 }
 
+func (M_Submessage_Submessage_Subenum) Type() protoreflect.EnumType {
+	return &file_import_public_sub_a_proto_enumTypes[2]
+}
+
 func (x M_Submessage_Submessage_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go

@@ -45,6 +45,10 @@ func (E1) Descriptor() protoreflect.EnumDescriptor {
 	return file_imports_test_a_1_m1_proto_enumTypes[0].EnumDescriptor
 }
 
+func (E1) Type() protoreflect.EnumType {
+	return &file_imports_test_a_1_m1_proto_enumTypes[0]
+}
+
 func (x E1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go

@@ -45,6 +45,10 @@ func (Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_nopackage_nopackage_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_nopackage_nopackage_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 24 - 0
cmd/protoc-gen-go/testdata/proto2/enum.pb.go

@@ -51,6 +51,10 @@ func (EnumType1) Descriptor() protoreflect.EnumDescriptor {
 	return file_proto2_enum_proto_enumTypes[0].EnumDescriptor
 }
 
+func (EnumType1) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[0]
+}
+
 func (x EnumType1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -101,6 +105,10 @@ func (EnumType2) Descriptor() protoreflect.EnumDescriptor {
 	return file_proto2_enum_proto_enumTypes[1].EnumDescriptor
 }
 
+func (EnumType2) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[1]
+}
+
 func (x EnumType2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -150,6 +158,10 @@ func (EnumContainerMessage1_NestedEnumType1A) Descriptor() protoreflect.EnumDesc
 	return file_proto2_enum_proto_enumTypes[2].EnumDescriptor
 }
 
+func (EnumContainerMessage1_NestedEnumType1A) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[2]
+}
+
 func (x EnumContainerMessage1_NestedEnumType1A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -197,6 +209,10 @@ func (EnumContainerMessage1_NestedEnumType1B) Descriptor() protoreflect.EnumDesc
 	return file_proto2_enum_proto_enumTypes[3].EnumDescriptor
 }
 
+func (EnumContainerMessage1_NestedEnumType1B) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[3]
+}
+
 func (x EnumContainerMessage1_NestedEnumType1B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -246,6 +262,10 @@ func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Descriptor()
 	return file_proto2_enum_proto_enumTypes[4].EnumDescriptor
 }
 
+func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[4]
+}
+
 func (x EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -293,6 +313,10 @@ func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Descriptor()
 	return file_proto2_enum_proto_enumTypes[5].EnumDescriptor
 }
 
+func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[5]
+}
+
 func (x EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
cmd/protoc-gen-go/testdata/proto2/fields.pb.go

@@ -49,6 +49,10 @@ func (FieldTestMessage_Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_proto2_fields_proto_enumTypes[0].EnumDescriptor
 }
 
+func (FieldTestMessage_Enum) Type() protoreflect.EnumType {
+	return &file_proto2_fields_proto_enumTypes[0]
+}
+
 func (x FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
cmd/protoc-gen-go/testdata/proto3/enum.pb.go

@@ -51,6 +51,10 @@ func (Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_proto3_enum_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_proto3_enum_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
cmd/protoc-gen-go/testdata/proto3/fields.pb.go

@@ -45,6 +45,10 @@ func (FieldTestMessage_Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_proto3_fields_proto_enumTypes[0].EnumDescriptor
 }
 
+func (FieldTestMessage_Enum) Type() protoreflect.EnumType {
+	return &file_proto3_fields_proto_enumTypes[0]
+}
+
 func (x FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 8 - 10
encoding/protojson/encode.go

@@ -256,12 +256,11 @@ func (o MarshalOptions) marshalExtensions(m pref.Message) error {
 		if !fd.IsExtension() {
 			return true
 		}
-		xt := fd.(pref.ExtensionType)
 
 		// If extended type is a MessageSet, set field name to be the message type name.
-		name := xt.Descriptor().FullName()
-		if isMessageSetExtension(xt) {
-			name = xt.Descriptor().Message().FullName()
+		name := fd.FullName()
+		if isMessageSetExtension(fd) {
+			name = fd.Message().FullName()
 		}
 
 		// Use [name] format for JSON field name.
@@ -294,18 +293,17 @@ func (o MarshalOptions) marshalExtensions(m pref.Message) error {
 }
 
 // isMessageSetExtension reports whether extension extends a message set.
-func isMessageSetExtension(xt pref.ExtensionType) bool {
-	xd := xt.Descriptor()
-	if xd.Name() != "message_set_extension" {
+func isMessageSetExtension(fd pref.FieldDescriptor) bool {
+	if fd.Name() != "message_set_extension" {
 		return false
 	}
-	md := xd.Message()
+	md := fd.Message()
 	if md == nil {
 		return false
 	}
-	if xd.FullName().Parent() != md.FullName() {
+	if fd.FullName().Parent() != md.FullName() {
 		return false
 	}
-	xmd, ok := xd.ContainingMessage().(interface{ IsMessageSet() bool })
+	xmd, ok := fd.ContainingMessage().(interface{ IsMessageSet() bool })
 	return ok && xmd.IsMessageSet()
 }

+ 2 - 2
encoding/protojson/well_known_types.go

@@ -189,7 +189,7 @@ func (o MarshalOptions) marshalAny(m pref.Message) error {
 	// If type of value has custom JSON encoding, marshal out a field "value"
 	// with corresponding custom JSON encoding of the embedded message as a
 	// field.
-	if isCustomType(emt.Descriptor().FullName()) {
+	if isCustomType(emt.FullName()) {
 		o.encoder.WriteName("value")
 		return o.marshalCustomType(em)
 	}
@@ -235,7 +235,7 @@ func (o UnmarshalOptions) unmarshalAny(m pref.Message) error {
 
 	// Create new message for the embedded message type and unmarshal into it.
 	em := emt.New()
-	if isCustomType(emt.Descriptor().FullName()) {
+	if isCustomType(emt.FullName()) {
 		// If embedded message is a custom type, unmarshal the JSON "value" field
 		// into it.
 		if err := o.unmarshalAnyValue(em); err != nil {

+ 9 - 11
encoding/prototext/encode.go

@@ -252,17 +252,16 @@ func (o MarshalOptions) appendExtensions(msgFields [][2]text.Value, m pref.Messa
 		if !fd.IsExtension() {
 			return true
 		}
-		xt := fd.(pref.ExtensionType)
 
 		// If extended type is a MessageSet, set field name to be the message type name.
-		name := xt.Descriptor().FullName()
-		if isMessageSetExtension(xt) {
-			name = xt.Descriptor().Message().FullName()
+		name := fd.FullName()
+		if isMessageSetExtension(fd) {
+			name = fd.Message().FullName()
 		}
 
 		// Use string type to produce [name] format.
 		tname := text.ValueOf(string(name))
-		entries, err = o.appendField(entries, tname, v, xt)
+		entries, err = o.appendField(entries, tname, v, fd)
 		if err != nil {
 			return false
 		}
@@ -281,19 +280,18 @@ func (o MarshalOptions) appendExtensions(msgFields [][2]text.Value, m pref.Messa
 }
 
 // isMessageSetExtension reports whether extension extends a message set.
-func isMessageSetExtension(xt pref.ExtensionType) bool {
-	xd := xt.Descriptor()
-	if xd.Name() != "message_set_extension" {
+func isMessageSetExtension(fd pref.FieldDescriptor) bool {
+	if fd.Name() != "message_set_extension" {
 		return false
 	}
-	md := xd.Message()
+	md := fd.Message()
 	if md == nil {
 		return false
 	}
-	if xd.FullName().Parent() != md.FullName() {
+	if fd.FullName().Parent() != md.FullName() {
 		return false
 	}
-	xmd, ok := xd.ContainingMessage().(interface{ IsMessageSet() bool })
+	xmd, ok := fd.ContainingMessage().(interface{ IsMessageSet() bool })
 	return ok && xmd.IsMessageSet()
 }
 

+ 8 - 0
encoding/testprotos/pb2/test.pb.go

@@ -59,6 +59,10 @@ func (Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_pb2_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_pb2_test_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -112,6 +116,10 @@ func (Enums_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_pb2_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enums_NestedEnum) Type() protoreflect.EnumType {
+	return &file_pb2_test_proto_enumTypes[1]
+}
+
 func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 8 - 0
encoding/testprotos/pb3/test.pb.go

@@ -54,6 +54,10 @@ func (Enum) Descriptor() protoreflect.EnumDescriptor {
 	return file_pb3_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_pb3_test_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -100,6 +104,10 @@ func (Enums_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_pb3_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enums_NestedEnum) Type() protoreflect.EnumType {
+	return &file_pb3_test_proto_enumTypes[1]
+}
+
 func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 3 - 0
internal/cmd/generate-types/impl.go

@@ -437,6 +437,9 @@ var implMessageTemplate = template.Must(template.New("").Parse(`
 func (m *{{.}}) Descriptor() protoreflect.MessageDescriptor {
 	return m.mi.PBType.Descriptor()
 }
+func (m *{{.}}) Type() protoreflect.MessageType {
+	return m.mi.PBType
+}
 func (m *{{.}}) New() protoreflect.Message {
 	return m.mi.PBType.New()
 }

+ 2 - 2
internal/impl/codec_message.go

@@ -42,8 +42,8 @@ func (mi *MessageInfo) makeMethods(t reflect.Type, si structInfo) {
 	mi.extensionOffset = si.extensionOffset
 
 	mi.coderFields = make(map[wire.Number]*coderFieldInfo)
-	for i := 0; i < mi.PBType.Descriptor().Fields().Len(); i++ {
-		fd := mi.PBType.Descriptor().Fields().Get(i)
+	for i := 0; i < mi.PBType.Fields().Len(); i++ {
+		fd := mi.PBType.Fields().Get(i)
 
 		fs := si.fieldsByNumber[fd.Number()]
 		if fd.ContainingOneof() != nil {

+ 3 - 0
internal/impl/legacy_enum.go

@@ -64,6 +64,9 @@ type legacyEnumWrapper struct {
 func (e *legacyEnumWrapper) Descriptor() pref.EnumDescriptor {
 	return e.pbTyp.Descriptor()
 }
+func (e *legacyEnumWrapper) Type() pref.EnumType {
+	return e.pbTyp
+}
 func (e *legacyEnumWrapper) Number() pref.EnumNumber {
 	return e.num
 }

+ 8 - 8
internal/impl/legacy_extension.go

@@ -65,7 +65,7 @@ func legacyExtensionDescFromType(xt pref.ExtensionType) *piface.ExtensionDescV1
 
 	// Determine the parent type if possible.
 	var parent piface.MessageV1
-	messageName := xt.Descriptor().ContainingMessage().FullName()
+	messageName := xt.ContainingMessage().FullName()
 	if mt, _ := preg.GlobalTypes.FindMessageByName(messageName); mt != nil {
 		// Create a new parent message and unwrap it if possible.
 		mv := mt.New().Interface()
@@ -96,7 +96,7 @@ func legacyExtensionDescFromType(xt pref.ExtensionType) *piface.ExtensionDescV1
 	// Reconstruct the legacy enum full name, which is an odd mixture of the
 	// proto package name with the Go type name.
 	var enumName string
-	if xt.Descriptor().Kind() == pref.EnumKind {
+	if xt.Kind() == pref.EnumKind {
 		// Derive Go type name.
 		t := extType
 		if t.Kind() == reflect.Ptr || t.Kind() == reflect.Slice {
@@ -107,7 +107,7 @@ func legacyExtensionDescFromType(xt pref.ExtensionType) *piface.ExtensionDescV1
 		// Derive the proto package name.
 		// For legacy enums, obtain the proto package from the raw descriptor.
 		var protoPkg string
-		if fd := xt.Descriptor().Enum().ParentFile(); fd != nil {
+		if fd := xt.Enum().ParentFile(); fd != nil {
 			protoPkg = string(fd.Package())
 		}
 		if ed, ok := reflect.Zero(t).Interface().(enumV1); ok && protoPkg == "" {
@@ -122,7 +122,7 @@ func legacyExtensionDescFromType(xt pref.ExtensionType) *piface.ExtensionDescV1
 
 	// Derive the proto file that the extension was declared within.
 	var filename string
-	if fd := xt.Descriptor().ParentFile(); fd != nil {
+	if fd := xt.ParentFile(); fd != nil {
 		filename = fd.Path()
 	}
 
@@ -131,9 +131,9 @@ func legacyExtensionDescFromType(xt pref.ExtensionType) *piface.ExtensionDescV1
 		Type:          xt,
 		ExtendedType:  parent,
 		ExtensionType: reflect.Zero(extType).Interface(),
-		Field:         int32(xt.Descriptor().Number()),
-		Name:          string(xt.Descriptor().FullName()),
-		Tag:           ptag.Marshal(xt.Descriptor(), enumName),
+		Field:         int32(xt.Number()),
+		Name:          string(xt.FullName()),
+		Tag:           ptag.Marshal(xt, enumName),
 		Filename:      filename,
 	}
 	if d, ok := legacyExtensionDescCache.LoadOrStore(xt, d); ok {
@@ -287,4 +287,4 @@ func (x *legacyExtensionType) GoType() reflect.Type                 { return x.t
 func (x *legacyExtensionType) New() pref.Value                      { return x.new() }
 func (x *legacyExtensionType) ValueOf(v interface{}) pref.Value     { return x.valueOf(v) }
 func (x *legacyExtensionType) InterfaceOf(v pref.Value) interface{} { return x.interfaceOf(v) }
-func (x *legacyExtensionType) Format(s fmt.State, r rune)           { descfmt.FormatDesc(s, r, x.Descriptor()) }
+func (x *legacyExtensionType) Format(s fmt.State, r rune)           { descfmt.FormatDesc(s, r, x) }

+ 9 - 9
internal/impl/legacy_test.go

@@ -605,23 +605,23 @@ func TestConcurrentInit(t *testing.T) {
 
 	var (
 		wantMTA = messageATypes[0]
-		wantMDA = messageATypes[0].Descriptor().Fields().ByNumber(1).Message()
+		wantMDA = messageATypes[0].Fields().ByNumber(1).Message()
 		wantMTB = messageBTypes[0]
-		wantMDB = messageBTypes[0].Descriptor().Fields().ByNumber(2).Message()
-		wantED  = messageATypes[0].Descriptor().Fields().ByNumber(3).Enum()
+		wantMDB = messageBTypes[0].Fields().ByNumber(2).Message()
+		wantED  = messageATypes[0].Fields().ByNumber(3).Enum()
 	)
 
 	for _, gotMT := range messageATypes[1:] {
 		if gotMT != wantMTA {
 			t.Error("MessageType(MessageA) mismatch")
 		}
-		if gotMDA := gotMT.Descriptor().Fields().ByNumber(1).Message(); gotMDA != wantMDA {
+		if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
 			t.Error("MessageDescriptor(MessageA) mismatch")
 		}
-		if gotMDB := gotMT.Descriptor().Fields().ByNumber(2).Message(); gotMDB != wantMDB {
+		if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
 			t.Error("MessageDescriptor(MessageB) mismatch")
 		}
-		if gotED := gotMT.Descriptor().Fields().ByNumber(3).Enum(); gotED != wantED {
+		if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
 			t.Error("EnumDescriptor(Enum) mismatch")
 		}
 	}
@@ -629,13 +629,13 @@ func TestConcurrentInit(t *testing.T) {
 		if gotMT != wantMTB {
 			t.Error("MessageType(MessageB) mismatch")
 		}
-		if gotMDA := gotMT.Descriptor().Fields().ByNumber(1).Message(); gotMDA != wantMDA {
+		if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
 			t.Error("MessageDescriptor(MessageA) mismatch")
 		}
-		if gotMDB := gotMT.Descriptor().Fields().ByNumber(2).Message(); gotMDB != wantMDB {
+		if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
 			t.Error("MessageDescriptor(MessageB) mismatch")
 		}
-		if gotED := gotMT.Descriptor().Fields().ByNumber(3).Enum(); gotED != wantED {
+		if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
 			t.Error("EnumDescriptor(Enum) mismatch")
 		}
 	}

+ 4 - 4
internal/impl/message.go

@@ -224,8 +224,8 @@ fieldLoop:
 // any discrepancies.
 func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) {
 	mi.fields = map[pref.FieldNumber]*fieldInfo{}
-	for i := 0; i < mi.PBType.Descriptor().Fields().Len(); i++ {
-		fd := mi.PBType.Descriptor().Fields().Get(i)
+	for i := 0; i < mi.PBType.Fields().Len(); i++ {
+		fd := mi.PBType.Fields().Get(i)
 		fs := si.fieldsByNumber[fd.Number()]
 		var fi fieldInfo
 		switch {
@@ -244,8 +244,8 @@ func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) {
 	}
 
 	mi.oneofs = map[pref.Name]*oneofInfo{}
-	for i := 0; i < mi.PBType.Descriptor().Oneofs().Len(); i++ {
-		od := mi.PBType.Descriptor().Oneofs().Get(i)
+	for i := 0; i < mi.PBType.Oneofs().Len(); i++ {
+		od := mi.PBType.Oneofs().Get(i)
 		mi.oneofs[od.Name()] = makeOneofInfo(od, si.oneofsByName[od.Name()], mi.Exporter, si.oneofWrappersByType)
 	}
 }

+ 6 - 0
internal/impl/message_reflect_gen.go

@@ -14,6 +14,9 @@ import (
 func (m *messageState) Descriptor() protoreflect.MessageDescriptor {
 	return m.mi.PBType.Descriptor()
 }
+func (m *messageState) Type() protoreflect.MessageType {
+	return m.mi.PBType
+}
 func (m *messageState) New() protoreflect.Message {
 	return m.mi.PBType.New()
 }
@@ -106,6 +109,9 @@ func (m *messageState) SetUnknown(b protoreflect.RawFields) {
 func (m *messageReflectWrapper) Descriptor() protoreflect.MessageDescriptor {
 	return m.mi.PBType.Descriptor()
 }
+func (m *messageReflectWrapper) Type() protoreflect.MessageType {
+	return m.mi.PBType
+}
 func (m *messageReflectWrapper) New() protoreflect.Message {
 	return m.mi.PBType.New()
 }

+ 2 - 0
internal/impl/message_test.go

@@ -963,6 +963,7 @@ var enumProto2Type = &prototype.Enum{
 }
 
 func (e EnumProto2) Descriptor() pref.EnumDescriptor { return enumProto2Type.Descriptor() }
+func (e EnumProto2) Type() pref.EnumType             { return enumProto2Type }
 func (e EnumProto2) Enum() *EnumProto2               { return &e }
 func (e EnumProto2) Number() pref.EnumNumber         { return pref.EnumNumber(e) }
 
@@ -979,6 +980,7 @@ var enumProto3Type = &prototype.Enum{
 }
 
 func (e EnumProto3) Descriptor() pref.EnumDescriptor { return enumProto3Type.Descriptor() }
+func (e EnumProto3) Type() pref.EnumType             { return enumProto3Type }
 func (e EnumProto3) Enum() *EnumProto3               { return &e }
 func (e EnumProto3) Number() pref.EnumNumber         { return pref.EnumNumber(e) }
 

+ 236 - 0
internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_8.pb.go

@@ -48,6 +48,10 @@ func (Enum720) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum720) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[0]
+}
+
 func (x Enum720) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -644,6 +648,10 @@ func (Enum3476) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enum3476) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[1]
+}
+
 func (x Enum3476) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -724,6 +732,10 @@ func (Enum3805) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Enum3805) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[2]
+}
+
 func (x Enum3805) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -828,6 +840,10 @@ func (Enum3783) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[3].EnumDescriptor
 }
 
+func (Enum3783) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[3]
+}
+
 func (x Enum3783) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -926,6 +942,10 @@ func (Enum3851) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[4].EnumDescriptor
 }
 
+func (Enum3851) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[4]
+}
+
 func (x Enum3851) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -976,6 +996,10 @@ func (UnusedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[5].EnumDescriptor
 }
 
+func (UnusedEnum) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[5]
+}
+
 func (x UnusedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1035,6 +1059,10 @@ func (Enum4146) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[6].EnumDescriptor
 }
 
+func (Enum4146) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[6]
+}
+
 func (x Enum4146) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1085,6 +1113,10 @@ func (Enum4160) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[7].EnumDescriptor
 }
 
+func (Enum4160) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[7]
+}
+
 func (x Enum4160) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1150,6 +1182,10 @@ func (Enum4152) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[8].EnumDescriptor
 }
 
+func (Enum4152) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[8]
+}
+
 func (x Enum4152) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1260,6 +1296,10 @@ func (Enum6025) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[9].EnumDescriptor
 }
 
+func (Enum6025) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[9]
+}
+
 func (x Enum6025) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1349,6 +1389,10 @@ func (Enum6065) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[10].EnumDescriptor
 }
 
+func (Enum6065) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[10]
+}
+
 func (x Enum6065) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1417,6 +1461,10 @@ func (Enum6579) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[11].EnumDescriptor
 }
 
+func (Enum6579) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[11]
+}
+
 func (x Enum6579) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1563,6 +1611,10 @@ func (Enum6588) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[12].EnumDescriptor
 }
 
+func (Enum6588) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[12]
+}
+
 func (x Enum6588) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1616,6 +1668,10 @@ func (Enum6769) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[13].EnumDescriptor
 }
 
+func (Enum6769) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[13]
+}
+
 func (x Enum6769) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1681,6 +1737,10 @@ func (Enum6774) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[14].EnumDescriptor
 }
 
+func (Enum6774) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[14]
+}
+
 func (x Enum6774) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1743,6 +1803,10 @@ func (Enum6782) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[15].EnumDescriptor
 }
 
+func (Enum6782) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[15]
+}
+
 func (x Enum6782) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1799,6 +1863,10 @@ func (Enum6858) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[16].EnumDescriptor
 }
 
+func (Enum6858) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[16]
+}
+
 func (x Enum6858) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1861,6 +1929,10 @@ func (Enum6815) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[17].EnumDescriptor
 }
 
+func (Enum6815) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[17]
+}
+
 func (x Enum6815) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1917,6 +1989,10 @@ func (Enum6822) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[18].EnumDescriptor
 }
 
+func (Enum6822) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[18]
+}
+
 func (x Enum6822) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1970,6 +2046,10 @@ func (Enum7654) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[19].EnumDescriptor
 }
 
+func (Enum7654) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[19]
+}
+
 func (x Enum7654) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2023,6 +2103,10 @@ func (Enum8292) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[20].EnumDescriptor
 }
 
+func (Enum8292) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[20]
+}
+
 func (x Enum8292) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2076,6 +2160,10 @@ func (Enum8450) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[21].EnumDescriptor
 }
 
+func (Enum8450) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[21]
+}
+
 func (x Enum8450) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2135,6 +2223,10 @@ func (Enum8900) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[22].EnumDescriptor
 }
 
+func (Enum8900) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[22]
+}
+
 func (x Enum8900) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2194,6 +2286,10 @@ func (Enum8945) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[23].EnumDescriptor
 }
 
+func (Enum8945) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[23]
+}
+
 func (x Enum8945) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2262,6 +2358,10 @@ func (Enum8951) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[24].EnumDescriptor
 }
 
+func (Enum8951) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[24]
+}
+
 func (x Enum8951) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2555,6 +2655,10 @@ func (Enum9243) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[25].EnumDescriptor
 }
 
+func (Enum9243) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[25]
+}
+
 func (x Enum9243) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2626,6 +2730,10 @@ func (Enum10157) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[26].EnumDescriptor
 }
 
+func (Enum10157) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[26]
+}
+
 func (x Enum10157) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2697,6 +2805,10 @@ func (Enum10167) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[27].EnumDescriptor
 }
 
+func (Enum10167) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[27]
+}
+
 func (x Enum10167) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2789,6 +2901,10 @@ func (Enum8862) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[28].EnumDescriptor
 }
 
+func (Enum8862) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[28]
+}
+
 func (x Enum8862) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2860,6 +2976,10 @@ func (Enum10325) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[29].EnumDescriptor
 }
 
+func (Enum10325) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[29]
+}
+
 func (x Enum10325) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2907,6 +3027,10 @@ func (Enum10335) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[30].EnumDescriptor
 }
 
+func (Enum10335) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[30]
+}
+
 func (x Enum10335) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2957,6 +3081,10 @@ func (Enum10337) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[31].EnumDescriptor
 }
 
+func (Enum10337) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[31]
+}
+
 func (x Enum10337) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3055,6 +3183,10 @@ func (Enum10392) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[32].EnumDescriptor
 }
 
+func (Enum10392) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[32]
+}
+
 func (x Enum10392) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -4179,6 +4311,10 @@ func (Enum11107) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[33].EnumDescriptor
 }
 
+func (Enum11107) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[33]
+}
+
 func (x Enum11107) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -4796,6 +4932,10 @@ func (Enum11541) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[34].EnumDescriptor
 }
 
+func (Enum11541) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[34]
+}
+
 func (x Enum11541) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -4912,6 +5052,10 @@ func (Enum11468) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[35].EnumDescriptor
 }
 
+func (Enum11468) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[35]
+}
+
 func (x Enum11468) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5208,6 +5352,10 @@ func (Enum11022) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[36].EnumDescriptor
 }
 
+func (Enum11022) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[36]
+}
+
 func (x Enum11022) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5261,6 +5409,10 @@ func (Enum12670) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[37].EnumDescriptor
 }
 
+func (Enum12670) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[37]
+}
+
 func (x Enum12670) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5323,6 +5475,10 @@ func (Enum12871) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[38].EnumDescriptor
 }
 
+func (Enum12871) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[38]
+}
+
 func (x Enum12871) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5376,6 +5532,10 @@ func (Enum13092) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[39].EnumDescriptor
 }
 
+func (Enum13092) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[39]
+}
+
 func (x Enum13092) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5432,6 +5592,10 @@ func (Enum13146) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[40].EnumDescriptor
 }
 
+func (Enum13146) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[40]
+}
+
 func (x Enum13146) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6562,6 +6726,10 @@ func (Enum16042) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[41].EnumDescriptor
 }
 
+func (Enum16042) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[41]
+}
+
 func (x Enum16042) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6636,6 +6804,10 @@ func (Enum16553) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[42].EnumDescriptor
 }
 
+func (Enum16553) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[42]
+}
+
 func (x Enum16553) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6689,6 +6861,10 @@ func (Enum16728) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[43].EnumDescriptor
 }
 
+func (Enum16728) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[43]
+}
+
 func (x Enum16728) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6748,6 +6924,10 @@ func (Enum16732) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[44].EnumDescriptor
 }
 
+func (Enum16732) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[44]
+}
+
 func (x Enum16732) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6813,6 +6993,10 @@ func (Enum16738) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[45].EnumDescriptor
 }
 
+func (Enum16738) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[45]
+}
+
 func (x Enum16738) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6926,6 +7110,10 @@ func (Enum16698) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[46].EnumDescriptor
 }
 
+func (Enum16698) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[46]
+}
+
 func (x Enum16698) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6988,6 +7176,10 @@ func (Enum16819) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[47].EnumDescriptor
 }
 
+func (Enum16819) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[47]
+}
+
 func (x Enum16819) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7074,6 +7266,10 @@ func (Enum16925) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[48].EnumDescriptor
 }
 
+func (Enum16925) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[48]
+}
+
 func (x Enum16925) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7124,6 +7320,10 @@ func (Enum22854) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[49].EnumDescriptor
 }
 
+func (Enum22854) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[49]
+}
+
 func (x Enum22854) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7180,6 +7380,10 @@ func (Enum24361) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[50].EnumDescriptor
 }
 
+func (Enum24361) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[50]
+}
+
 func (x Enum24361) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7320,6 +7524,10 @@ func (Enum16891) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[51].EnumDescriptor
 }
 
+func (Enum16891) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[51]
+}
+
 func (x Enum16891) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7379,6 +7587,10 @@ func (Enum27361) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[52].EnumDescriptor
 }
 
+func (Enum27361) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[52]
+}
+
 func (x Enum27361) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7444,6 +7656,10 @@ func (Enum33960) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[53].EnumDescriptor
 }
 
+func (Enum33960) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[53]
+}
+
 func (x Enum33960) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7491,6 +7707,10 @@ func (Enum34388) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[54].EnumDescriptor
 }
 
+func (Enum34388) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[54]
+}
+
 func (x Enum34388) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7550,6 +7770,10 @@ func (Enum35477) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[55].EnumDescriptor
 }
 
+func (Enum35477) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[55]
+}
+
 func (x Enum35477) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7624,6 +7848,10 @@ func (Enum35507) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[56].EnumDescriptor
 }
 
+func (Enum35507) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[56]
+}
+
 func (x Enum35507) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7692,6 +7920,10 @@ func (Enum36860) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[57].EnumDescriptor
 }
 
+func (Enum36860) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[57]
+}
+
 func (x Enum36860) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7742,6 +7974,10 @@ func (Enum36890) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[58].EnumDescriptor
 }
 
+func (Enum36890) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[58]
+}
+
 func (x Enum36890) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 168 - 0
internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_3.pb.go

@@ -48,6 +48,10 @@ func (UnusedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[0].EnumDescriptor
 }
 
+func (UnusedEnum) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[0]
+}
+
 func (x UnusedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -116,6 +120,10 @@ func (Enum2593) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enum2593) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[1]
+}
+
 func (x Enum2593) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -169,6 +177,10 @@ func (Enum2834) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Enum2834) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[2]
+}
+
 func (x Enum2834) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -258,6 +270,10 @@ func (Enum2806) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[3].EnumDescriptor
 }
 
+func (Enum2806) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[3]
+}
+
 func (x Enum2806) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -665,6 +681,10 @@ func (Enum2851) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[4].EnumDescriptor
 }
 
+func (Enum2851) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[4]
+}
+
 func (x Enum2851) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -745,6 +765,10 @@ func (Enum2602) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[5].EnumDescriptor
 }
 
+func (Enum2602) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[5]
+}
+
 func (x Enum2602) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -873,6 +897,10 @@ func (Enum3071) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[6].EnumDescriptor
 }
 
+func (Enum3071) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[6]
+}
+
 func (x Enum3071) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -953,6 +981,10 @@ func (Enum3805) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[7].EnumDescriptor
 }
 
+func (Enum3805) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[7]
+}
+
 func (x Enum3805) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1057,6 +1089,10 @@ func (Enum3783) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[8].EnumDescriptor
 }
 
+func (Enum3783) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[8]
+}
+
 func (x Enum3783) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1155,6 +1191,10 @@ func (Enum3851) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[9].EnumDescriptor
 }
 
+func (Enum3851) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[9]
+}
+
 func (x Enum3851) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1208,6 +1248,10 @@ func (Enum5862) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[10].EnumDescriptor
 }
 
+func (Enum5862) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[10]
+}
+
 func (x Enum5862) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1264,6 +1308,10 @@ func (Enum5868) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[11].EnumDescriptor
 }
 
+func (Enum5868) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[11]
+}
+
 func (x Enum5868) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1317,6 +1365,10 @@ func (Enum5873) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[12].EnumDescriptor
 }
 
+func (Enum5873) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[12]
+}
+
 func (x Enum5873) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1367,6 +1419,10 @@ func (Enum5904) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[13].EnumDescriptor
 }
 
+func (Enum5904) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[13]
+}
+
 func (x Enum5904) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1417,6 +1473,10 @@ func (Enum5909) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[14].EnumDescriptor
 }
 
+func (Enum5909) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[14]
+}
+
 func (x Enum5909) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1467,6 +1527,10 @@ func (Enum5912) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[15].EnumDescriptor
 }
 
+func (Enum5912) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[15]
+}
+
 func (x Enum5912) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1523,6 +1587,10 @@ func (Enum5915) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[16].EnumDescriptor
 }
 
+func (Enum5915) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[16]
+}
+
 func (x Enum5915) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1573,6 +1641,10 @@ func (Enum5920) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[17].EnumDescriptor
 }
 
+func (Enum5920) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[17]
+}
+
 func (x Enum5920) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1629,6 +1701,10 @@ func (Enum5923) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[18].EnumDescriptor
 }
 
+func (Enum5923) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[18]
+}
+
 func (x Enum5923) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1679,6 +1755,10 @@ func (Enum5928) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[19].EnumDescriptor
 }
 
+func (Enum5928) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[19]
+}
+
 func (x Enum5928) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1732,6 +1812,10 @@ func (Enum5931) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[20].EnumDescriptor
 }
 
+func (Enum5931) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[20]
+}
+
 func (x Enum5931) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1785,6 +1869,10 @@ func (Enum5935) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[21].EnumDescriptor
 }
 
+func (Enum5935) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[21]
+}
+
 func (x Enum5935) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1847,6 +1935,10 @@ func (Enum5939) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[22].EnumDescriptor
 }
 
+func (Enum5939) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[22]
+}
+
 func (x Enum5939) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1921,6 +2013,10 @@ func (Enum5946) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[23].EnumDescriptor
 }
 
+func (Enum5946) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[23]
+}
+
 func (x Enum5946) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1977,6 +2073,10 @@ func (Enum5957) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[24].EnumDescriptor
 }
 
+func (Enum5957) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[24]
+}
+
 func (x Enum5957) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2027,6 +2127,10 @@ func (Enum5962) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[25].EnumDescriptor
 }
 
+func (Enum5962) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[25]
+}
+
 func (x Enum5962) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2137,6 +2241,10 @@ func (Enum6025) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[26].EnumDescriptor
 }
 
+func (Enum6025) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[26]
+}
+
 func (x Enum6025) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2223,6 +2331,10 @@ func (Enum6111) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[27].EnumDescriptor
 }
 
+func (Enum6111) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[27]
+}
+
 func (x Enum6111) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2312,6 +2424,10 @@ func (Enum6065) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[28].EnumDescriptor
 }
 
+func (Enum6065) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[28]
+}
+
 func (x Enum6065) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2362,6 +2478,10 @@ func (Enum6130) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[29].EnumDescriptor
 }
 
+func (Enum6130) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[29]
+}
+
 func (x Enum6130) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2430,6 +2550,10 @@ func (Enum6579) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[30].EnumDescriptor
 }
 
+func (Enum6579) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[30]
+}
+
 func (x Enum6579) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2576,6 +2700,10 @@ func (Enum6588) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[31].EnumDescriptor
 }
 
+func (Enum6588) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[31]
+}
+
 func (x Enum6588) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2632,6 +2760,10 @@ func (Enum7288) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[32].EnumDescriptor
 }
 
+func (Enum7288) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[32]
+}
+
 func (x Enum7288) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2700,6 +2832,10 @@ func (Enum7512) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[33].EnumDescriptor
 }
 
+func (Enum7512) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[33]
+}
+
 func (x Enum7512) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2759,6 +2895,10 @@ func (Enum7922) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[34].EnumDescriptor
 }
 
+func (Enum7922) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[34]
+}
+
 func (x Enum7922) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3355,6 +3495,10 @@ func (Enum3476) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[35].EnumDescriptor
 }
 
+func (Enum3476) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[35]
+}
+
 func (x Enum3476) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3426,6 +3570,10 @@ func (Enum10325) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[36].EnumDescriptor
 }
 
+func (Enum10325) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[36]
+}
+
 func (x Enum10325) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3473,6 +3621,10 @@ func (Enum10335) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[37].EnumDescriptor
 }
 
+func (Enum10335) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[37]
+}
+
 func (x Enum10335) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3523,6 +3675,10 @@ func (Enum10337) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[38].EnumDescriptor
 }
 
+func (Enum10337) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[38]
+}
+
 func (x Enum10337) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3579,6 +3735,10 @@ func (Enum11901) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[39].EnumDescriptor
 }
 
+func (Enum11901) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[39]
+}
+
 func (x Enum11901) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3635,6 +3795,10 @@ func (Enum12735) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[40].EnumDescriptor
 }
 
+func (Enum12735) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[40]
+}
+
 func (x Enum12735) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3697,6 +3861,10 @@ func (Enum12871) Descriptor() protoreflect.EnumDescriptor {
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[41].EnumDescriptor
 }
 
+func (Enum12871) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[41]
+}
+
 func (x Enum12871) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 8 - 0
internal/testprotos/conformance/conformance.pb.go

@@ -57,6 +57,10 @@ func (WireFormat) Descriptor() protoreflect.EnumDescriptor {
 	return file_conformance_conformance_proto_enumTypes[0].EnumDescriptor
 }
 
+func (WireFormat) Type() protoreflect.EnumType {
+	return &file_conformance_conformance_proto_enumTypes[0]
+}
+
 func (x WireFormat) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -117,6 +121,10 @@ func (TestCategory) Descriptor() protoreflect.EnumDescriptor {
 	return file_conformance_conformance_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestCategory) Type() protoreflect.EnumType {
+	return &file_conformance_conformance_proto_enumTypes[1]
+}
+
 func (x TestCategory) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 8 - 0
internal/testprotos/conformance/test_messages_proto2.pb.go

@@ -52,6 +52,10 @@ func (ForeignEnumProto2) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_test_messages_proto2_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnumProto2) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto2_proto_enumTypes[0]
+}
+
 func (x ForeignEnumProto2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -108,6 +112,10 @@ func (TestAllTypesProto2_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_test_messages_proto2_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestAllTypesProto2_NestedEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto2_proto_enumTypes[1]
+}
+
 func (x TestAllTypesProto2_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 12 - 0
internal/testprotos/conformance/test_messages_proto3.pb.go

@@ -57,6 +57,10 @@ func (ForeignEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_test_messages_proto3_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto3_proto_enumTypes[0]
+}
+
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -103,6 +107,10 @@ func (TestAllTypesProto3_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_test_messages_proto3_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestAllTypesProto3_NestedEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto3_proto_enumTypes[1]
+}
+
 func (x TestAllTypesProto3_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -155,6 +163,10 @@ func (TestAllTypesProto3_AliasedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_test_messages_proto3_proto_enumTypes[2].EnumDescriptor
 }
 
+func (TestAllTypesProto3_AliasedEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto3_proto_enumTypes[2]
+}
+
 func (x TestAllTypesProto3_AliasedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 14 - 4
internal/testprotos/irregular/irregular.go

@@ -8,6 +8,8 @@ import (
 	"google.golang.org/protobuf/encoding/prototext"
 	"google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/reflect/prototype"
+
 	"google.golang.org/protobuf/types/descriptorpb"
 )
 
@@ -20,11 +22,19 @@ func (m *IrregularMessage) ProtoReflect() pref.Message { return (*message)(m) }
 
 type message IrregularMessage
 
-func (m *message) Descriptor() pref.MessageDescriptor { return descriptor.Messages().Get(0) }
+var messageType = &prototype.Message{
+	MessageDescriptor: fileDesc.Messages().Get(0),
+	NewMessage: func() pref.Message {
+		return &message{}
+	},
+}
+
+func (m *message) Descriptor() pref.MessageDescriptor { return messageType.Descriptor() }
+func (m *message) Type() pref.MessageType             { return messageType }
 func (m *message) New() pref.Message                  { return &message{} }
 func (m *message) Interface() pref.ProtoMessage       { return (*IrregularMessage)(m) }
 
-var fieldDescS = descriptor.Messages().Get(0).Fields().Get(0)
+var fieldDescS = fileDesc.Messages().Get(0).Fields().Get(0)
 
 func (m *message) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
 	if m.set {
@@ -79,7 +89,7 @@ func (m *message) WhichOneof(pref.OneofDescriptor) pref.FieldDescriptor {
 func (m *message) GetUnknown() pref.RawFields { return nil }
 func (m *message) SetUnknown(pref.RawFields)  { return }
 
-var descriptor = func() pref.FileDescriptor {
+var fileDesc = func() pref.FileDescriptor {
 	p := &descriptorpb.FileDescriptorProto{}
 	if err := prototext.Unmarshal([]byte(descriptorText), p); err != nil {
 		panic(err)
@@ -91,7 +101,7 @@ var descriptor = func() pref.FileDescriptor {
 	return file
 }()
 
-func file_irregular_irregular_proto_init() { _ = descriptor }
+func file_irregular_irregular_proto_init() { _ = fileDesc }
 
 const descriptorText = `
   name: "internal/testprotos/irregular/irregular.proto"

+ 16 - 0
internal/testprotos/test/test.pb.go

@@ -53,6 +53,10 @@ func (ForeignEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_test_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnum) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[0]
+}
+
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -100,6 +104,10 @@ func (TestReservedEnumFields) Descriptor() protoreflect.EnumDescriptor {
 	return file_test_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestReservedEnumFields) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[1]
+}
+
 func (x TestReservedEnumFields) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -156,6 +164,10 @@ func (TestAllTypes_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_test_test_proto_enumTypes[2].EnumDescriptor
 }
 
+func (TestAllTypes_NestedEnum) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[2]
+}
+
 func (x TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -202,6 +214,10 @@ func (TestDeprecatedMessage_DeprecatedEnum) Descriptor() protoreflect.EnumDescri
 	return file_test_test_proto_enumTypes[3].EnumDescriptor
 }
 
+func (TestDeprecatedMessage_DeprecatedEnum) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[3]
+}
+
 func (x TestDeprecatedMessage_DeprecatedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
internal/testprotos/test/test_import.pb.go

@@ -45,6 +45,10 @@ func (ImportEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_test_test_import_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ImportEnum) Type() protoreflect.EnumType {
+	return &file_test_test_import_proto_enumTypes[0]
+}
+
 func (x ImportEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 8 - 0
internal/testprotos/test3/test.pb.go

@@ -54,6 +54,10 @@ func (ForeignEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_test3_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnum) Type() protoreflect.EnumType {
+	return &file_test3_test_proto_enumTypes[0]
+}
+
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -100,6 +104,10 @@ func (TestAllTypes_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_test3_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestAllTypes_NestedEnum) Type() protoreflect.EnumType {
+	return &file_test3_test_proto_enumTypes[1]
+}
+
 func (x TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 4 - 0
internal/testprotos/test3/test_import.pb.go

@@ -45,6 +45,10 @@ func (ImportEnum) Descriptor() protoreflect.EnumDescriptor {
 	return file_test3_test_import_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ImportEnum) Type() protoreflect.EnumType {
+	return &file_test3_test_import_proto_enumTypes[0]
+}
+
 func (x ImportEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 14 - 0
reflect/protoreflect/value.go

@@ -11,8 +11,15 @@ import "google.golang.org/protobuf/internal/encoding/wire"
 // Enum does not provide a mutable API since enums are commonly backed by
 // Go constants, which are not addressable.
 type Enum interface {
+	// Descriptor returns enum descriptor, which contains only the protobuf
+	// type information for the enum.
 	Descriptor() EnumDescriptor
 
+	// Type returns the enum type, which encapsulates both Go and protobuf
+	// type information. If the Go type information is not needed,
+	// it is recommended that the enum descriptor be used instead.
+	Type() EnumType
+
 	// Number returns the enum value as an integer.
 	Number() EnumNumber
 }
@@ -31,8 +38,15 @@ type Enum interface {
 // See Value for the Go types associated with a FieldDescriptor.
 // Providing a Value that is invalid or of an incorrect type panics.
 type Message interface {
+	// Descriptor returns message descriptor, which contains only the protobuf
+	// type information for the message.
 	Descriptor() MessageDescriptor
 
+	// Type returns the message type, which encapsulates both Go and protobuf
+	// type information. If the Go type information is not needed,
+	// it is recommended that the message descriptor be used instead.
+	Type() MessageType
+
 	// New returns a newly allocated and mutable empty message.
 	New() Message
 

+ 5 - 5
reflect/protoregistry/registry.go

@@ -406,11 +406,11 @@ typeLoop:
 			var name protoreflect.FullName
 			switch t := typ.(type) {
 			case protoreflect.EnumType:
-				name = t.Descriptor().FullName()
+				name = t.FullName()
 			case protoreflect.MessageType:
-				name = t.Descriptor().FullName()
+				name = t.FullName()
 			case protoreflect.ExtensionType:
-				name = t.Descriptor().FullName()
+				name = t.FullName()
 			default:
 				panic(fmt.Sprintf("invalid type: %T", t))
 			}
@@ -423,8 +423,8 @@ typeLoop:
 
 			// Check for conflicts in extensionsByMessage.
 			if xt, _ := typ.(protoreflect.ExtensionType); xt != nil {
-				field := xt.Descriptor().Number()
-				message := xt.Descriptor().ContainingMessage().FullName()
+				field := xt.Number()
+				message := xt.ContainingMessage().FullName()
 				if r.extensionsByMessage[message][field] != nil {
 					if firstErr == nil {
 						firstErr = errors.New("extension %v is already registered on message %v", name, message)

+ 3 - 3
reflect/protoregistry/registry_test.go

@@ -536,11 +536,11 @@ func TestTypes(t *testing.T) {
 	fullName := func(t preg.Type) pref.FullName {
 		switch t := t.(type) {
 		case pref.EnumType:
-			return t.Descriptor().FullName()
+			return t.FullName()
 		case pref.MessageType:
-			return t.Descriptor().FullName()
+			return t.FullName()
 		case pref.ExtensionType:
-			return t.Descriptor().FullName()
+			return t.FullName()
 		default:
 			panic("invalid type")
 		}

+ 12 - 0
reflect/protoregistry/testprotos/test.pb.go

@@ -46,6 +46,10 @@ func (Enum1) Descriptor() protoreflect.EnumDescriptor {
 	return file_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum1) Type() protoreflect.EnumType {
+	return &file_test_proto_enumTypes[0]
+}
+
 func (x Enum1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -93,6 +97,10 @@ func (Enum2) Descriptor() protoreflect.EnumDescriptor {
 	return file_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enum2) Type() protoreflect.EnumType {
+	return &file_test_proto_enumTypes[1]
+}
+
 func (x Enum2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -140,6 +148,10 @@ func (Enum3) Descriptor() protoreflect.EnumDescriptor {
 	return file_test_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Enum3) Type() protoreflect.EnumType {
+	return &file_test_proto_enumTypes[2]
+}
+
 func (x Enum3) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 24 - 0
types/descriptorpb/descriptor.pb.go

@@ -108,6 +108,10 @@ func (FieldDescriptorProto_Type) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_descriptor_proto_enumTypes[0].EnumDescriptor
 }
 
+func (FieldDescriptorProto_Type) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[0]
+}
+
 func (x FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -162,6 +166,10 @@ func (FieldDescriptorProto_Label) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_descriptor_proto_enumTypes[1].EnumDescriptor
 }
 
+func (FieldDescriptorProto_Label) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[1]
+}
+
 func (x FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -217,6 +225,10 @@ func (FileOptions_OptimizeMode) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_descriptor_proto_enumTypes[2].EnumDescriptor
 }
 
+func (FileOptions_OptimizeMode) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[2]
+}
+
 func (x FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -271,6 +283,10 @@ func (FieldOptions_CType) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_descriptor_proto_enumTypes[3].EnumDescriptor
 }
 
+func (FieldOptions_CType) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[3]
+}
+
 func (x FieldOptions_CType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -327,6 +343,10 @@ func (FieldOptions_JSType) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_descriptor_proto_enumTypes[4].EnumDescriptor
 }
 
+func (FieldOptions_JSType) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[4]
+}
+
 func (x FieldOptions_JSType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -383,6 +403,10 @@ func (MethodOptions_IdempotencyLevel) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_descriptor_proto_enumTypes[5].EnumDescriptor
 }
 
+func (MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[5]
+}
+
 func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 17 - 8
types/dynamicpb/dynamic.go

@@ -10,6 +10,7 @@ import (
 
 	"google.golang.org/protobuf/internal/errors"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/reflect/prototype"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 )
 
@@ -29,7 +30,7 @@ import (
 //
 // Operations which modify a Message are not safe for concurrent use.
 type Message struct {
-	desc    pref.MessageDescriptor
+	typ     prototype.Message
 	known   map[pref.FieldNumber]pref.Value
 	ext     map[pref.FieldNumber]pref.FieldDescriptor
 	unknown pref.RawFields
@@ -38,7 +39,10 @@ type Message struct {
 // New creates a new message with the provided descriptor.
 func New(desc pref.MessageDescriptor) *Message {
 	return &Message{
-		desc:  desc,
+		typ: prototype.Message{
+			MessageDescriptor: desc,
+			NewMessage:        func() pref.Message { return New(desc) },
+		},
 		known: make(map[pref.FieldNumber]pref.Value),
 		ext:   make(map[pref.FieldNumber]pref.FieldDescriptor),
 	}
@@ -56,13 +60,18 @@ func (m *Message) String() string {
 
 // Descriptor returns the message descriptor.
 func (m *Message) Descriptor() pref.MessageDescriptor {
-	return m.desc
+	return m.typ.Descriptor()
+}
+
+// Type returns the message type.
+func (m *Message) Type() pref.MessageType {
+	return &m.typ
 }
 
 // New returns a newly allocated empty message with the same descriptor.
 // See protoreflect.Message for details.
 func (m *Message) New() pref.Message {
-	return New(m.desc)
+	return m.Type().New()
 }
 
 // Interface returns the message.
@@ -77,7 +86,7 @@ func (m *Message) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
 	for num, v := range m.known {
 		fd := m.ext[num]
 		if fd == nil {
-			fd = m.desc.Fields().ByNumber(num)
+			fd = m.Descriptor().Fields().ByNumber(num)
 			if !isSet(fd, v) {
 				continue
 			}
@@ -237,16 +246,16 @@ func (m *Message) SetUnknown(r pref.RawFields) {
 }
 
 func (m *Message) checkField(fd pref.FieldDescriptor) {
-	if fd.IsExtension() && fd.ContainingMessage().FullName() == m.desc.FullName() {
+	if fd.IsExtension() && fd.ContainingMessage().FullName() == m.Descriptor().FullName() {
 		if _, ok := fd.(pref.ExtensionType); !ok {
 			panic(errors.New("%v: extension field descriptor does not implement ExtensionType", fd.FullName()))
 		}
 		return
 	}
-	if fd.Parent() == m.desc {
+	if fd.Parent() == m.Descriptor() {
 		return
 	}
-	fields := m.desc.Fields()
+	fields := m.Descriptor().Fields()
 	index := fd.Index()
 	if index >= fields.Len() || fields.Get(index) != fd {
 		panic(errors.New("%v: field descriptor does not belong to this message", fd.FullName()))

+ 4 - 0
types/known/structpb/struct.pb.go

@@ -50,6 +50,10 @@ func (NullValue) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_struct_proto_enumTypes[0].EnumDescriptor
 }
 
+func (NullValue) Type() protoreflect.EnumType {
+	return &file_google_protobuf_struct_proto_enumTypes[0]
+}
+
 func (x NullValue) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }

+ 12 - 0
types/known/typepb/type.pb.go

@@ -53,6 +53,10 @@ func (Syntax) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_type_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Syntax) Type() protoreflect.EnumType {
+	return &file_google_protobuf_type_proto_enumTypes[0]
+}
+
 func (x Syntax) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -164,6 +168,10 @@ func (Field_Kind) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_type_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Field_Kind) Type() protoreflect.EnumType {
+	return &file_google_protobuf_type_proto_enumTypes[1]
+}
+
 func (x Field_Kind) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -215,6 +223,10 @@ func (Field_Cardinality) Descriptor() protoreflect.EnumDescriptor {
 	return file_google_protobuf_type_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Field_Cardinality) Type() protoreflect.EnumType {
+	return &file_google_protobuf_type_proto_enumTypes[2]
+}
+
 func (x Field_Cardinality) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }