cmd/protoc-gen-go: generate for v2-only dependencies

This removes yet another set of dependencies of v2 on v1.
The only remaining dependency are in the _test.go files,
primarily for proto.Equal.

Changes made:
* cmd/protoc-gen-go no longer generates any functionality that depends
on the v1 package, and instead only depends on v2.
* internal/fileinit.FileBuilder.MessageOutputTypes is switched from
protoreflect.MessageType to protoimpl.MessageType since the
implementation must be fully inialized before registration occurs.
* The test for internal/legacy/file_test.go is switched to a legacy_test
package to avoid a cyclic dependency.
This requires Load{Enum,Message,File}Desc to be exported.

Change-Id: I43e2fe64cff4eea204258ce11e791aca5eb6e569
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/169298
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/cmd/protoc-gen-go-grpc/testdata/go.mod b/cmd/protoc-gen-go-grpc/testdata/go.mod
index 4637edd..39d44c3 100644
--- a/cmd/protoc-gen-go-grpc/testdata/go.mod
+++ b/cmd/protoc-gen-go-grpc/testdata/go.mod
@@ -1,7 +1,7 @@
 module github.com/golang/protobuf/v2/cmd/protoc-gen-go-grpc/testdata
 
 require (
-	github.com/golang/protobuf v1.2.1-0.20190322195920-d94fb84e04b7
+	github.com/golang/protobuf v1.2.1-0.20190326022002-be03c15fcaa2
 	github.com/golang/protobuf/v2 v2.0.0
 	google.golang.org/grpc v1.19.0
 )
diff --git a/cmd/protoc-gen-go-grpc/testdata/grpc/deprecation.pb.go b/cmd/protoc-gen-go-grpc/testdata/grpc/deprecation.pb.go
index 48974c0..39887ad 100644
--- a/cmd/protoc-gen-go-grpc/testdata/grpc/deprecation.pb.go
+++ b/cmd/protoc-gen-go-grpc/testdata/grpc/deprecation.pb.go
@@ -4,8 +4,8 @@
 package grpc
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 )
 
@@ -54,8 +54,9 @@
 		RawDescriptor:     xxx_File_grpc_deprecation_proto_rawdesc,
 		GoTypes:           xxx_File_grpc_deprecation_proto_goTypes,
 		DependencyIndexes: xxx_File_grpc_deprecation_proto_depIdxs,
+		FilesRegistry:     protoregistry.GlobalFiles,
+		TypesRegistry:     protoregistry.GlobalTypes,
 	}.Init()
-	proto.RegisterFile("grpc/deprecation.proto", xxx_File_grpc_deprecation_proto_rawdesc_gzipped)
 	xxx_File_grpc_deprecation_proto_goTypes = nil
 	xxx_File_grpc_deprecation_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go b/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
index 240f089..4367cbd 100644
--- a/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
+++ b/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
@@ -4,10 +4,9 @@
 package grpc
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Request struct {
@@ -20,7 +19,7 @@
 	return xxx_File_grpc_grpc_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Request) Reset()         { *m = Request{} }
-func (m *Request) String() string { return proto.CompactTextString(m) }
+func (m *Request) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Request) ProtoMessage()    {}
 
 // Deprecated: Use Request.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_grpc_grpc_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Request) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Request.Unmarshal(m, b)
-}
-func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Request.Marshal(b, m, deterministic)
-}
-func (m *Request) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Request.Merge(m, src)
-}
-func (m *Request) XXX_Size() int {
-	return xxx_messageInfo_Request.Size(m)
-}
-func (m *Request) XXX_DiscardUnknown() {
-	xxx_messageInfo_Request.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Request proto.InternalMessageInfo
-
 type Response struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -56,7 +37,7 @@
 	return xxx_File_grpc_grpc_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Response) Reset()         { *m = Response{} }
-func (m *Response) String() string { return proto.CompactTextString(m) }
+func (m *Response) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Response) ProtoMessage()    {}
 
 // Deprecated: Use Response.ProtoReflect.Type instead.
@@ -64,24 +45,6 @@
 	return xxx_File_grpc_grpc_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *Response) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Response.Unmarshal(m, b)
-}
-func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Response.Marshal(b, m, deterministic)
-}
-func (m *Response) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Response.Merge(m, src)
-}
-func (m *Response) XXX_Size() int {
-	return xxx_messageInfo_Response.Size(m)
-}
-func (m *Response) XXX_DiscardUnknown() {
-	xxx_messageInfo_Response.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Response proto.InternalMessageInfo
-
 var xxx_File_grpc_grpc_proto_rawdesc = []byte{
 	// 466 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74,
@@ -143,21 +106,14 @@
 	if File_grpc_grpc_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 2)
 	File_grpc_grpc_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_grpc_grpc_proto_rawdesc,
 		GoTypes:            xxx_File_grpc_grpc_proto_goTypes,
 		DependencyIndexes:  xxx_File_grpc_grpc_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_grpc_grpc_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_grpc_grpc_proto_goTypes[0:][:2]
-	for i, mt := range messageTypes {
-		xxx_File_grpc_grpc_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_grpc_grpc_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("grpc/grpc.proto", xxx_File_grpc_grpc_proto_rawdesc_gzipped)
-	proto.RegisterType((*Request)(nil), "goproto.protoc.grpc.Request")
-	proto.RegisterType((*Response)(nil), "goproto.protoc.grpc.Response")
 	xxx_File_grpc_grpc_proto_goTypes = nil
 	xxx_File_grpc_grpc_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index cfa9e41..f831241 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -11,7 +11,6 @@
 	"go/parser"
 	"go/token"
 	"math"
-	"sort"
 	"strconv"
 	"strings"
 	"unicode"
@@ -28,8 +27,6 @@
 
 const (
 	mathPackage          = protogen.GoImportPath("math")
-	reflectPackage       = protogen.GoImportPath("reflect")
-	protoPackage         = protogen.GoImportPath("github.com/golang/protobuf/proto")
 	protoifacePackage    = protogen.GoImportPath("github.com/golang/protobuf/v2/runtime/protoiface")
 	protoimplPackage     = protogen.GoImportPath("github.com/golang/protobuf/v2/runtime/protoimpl")
 	protoreflectPackage  = protogen.GoImportPath("github.com/golang/protobuf/v2/reflect/protoreflect")
@@ -424,11 +421,7 @@
 	// Reset
 	g.P("func (m *", message.GoIdent, ") Reset() { *m = ", message.GoIdent, "{} }")
 	// String
-	if isDescriptor(f.File) {
-		g.P("func (m *", message.GoIdent, ") String() string { return ", protoimplPackage.Ident("X"), ".MessageStringOf(m) }")
-	} else {
-		g.P("func (m *", message.GoIdent, ") String() string { return ", protoPackage.Ident("CompactTextString"), "(m) }")
-	}
+	g.P("func (m *", message.GoIdent, ") String() string { return ", protoimplPackage.Ident("X"), ".MessageStringOf(m) }")
 	// ProtoMessage
 	g.P("func (*", message.GoIdent, ") ProtoMessage() {}")
 	// Descriptor
@@ -462,43 +455,6 @@
 
 	genWellKnownType(g, "*", message.GoIdent, message.Desc)
 
-	// Table-driven proto support.
-	//
-	// TODO: It does not scale to keep adding another method for every
-	// operation on protos that we want to switch over to using the
-	// table-driven approach. Instead, we should only add a single method
-	// that allows getting access to the *InternalMessageInfo struct and then
-	// calling Unmarshal, Marshal, Merge, Size, and Discard directly on that.
-	if !isDescriptor(f.File) {
-		// NOTE: We avoid adding table-driven support for descriptor proto
-		// since this depends on the v1 proto package, which would eventually
-		// need to depend on the descriptor itself.
-		messageInfoVar := "xxx_messageInfo_" + message.GoIdent.GoName
-		// XXX_Unmarshal
-		g.P("func (m *", message.GoIdent, ") XXX_Unmarshal(b []byte) error {")
-		g.P("return ", messageInfoVar, ".Unmarshal(m, b)")
-		g.P("}")
-		// XXX_Marshal
-		g.P("func (m *", message.GoIdent, ") XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {")
-		g.P("return ", messageInfoVar, ".Marshal(b, m, deterministic)")
-		g.P("}")
-		// XXX_Merge
-		g.P("func (m *", message.GoIdent, ") XXX_Merge(src proto.Message) {")
-		g.P(messageInfoVar, ".Merge(m, src)")
-		g.P("}")
-		// XXX_Size
-		g.P("func (m *", message.GoIdent, ") XXX_Size() int {")
-		g.P("return ", messageInfoVar, ".Size(m)")
-		g.P("}")
-		// XXX_DiscardUnknown
-		g.P("func (m *", message.GoIdent, ") XXX_DiscardUnknown() {")
-		g.P(messageInfoVar, ".DiscardUnknown(m)")
-		g.P("}")
-		g.P()
-		g.P("var ", messageInfoVar, " ", protoPackage.Ident("InternalMessageInfo"))
-		g.P()
-	}
-
 	// Constants and vars holding the default values of fields.
 	for _, field := range message.Fields {
 		if !field.Desc.HasDefault() {
@@ -761,50 +717,6 @@
 	return f.GoImportPath.Ident(name)
 }
 
-// genRegistrationV1 generates the init function body that registers the
-// types in the generated file with the v1 proto package.
-func genRegistrationV1(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo) {
-	// TODO: Remove this function when we always register with v2.
-	if isDescriptor(f.File) {
-		return
-	}
-
-	g.P(protoPackage.Ident("RegisterFile"), "(", strconv.Quote(f.Desc.Path()), ", ", f.descriptorGzipVar, ")")
-	for _, enum := range f.allEnums {
-		name := enum.GoIdent.GoName
-		g.P(protoPackage.Ident("RegisterEnum"), fmt.Sprintf("(%q, %s_name, %s_value)", enumRegistryName(enum), name, name))
-	}
-	for _, message := range f.allMessages {
-		if message.Desc.IsMapEntry() {
-			continue
-		}
-
-		name := message.GoIdent.GoName
-		g.P(protoPackage.Ident("RegisterType"), fmt.Sprintf("((*%s)(nil), %q)", name, message.Desc.FullName()))
-
-		// Types of map fields, sorted by the name of the field message type.
-		var mapFields []*protogen.Field
-		for _, field := range message.Fields {
-			if field.Desc.IsMap() {
-				mapFields = append(mapFields, field)
-			}
-		}
-		sort.Slice(mapFields, func(i, j int) bool {
-			ni := mapFields[i].MessageType.Desc.FullName()
-			nj := mapFields[j].MessageType.Desc.FullName()
-			return ni < nj
-		})
-		for _, field := range mapFields {
-			typeName := string(field.MessageType.Desc.FullName())
-			goType, _ := fieldGoType(g, field)
-			g.P(protoPackage.Ident("RegisterMapType"), fmt.Sprintf("((%v)(nil), %q)", goType, typeName))
-		}
-	}
-	for _, extension := range f.allExtensions {
-		g.P(protoPackage.Ident("RegisterExtension"), "(", extensionVar(f.File, extension), ")")
-	}
-}
-
 // deprecationComment returns a standard deprecation comment if deprecated is true.
 func deprecationComment(deprecated bool) string {
 	if !deprecated {
diff --git a/cmd/protoc-gen-go/internal_gengo/reflect.go b/cmd/protoc-gen-go/internal_gengo/reflect.go
index b9068dc..cf02078 100644
--- a/cmd/protoc-gen-go/internal_gengo/reflect.go
+++ b/cmd/protoc-gen-go/internal_gengo/reflect.go
@@ -149,9 +149,6 @@
 		g.P(initFuncName(impFile), "()")
 	}
 
-	if len(f.allMessages) > 0 {
-		g.P("messageTypes := make([]", protoreflectPackage.Ident("MessageType"), ",", len(f.allMessages), ")")
-	}
 	if len(f.allExtensions) > 0 {
 		g.P("extensionTypes := make([]", protoreflectPackage.Ident("ExtensionType"), ",", len(f.allExtensions), ")")
 	}
@@ -167,30 +164,20 @@
 		g.P("EnumOutputTypes: ", enumTypesVarName(f), ",")
 	}
 	if len(f.allMessages) > 0 {
-		g.P("MessageOutputTypes: messageTypes,")
+		g.P("MessageOutputTypes: ", messageTypesVarName(f), ",")
 	}
 	if len(f.allExtensions) > 0 {
 		g.P("ExtensionOutputTypes: extensionTypes,")
 	}
-	if isDescriptor(f.File) {
-		// TODO: Enable this for all protos.
-		g.P("FilesRegistry: ", protoregistryPackage.Ident("GlobalFiles"), ",")
-		g.P("TypesRegistry: ", protoregistryPackage.Ident("GlobalTypes"), ",")
-	}
+	g.P("FilesRegistry: ", protoregistryPackage.Ident("GlobalFiles"), ",")
+	g.P("TypesRegistry: ", protoregistryPackage.Ident("GlobalTypes"), ",")
 	g.P("}.Init()")
 
-	// Copy the local list of message types into the global array.
-	if len(f.allMessages) > 0 {
-		g.P("messageGoTypes := ", goTypesVarName(f), "[", len(f.allEnums), ":][:", len(f.allMessages), "]")
-		g.P("for i, mt := range messageTypes {")
-		g.P(messageTypesVarName(f), "[i].GoType = ", reflectPackage.Ident("TypeOf"), "(messageGoTypes[i])")
-		g.P(messageTypesVarName(f), "[i].PBType = mt")
-		g.P("}")
-	}
-
 	// The descriptor proto needs to register the option types with the
 	// prototype so that the package can properly handle those option types.
-	if isDescriptor(f.File) {
+	//
+	// TODO: Should this be handled by fileinit at runtime?
+	if f.Desc.Path() == "google/protobuf/descriptor.proto" && f.Desc.Package() == "google.protobuf" {
 		for _, m := range f.allMessages {
 			name := m.GoIdent.GoName
 			if strings.HasSuffix(name, "Options") {
@@ -199,8 +186,6 @@
 		}
 	}
 
-	genRegistrationV1(gen, g, f)
-
 	g.P(goTypesVarName(f), " = nil") // allow GC to reclaim resource
 	g.P(depIdxsVarName(f), " = nil") // allow GC to reclaim resource
 	g.P("}")
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
index e2d071c..9871f32 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
@@ -4,10 +4,9 @@
 package annotations
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type AnnotationsTestEnum int32
@@ -67,7 +66,7 @@
 	return xxx_File_annotations_annotations_proto_messageTypes[0].MessageOf(m)
 }
 func (m *AnnotationsTestMessage) Reset()         { *m = AnnotationsTestMessage{} }
-func (m *AnnotationsTestMessage) String() string { return proto.CompactTextString(m) }
+func (m *AnnotationsTestMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*AnnotationsTestMessage) ProtoMessage()    {}
 
 // Deprecated: Use AnnotationsTestMessage.ProtoReflect.Type instead.
@@ -75,24 +74,6 @@
 	return xxx_File_annotations_annotations_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *AnnotationsTestMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AnnotationsTestMessage.Unmarshal(m, b)
-}
-func (m *AnnotationsTestMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AnnotationsTestMessage.Marshal(b, m, deterministic)
-}
-func (m *AnnotationsTestMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AnnotationsTestMessage.Merge(m, src)
-}
-func (m *AnnotationsTestMessage) XXX_Size() int {
-	return xxx_messageInfo_AnnotationsTestMessage.Size(m)
-}
-func (m *AnnotationsTestMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_AnnotationsTestMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_AnnotationsTestMessage proto.InternalMessageInfo
-
 func (m *AnnotationsTestMessage) GetAnnotationsTestField() string {
 	if m != nil && m.AnnotationsTestField != nil {
 		return *m.AnnotationsTestField
@@ -140,22 +121,15 @@
 	if File_annotations_annotations_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_annotations_annotations_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_annotations_annotations_proto_rawdesc,
 		GoTypes:            xxx_File_annotations_annotations_proto_goTypes,
 		DependencyIndexes:  xxx_File_annotations_annotations_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_annotations_annotations_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_annotations_annotations_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_annotations_annotations_proto_goTypes[1:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_annotations_annotations_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_annotations_annotations_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("annotations/annotations.proto", xxx_File_annotations_annotations_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.annotations.AnnotationsTestEnum", AnnotationsTestEnum_name, AnnotationsTestEnum_value)
-	proto.RegisterType((*AnnotationsTestMessage)(nil), "goproto.protoc.annotations.AnnotationsTestMessage")
 	xxx_File_annotations_annotations_proto_goTypes = nil
 	xxx_File_annotations_annotations_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
index 8b28463..321d27b 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
@@ -1 +1 @@
-annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:318 end:337} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:354 end:401} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1562 end:1584} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1595 end:1615} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:3170 end:3193}
\ No newline at end of file
+annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:326 end:345} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:362 end:409} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1570 end:1592} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1603 end:1623} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:2467 end:2490}
\ No newline at end of file
diff --git a/cmd/protoc-gen-go/testdata/comments/comments.pb.go b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
index d159b09..5f29d2f 100644
--- a/cmd/protoc-gen-go/testdata/comments/comments.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
@@ -6,10 +6,9 @@
 package comments
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // COMMENT: Message1
@@ -31,7 +30,7 @@
 	return xxx_File_comments_comments_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message1) Reset()         { *m = Message1{} }
-func (m *Message1) String() string { return proto.CompactTextString(m) }
+func (m *Message1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message1) ProtoMessage()    {}
 
 // Deprecated: Use Message1.ProtoReflect.Type instead.
@@ -39,24 +38,6 @@
 	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Message1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message1.Unmarshal(m, b)
-}
-func (m *Message1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message1.Marshal(b, m, deterministic)
-}
-func (m *Message1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message1.Merge(m, src)
-}
-func (m *Message1) XXX_Size() int {
-	return xxx_messageInfo_Message1.Size(m)
-}
-func (m *Message1) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message1 proto.InternalMessageInfo
-
 func (m *Message1) GetField1A() string {
 	if m != nil && m.Field1A != nil {
 		return *m.Field1A
@@ -106,7 +87,7 @@
 	return xxx_File_comments_comments_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Message2) Reset()         { *m = Message2{} }
-func (m *Message2) String() string { return proto.CompactTextString(m) }
+func (m *Message2) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message2) ProtoMessage()    {}
 
 // Deprecated: Use Message2.ProtoReflect.Type instead.
@@ -114,24 +95,6 @@
 	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *Message2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message2.Unmarshal(m, b)
-}
-func (m *Message2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message2.Marshal(b, m, deterministic)
-}
-func (m *Message2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message2.Merge(m, src)
-}
-func (m *Message2) XXX_Size() int {
-	return xxx_messageInfo_Message2.Size(m)
-}
-func (m *Message2) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message2 proto.InternalMessageInfo
-
 // COMMENT: Message1A
 type Message1_Message1A struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -143,7 +106,7 @@
 	return xxx_File_comments_comments_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Message1_Message1A) Reset()         { *m = Message1_Message1A{} }
-func (m *Message1_Message1A) String() string { return proto.CompactTextString(m) }
+func (m *Message1_Message1A) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message1_Message1A) ProtoMessage()    {}
 
 // Deprecated: Use Message1_Message1A.ProtoReflect.Type instead.
@@ -151,24 +114,6 @@
 	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *Message1_Message1A) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message1_Message1A.Unmarshal(m, b)
-}
-func (m *Message1_Message1A) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message1_Message1A.Marshal(b, m, deterministic)
-}
-func (m *Message1_Message1A) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message1_Message1A.Merge(m, src)
-}
-func (m *Message1_Message1A) XXX_Size() int {
-	return xxx_messageInfo_Message1_Message1A.Size(m)
-}
-func (m *Message1_Message1A) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message1_Message1A.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message1_Message1A proto.InternalMessageInfo
-
 // COMMENT: Message1B
 type Message1_Message1B struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -180,7 +125,7 @@
 	return xxx_File_comments_comments_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Message1_Message1B) Reset()         { *m = Message1_Message1B{} }
-func (m *Message1_Message1B) String() string { return proto.CompactTextString(m) }
+func (m *Message1_Message1B) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message1_Message1B) ProtoMessage()    {}
 
 // Deprecated: Use Message1_Message1B.ProtoReflect.Type instead.
@@ -188,24 +133,6 @@
 	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{0, 1}
 }
 
-func (m *Message1_Message1B) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message1_Message1B.Unmarshal(m, b)
-}
-func (m *Message1_Message1B) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message1_Message1B.Marshal(b, m, deterministic)
-}
-func (m *Message1_Message1B) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message1_Message1B.Merge(m, src)
-}
-func (m *Message1_Message1B) XXX_Size() int {
-	return xxx_messageInfo_Message1_Message1B.Size(m)
-}
-func (m *Message1_Message1B) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message1_Message1B.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message1_Message1B proto.InternalMessageInfo
-
 // COMMENT: Message2A
 type Message2_Message2A struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -217,7 +144,7 @@
 	return xxx_File_comments_comments_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Message2_Message2A) Reset()         { *m = Message2_Message2A{} }
-func (m *Message2_Message2A) String() string { return proto.CompactTextString(m) }
+func (m *Message2_Message2A) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message2_Message2A) ProtoMessage()    {}
 
 // Deprecated: Use Message2_Message2A.ProtoReflect.Type instead.
@@ -225,24 +152,6 @@
 	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{1, 0}
 }
 
-func (m *Message2_Message2A) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message2_Message2A.Unmarshal(m, b)
-}
-func (m *Message2_Message2A) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message2_Message2A.Marshal(b, m, deterministic)
-}
-func (m *Message2_Message2A) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message2_Message2A.Merge(m, src)
-}
-func (m *Message2_Message2A) XXX_Size() int {
-	return xxx_messageInfo_Message2_Message2A.Size(m)
-}
-func (m *Message2_Message2A) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message2_Message2A.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message2_Message2A proto.InternalMessageInfo
-
 // COMMENT: Message2B
 type Message2_Message2B struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -254,7 +163,7 @@
 	return xxx_File_comments_comments_proto_messageTypes[5].MessageOf(m)
 }
 func (m *Message2_Message2B) Reset()         { *m = Message2_Message2B{} }
-func (m *Message2_Message2B) String() string { return proto.CompactTextString(m) }
+func (m *Message2_Message2B) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message2_Message2B) ProtoMessage()    {}
 
 // Deprecated: Use Message2_Message2B.ProtoReflect.Type instead.
@@ -262,24 +171,6 @@
 	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{1, 1}
 }
 
-func (m *Message2_Message2B) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message2_Message2B.Unmarshal(m, b)
-}
-func (m *Message2_Message2B) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message2_Message2B.Marshal(b, m, deterministic)
-}
-func (m *Message2_Message2B) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message2_Message2B.Merge(m, src)
-}
-func (m *Message2_Message2B) XXX_Size() int {
-	return xxx_messageInfo_Message2_Message2B.Size(m)
-}
-func (m *Message2_Message2B) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message2_Message2B.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message2_Message2B proto.InternalMessageInfo
-
 var xxx_File_comments_comments_proto_rawdesc = []byte{
 	// 272 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65,
@@ -323,25 +214,14 @@
 	if File_comments_comments_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 6)
 	File_comments_comments_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_comments_comments_proto_rawdesc,
 		GoTypes:            xxx_File_comments_comments_proto_goTypes,
 		DependencyIndexes:  xxx_File_comments_comments_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_comments_comments_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_comments_comments_proto_goTypes[0:][:6]
-	for i, mt := range messageTypes {
-		xxx_File_comments_comments_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_comments_comments_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("comments/comments.proto", xxx_File_comments_comments_proto_rawdesc_gzipped)
-	proto.RegisterType((*Message1)(nil), "goproto.protoc.comments.Message1")
-	proto.RegisterType((*Message2)(nil), "goproto.protoc.comments.Message2")
-	proto.RegisterType((*Message1_Message1A)(nil), "goproto.protoc.comments.Message1.Message1A")
-	proto.RegisterType((*Message1_Message1B)(nil), "goproto.protoc.comments.Message1.Message1B")
-	proto.RegisterType((*Message2_Message2A)(nil), "goproto.protoc.comments.Message2.Message2A")
-	proto.RegisterType((*Message2_Message2B)(nil), "goproto.protoc.comments.Message2.Message2B")
 	xxx_File_comments_comments_proto_goTypes = nil
 	xxx_File_comments_comments_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
index ffee4cb..d957b09 100644
--- a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
@@ -4,10 +4,9 @@
 package comments
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type DeprecatedEnum int32 // Deprecated: Do not use.
@@ -53,7 +52,7 @@
 	return xxx_File_comments_deprecated_proto_messageTypes[0].MessageOf(m)
 }
 func (m *DeprecatedMessage) Reset()         { *m = DeprecatedMessage{} }
-func (m *DeprecatedMessage) String() string { return proto.CompactTextString(m) }
+func (m *DeprecatedMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*DeprecatedMessage) ProtoMessage()    {}
 
 // Deprecated: Use DeprecatedMessage.ProtoReflect.Type instead.
@@ -61,24 +60,6 @@
 	return xxx_File_comments_deprecated_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *DeprecatedMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DeprecatedMessage.Unmarshal(m, b)
-}
-func (m *DeprecatedMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DeprecatedMessage.Marshal(b, m, deterministic)
-}
-func (m *DeprecatedMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeprecatedMessage.Merge(m, src)
-}
-func (m *DeprecatedMessage) XXX_Size() int {
-	return xxx_messageInfo_DeprecatedMessage.Size(m)
-}
-func (m *DeprecatedMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_DeprecatedMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DeprecatedMessage proto.InternalMessageInfo
-
 // Deprecated: Do not use.
 func (m *DeprecatedMessage) GetDeprecatedField() string {
 	if m != nil {
@@ -126,22 +107,15 @@
 	if File_comments_deprecated_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_comments_deprecated_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_comments_deprecated_proto_rawdesc,
 		GoTypes:            xxx_File_comments_deprecated_proto_goTypes,
 		DependencyIndexes:  xxx_File_comments_deprecated_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_comments_deprecated_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_comments_deprecated_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_comments_deprecated_proto_goTypes[1:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_comments_deprecated_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_comments_deprecated_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("comments/deprecated.proto", xxx_File_comments_deprecated_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.comments.DeprecatedEnum", DeprecatedEnum_name, DeprecatedEnum_value)
-	proto.RegisterType((*DeprecatedMessage)(nil), "goproto.protoc.comments.DeprecatedMessage")
 	xxx_File_comments_deprecated_proto_goTypes = nil
 	xxx_File_comments_deprecated_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
index 3b290a6..58f6021 100644
--- a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
@@ -4,11 +4,10 @@
 package base
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type BaseMessage struct {
@@ -23,7 +22,7 @@
 	return xxx_File_extensions_base_base_proto_messageTypes[0].MessageOf(m)
 }
 func (m *BaseMessage) Reset()         { *m = BaseMessage{} }
-func (m *BaseMessage) String() string { return proto.CompactTextString(m) }
+func (m *BaseMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*BaseMessage) ProtoMessage()    {}
 
 // Deprecated: Use BaseMessage.ProtoReflect.Type instead.
@@ -41,24 +40,6 @@
 	return extRange_BaseMessage
 }
 
-func (m *BaseMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BaseMessage.Unmarshal(m, b)
-}
-func (m *BaseMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BaseMessage.Marshal(b, m, deterministic)
-}
-func (m *BaseMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BaseMessage.Merge(m, src)
-}
-func (m *BaseMessage) XXX_Size() int {
-	return xxx_messageInfo_BaseMessage.Size(m)
-}
-func (m *BaseMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_BaseMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BaseMessage proto.InternalMessageInfo
-
 func (m *BaseMessage) GetField() string {
 	if m != nil && m.Field != nil {
 		return *m.Field
@@ -77,7 +58,7 @@
 	return xxx_File_extensions_base_base_proto_messageTypes[1].MessageOf(m)
 }
 func (m *MessageSetWireFormatMessage) Reset()         { *m = MessageSetWireFormatMessage{} }
-func (m *MessageSetWireFormatMessage) String() string { return proto.CompactTextString(m) }
+func (m *MessageSetWireFormatMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*MessageSetWireFormatMessage) ProtoMessage()    {}
 
 // Deprecated: Use MessageSetWireFormatMessage.ProtoReflect.Type instead.
@@ -94,24 +75,6 @@
 	return extRange_MessageSetWireFormatMessage
 }
 
-func (m *MessageSetWireFormatMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MessageSetWireFormatMessage.Unmarshal(m, b)
-}
-func (m *MessageSetWireFormatMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MessageSetWireFormatMessage.Marshal(b, m, deterministic)
-}
-func (m *MessageSetWireFormatMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MessageSetWireFormatMessage.Merge(m, src)
-}
-func (m *MessageSetWireFormatMessage) XXX_Size() int {
-	return xxx_messageInfo_MessageSetWireFormatMessage.Size(m)
-}
-func (m *MessageSetWireFormatMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_MessageSetWireFormatMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_MessageSetWireFormatMessage proto.InternalMessageInfo
-
 var xxx_File_extensions_base_base_proto_rawdesc = []byte{
 	// 233 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x62, 0x61, 0x73,
@@ -149,21 +112,14 @@
 	if File_extensions_base_base_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 2)
 	File_extensions_base_base_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_extensions_base_base_proto_rawdesc,
 		GoTypes:            xxx_File_extensions_base_base_proto_goTypes,
 		DependencyIndexes:  xxx_File_extensions_base_base_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_extensions_base_base_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_extensions_base_base_proto_goTypes[0:][:2]
-	for i, mt := range messageTypes {
-		xxx_File_extensions_base_base_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_extensions_base_base_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("extensions/base/base.proto", xxx_File_extensions_base_base_proto_rawdesc_gzipped)
-	proto.RegisterType((*BaseMessage)(nil), "goproto.protoc.extension.base.BaseMessage")
-	proto.RegisterType((*MessageSetWireFormatMessage)(nil), "goproto.protoc.extension.base.MessageSetWireFormatMessage")
 	xxx_File_extensions_base_base_proto_goTypes = nil
 	xxx_File_extensions_base_base_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
index 5cfb7e6..b7c3139 100644
--- a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
@@ -4,13 +4,12 @@
 package ext
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	base "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/extensions/base"
 	extra "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/extensions/extra"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Enum int32
@@ -70,7 +69,7 @@
 	return xxx_File_extensions_ext_ext_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
-func (m *Message) String() string { return proto.CompactTextString(m) }
+func (m *Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message) ProtoMessage()    {}
 
 // Deprecated: Use Message.ProtoReflect.Type instead.
@@ -78,24 +77,6 @@
 	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message.Unmarshal(m, b)
-}
-func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message.Marshal(b, m, deterministic)
-}
-func (m *Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message.Merge(m, src)
-}
-func (m *Message) XXX_Size() int {
-	return xxx_messageInfo_Message.Size(m)
-}
-func (m *Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message proto.InternalMessageInfo
-
 func (m *Message) GetData() []byte {
 	if m != nil {
 		return m.Data
@@ -114,7 +95,7 @@
 	return xxx_File_extensions_ext_ext_proto_messageTypes[1].MessageOf(m)
 }
 func (m *ExtensionGroup) Reset()         { *m = ExtensionGroup{} }
-func (m *ExtensionGroup) String() string { return proto.CompactTextString(m) }
+func (m *ExtensionGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ExtensionGroup) ProtoMessage()    {}
 
 // Deprecated: Use ExtensionGroup.ProtoReflect.Type instead.
@@ -122,24 +103,6 @@
 	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *ExtensionGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExtensionGroup.Unmarshal(m, b)
-}
-func (m *ExtensionGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExtensionGroup.Marshal(b, m, deterministic)
-}
-func (m *ExtensionGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExtensionGroup.Merge(m, src)
-}
-func (m *ExtensionGroup) XXX_Size() int {
-	return xxx_messageInfo_ExtensionGroup.Size(m)
-}
-func (m *ExtensionGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExtensionGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExtensionGroup proto.InternalMessageInfo
-
 func (m *ExtensionGroup) GetExtensionGroup() string {
 	if m != nil && m.ExtensionGroup != nil {
 		return *m.ExtensionGroup
@@ -158,7 +121,7 @@
 	return xxx_File_extensions_ext_ext_proto_messageTypes[2].MessageOf(m)
 }
 func (m *ExtendingMessage) Reset()         { *m = ExtendingMessage{} }
-func (m *ExtendingMessage) String() string { return proto.CompactTextString(m) }
+func (m *ExtendingMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ExtendingMessage) ProtoMessage()    {}
 
 // Deprecated: Use ExtendingMessage.ProtoReflect.Type instead.
@@ -166,24 +129,6 @@
 	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *ExtendingMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExtendingMessage.Unmarshal(m, b)
-}
-func (m *ExtendingMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExtendingMessage.Marshal(b, m, deterministic)
-}
-func (m *ExtendingMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExtendingMessage.Merge(m, src)
-}
-func (m *ExtendingMessage) XXX_Size() int {
-	return xxx_messageInfo_ExtendingMessage.Size(m)
-}
-func (m *ExtendingMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExtendingMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExtendingMessage proto.InternalMessageInfo
-
 type RepeatedGroup struct {
 	RepeatedXGroup       []string `protobuf:"bytes,319,rep,name=repeated_x_group,json=repeatedXGroup" json:"repeated_x_group,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -195,7 +140,7 @@
 	return xxx_File_extensions_ext_ext_proto_messageTypes[3].MessageOf(m)
 }
 func (m *RepeatedGroup) Reset()         { *m = RepeatedGroup{} }
-func (m *RepeatedGroup) String() string { return proto.CompactTextString(m) }
+func (m *RepeatedGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*RepeatedGroup) ProtoMessage()    {}
 
 // Deprecated: Use RepeatedGroup.ProtoReflect.Type instead.
@@ -203,24 +148,6 @@
 	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{3}
 }
 
-func (m *RepeatedGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RepeatedGroup.Unmarshal(m, b)
-}
-func (m *RepeatedGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RepeatedGroup.Marshal(b, m, deterministic)
-}
-func (m *RepeatedGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RepeatedGroup.Merge(m, src)
-}
-func (m *RepeatedGroup) XXX_Size() int {
-	return xxx_messageInfo_RepeatedGroup.Size(m)
-}
-func (m *RepeatedGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_RepeatedGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RepeatedGroup proto.InternalMessageInfo
-
 func (m *RepeatedGroup) GetRepeatedXGroup() []string {
 	if m != nil {
 		return m.RepeatedXGroup
@@ -240,7 +167,7 @@
 	return xxx_File_extensions_ext_ext_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Extendable) Reset()         { *m = Extendable{} }
-func (m *Extendable) String() string { return proto.CompactTextString(m) }
+func (m *Extendable) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Extendable) ProtoMessage()    {}
 
 // Deprecated: Use Extendable.ProtoReflect.Type instead.
@@ -257,24 +184,6 @@
 	return extRange_Extendable
 }
 
-func (m *Extendable) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Extendable.Unmarshal(m, b)
-}
-func (m *Extendable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Extendable.Marshal(b, m, deterministic)
-}
-func (m *Extendable) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Extendable.Merge(m, src)
-}
-func (m *Extendable) XXX_Size() int {
-	return xxx_messageInfo_Extendable.Size(m)
-}
-func (m *Extendable) XXX_DiscardUnknown() {
-	xxx_messageInfo_Extendable.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Extendable proto.InternalMessageInfo
-
 // Message set wire format.
 type MessageSetWireFormatExtension struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -286,7 +195,7 @@
 	return xxx_File_extensions_ext_ext_proto_messageTypes[5].MessageOf(m)
 }
 func (m *MessageSetWireFormatExtension) Reset()         { *m = MessageSetWireFormatExtension{} }
-func (m *MessageSetWireFormatExtension) String() string { return proto.CompactTextString(m) }
+func (m *MessageSetWireFormatExtension) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*MessageSetWireFormatExtension) ProtoMessage()    {}
 
 // Deprecated: Use MessageSetWireFormatExtension.ProtoReflect.Type instead.
@@ -294,24 +203,6 @@
 	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{5}
 }
 
-func (m *MessageSetWireFormatExtension) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MessageSetWireFormatExtension.Unmarshal(m, b)
-}
-func (m *MessageSetWireFormatExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MessageSetWireFormatExtension.Marshal(b, m, deterministic)
-}
-func (m *MessageSetWireFormatExtension) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MessageSetWireFormatExtension.Merge(m, src)
-}
-func (m *MessageSetWireFormatExtension) XXX_Size() int {
-	return xxx_messageInfo_MessageSetWireFormatExtension.Size(m)
-}
-func (m *MessageSetWireFormatExtension) XXX_DiscardUnknown() {
-	xxx_messageInfo_MessageSetWireFormatExtension.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_MessageSetWireFormatExtension proto.InternalMessageInfo
-
 type Message_M struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -322,7 +213,7 @@
 	return xxx_File_extensions_ext_ext_proto_messageTypes[6].MessageOf(m)
 }
 func (m *Message_M) Reset()         { *m = Message_M{} }
-func (m *Message_M) String() string { return proto.CompactTextString(m) }
+func (m *Message_M) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message_M) ProtoMessage()    {}
 
 // Deprecated: Use Message_M.ProtoReflect.Type instead.
@@ -330,24 +221,6 @@
 	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *Message_M) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message_M.Unmarshal(m, b)
-}
-func (m *Message_M) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message_M.Marshal(b, m, deterministic)
-}
-func (m *Message_M) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message_M.Merge(m, src)
-}
-func (m *Message_M) XXX_Size() int {
-	return xxx_messageInfo_Message_M.Size(m)
-}
-func (m *Message_M) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message_M.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message_M proto.InternalMessageInfo
-
 type ExtendingMessage_ExtendingMessageSubmessage struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -361,7 +234,7 @@
 	*m = ExtendingMessage_ExtendingMessageSubmessage{}
 }
 func (m *ExtendingMessage_ExtendingMessageSubmessage) String() string {
-	return proto.CompactTextString(m)
+	return protoimpl.X.MessageStringOf(m)
 }
 func (*ExtendingMessage_ExtendingMessageSubmessage) ProtoMessage() {}
 
@@ -370,24 +243,6 @@
 	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{2, 0}
 }
 
-func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Unmarshal(m, b)
-}
-func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Marshal(b, m, deterministic)
-}
-func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Merge(m, src)
-}
-func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Size() int {
-	return xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Size(m)
-}
-func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage proto.InternalMessageInfo
-
 var xxx_File_extensions_ext_ext_proto_extDescs = []protoiface.ExtensionDescV1{
 	{
 		ExtendedType:  (*base.BaseMessage)(nil),
@@ -1278,7 +1133,6 @@
 	if File_extensions_ext_ext_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 8)
 	extensionTypes := make([]protoreflect.ExtensionType, 44)
 	File_extensions_ext_ext_proto = protoimpl.FileBuilder{
 		RawDescriptor:        xxx_File_extensions_ext_ext_proto_rawdesc,
@@ -1286,68 +1140,11 @@
 		DependencyIndexes:    xxx_File_extensions_ext_ext_proto_depIdxs,
 		LegacyExtensions:     xxx_File_extensions_ext_ext_proto_extDescs,
 		EnumOutputTypes:      xxx_File_extensions_ext_ext_proto_enumTypes,
-		MessageOutputTypes:   messageTypes,
+		MessageOutputTypes:   xxx_File_extensions_ext_ext_proto_messageTypes,
 		ExtensionOutputTypes: extensionTypes,
+		FilesRegistry:        protoregistry.GlobalFiles,
+		TypesRegistry:        protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_extensions_ext_ext_proto_goTypes[1:][:8]
-	for i, mt := range messageTypes {
-		xxx_File_extensions_ext_ext_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_extensions_ext_ext_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("extensions/ext/ext.proto", xxx_File_extensions_ext_ext_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.extension.ext.Enum", Enum_name, Enum_value)
-	proto.RegisterType((*Message)(nil), "goproto.protoc.extension.ext.Message")
-	proto.RegisterType((*ExtensionGroup)(nil), "goproto.protoc.extension.ext.ExtensionGroup")
-	proto.RegisterType((*ExtendingMessage)(nil), "goproto.protoc.extension.ext.ExtendingMessage")
-	proto.RegisterType((*RepeatedGroup)(nil), "goproto.protoc.extension.ext.RepeatedGroup")
-	proto.RegisterType((*Extendable)(nil), "goproto.protoc.extension.ext.Extendable")
-	proto.RegisterType((*MessageSetWireFormatExtension)(nil), "goproto.protoc.extension.ext.MessageSetWireFormatExtension")
-	proto.RegisterType((*Message_M)(nil), "goproto.protoc.extension.ext.Message.M")
-	proto.RegisterType((*ExtendingMessage_ExtendingMessageSubmessage)(nil), "goproto.protoc.extension.ext.ExtendingMessage.ExtendingMessageSubmessage")
-	proto.RegisterExtension(E_ExtensionBool)
-	proto.RegisterExtension(E_ExtensionEnum)
-	proto.RegisterExtension(E_ExtensionInt32)
-	proto.RegisterExtension(E_ExtensionSint32)
-	proto.RegisterExtension(E_ExtensionUint32)
-	proto.RegisterExtension(E_ExtensionInt64)
-	proto.RegisterExtension(E_ExtensionSint64)
-	proto.RegisterExtension(E_ExtensionUint64)
-	proto.RegisterExtension(E_ExtensionSfixed32)
-	proto.RegisterExtension(E_ExtensionFixed32)
-	proto.RegisterExtension(E_ExtensionFloat)
-	proto.RegisterExtension(E_ExtensionSfixed64)
-	proto.RegisterExtension(E_ExtensionFixed64)
-	proto.RegisterExtension(E_ExtensionDouble)
-	proto.RegisterExtension(E_ExtensionString)
-	proto.RegisterExtension(E_ExtensionBytes)
-	proto.RegisterExtension(E_Extension_Message)
-	proto.RegisterExtension(E_Extension_MessageM)
-	proto.RegisterExtension(E_Extensiongroup)
-	proto.RegisterExtension(E_ExtraMessage)
-	proto.RegisterExtension(E_RepeatedXBool)
-	proto.RegisterExtension(E_RepeatedXEnum)
-	proto.RegisterExtension(E_RepeatedXInt32)
-	proto.RegisterExtension(E_RepeatedXSint32)
-	proto.RegisterExtension(E_RepeatedXUint32)
-	proto.RegisterExtension(E_RepeatedXInt64)
-	proto.RegisterExtension(E_RepeatedXSint64)
-	proto.RegisterExtension(E_RepeatedXUint64)
-	proto.RegisterExtension(E_RepeatedXSfixed32)
-	proto.RegisterExtension(E_RepeatedXFixed32)
-	proto.RegisterExtension(E_RepeatedXFloat)
-	proto.RegisterExtension(E_RepeatedXSfixed64)
-	proto.RegisterExtension(E_RepeatedXFixed64)
-	proto.RegisterExtension(E_RepeatedXDouble)
-	proto.RegisterExtension(E_RepeatedXString)
-	proto.RegisterExtension(E_RepeatedXBytes)
-	proto.RegisterExtension(E_RepeatedX_Message)
-	proto.RegisterExtension(E_Repeatedgroup)
-	proto.RegisterExtension(E_ExtendableField)
-	proto.RegisterExtension(E_ExtendableStringField)
-	proto.RegisterExtension(E_MessageSetExtension)
-	proto.RegisterExtension(E_ExtendingMessage_ExtendingMessageString)
-	proto.RegisterExtension(E_ExtendingMessage_ExtendingMessageSubmessage)
-	proto.RegisterExtension(E_MessageSetWireFormatExtension_MessageSetExtension)
 	xxx_File_extensions_ext_ext_proto_goTypes = nil
 	xxx_File_extensions_ext_ext_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
index 507b395..988acb5 100644
--- a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
@@ -4,10 +4,9 @@
 package extra
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type ExtraMessage struct {
@@ -21,7 +20,7 @@
 	return xxx_File_extensions_extra_extra_proto_messageTypes[0].MessageOf(m)
 }
 func (m *ExtraMessage) Reset()         { *m = ExtraMessage{} }
-func (m *ExtraMessage) String() string { return proto.CompactTextString(m) }
+func (m *ExtraMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ExtraMessage) ProtoMessage()    {}
 
 // Deprecated: Use ExtraMessage.ProtoReflect.Type instead.
@@ -29,24 +28,6 @@
 	return xxx_File_extensions_extra_extra_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *ExtraMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExtraMessage.Unmarshal(m, b)
-}
-func (m *ExtraMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExtraMessage.Marshal(b, m, deterministic)
-}
-func (m *ExtraMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExtraMessage.Merge(m, src)
-}
-func (m *ExtraMessage) XXX_Size() int {
-	return xxx_messageInfo_ExtraMessage.Size(m)
-}
-func (m *ExtraMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExtraMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExtraMessage proto.InternalMessageInfo
-
 func (m *ExtraMessage) GetData() []byte {
 	if m != nil {
 		return m.Data
@@ -86,20 +67,14 @@
 	if File_extensions_extra_extra_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_extensions_extra_extra_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_extensions_extra_extra_proto_rawdesc,
 		GoTypes:            xxx_File_extensions_extra_extra_proto_goTypes,
 		DependencyIndexes:  xxx_File_extensions_extra_extra_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_extensions_extra_extra_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_extensions_extra_extra_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_extensions_extra_extra_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_extensions_extra_extra_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("extensions/extra/extra.proto", xxx_File_extensions_extra_extra_proto_rawdesc_gzipped)
-	proto.RegisterType((*ExtraMessage)(nil), "goproto.protoc.extension.extra.ExtraMessage")
 	xxx_File_extensions_extra_extra_proto_goTypes = nil
 	xxx_File_extensions_extra_extra_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
index 446c804..1c0a651 100644
--- a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
@@ -4,12 +4,11 @@
 package proto3
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 	descriptor "github.com/golang/protobuf/v2/types/descriptor"
-	reflect "reflect"
 )
 
 type Enum int32
@@ -54,7 +53,7 @@
 	return xxx_File_extensions_proto3_ext3_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
-func (m *Message) String() string { return proto.CompactTextString(m) }
+func (m *Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message) ProtoMessage()    {}
 
 // Deprecated: Use Message.ProtoReflect.Type instead.
@@ -62,24 +61,6 @@
 	return xxx_File_extensions_proto3_ext3_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message.Unmarshal(m, b)
-}
-func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message.Marshal(b, m, deterministic)
-}
-func (m *Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message.Merge(m, src)
-}
-func (m *Message) XXX_Size() int {
-	return xxx_messageInfo_Message.Size(m)
-}
-func (m *Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message proto.InternalMessageInfo
-
 var xxx_File_extensions_proto3_ext3_proto_extDescs = []protoiface.ExtensionDescV1{
 	{
 		ExtendedType:  (*descriptor.MessageOptions)(nil),
@@ -725,7 +706,6 @@
 	if File_extensions_proto3_ext3_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	extensionTypes := make([]protoreflect.ExtensionType, 34)
 	File_extensions_proto3_ext3_proto = protoimpl.FileBuilder{
 		RawDescriptor:        xxx_File_extensions_proto3_ext3_proto_rawdesc,
@@ -733,51 +713,11 @@
 		DependencyIndexes:    xxx_File_extensions_proto3_ext3_proto_depIdxs,
 		LegacyExtensions:     xxx_File_extensions_proto3_ext3_proto_extDescs,
 		EnumOutputTypes:      xxx_File_extensions_proto3_ext3_proto_enumTypes,
-		MessageOutputTypes:   messageTypes,
+		MessageOutputTypes:   xxx_File_extensions_proto3_ext3_proto_messageTypes,
 		ExtensionOutputTypes: extensionTypes,
+		FilesRegistry:        protoregistry.GlobalFiles,
+		TypesRegistry:        protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_extensions_proto3_ext3_proto_goTypes[1:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_extensions_proto3_ext3_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_extensions_proto3_ext3_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("extensions/proto3/ext3.proto", xxx_File_extensions_proto3_ext3_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.extension.proto3.Enum", Enum_name, Enum_value)
-	proto.RegisterType((*Message)(nil), "goproto.protoc.extension.proto3.Message")
-	proto.RegisterExtension(E_ExtensionBool)
-	proto.RegisterExtension(E_ExtensionEnum)
-	proto.RegisterExtension(E_ExtensionInt32)
-	proto.RegisterExtension(E_ExtensionSint32)
-	proto.RegisterExtension(E_ExtensionUint32)
-	proto.RegisterExtension(E_ExtensionInt64)
-	proto.RegisterExtension(E_ExtensionSint64)
-	proto.RegisterExtension(E_ExtensionUint64)
-	proto.RegisterExtension(E_ExtensionSfixed32)
-	proto.RegisterExtension(E_ExtensionFixed32)
-	proto.RegisterExtension(E_ExtensionFloat)
-	proto.RegisterExtension(E_ExtensionSfixed64)
-	proto.RegisterExtension(E_ExtensionFixed64)
-	proto.RegisterExtension(E_ExtensionDouble)
-	proto.RegisterExtension(E_ExtensionString)
-	proto.RegisterExtension(E_ExtensionBytes)
-	proto.RegisterExtension(E_Extension_Message)
-	proto.RegisterExtension(E_RepeatedExtensionBool)
-	proto.RegisterExtension(E_RepeatedExtensionEnum)
-	proto.RegisterExtension(E_RepeatedExtensionInt32)
-	proto.RegisterExtension(E_RepeatedExtensionSint32)
-	proto.RegisterExtension(E_RepeatedExtensionUint32)
-	proto.RegisterExtension(E_RepeatedExtensionInt64)
-	proto.RegisterExtension(E_RepeatedExtensionSint64)
-	proto.RegisterExtension(E_RepeatedExtensionUint64)
-	proto.RegisterExtension(E_RepeatedExtensionSfixed32)
-	proto.RegisterExtension(E_RepeatedExtensionFixed32)
-	proto.RegisterExtension(E_RepeatedExtensionFloat)
-	proto.RegisterExtension(E_RepeatedExtensionSfixed64)
-	proto.RegisterExtension(E_RepeatedExtensionFixed64)
-	proto.RegisterExtension(E_RepeatedExtensionDouble)
-	proto.RegisterExtension(E_RepeatedExtensionString)
-	proto.RegisterExtension(E_RepeatedExtensionBytes)
-	proto.RegisterExtension(E_RepeatedExtension_Message)
 	xxx_File_extensions_proto3_ext3_proto_goTypes = nil
 	xxx_File_extensions_proto3_ext3_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
index 02d8712..1a60df1 100644
--- a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
+++ b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
@@ -4,10 +4,9 @@
 package fieldnames
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // Assorted edge cases in field name conflict resolution.
@@ -59,7 +58,7 @@
 	return xxx_File_fieldnames_fieldnames_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
-func (m *Message) String() string { return proto.CompactTextString(m) }
+func (m *Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message) ProtoMessage()    {}
 
 // Deprecated: Use Message.ProtoReflect.Type instead.
@@ -67,24 +66,6 @@
 	return xxx_File_fieldnames_fieldnames_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message.Unmarshal(m, b)
-}
-func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message.Marshal(b, m, deterministic)
-}
-func (m *Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message.Merge(m, src)
-}
-func (m *Message) XXX_Size() int {
-	return xxx_messageInfo_Message.Size(m)
-}
-func (m *Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message proto.InternalMessageInfo
-
 func (m *Message) GetFieldOne() string {
 	if m != nil && m.FieldOne != nil {
 		return *m.FieldOne
@@ -288,7 +269,7 @@
 	return xxx_File_fieldnames_fieldnames_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Message_OneofMessageConflict) Reset()         { *m = Message_OneofMessageConflict{} }
-func (m *Message_OneofMessageConflict) String() string { return proto.CompactTextString(m) }
+func (m *Message_OneofMessageConflict) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message_OneofMessageConflict) ProtoMessage()    {}
 
 // Deprecated: Use Message_OneofMessageConflict.ProtoReflect.Type instead.
@@ -296,24 +277,6 @@
 	return xxx_File_fieldnames_fieldnames_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *Message_OneofMessageConflict) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message_OneofMessageConflict.Unmarshal(m, b)
-}
-func (m *Message_OneofMessageConflict) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message_OneofMessageConflict.Marshal(b, m, deterministic)
-}
-func (m *Message_OneofMessageConflict) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message_OneofMessageConflict.Merge(m, src)
-}
-func (m *Message_OneofMessageConflict) XXX_Size() int {
-	return xxx_messageInfo_Message_OneofMessageConflict.Size(m)
-}
-func (m *Message_OneofMessageConflict) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message_OneofMessageConflict.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message_OneofMessageConflict proto.InternalMessageInfo
-
 var xxx_File_fieldnames_fieldnames_proto_rawdesc = []byte{
 	// 826 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x65,
@@ -388,21 +351,14 @@
 	if File_fieldnames_fieldnames_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 2)
 	File_fieldnames_fieldnames_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_fieldnames_fieldnames_proto_rawdesc,
 		GoTypes:            xxx_File_fieldnames_fieldnames_proto_goTypes,
 		DependencyIndexes:  xxx_File_fieldnames_fieldnames_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_fieldnames_fieldnames_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_fieldnames_fieldnames_proto_goTypes[0:][:2]
-	for i, mt := range messageTypes {
-		xxx_File_fieldnames_fieldnames_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_fieldnames_fieldnames_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("fieldnames/fieldnames.proto", xxx_File_fieldnames_fieldnames_proto_rawdesc_gzipped)
-	proto.RegisterType((*Message)(nil), "goproto.protoc.fieldnames.Message")
-	proto.RegisterType((*Message_OneofMessageConflict)(nil), "goproto.protoc.fieldnames.Message.OneofMessageConflict")
 	xxx_File_fieldnames_fieldnames_proto_goTypes = nil
 	xxx_File_fieldnames_fieldnames_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/go.mod b/cmd/protoc-gen-go/testdata/go.mod
index 57b0d1e..c8b3c59 100644
--- a/cmd/protoc-gen-go/testdata/go.mod
+++ b/cmd/protoc-gen-go/testdata/go.mod
@@ -1,7 +1,7 @@
 module github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata
 
 require (
-	github.com/golang/protobuf v1.2.1-0.20190322195920-d94fb84e04b7
+	github.com/golang/protobuf v1.2.1-0.20190326022002-be03c15fcaa2
 	github.com/golang/protobuf/v2 v2.0.0
 )
 
diff --git a/cmd/protoc-gen-go/testdata/import_public/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
index ceb4196..a4eab42 100644
--- a/cmd/protoc-gen-go/testdata/import_public/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
@@ -4,12 +4,11 @@
 package import_public
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	sub "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/import_public/sub"
 	sub2 "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/import_public/sub2"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // Symbols defined in public import of import_public/sub/a.proto
@@ -67,7 +66,7 @@
 	return xxx_File_import_public_a_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Public) Reset()         { *m = Public{} }
-func (m *Public) String() string { return proto.CompactTextString(m) }
+func (m *Public) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Public) ProtoMessage()    {}
 
 // Deprecated: Use Public.ProtoReflect.Type instead.
@@ -75,24 +74,6 @@
 	return xxx_File_import_public_a_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Public) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Public.Unmarshal(m, b)
-}
-func (m *Public) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Public.Marshal(b, m, deterministic)
-}
-func (m *Public) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Public.Merge(m, src)
-}
-func (m *Public) XXX_Size() int {
-	return xxx_messageInfo_Public.Size(m)
-}
-func (m *Public) XXX_DiscardUnknown() {
-	xxx_messageInfo_Public.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Public proto.InternalMessageInfo
-
 func (m *Public) GetM() *sub.M {
 	if m != nil {
 		return m.M
@@ -167,20 +148,14 @@
 		return
 	}
 	xxx_File_import_public_b_proto_init()
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_import_public_a_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_import_public_a_proto_rawdesc,
 		GoTypes:            xxx_File_import_public_a_proto_goTypes,
 		DependencyIndexes:  xxx_File_import_public_a_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_import_public_a_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_import_public_a_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_import_public_a_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_import_public_a_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("import_public/a.proto", xxx_File_import_public_a_proto_rawdesc_gzipped)
-	proto.RegisterType((*Public)(nil), "goproto.protoc.import_public.Public")
 	xxx_File_import_public_a_proto_goTypes = nil
 	xxx_File_import_public_a_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
index 56f9a72..d04c0ad 100644
--- a/cmd/protoc-gen-go/testdata/import_public/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
@@ -4,11 +4,10 @@
 package import_public
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	sub "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/import_public/sub"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Local struct {
@@ -23,7 +22,7 @@
 	return xxx_File_import_public_b_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Local) Reset()         { *m = Local{} }
-func (m *Local) String() string { return proto.CompactTextString(m) }
+func (m *Local) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Local) ProtoMessage()    {}
 
 // Deprecated: Use Local.ProtoReflect.Type instead.
@@ -31,24 +30,6 @@
 	return xxx_File_import_public_b_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Local) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Local.Unmarshal(m, b)
-}
-func (m *Local) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Local.Marshal(b, m, deterministic)
-}
-func (m *Local) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Local.Merge(m, src)
-}
-func (m *Local) XXX_Size() int {
-	return xxx_messageInfo_Local.Size(m)
-}
-func (m *Local) XXX_DiscardUnknown() {
-	xxx_messageInfo_Local.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Local proto.InternalMessageInfo
-
 func (m *Local) GetM() *sub.M {
 	if m != nil {
 		return m.M
@@ -106,20 +87,14 @@
 	if File_import_public_b_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_import_public_b_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_import_public_b_proto_rawdesc,
 		GoTypes:            xxx_File_import_public_b_proto_goTypes,
 		DependencyIndexes:  xxx_File_import_public_b_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_import_public_b_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_import_public_b_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_import_public_b_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_import_public_b_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("import_public/b.proto", xxx_File_import_public_b_proto_rawdesc_gzipped)
-	proto.RegisterType((*Local)(nil), "goproto.protoc.import_public.Local")
 	xxx_File_import_public_b_proto_goTypes = nil
 	xxx_File_import_public_b_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
index cc4f585..21fddab 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
@@ -4,13 +4,12 @@
 package sub
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	sub2 "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/import_public/sub2"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 	math "math"
-	reflect "reflect"
 )
 
 // Symbols defined in public import of import_public/sub2/a.proto
@@ -175,7 +174,7 @@
 	return xxx_File_import_public_sub_a_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M) Reset()         { *m = M{} }
-func (m *M) String() string { return proto.CompactTextString(m) }
+func (m *M) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M) ProtoMessage()    {}
 
 // Deprecated: Use M.ProtoReflect.Type instead.
@@ -192,24 +191,6 @@
 	return extRange_M
 }
 
-func (m *M) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M.Unmarshal(m, b)
-}
-func (m *M) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M.Marshal(b, m, deterministic)
-}
-func (m *M) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M.Merge(m, src)
-}
-func (m *M) XXX_Size() int {
-	return xxx_messageInfo_M.Size(m)
-}
-func (m *M) XXX_DiscardUnknown() {
-	xxx_messageInfo_M.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M proto.InternalMessageInfo
-
 const Default_M_S string = "default"
 
 var Default_M_B []byte = []byte("default")
@@ -302,7 +283,7 @@
 	return xxx_File_import_public_sub_a_proto_messageTypes[1].MessageOf(m)
 }
 func (m *M_Submessage) Reset()         { *m = M_Submessage{} }
-func (m *M_Submessage) String() string { return proto.CompactTextString(m) }
+func (m *M_Submessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M_Submessage) ProtoMessage()    {}
 
 // Deprecated: Use M_Submessage.ProtoReflect.Type instead.
@@ -310,24 +291,6 @@
 	return xxx_File_import_public_sub_a_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *M_Submessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M_Submessage.Unmarshal(m, b)
-}
-func (m *M_Submessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M_Submessage.Marshal(b, m, deterministic)
-}
-func (m *M_Submessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M_Submessage.Merge(m, src)
-}
-func (m *M_Submessage) XXX_Size() int {
-	return xxx_messageInfo_M_Submessage.Size(m)
-}
-func (m *M_Submessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_M_Submessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M_Submessage proto.InternalMessageInfo
-
 type isM_Submessage_SubmessageOneofField interface {
 	isM_Submessage_SubmessageOneofField()
 }
@@ -464,7 +427,6 @@
 		return
 	}
 	xxx_File_import_public_sub_b_proto_init()
-	messageTypes := make([]protoreflect.MessageType, 2)
 	extensionTypes := make([]protoreflect.ExtensionType, 1)
 	File_import_public_sub_a_proto = protoimpl.FileBuilder{
 		RawDescriptor:        xxx_File_import_public_sub_a_proto_rawdesc,
@@ -472,21 +434,11 @@
 		DependencyIndexes:    xxx_File_import_public_sub_a_proto_depIdxs,
 		LegacyExtensions:     xxx_File_import_public_sub_a_proto_extDescs,
 		EnumOutputTypes:      xxx_File_import_public_sub_a_proto_enumTypes,
-		MessageOutputTypes:   messageTypes,
+		MessageOutputTypes:   xxx_File_import_public_sub_a_proto_messageTypes,
 		ExtensionOutputTypes: extensionTypes,
+		FilesRegistry:        protoregistry.GlobalFiles,
+		TypesRegistry:        protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_import_public_sub_a_proto_goTypes[3:][:2]
-	for i, mt := range messageTypes {
-		xxx_File_import_public_sub_a_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_import_public_sub_a_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("import_public/sub/a.proto", xxx_File_import_public_sub_a_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.import_public.sub.E", E_name, E_value)
-	proto.RegisterEnum("goproto.protoc.import_public.sub.M_Subenum", M_Subenum_name, M_Subenum_value)
-	proto.RegisterEnum("goproto.protoc.import_public.sub.M_Submessage_Submessage_Subenum", M_Submessage_Submessage_Subenum_name, M_Submessage_Submessage_Subenum_value)
-	proto.RegisterType((*M)(nil), "goproto.protoc.import_public.sub.M")
-	proto.RegisterType((*M_Submessage)(nil), "goproto.protoc.import_public.sub.M.Submessage")
-	proto.RegisterExtension(E_ExtensionField)
 	xxx_File_import_public_sub_a_proto_goTypes = nil
 	xxx_File_import_public_sub_a_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
index 28e3938..da0fa2e 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
@@ -4,10 +4,9 @@
 package sub
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type M2 struct {
@@ -20,7 +19,7 @@
 	return xxx_File_import_public_sub_b_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M2) Reset()         { *m = M2{} }
-func (m *M2) String() string { return proto.CompactTextString(m) }
+func (m *M2) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M2) ProtoMessage()    {}
 
 // Deprecated: Use M2.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_import_public_sub_b_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M2.Unmarshal(m, b)
-}
-func (m *M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M2.Marshal(b, m, deterministic)
-}
-func (m *M2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M2.Merge(m, src)
-}
-func (m *M2) XXX_Size() int {
-	return xxx_messageInfo_M2.Size(m)
-}
-func (m *M2) XXX_DiscardUnknown() {
-	xxx_messageInfo_M2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M2 proto.InternalMessageInfo
-
 var xxx_File_import_public_sub_b_proto_rawdesc = []byte{
 	// 145 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
@@ -77,20 +58,14 @@
 	if File_import_public_sub_b_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_import_public_sub_b_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_import_public_sub_b_proto_rawdesc,
 		GoTypes:            xxx_File_import_public_sub_b_proto_goTypes,
 		DependencyIndexes:  xxx_File_import_public_sub_b_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_import_public_sub_b_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_import_public_sub_b_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_import_public_sub_b_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_import_public_sub_b_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("import_public/sub/b.proto", xxx_File_import_public_sub_b_proto_rawdesc_gzipped)
-	proto.RegisterType((*M2)(nil), "goproto.protoc.import_public.sub.M2")
 	xxx_File_import_public_sub_b_proto_goTypes = nil
 	xxx_File_import_public_sub_b_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go
index a467e7d..63c77f4 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go
@@ -4,10 +4,9 @@
 package sub2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Sub2Message struct {
@@ -20,7 +19,7 @@
 	return xxx_File_import_public_sub2_a_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Sub2Message) Reset()         { *m = Sub2Message{} }
-func (m *Sub2Message) String() string { return proto.CompactTextString(m) }
+func (m *Sub2Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Sub2Message) ProtoMessage()    {}
 
 // Deprecated: Use Sub2Message.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_import_public_sub2_a_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Sub2Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Sub2Message.Unmarshal(m, b)
-}
-func (m *Sub2Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Sub2Message.Marshal(b, m, deterministic)
-}
-func (m *Sub2Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Sub2Message.Merge(m, src)
-}
-func (m *Sub2Message) XXX_Size() int {
-	return xxx_messageInfo_Sub2Message.Size(m)
-}
-func (m *Sub2Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_Sub2Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Sub2Message proto.InternalMessageInfo
-
 var xxx_File_import_public_sub2_a_proto_rawdesc = []byte{
 	// 157 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1a, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
@@ -77,20 +58,14 @@
 	if File_import_public_sub2_a_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_import_public_sub2_a_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_import_public_sub2_a_proto_rawdesc,
 		GoTypes:            xxx_File_import_public_sub2_a_proto_goTypes,
 		DependencyIndexes:  xxx_File_import_public_sub2_a_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_import_public_sub2_a_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_import_public_sub2_a_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_import_public_sub2_a_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_import_public_sub2_a_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("import_public/sub2/a.proto", xxx_File_import_public_sub2_a_proto_rawdesc_gzipped)
-	proto.RegisterType((*Sub2Message)(nil), "goproto.protoc.import_public.sub2.Sub2Message")
 	xxx_File_import_public_sub2_a_proto_goTypes = nil
 	xxx_File_import_public_sub2_a_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
index 1fe71ef..a937858 100644
--- a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
@@ -4,10 +4,9 @@
 package fmt
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type M struct {
@@ -20,7 +19,7 @@
 	return xxx_File_imports_fmt_m_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M) Reset()         { *m = M{} }
-func (m *M) String() string { return proto.CompactTextString(m) }
+func (m *M) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M) ProtoMessage()    {}
 
 // Deprecated: Use M.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_imports_fmt_m_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M.Unmarshal(m, b)
-}
-func (m *M) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M.Marshal(b, m, deterministic)
-}
-func (m *M) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M.Merge(m, src)
-}
-func (m *M) XXX_Size() int {
-	return xxx_messageInfo_M.Size(m)
-}
-func (m *M) XXX_DiscardUnknown() {
-	xxx_messageInfo_M.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M proto.InternalMessageInfo
-
 var xxx_File_imports_fmt_m_proto_rawdesc = []byte{
 	// 111 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x13, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x66, 0x6d, 0x74, 0x2f, 0x6d, 0x2e,
@@ -74,20 +55,14 @@
 	if File_imports_fmt_m_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_fmt_m_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_fmt_m_proto_rawdesc,
 		GoTypes:            xxx_File_imports_fmt_m_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_fmt_m_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_fmt_m_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_fmt_m_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_fmt_m_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_fmt_m_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/fmt/m.proto", xxx_File_imports_fmt_m_proto_rawdesc_gzipped)
-	proto.RegisterType((*M)(nil), "fmt.M")
 	xxx_File_imports_fmt_m_proto_goTypes = nil
 	xxx_File_imports_fmt_m_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
index 167c0c9..88c2bd5 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
@@ -4,10 +4,9 @@
 package test_a_1
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type E1 int32
@@ -52,7 +51,7 @@
 	return xxx_File_imports_test_a_1_m1_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M1) Reset()         { *m = M1{} }
-func (m *M1) String() string { return proto.CompactTextString(m) }
+func (m *M1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M1) ProtoMessage()    {}
 
 // Deprecated: Use M1.ProtoReflect.Type instead.
@@ -60,24 +59,6 @@
 	return xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M1.Unmarshal(m, b)
-}
-func (m *M1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M1.Marshal(b, m, deterministic)
-}
-func (m *M1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M1.Merge(m, src)
-}
-func (m *M1) XXX_Size() int {
-	return xxx_messageInfo_M1.Size(m)
-}
-func (m *M1) XXX_DiscardUnknown() {
-	xxx_messageInfo_M1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M1 proto.InternalMessageInfo
-
 type M1_1 struct {
 	M1                   *M1      `protobuf:"bytes,1,opt,name=m1,proto3" json:"m1,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -89,7 +70,7 @@
 	return xxx_File_imports_test_a_1_m1_proto_messageTypes[1].MessageOf(m)
 }
 func (m *M1_1) Reset()         { *m = M1_1{} }
-func (m *M1_1) String() string { return proto.CompactTextString(m) }
+func (m *M1_1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M1_1) ProtoMessage()    {}
 
 // Deprecated: Use M1_1.ProtoReflect.Type instead.
@@ -97,24 +78,6 @@
 	return xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *M1_1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M1_1.Unmarshal(m, b)
-}
-func (m *M1_1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M1_1.Marshal(b, m, deterministic)
-}
-func (m *M1_1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M1_1.Merge(m, src)
-}
-func (m *M1_1) XXX_Size() int {
-	return xxx_messageInfo_M1_1.Size(m)
-}
-func (m *M1_1) XXX_DiscardUnknown() {
-	xxx_messageInfo_M1_1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M1_1 proto.InternalMessageInfo
-
 func (m *M1_1) GetM1() *M1 {
 	if m != nil {
 		return m.M1
@@ -160,23 +123,15 @@
 	if File_imports_test_a_1_m1_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 2)
 	File_imports_test_a_1_m1_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_a_1_m1_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_a_1_m1_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_a_1_m1_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_imports_test_a_1_m1_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_a_1_m1_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_a_1_m1_proto_goTypes[1:][:2]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_a_1_m1_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_a_1_m1_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_a_1/m1.proto", xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped)
-	proto.RegisterEnum("test.a.E1", E1_name, E1_value)
-	proto.RegisterType((*M1)(nil), "test.a.M1")
-	proto.RegisterType((*M1_1)(nil), "test.a.M1_1")
 	xxx_File_imports_test_a_1_m1_proto_goTypes = nil
 	xxx_File_imports_test_a_1_m1_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
index 102318c..f6f7ec1 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
@@ -4,10 +4,9 @@
 package test_a_1
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type M2 struct {
@@ -20,7 +19,7 @@
 	return xxx_File_imports_test_a_1_m2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M2) Reset()         { *m = M2{} }
-func (m *M2) String() string { return proto.CompactTextString(m) }
+func (m *M2) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M2) ProtoMessage()    {}
 
 // Deprecated: Use M2.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_imports_test_a_1_m2_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M2.Unmarshal(m, b)
-}
-func (m *M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M2.Marshal(b, m, deterministic)
-}
-func (m *M2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M2.Merge(m, src)
-}
-func (m *M2) XXX_Size() int {
-	return xxx_messageInfo_M2.Size(m)
-}
-func (m *M2) XXX_DiscardUnknown() {
-	xxx_messageInfo_M2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M2 proto.InternalMessageInfo
-
 var xxx_File_imports_test_a_1_m2_proto_rawdesc = []byte{
 	// 126 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
@@ -75,20 +56,14 @@
 	if File_imports_test_a_1_m2_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_a_1_m2_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_a_1_m2_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_a_1_m2_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_a_1_m2_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_a_1_m2_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_a_1_m2_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_a_1_m2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_a_1_m2_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_a_1/m2.proto", xxx_File_imports_test_a_1_m2_proto_rawdesc_gzipped)
-	proto.RegisterType((*M2)(nil), "test.a.M2")
 	xxx_File_imports_test_a_1_m2_proto_goTypes = nil
 	xxx_File_imports_test_a_1_m2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
index f23dce0..258e2d3 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
@@ -4,10 +4,9 @@
 package test_a_2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type M3 struct {
@@ -20,7 +19,7 @@
 	return xxx_File_imports_test_a_2_m3_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M3) Reset()         { *m = M3{} }
-func (m *M3) String() string { return proto.CompactTextString(m) }
+func (m *M3) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M3) ProtoMessage()    {}
 
 // Deprecated: Use M3.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_imports_test_a_2_m3_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M3) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M3.Unmarshal(m, b)
-}
-func (m *M3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M3.Marshal(b, m, deterministic)
-}
-func (m *M3) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M3.Merge(m, src)
-}
-func (m *M3) XXX_Size() int {
-	return xxx_messageInfo_M3.Size(m)
-}
-func (m *M3) XXX_DiscardUnknown() {
-	xxx_messageInfo_M3.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M3 proto.InternalMessageInfo
-
 var xxx_File_imports_test_a_2_m3_proto_rawdesc = []byte{
 	// 126 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
@@ -75,20 +56,14 @@
 	if File_imports_test_a_2_m3_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_a_2_m3_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_a_2_m3_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_a_2_m3_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_a_2_m3_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_a_2_m3_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_a_2_m3_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_a_2_m3_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_a_2_m3_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_a_2/m3.proto", xxx_File_imports_test_a_2_m3_proto_rawdesc_gzipped)
-	proto.RegisterType((*M3)(nil), "test.a.M3")
 	xxx_File_imports_test_a_2_m3_proto_goTypes = nil
 	xxx_File_imports_test_a_2_m3_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
index 3febc09..8dcd49d 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
@@ -4,10 +4,9 @@
 package test_a_2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type M4 struct {
@@ -20,7 +19,7 @@
 	return xxx_File_imports_test_a_2_m4_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M4) Reset()         { *m = M4{} }
-func (m *M4) String() string { return proto.CompactTextString(m) }
+func (m *M4) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M4) ProtoMessage()    {}
 
 // Deprecated: Use M4.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_imports_test_a_2_m4_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M4) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M4.Unmarshal(m, b)
-}
-func (m *M4) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M4.Marshal(b, m, deterministic)
-}
-func (m *M4) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M4.Merge(m, src)
-}
-func (m *M4) XXX_Size() int {
-	return xxx_messageInfo_M4.Size(m)
-}
-func (m *M4) XXX_DiscardUnknown() {
-	xxx_messageInfo_M4.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M4 proto.InternalMessageInfo
-
 var xxx_File_imports_test_a_2_m4_proto_rawdesc = []byte{
 	// 126 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
@@ -75,20 +56,14 @@
 	if File_imports_test_a_2_m4_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_a_2_m4_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_a_2_m4_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_a_2_m4_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_a_2_m4_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_a_2_m4_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_a_2_m4_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_a_2_m4_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_a_2_m4_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_a_2/m4.proto", xxx_File_imports_test_a_2_m4_proto_rawdesc_gzipped)
-	proto.RegisterType((*M4)(nil), "test.a.M4")
 	xxx_File_imports_test_a_2_m4_proto_goTypes = nil
 	xxx_File_imports_test_a_2_m4_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
index 924fc1c..5d37d5f 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
@@ -4,10 +4,9 @@
 package beta
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type M1 struct {
@@ -20,7 +19,7 @@
 	return xxx_File_imports_test_b_1_m1_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M1) Reset()         { *m = M1{} }
-func (m *M1) String() string { return proto.CompactTextString(m) }
+func (m *M1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M1) ProtoMessage()    {}
 
 // Deprecated: Use M1.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_imports_test_b_1_m1_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M1.Unmarshal(m, b)
-}
-func (m *M1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M1.Marshal(b, m, deterministic)
-}
-func (m *M1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M1.Merge(m, src)
-}
-func (m *M1) XXX_Size() int {
-	return xxx_messageInfo_M1.Size(m)
-}
-func (m *M1) XXX_DiscardUnknown() {
-	xxx_messageInfo_M1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M1 proto.InternalMessageInfo
-
 var xxx_File_imports_test_b_1_m1_proto_rawdesc = []byte{
 	// 137 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x62,
@@ -76,20 +57,14 @@
 	if File_imports_test_b_1_m1_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_b_1_m1_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_b_1_m1_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_b_1_m1_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_b_1_m1_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_b_1_m1_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_b_1_m1_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_b_1_m1_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_b_1_m1_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_b_1/m1.proto", xxx_File_imports_test_b_1_m1_proto_rawdesc_gzipped)
-	proto.RegisterType((*M1)(nil), "test.b.part1.M1")
 	xxx_File_imports_test_b_1_m1_proto_goTypes = nil
 	xxx_File_imports_test_b_1_m1_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
index 02b89ba..5dc9ffe 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
@@ -4,10 +4,9 @@
 package beta
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type M2 struct {
@@ -20,7 +19,7 @@
 	return xxx_File_imports_test_b_1_m2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M2) Reset()         { *m = M2{} }
-func (m *M2) String() string { return proto.CompactTextString(m) }
+func (m *M2) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*M2) ProtoMessage()    {}
 
 // Deprecated: Use M2.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_imports_test_b_1_m2_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *M2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_M2.Unmarshal(m, b)
-}
-func (m *M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_M2.Marshal(b, m, deterministic)
-}
-func (m *M2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_M2.Merge(m, src)
-}
-func (m *M2) XXX_Size() int {
-	return xxx_messageInfo_M2.Size(m)
-}
-func (m *M2) XXX_DiscardUnknown() {
-	xxx_messageInfo_M2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_M2 proto.InternalMessageInfo
-
 var xxx_File_imports_test_b_1_m2_proto_rawdesc = []byte{
 	// 137 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x62,
@@ -76,20 +57,14 @@
 	if File_imports_test_b_1_m2_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_b_1_m2_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_b_1_m2_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_b_1_m2_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_b_1_m2_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_b_1_m2_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_b_1_m2_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_b_1_m2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_b_1_m2_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_b_1/m2.proto", xxx_File_imports_test_b_1_m2_proto_rawdesc_gzipped)
-	proto.RegisterType((*M2)(nil), "test.b.part2.M2")
 	xxx_File_imports_test_b_1_m2_proto_goTypes = nil
 	xxx_File_imports_test_b_1_m2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
index e3117b5..80759e4 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
@@ -4,11 +4,10 @@
 package imports
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	test_a_1 "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/imports/test_a_1"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type A1M1 struct {
@@ -22,7 +21,7 @@
 	return xxx_File_imports_test_import_a1m1_proto_messageTypes[0].MessageOf(m)
 }
 func (m *A1M1) Reset()         { *m = A1M1{} }
-func (m *A1M1) String() string { return proto.CompactTextString(m) }
+func (m *A1M1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*A1M1) ProtoMessage()    {}
 
 // Deprecated: Use A1M1.ProtoReflect.Type instead.
@@ -30,24 +29,6 @@
 	return xxx_File_imports_test_import_a1m1_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *A1M1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_A1M1.Unmarshal(m, b)
-}
-func (m *A1M1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_A1M1.Marshal(b, m, deterministic)
-}
-func (m *A1M1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_A1M1.Merge(m, src)
-}
-func (m *A1M1) XXX_Size() int {
-	return xxx_messageInfo_A1M1.Size(m)
-}
-func (m *A1M1) XXX_DiscardUnknown() {
-	xxx_messageInfo_A1M1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_A1M1 proto.InternalMessageInfo
-
 func (m *A1M1) GetF() *test_a_1.M1 {
 	if m != nil {
 		return m.F
@@ -90,20 +71,14 @@
 	if File_imports_test_import_a1m1_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_import_a1m1_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_import_a1m1_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_import_a1m1_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_import_a1m1_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_import_a1m1_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_import_a1m1_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_import_a1m1_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_import_a1m1_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_import_a1m1.proto", xxx_File_imports_test_import_a1m1_proto_rawdesc_gzipped)
-	proto.RegisterType((*A1M1)(nil), "test.A1M1")
 	xxx_File_imports_test_import_a1m1_proto_goTypes = nil
 	xxx_File_imports_test_import_a1m1_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
index 99641a3..b345e35 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
@@ -4,11 +4,10 @@
 package imports
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	test_a_1 "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/imports/test_a_1"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type A1M2 struct {
@@ -22,7 +21,7 @@
 	return xxx_File_imports_test_import_a1m2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *A1M2) Reset()         { *m = A1M2{} }
-func (m *A1M2) String() string { return proto.CompactTextString(m) }
+func (m *A1M2) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*A1M2) ProtoMessage()    {}
 
 // Deprecated: Use A1M2.ProtoReflect.Type instead.
@@ -30,24 +29,6 @@
 	return xxx_File_imports_test_import_a1m2_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *A1M2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_A1M2.Unmarshal(m, b)
-}
-func (m *A1M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_A1M2.Marshal(b, m, deterministic)
-}
-func (m *A1M2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_A1M2.Merge(m, src)
-}
-func (m *A1M2) XXX_Size() int {
-	return xxx_messageInfo_A1M2.Size(m)
-}
-func (m *A1M2) XXX_DiscardUnknown() {
-	xxx_messageInfo_A1M2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_A1M2 proto.InternalMessageInfo
-
 func (m *A1M2) GetF() *test_a_1.M2 {
 	if m != nil {
 		return m.F
@@ -90,20 +71,14 @@
 	if File_imports_test_import_a1m2_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_import_a1m2_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_import_a1m2_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_import_a1m2_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_import_a1m2_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_import_a1m2_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_import_a1m2_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_import_a1m2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_import_a1m2_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_import_a1m2.proto", xxx_File_imports_test_import_a1m2_proto_rawdesc_gzipped)
-	proto.RegisterType((*A1M2)(nil), "test.A1M2")
 	xxx_File_imports_test_import_a1m2_proto_goTypes = nil
 	xxx_File_imports_test_import_a1m2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
index c51a54d..e8c83f7 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
@@ -4,14 +4,13 @@
 package imports
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	fmt "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/imports/fmt"
 	test_a_1 "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/imports/test_a_1"
 	_ "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/imports/test_a_2"
 	test_b_1 "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/imports/test_b_1"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type All struct {
@@ -29,7 +28,7 @@
 	return xxx_File_imports_test_import_all_proto_messageTypes[0].MessageOf(m)
 }
 func (m *All) Reset()         { *m = All{} }
-func (m *All) String() string { return proto.CompactTextString(m) }
+func (m *All) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*All) ProtoMessage()    {}
 
 // Deprecated: Use All.ProtoReflect.Type instead.
@@ -37,24 +36,6 @@
 	return xxx_File_imports_test_import_all_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *All) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_All.Unmarshal(m, b)
-}
-func (m *All) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_All.Marshal(b, m, deterministic)
-}
-func (m *All) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_All.Merge(m, src)
-}
-func (m *All) XXX_Size() int {
-	return xxx_messageInfo_All.Size(m)
-}
-func (m *All) XXX_DiscardUnknown() {
-	xxx_messageInfo_All.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_All proto.InternalMessageInfo
-
 func (m *All) GetAm1() *test_a_1.M1 {
 	if m != nil {
 		return m.Am1
@@ -151,20 +132,14 @@
 	if File_imports_test_import_all_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_imports_test_import_all_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_imports_test_import_all_proto_rawdesc,
 		GoTypes:            xxx_File_imports_test_import_all_proto_goTypes,
 		DependencyIndexes:  xxx_File_imports_test_import_all_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_imports_test_import_all_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_imports_test_import_all_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_imports_test_import_all_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_imports_test_import_all_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("imports/test_import_all.proto", xxx_File_imports_test_import_all_proto_rawdesc_gzipped)
-	proto.RegisterType((*All)(nil), "test.All")
 	xxx_File_imports_test_import_all_proto_goTypes = nil
 	xxx_File_imports_test_import_all_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go b/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go
index f069b11..df50ae1 100644
--- a/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go
+++ b/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go
@@ -4,10 +4,9 @@
 package oneoftest
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Foo struct {
@@ -23,7 +22,7 @@
 	return xxx_File_issue780_oneof_conflict_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Foo) Reset()         { *m = Foo{} }
-func (m *Foo) String() string { return proto.CompactTextString(m) }
+func (m *Foo) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Foo) ProtoMessage()    {}
 
 // Deprecated: Use Foo.ProtoReflect.Type instead.
@@ -31,24 +30,6 @@
 	return xxx_File_issue780_oneof_conflict_test_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Foo) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Foo.Unmarshal(m, b)
-}
-func (m *Foo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Foo.Marshal(b, m, deterministic)
-}
-func (m *Foo) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Foo.Merge(m, src)
-}
-func (m *Foo) XXX_Size() int {
-	return xxx_messageInfo_Foo.Size(m)
-}
-func (m *Foo) XXX_DiscardUnknown() {
-	xxx_messageInfo_Foo.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Foo proto.InternalMessageInfo
-
 type isFoo_Bar interface {
 	isFoo_Bar()
 }
@@ -107,20 +88,14 @@
 	if File_issue780_oneof_conflict_test_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_issue780_oneof_conflict_test_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_issue780_oneof_conflict_test_proto_rawdesc,
 		GoTypes:            xxx_File_issue780_oneof_conflict_test_proto_goTypes,
 		DependencyIndexes:  xxx_File_issue780_oneof_conflict_test_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_issue780_oneof_conflict_test_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_issue780_oneof_conflict_test_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_issue780_oneof_conflict_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_issue780_oneof_conflict_test_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("issue780_oneof_conflict/test.proto", xxx_File_issue780_oneof_conflict_test_proto_rawdesc_gzipped)
-	proto.RegisterType((*Foo)(nil), "oneoftest.Foo")
 	xxx_File_issue780_oneof_conflict_test_proto_goTypes = nil
 	xxx_File_issue780_oneof_conflict_test_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
index cf2f164..4ef3404 100644
--- a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
+++ b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
@@ -4,10 +4,9 @@
 package nopackage
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Enum int32
@@ -68,7 +67,7 @@
 	return xxx_File_nopackage_nopackage_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
-func (m *Message) String() string { return proto.CompactTextString(m) }
+func (m *Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message) ProtoMessage()    {}
 
 // Deprecated: Use Message.ProtoReflect.Type instead.
@@ -76,24 +75,6 @@
 	return xxx_File_nopackage_nopackage_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message.Unmarshal(m, b)
-}
-func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message.Marshal(b, m, deterministic)
-}
-func (m *Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message.Merge(m, src)
-}
-func (m *Message) XXX_Size() int {
-	return xxx_messageInfo_Message.Size(m)
-}
-func (m *Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message proto.InternalMessageInfo
-
 const Default_Message_EnumField Enum = Enum_ZERO
 
 func (m *Message) GetStringField() string {
@@ -144,22 +125,15 @@
 	if File_nopackage_nopackage_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_nopackage_nopackage_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_nopackage_nopackage_proto_rawdesc,
 		GoTypes:            xxx_File_nopackage_nopackage_proto_goTypes,
 		DependencyIndexes:  xxx_File_nopackage_nopackage_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_nopackage_nopackage_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_nopackage_nopackage_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_nopackage_nopackage_proto_goTypes[1:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_nopackage_nopackage_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_nopackage_nopackage_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("nopackage/nopackage.proto", xxx_File_nopackage_nopackage_proto_rawdesc_gzipped)
-	proto.RegisterEnum("Enum", Enum_name, Enum_value)
-	proto.RegisterType((*Message)(nil), "Message")
 	xxx_File_nopackage_nopackage_proto_goTypes = nil
 	xxx_File_nopackage_nopackage_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
index ecfed3c..72a9bfc 100644
--- a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
@@ -4,10 +4,9 @@
 package proto2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // EnumType1 comment.
@@ -311,7 +310,7 @@
 	return xxx_File_proto2_enum_proto_messageTypes[0].MessageOf(m)
 }
 func (m *EnumContainerMessage1) Reset()         { *m = EnumContainerMessage1{} }
-func (m *EnumContainerMessage1) String() string { return proto.CompactTextString(m) }
+func (m *EnumContainerMessage1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*EnumContainerMessage1) ProtoMessage()    {}
 
 // Deprecated: Use EnumContainerMessage1.ProtoReflect.Type instead.
@@ -319,24 +318,6 @@
 	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *EnumContainerMessage1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_EnumContainerMessage1.Unmarshal(m, b)
-}
-func (m *EnumContainerMessage1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_EnumContainerMessage1.Marshal(b, m, deterministic)
-}
-func (m *EnumContainerMessage1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_EnumContainerMessage1.Merge(m, src)
-}
-func (m *EnumContainerMessage1) XXX_Size() int {
-	return xxx_messageInfo_EnumContainerMessage1.Size(m)
-}
-func (m *EnumContainerMessage1) XXX_DiscardUnknown() {
-	xxx_messageInfo_EnumContainerMessage1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_EnumContainerMessage1 proto.InternalMessageInfo
-
 const Default_EnumContainerMessage1_DefaultDuplicate1 EnumType2 = EnumType2_duplicate1
 const Default_EnumContainerMessage1_DefaultDuplicate2 EnumType2 = EnumType2_duplicate2
 
@@ -367,7 +348,7 @@
 	*m = EnumContainerMessage1_EnumContainerMessage2{}
 }
 func (m *EnumContainerMessage1_EnumContainerMessage2) String() string {
-	return proto.CompactTextString(m)
+	return protoimpl.X.MessageStringOf(m)
 }
 func (*EnumContainerMessage1_EnumContainerMessage2) ProtoMessage() {}
 
@@ -376,24 +357,6 @@
 	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *EnumContainerMessage1_EnumContainerMessage2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_EnumContainerMessage1_EnumContainerMessage2.Unmarshal(m, b)
-}
-func (m *EnumContainerMessage1_EnumContainerMessage2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_EnumContainerMessage1_EnumContainerMessage2.Marshal(b, m, deterministic)
-}
-func (m *EnumContainerMessage1_EnumContainerMessage2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_EnumContainerMessage1_EnumContainerMessage2.Merge(m, src)
-}
-func (m *EnumContainerMessage1_EnumContainerMessage2) XXX_Size() int {
-	return xxx_messageInfo_EnumContainerMessage1_EnumContainerMessage2.Size(m)
-}
-func (m *EnumContainerMessage1_EnumContainerMessage2) XXX_DiscardUnknown() {
-	xxx_messageInfo_EnumContainerMessage1_EnumContainerMessage2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_EnumContainerMessage1_EnumContainerMessage2 proto.InternalMessageInfo
-
 var xxx_File_proto2_enum_proto_rawdesc = []byte{
 	// 624 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x70, 0x72,
@@ -465,28 +428,15 @@
 	if File_proto2_enum_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 2)
 	File_proto2_enum_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_proto2_enum_proto_rawdesc,
 		GoTypes:            xxx_File_proto2_enum_proto_goTypes,
 		DependencyIndexes:  xxx_File_proto2_enum_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_proto2_enum_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_proto2_enum_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_proto2_enum_proto_goTypes[6:][:2]
-	for i, mt := range messageTypes {
-		xxx_File_proto2_enum_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_proto2_enum_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("proto2/enum.proto", xxx_File_proto2_enum_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.proto2.EnumType1", EnumType1_name, EnumType1_value)
-	proto.RegisterEnum("goproto.protoc.proto2.EnumType2", EnumType2_name, EnumType2_value)
-	proto.RegisterEnum("goproto.protoc.proto2.EnumContainerMessage1_NestedEnumType1A", EnumContainerMessage1_NestedEnumType1A_name, EnumContainerMessage1_NestedEnumType1A_value)
-	proto.RegisterEnum("goproto.protoc.proto2.EnumContainerMessage1_NestedEnumType1B", EnumContainerMessage1_NestedEnumType1B_name, EnumContainerMessage1_NestedEnumType1B_value)
-	proto.RegisterEnum("goproto.protoc.proto2.EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A", EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A_name, EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A_value)
-	proto.RegisterEnum("goproto.protoc.proto2.EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B", EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B_name, EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B_value)
-	proto.RegisterType((*EnumContainerMessage1)(nil), "goproto.protoc.proto2.EnumContainerMessage1")
-	proto.RegisterType((*EnumContainerMessage1_EnumContainerMessage2)(nil), "goproto.protoc.proto2.EnumContainerMessage1.EnumContainerMessage2")
 	xxx_File_proto2_enum_proto_goTypes = nil
 	xxx_File_proto2_enum_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
index 4806de3..4c316a8 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
@@ -4,11 +4,10 @@
 package proto2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 	math "math"
-	reflect "reflect"
 )
 
 type FieldTestMessage_Enum int32
@@ -176,7 +175,7 @@
 	return xxx_File_proto2_fields_proto_messageTypes[0].MessageOf(m)
 }
 func (m *FieldTestMessage) Reset()         { *m = FieldTestMessage{} }
-func (m *FieldTestMessage) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage.ProtoReflect.Type instead.
@@ -184,24 +183,6 @@
 	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *FieldTestMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage.Unmarshal(m, b)
-}
-func (m *FieldTestMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage.Merge(m, src)
-}
-func (m *FieldTestMessage) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage.Size(m)
-}
-func (m *FieldTestMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage proto.InternalMessageInfo
-
 const Default_FieldTestMessage_DefaultBool bool = true
 const Default_FieldTestMessage_DefaultEnum FieldTestMessage_Enum = FieldTestMessage_ONE
 const Default_FieldTestMessage_DefaultInt32 int32 = 1
@@ -1130,7 +1111,7 @@
 	return xxx_File_proto2_fields_proto_messageTypes[1].MessageOf(m)
 }
 func (m *FieldTestMessage_OptionalGroup) Reset()         { *m = FieldTestMessage_OptionalGroup{} }
-func (m *FieldTestMessage_OptionalGroup) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage_OptionalGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage_OptionalGroup) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage_OptionalGroup.ProtoReflect.Type instead.
@@ -1138,24 +1119,6 @@
 	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *FieldTestMessage_OptionalGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage_OptionalGroup.Unmarshal(m, b)
-}
-func (m *FieldTestMessage_OptionalGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage_OptionalGroup.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage_OptionalGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage_OptionalGroup.Merge(m, src)
-}
-func (m *FieldTestMessage_OptionalGroup) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage_OptionalGroup.Size(m)
-}
-func (m *FieldTestMessage_OptionalGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage_OptionalGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage_OptionalGroup proto.InternalMessageInfo
-
 func (m *FieldTestMessage_OptionalGroup) GetOptionalGroup() string {
 	if m != nil && m.OptionalGroup != nil {
 		return *m.OptionalGroup
@@ -1174,7 +1137,7 @@
 	return xxx_File_proto2_fields_proto_messageTypes[2].MessageOf(m)
 }
 func (m *FieldTestMessage_RequiredGroup) Reset()         { *m = FieldTestMessage_RequiredGroup{} }
-func (m *FieldTestMessage_RequiredGroup) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage_RequiredGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage_RequiredGroup) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage_RequiredGroup.ProtoReflect.Type instead.
@@ -1182,24 +1145,6 @@
 	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 1}
 }
 
-func (m *FieldTestMessage_RequiredGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage_RequiredGroup.Unmarshal(m, b)
-}
-func (m *FieldTestMessage_RequiredGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage_RequiredGroup.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage_RequiredGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage_RequiredGroup.Merge(m, src)
-}
-func (m *FieldTestMessage_RequiredGroup) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage_RequiredGroup.Size(m)
-}
-func (m *FieldTestMessage_RequiredGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage_RequiredGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage_RequiredGroup proto.InternalMessageInfo
-
 func (m *FieldTestMessage_RequiredGroup) GetRequiredGroup() string {
 	if m != nil && m.RequiredGroup != nil {
 		return *m.RequiredGroup
@@ -1218,7 +1163,7 @@
 	return xxx_File_proto2_fields_proto_messageTypes[3].MessageOf(m)
 }
 func (m *FieldTestMessage_RepeatedGroup) Reset()         { *m = FieldTestMessage_RepeatedGroup{} }
-func (m *FieldTestMessage_RepeatedGroup) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage_RepeatedGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage_RepeatedGroup) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage_RepeatedGroup.ProtoReflect.Type instead.
@@ -1226,24 +1171,6 @@
 	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 2}
 }
 
-func (m *FieldTestMessage_RepeatedGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage_RepeatedGroup.Unmarshal(m, b)
-}
-func (m *FieldTestMessage_RepeatedGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage_RepeatedGroup.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage_RepeatedGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage_RepeatedGroup.Merge(m, src)
-}
-func (m *FieldTestMessage_RepeatedGroup) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage_RepeatedGroup.Size(m)
-}
-func (m *FieldTestMessage_RepeatedGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage_RepeatedGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage_RepeatedGroup proto.InternalMessageInfo
-
 func (m *FieldTestMessage_RepeatedGroup) GetRepeatedGroup() []string {
 	if m != nil {
 		return m.RepeatedGroup
@@ -1262,7 +1189,7 @@
 	return xxx_File_proto2_fields_proto_messageTypes[7].MessageOf(m)
 }
 func (m *FieldTestMessage_OneofGroup) Reset()         { *m = FieldTestMessage_OneofGroup{} }
-func (m *FieldTestMessage_OneofGroup) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage_OneofGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage_OneofGroup) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage_OneofGroup.ProtoReflect.Type instead.
@@ -1270,24 +1197,6 @@
 	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 6}
 }
 
-func (m *FieldTestMessage_OneofGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage_OneofGroup.Unmarshal(m, b)
-}
-func (m *FieldTestMessage_OneofGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage_OneofGroup.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage_OneofGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage_OneofGroup.Merge(m, src)
-}
-func (m *FieldTestMessage_OneofGroup) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage_OneofGroup.Size(m)
-}
-func (m *FieldTestMessage_OneofGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage_OneofGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage_OneofGroup proto.InternalMessageInfo
-
 func (m *FieldTestMessage_OneofGroup) GetOneofGroupField() string {
 	if m != nil && m.OneofGroupField != nil {
 		return *m.OneofGroupField
@@ -1305,7 +1214,7 @@
 	return xxx_File_proto2_fields_proto_messageTypes[8].MessageOf(m)
 }
 func (m *FieldTestMessage_Message) Reset()         { *m = FieldTestMessage_Message{} }
-func (m *FieldTestMessage_Message) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage_Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage_Message) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage_Message.ProtoReflect.Type instead.
@@ -1313,24 +1222,6 @@
 	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 7}
 }
 
-func (m *FieldTestMessage_Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage_Message.Unmarshal(m, b)
-}
-func (m *FieldTestMessage_Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage_Message.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage_Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage_Message.Merge(m, src)
-}
-func (m *FieldTestMessage_Message) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage_Message.Size(m)
-}
-func (m *FieldTestMessage_Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage_Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage_Message proto.InternalMessageInfo
-
 var xxx_File_proto2_fields_proto_rawdesc = []byte{
 	// 5913 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2e,
@@ -1751,30 +1642,15 @@
 	if File_proto2_fields_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 9)
 	File_proto2_fields_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_proto2_fields_proto_rawdesc,
 		GoTypes:            xxx_File_proto2_fields_proto_goTypes,
 		DependencyIndexes:  xxx_File_proto2_fields_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_proto2_fields_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_proto2_fields_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_proto2_fields_proto_goTypes[1:][:9]
-	for i, mt := range messageTypes {
-		xxx_File_proto2_fields_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_proto2_fields_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("proto2/fields.proto", xxx_File_proto2_fields_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.proto2.FieldTestMessage_Enum", FieldTestMessage_Enum_name, FieldTestMessage_Enum_value)
-	proto.RegisterType((*FieldTestMessage)(nil), "goproto.protoc.proto2.FieldTestMessage")
-	proto.RegisterMapType((map[uint64]FieldTestMessage_Enum)(nil), "goproto.protoc.proto2.FieldTestMessage.MapFixed64EnumEntry")
-	proto.RegisterMapType((map[int32]int64)(nil), "goproto.protoc.proto2.FieldTestMessage.MapInt32Int64Entry")
-	proto.RegisterMapType((map[string]*FieldTestMessage_Message)(nil), "goproto.protoc.proto2.FieldTestMessage.MapStringMessageEntry")
-	proto.RegisterType((*FieldTestMessage_OptionalGroup)(nil), "goproto.protoc.proto2.FieldTestMessage.OptionalGroup")
-	proto.RegisterType((*FieldTestMessage_RequiredGroup)(nil), "goproto.protoc.proto2.FieldTestMessage.RequiredGroup")
-	proto.RegisterType((*FieldTestMessage_RepeatedGroup)(nil), "goproto.protoc.proto2.FieldTestMessage.RepeatedGroup")
-	proto.RegisterType((*FieldTestMessage_OneofGroup)(nil), "goproto.protoc.proto2.FieldTestMessage.OneofGroup")
-	proto.RegisterType((*FieldTestMessage_Message)(nil), "goproto.protoc.proto2.FieldTestMessage.Message")
 	xxx_File_proto2_fields_proto_goTypes = nil
 	xxx_File_proto2_fields_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
index 47c5214..41eaab6 100644
--- a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
@@ -4,10 +4,9 @@
 package proto2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Layer1 struct {
@@ -22,7 +21,7 @@
 	return xxx_File_proto2_nested_messages_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Layer1) Reset()         { *m = Layer1{} }
-func (m *Layer1) String() string { return proto.CompactTextString(m) }
+func (m *Layer1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Layer1) ProtoMessage()    {}
 
 // Deprecated: Use Layer1.ProtoReflect.Type instead.
@@ -30,24 +29,6 @@
 	return xxx_File_proto2_nested_messages_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Layer1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Layer1.Unmarshal(m, b)
-}
-func (m *Layer1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Layer1.Marshal(b, m, deterministic)
-}
-func (m *Layer1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Layer1.Merge(m, src)
-}
-func (m *Layer1) XXX_Size() int {
-	return xxx_messageInfo_Layer1.Size(m)
-}
-func (m *Layer1) XXX_DiscardUnknown() {
-	xxx_messageInfo_Layer1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Layer1 proto.InternalMessageInfo
-
 func (m *Layer1) GetL2() *Layer1_Layer2 {
 	if m != nil {
 		return m.L2
@@ -73,7 +54,7 @@
 	return xxx_File_proto2_nested_messages_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Layer1_Layer2) Reset()         { *m = Layer1_Layer2{} }
-func (m *Layer1_Layer2) String() string { return proto.CompactTextString(m) }
+func (m *Layer1_Layer2) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Layer1_Layer2) ProtoMessage()    {}
 
 // Deprecated: Use Layer1_Layer2.ProtoReflect.Type instead.
@@ -81,24 +62,6 @@
 	return xxx_File_proto2_nested_messages_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *Layer1_Layer2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Layer1_Layer2.Unmarshal(m, b)
-}
-func (m *Layer1_Layer2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Layer1_Layer2.Marshal(b, m, deterministic)
-}
-func (m *Layer1_Layer2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Layer1_Layer2.Merge(m, src)
-}
-func (m *Layer1_Layer2) XXX_Size() int {
-	return xxx_messageInfo_Layer1_Layer2.Size(m)
-}
-func (m *Layer1_Layer2) XXX_DiscardUnknown() {
-	xxx_messageInfo_Layer1_Layer2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Layer1_Layer2 proto.InternalMessageInfo
-
 func (m *Layer1_Layer2) GetL3() *Layer1_Layer2_Layer3 {
 	if m != nil {
 		return m.L3
@@ -116,7 +79,7 @@
 	return xxx_File_proto2_nested_messages_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Layer1_Layer2_Layer3) Reset()         { *m = Layer1_Layer2_Layer3{} }
-func (m *Layer1_Layer2_Layer3) String() string { return proto.CompactTextString(m) }
+func (m *Layer1_Layer2_Layer3) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Layer1_Layer2_Layer3) ProtoMessage()    {}
 
 // Deprecated: Use Layer1_Layer2_Layer3.ProtoReflect.Type instead.
@@ -124,24 +87,6 @@
 	return xxx_File_proto2_nested_messages_proto_rawdesc_gzipped, []int{0, 0, 0}
 }
 
-func (m *Layer1_Layer2_Layer3) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Layer1_Layer2_Layer3.Unmarshal(m, b)
-}
-func (m *Layer1_Layer2_Layer3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Layer1_Layer2_Layer3.Marshal(b, m, deterministic)
-}
-func (m *Layer1_Layer2_Layer3) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Layer1_Layer2_Layer3.Merge(m, src)
-}
-func (m *Layer1_Layer2_Layer3) XXX_Size() int {
-	return xxx_messageInfo_Layer1_Layer2_Layer3.Size(m)
-}
-func (m *Layer1_Layer2_Layer3) XXX_DiscardUnknown() {
-	xxx_messageInfo_Layer1_Layer2_Layer3.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Layer1_Layer2_Layer3 proto.InternalMessageInfo
-
 var xxx_File_proto2_nested_messages_proto_rawdesc = []byte{
 	// 327 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f,
@@ -190,22 +135,14 @@
 	if File_proto2_nested_messages_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 3)
 	File_proto2_nested_messages_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_proto2_nested_messages_proto_rawdesc,
 		GoTypes:            xxx_File_proto2_nested_messages_proto_goTypes,
 		DependencyIndexes:  xxx_File_proto2_nested_messages_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_proto2_nested_messages_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_proto2_nested_messages_proto_goTypes[0:][:3]
-	for i, mt := range messageTypes {
-		xxx_File_proto2_nested_messages_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_proto2_nested_messages_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("proto2/nested_messages.proto", xxx_File_proto2_nested_messages_proto_rawdesc_gzipped)
-	proto.RegisterType((*Layer1)(nil), "goproto.protoc.proto2.Layer1")
-	proto.RegisterType((*Layer1_Layer2)(nil), "goproto.protoc.proto2.Layer1.Layer2")
-	proto.RegisterType((*Layer1_Layer2_Layer3)(nil), "goproto.protoc.proto2.Layer1.Layer2.Layer3")
 	xxx_File_proto2_nested_messages_proto_goTypes = nil
 	xxx_File_proto2_nested_messages_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
index 90eb7fa..2a61297 100644
--- a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
@@ -4,10 +4,9 @@
 package proto2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Message struct {
@@ -22,7 +21,7 @@
 	return xxx_File_proto2_proto2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
-func (m *Message) String() string { return proto.CompactTextString(m) }
+func (m *Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message) ProtoMessage()    {}
 
 // Deprecated: Use Message.ProtoReflect.Type instead.
@@ -30,24 +29,6 @@
 	return xxx_File_proto2_proto2_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message.Unmarshal(m, b)
-}
-func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message.Marshal(b, m, deterministic)
-}
-func (m *Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message.Merge(m, src)
-}
-func (m *Message) XXX_Size() int {
-	return xxx_messageInfo_Message.Size(m)
-}
-func (m *Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message proto.InternalMessageInfo
-
 func (m *Message) GetI32() int32 {
 	if m != nil && m.I32 != nil {
 		return *m.I32
@@ -97,20 +78,14 @@
 	if File_proto2_proto2_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_proto2_proto2_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_proto2_proto2_proto_rawdesc,
 		GoTypes:            xxx_File_proto2_proto2_proto_goTypes,
 		DependencyIndexes:  xxx_File_proto2_proto2_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_proto2_proto2_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_proto2_proto2_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_proto2_proto2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_proto2_proto2_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("proto2/proto2.proto", xxx_File_proto2_proto2_proto_rawdesc_gzipped)
-	proto.RegisterType((*Message)(nil), "goproto.protoc.proto2.Message")
 	xxx_File_proto2_proto2_proto_goTypes = nil
 	xxx_File_proto2_proto2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto3/enum.pb.go b/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
index 68c890b..42d5a2c 100644
--- a/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
@@ -4,8 +4,8 @@
 package proto3
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 )
 
@@ -83,9 +83,9 @@
 		GoTypes:           xxx_File_proto3_enum_proto_goTypes,
 		DependencyIndexes: xxx_File_proto3_enum_proto_depIdxs,
 		EnumOutputTypes:   xxx_File_proto3_enum_proto_enumTypes,
+		FilesRegistry:     protoregistry.GlobalFiles,
+		TypesRegistry:     protoregistry.GlobalTypes,
 	}.Init()
-	proto.RegisterFile("proto3/enum.proto", xxx_File_proto3_enum_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.proto3.Enum", Enum_name, Enum_value)
 	xxx_File_proto3_enum_proto_goTypes = nil
 	xxx_File_proto3_enum_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
index b4054cd..a20bca8 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
@@ -4,10 +4,9 @@
 package proto3
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type FieldTestMessage_Enum int32
@@ -89,7 +88,7 @@
 	return xxx_File_proto3_fields_proto_messageTypes[0].MessageOf(m)
 }
 func (m *FieldTestMessage) Reset()         { *m = FieldTestMessage{} }
-func (m *FieldTestMessage) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage.ProtoReflect.Type instead.
@@ -97,24 +96,6 @@
 	return xxx_File_proto3_fields_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *FieldTestMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage.Unmarshal(m, b)
-}
-func (m *FieldTestMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage.Merge(m, src)
-}
-func (m *FieldTestMessage) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage.Size(m)
-}
-func (m *FieldTestMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage proto.InternalMessageInfo
-
 func (m *FieldTestMessage) GetOptionalBool() string {
 	if m != nil {
 		return m.OptionalBool
@@ -384,7 +365,7 @@
 	return xxx_File_proto3_fields_proto_messageTypes[4].MessageOf(m)
 }
 func (m *FieldTestMessage_Message) Reset()         { *m = FieldTestMessage_Message{} }
-func (m *FieldTestMessage_Message) String() string { return proto.CompactTextString(m) }
+func (m *FieldTestMessage_Message) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldTestMessage_Message) ProtoMessage()    {}
 
 // Deprecated: Use FieldTestMessage_Message.ProtoReflect.Type instead.
@@ -392,24 +373,6 @@
 	return xxx_File_proto3_fields_proto_rawdesc_gzipped, []int{0, 3}
 }
 
-func (m *FieldTestMessage_Message) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldTestMessage_Message.Unmarshal(m, b)
-}
-func (m *FieldTestMessage_Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldTestMessage_Message.Marshal(b, m, deterministic)
-}
-func (m *FieldTestMessage_Message) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldTestMessage_Message.Merge(m, src)
-}
-func (m *FieldTestMessage_Message) XXX_Size() int {
-	return xxx_messageInfo_FieldTestMessage_Message.Size(m)
-}
-func (m *FieldTestMessage_Message) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldTestMessage_Message.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldTestMessage_Message proto.InternalMessageInfo
-
 var xxx_File_proto3_fields_proto_rawdesc = []byte{
 	// 2378 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2e,
@@ -596,26 +559,15 @@
 	if File_proto3_fields_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 5)
 	File_proto3_fields_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_proto3_fields_proto_rawdesc,
 		GoTypes:            xxx_File_proto3_fields_proto_goTypes,
 		DependencyIndexes:  xxx_File_proto3_fields_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_proto3_fields_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_proto3_fields_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_proto3_fields_proto_goTypes[1:][:5]
-	for i, mt := range messageTypes {
-		xxx_File_proto3_fields_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_proto3_fields_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("proto3/fields.proto", xxx_File_proto3_fields_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.protoc.proto3.FieldTestMessage_Enum", FieldTestMessage_Enum_name, FieldTestMessage_Enum_value)
-	proto.RegisterType((*FieldTestMessage)(nil), "goproto.protoc.proto3.FieldTestMessage")
-	proto.RegisterMapType((map[uint64]FieldTestMessage_Enum)(nil), "goproto.protoc.proto3.FieldTestMessage.MapFixed64EnumEntry")
-	proto.RegisterMapType((map[int32]int64)(nil), "goproto.protoc.proto3.FieldTestMessage.MapInt32Int64Entry")
-	proto.RegisterMapType((map[string]*FieldTestMessage_Message)(nil), "goproto.protoc.proto3.FieldTestMessage.MapStringMessageEntry")
-	proto.RegisterType((*FieldTestMessage_Message)(nil), "goproto.protoc.proto3.FieldTestMessage.Message")
 	xxx_File_proto3_fields_proto_goTypes = nil
 	xxx_File_proto3_fields_proto_depIdxs = nil
 }
diff --git a/encoding/testprotos/pb2/test.pb.go b/encoding/testprotos/pb2/test.pb.go
index fdbd57e..0ff518e 100644
--- a/encoding/testprotos/pb2/test.pb.go
+++ b/encoding/testprotos/pb2/test.pb.go
@@ -4,12 +4,11 @@
 package pb2
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 	known "github.com/golang/protobuf/v2/types/known"
-	reflect "reflect"
 )
 
 type Enum int32
@@ -142,7 +141,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Scalars) Reset()         { *m = Scalars{} }
-func (m *Scalars) String() string { return proto.CompactTextString(m) }
+func (m *Scalars) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Scalars) ProtoMessage()    {}
 
 // Deprecated: Use Scalars.ProtoReflect.Type instead.
@@ -150,24 +149,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Scalars) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Scalars.Unmarshal(m, b)
-}
-func (m *Scalars) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Scalars.Marshal(b, m, deterministic)
-}
-func (m *Scalars) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Scalars.Merge(m, src)
-}
-func (m *Scalars) XXX_Size() int {
-	return xxx_messageInfo_Scalars.Size(m)
-}
-func (m *Scalars) XXX_DiscardUnknown() {
-	xxx_messageInfo_Scalars.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Scalars proto.InternalMessageInfo
-
 func (m *Scalars) GetOptBool() bool {
 	if m != nil && m.OptBool != nil {
 		return *m.OptBool
@@ -288,7 +269,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Enums) Reset()         { *m = Enums{} }
-func (m *Enums) String() string { return proto.CompactTextString(m) }
+func (m *Enums) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Enums) ProtoMessage()    {}
 
 // Deprecated: Use Enums.ProtoReflect.Type instead.
@@ -296,24 +277,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *Enums) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Enums.Unmarshal(m, b)
-}
-func (m *Enums) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Enums.Marshal(b, m, deterministic)
-}
-func (m *Enums) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Enums.Merge(m, src)
-}
-func (m *Enums) XXX_Size() int {
-	return xxx_messageInfo_Enums.Size(m)
-}
-func (m *Enums) XXX_DiscardUnknown() {
-	xxx_messageInfo_Enums.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Enums proto.InternalMessageInfo
-
 func (m *Enums) GetOptEnum() Enum {
 	if m != nil && m.OptEnum != nil {
 		return *m.OptEnum
@@ -362,7 +325,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Repeats) Reset()         { *m = Repeats{} }
-func (m *Repeats) String() string { return proto.CompactTextString(m) }
+func (m *Repeats) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Repeats) ProtoMessage()    {}
 
 // Deprecated: Use Repeats.ProtoReflect.Type instead.
@@ -370,24 +333,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *Repeats) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Repeats.Unmarshal(m, b)
-}
-func (m *Repeats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Repeats.Marshal(b, m, deterministic)
-}
-func (m *Repeats) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Repeats.Merge(m, src)
-}
-func (m *Repeats) XXX_Size() int {
-	return xxx_messageInfo_Repeats.Size(m)
-}
-func (m *Repeats) XXX_DiscardUnknown() {
-	xxx_messageInfo_Repeats.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Repeats proto.InternalMessageInfo
-
 func (m *Repeats) GetRptBool() []bool {
 	if m != nil {
 		return m.RptBool
@@ -464,7 +409,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Nested) Reset()         { *m = Nested{} }
-func (m *Nested) String() string { return proto.CompactTextString(m) }
+func (m *Nested) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Nested) ProtoMessage()    {}
 
 // Deprecated: Use Nested.ProtoReflect.Type instead.
@@ -472,24 +417,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{3}
 }
 
-func (m *Nested) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nested.Unmarshal(m, b)
-}
-func (m *Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nested.Marshal(b, m, deterministic)
-}
-func (m *Nested) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nested.Merge(m, src)
-}
-func (m *Nested) XXX_Size() int {
-	return xxx_messageInfo_Nested.Size(m)
-}
-func (m *Nested) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nested.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nested proto.InternalMessageInfo
-
 func (m *Nested) GetOptString() string {
 	if m != nil && m.OptString != nil {
 		return *m.OptString
@@ -519,7 +446,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Nests) Reset()         { *m = Nests{} }
-func (m *Nests) String() string { return proto.CompactTextString(m) }
+func (m *Nests) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Nests) ProtoMessage()    {}
 
 // Deprecated: Use Nests.ProtoReflect.Type instead.
@@ -527,24 +454,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{4}
 }
 
-func (m *Nests) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nests.Unmarshal(m, b)
-}
-func (m *Nests) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nests.Marshal(b, m, deterministic)
-}
-func (m *Nests) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nests.Merge(m, src)
-}
-func (m *Nests) XXX_Size() int {
-	return xxx_messageInfo_Nests.Size(m)
-}
-func (m *Nests) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nests.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nests proto.InternalMessageInfo
-
 func (m *Nests) GetOptNested() *Nested {
 	if m != nil {
 		return m.OptNested
@@ -590,7 +499,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[5].MessageOf(m)
 }
 func (m *Requireds) Reset()         { *m = Requireds{} }
-func (m *Requireds) String() string { return proto.CompactTextString(m) }
+func (m *Requireds) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Requireds) ProtoMessage()    {}
 
 // Deprecated: Use Requireds.ProtoReflect.Type instead.
@@ -598,24 +507,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{5}
 }
 
-func (m *Requireds) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Requireds.Unmarshal(m, b)
-}
-func (m *Requireds) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Requireds.Marshal(b, m, deterministic)
-}
-func (m *Requireds) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Requireds.Merge(m, src)
-}
-func (m *Requireds) XXX_Size() int {
-	return xxx_messageInfo_Requireds.Size(m)
-}
-func (m *Requireds) XXX_DiscardUnknown() {
-	xxx_messageInfo_Requireds.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Requireds proto.InternalMessageInfo
-
 func (m *Requireds) GetReqBool() bool {
 	if m != nil && m.ReqBool != nil {
 		return *m.ReqBool
@@ -671,7 +562,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[6].MessageOf(m)
 }
 func (m *PartialRequired) Reset()         { *m = PartialRequired{} }
-func (m *PartialRequired) String() string { return proto.CompactTextString(m) }
+func (m *PartialRequired) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*PartialRequired) ProtoMessage()    {}
 
 // Deprecated: Use PartialRequired.ProtoReflect.Type instead.
@@ -679,24 +570,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{6}
 }
 
-func (m *PartialRequired) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PartialRequired.Unmarshal(m, b)
-}
-func (m *PartialRequired) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PartialRequired.Marshal(b, m, deterministic)
-}
-func (m *PartialRequired) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PartialRequired.Merge(m, src)
-}
-func (m *PartialRequired) XXX_Size() int {
-	return xxx_messageInfo_PartialRequired.Size(m)
-}
-func (m *PartialRequired) XXX_DiscardUnknown() {
-	xxx_messageInfo_PartialRequired.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PartialRequired proto.InternalMessageInfo
-
 func (m *PartialRequired) GetReqString() string {
 	if m != nil && m.ReqString != nil {
 		return *m.ReqString
@@ -722,7 +595,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[7].MessageOf(m)
 }
 func (m *NestedWithRequired) Reset()         { *m = NestedWithRequired{} }
-func (m *NestedWithRequired) String() string { return proto.CompactTextString(m) }
+func (m *NestedWithRequired) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*NestedWithRequired) ProtoMessage()    {}
 
 // Deprecated: Use NestedWithRequired.ProtoReflect.Type instead.
@@ -730,24 +603,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{7}
 }
 
-func (m *NestedWithRequired) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_NestedWithRequired.Unmarshal(m, b)
-}
-func (m *NestedWithRequired) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_NestedWithRequired.Marshal(b, m, deterministic)
-}
-func (m *NestedWithRequired) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NestedWithRequired.Merge(m, src)
-}
-func (m *NestedWithRequired) XXX_Size() int {
-	return xxx_messageInfo_NestedWithRequired.Size(m)
-}
-func (m *NestedWithRequired) XXX_DiscardUnknown() {
-	xxx_messageInfo_NestedWithRequired.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_NestedWithRequired proto.InternalMessageInfo
-
 func (m *NestedWithRequired) GetReqString() string {
 	if m != nil && m.ReqString != nil {
 		return *m.ReqString
@@ -771,7 +626,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[8].MessageOf(m)
 }
 func (m *IndirectRequired) Reset()         { *m = IndirectRequired{} }
-func (m *IndirectRequired) String() string { return proto.CompactTextString(m) }
+func (m *IndirectRequired) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*IndirectRequired) ProtoMessage()    {}
 
 // Deprecated: Use IndirectRequired.ProtoReflect.Type instead.
@@ -779,24 +634,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{8}
 }
 
-func (m *IndirectRequired) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_IndirectRequired.Unmarshal(m, b)
-}
-func (m *IndirectRequired) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_IndirectRequired.Marshal(b, m, deterministic)
-}
-func (m *IndirectRequired) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IndirectRequired.Merge(m, src)
-}
-func (m *IndirectRequired) XXX_Size() int {
-	return xxx_messageInfo_IndirectRequired.Size(m)
-}
-func (m *IndirectRequired) XXX_DiscardUnknown() {
-	xxx_messageInfo_IndirectRequired.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_IndirectRequired proto.InternalMessageInfo
-
 func (m *IndirectRequired) GetOptNested() *NestedWithRequired {
 	if m != nil {
 		return m.OptNested
@@ -863,7 +700,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[9].MessageOf(m)
 }
 func (m *Extensions) Reset()         { *m = Extensions{} }
-func (m *Extensions) String() string { return proto.CompactTextString(m) }
+func (m *Extensions) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Extensions) ProtoMessage()    {}
 
 // Deprecated: Use Extensions.ProtoReflect.Type instead.
@@ -880,24 +717,6 @@
 	return extRange_Extensions
 }
 
-func (m *Extensions) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Extensions.Unmarshal(m, b)
-}
-func (m *Extensions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Extensions.Marshal(b, m, deterministic)
-}
-func (m *Extensions) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Extensions.Merge(m, src)
-}
-func (m *Extensions) XXX_Size() int {
-	return xxx_messageInfo_Extensions.Size(m)
-}
-func (m *Extensions) XXX_DiscardUnknown() {
-	xxx_messageInfo_Extensions.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Extensions proto.InternalMessageInfo
-
 func (m *Extensions) GetOptString() string {
 	if m != nil && m.OptString != nil {
 		return *m.OptString
@@ -929,7 +748,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[10].MessageOf(m)
 }
 func (m *ExtensionsContainer) Reset()         { *m = ExtensionsContainer{} }
-func (m *ExtensionsContainer) String() string { return proto.CompactTextString(m) }
+func (m *ExtensionsContainer) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ExtensionsContainer) ProtoMessage()    {}
 
 // Deprecated: Use ExtensionsContainer.ProtoReflect.Type instead.
@@ -937,24 +756,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{10}
 }
 
-func (m *ExtensionsContainer) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExtensionsContainer.Unmarshal(m, b)
-}
-func (m *ExtensionsContainer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExtensionsContainer.Marshal(b, m, deterministic)
-}
-func (m *ExtensionsContainer) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExtensionsContainer.Merge(m, src)
-}
-func (m *ExtensionsContainer) XXX_Size() int {
-	return xxx_messageInfo_ExtensionsContainer.Size(m)
-}
-func (m *ExtensionsContainer) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExtensionsContainer.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExtensionsContainer proto.InternalMessageInfo
-
 type MessageSet struct {
 	XXX_NoUnkeyedLiteral   struct{}                    `json:"-"`
 	XXX_InternalExtensions protoimpl.ExtensionFieldsV1 `protobuf_messageset:"1" json:"-"`
@@ -966,7 +767,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[11].MessageOf(m)
 }
 func (m *MessageSet) Reset()         { *m = MessageSet{} }
-func (m *MessageSet) String() string { return proto.CompactTextString(m) }
+func (m *MessageSet) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*MessageSet) ProtoMessage()    {}
 
 // Deprecated: Use MessageSet.ProtoReflect.Type instead.
@@ -983,24 +784,6 @@
 	return extRange_MessageSet
 }
 
-func (m *MessageSet) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MessageSet.Unmarshal(m, b)
-}
-func (m *MessageSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MessageSet.Marshal(b, m, deterministic)
-}
-func (m *MessageSet) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MessageSet.Merge(m, src)
-}
-func (m *MessageSet) XXX_Size() int {
-	return xxx_messageInfo_MessageSet.Size(m)
-}
-func (m *MessageSet) XXX_DiscardUnknown() {
-	xxx_messageInfo_MessageSet.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_MessageSet proto.InternalMessageInfo
-
 type MessageSetExtension struct {
 	OptString            *string  `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -1012,7 +795,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[12].MessageOf(m)
 }
 func (m *MessageSetExtension) Reset()         { *m = MessageSetExtension{} }
-func (m *MessageSetExtension) String() string { return proto.CompactTextString(m) }
+func (m *MessageSetExtension) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*MessageSetExtension) ProtoMessage()    {}
 
 // Deprecated: Use MessageSetExtension.ProtoReflect.Type instead.
@@ -1020,24 +803,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{12}
 }
 
-func (m *MessageSetExtension) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MessageSetExtension.Unmarshal(m, b)
-}
-func (m *MessageSetExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MessageSetExtension.Marshal(b, m, deterministic)
-}
-func (m *MessageSetExtension) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MessageSetExtension.Merge(m, src)
-}
-func (m *MessageSetExtension) XXX_Size() int {
-	return xxx_messageInfo_MessageSetExtension.Size(m)
-}
-func (m *MessageSetExtension) XXX_DiscardUnknown() {
-	xxx_messageInfo_MessageSetExtension.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_MessageSetExtension proto.InternalMessageInfo
-
 func (m *MessageSetExtension) GetOptString() string {
 	if m != nil && m.OptString != nil {
 		return *m.OptString
@@ -1056,7 +821,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[13].MessageOf(m)
 }
 func (m *FakeMessageSet) Reset()         { *m = FakeMessageSet{} }
-func (m *FakeMessageSet) String() string { return proto.CompactTextString(m) }
+func (m *FakeMessageSet) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FakeMessageSet) ProtoMessage()    {}
 
 // Deprecated: Use FakeMessageSet.ProtoReflect.Type instead.
@@ -1073,24 +838,6 @@
 	return extRange_FakeMessageSet
 }
 
-func (m *FakeMessageSet) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FakeMessageSet.Unmarshal(m, b)
-}
-func (m *FakeMessageSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FakeMessageSet.Marshal(b, m, deterministic)
-}
-func (m *FakeMessageSet) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FakeMessageSet.Merge(m, src)
-}
-func (m *FakeMessageSet) XXX_Size() int {
-	return xxx_messageInfo_FakeMessageSet.Size(m)
-}
-func (m *FakeMessageSet) XXX_DiscardUnknown() {
-	xxx_messageInfo_FakeMessageSet.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FakeMessageSet proto.InternalMessageInfo
-
 type FakeMessageSetExtension struct {
 	OptString            *string  `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -1102,7 +849,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[14].MessageOf(m)
 }
 func (m *FakeMessageSetExtension) Reset()         { *m = FakeMessageSetExtension{} }
-func (m *FakeMessageSetExtension) String() string { return proto.CompactTextString(m) }
+func (m *FakeMessageSetExtension) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FakeMessageSetExtension) ProtoMessage()    {}
 
 // Deprecated: Use FakeMessageSetExtension.ProtoReflect.Type instead.
@@ -1110,24 +857,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{14}
 }
 
-func (m *FakeMessageSetExtension) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FakeMessageSetExtension.Unmarshal(m, b)
-}
-func (m *FakeMessageSetExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FakeMessageSetExtension.Marshal(b, m, deterministic)
-}
-func (m *FakeMessageSetExtension) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FakeMessageSetExtension.Merge(m, src)
-}
-func (m *FakeMessageSetExtension) XXX_Size() int {
-	return xxx_messageInfo_FakeMessageSetExtension.Size(m)
-}
-func (m *FakeMessageSetExtension) XXX_DiscardUnknown() {
-	xxx_messageInfo_FakeMessageSetExtension.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FakeMessageSetExtension proto.InternalMessageInfo
-
 func (m *FakeMessageSetExtension) GetOptString() string {
 	if m != nil && m.OptString != nil {
 		return *m.OptString
@@ -1163,7 +892,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[15].MessageOf(m)
 }
 func (m *KnownTypes) Reset()         { *m = KnownTypes{} }
-func (m *KnownTypes) String() string { return proto.CompactTextString(m) }
+func (m *KnownTypes) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*KnownTypes) ProtoMessage()    {}
 
 // Deprecated: Use KnownTypes.ProtoReflect.Type instead.
@@ -1171,24 +900,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{15}
 }
 
-func (m *KnownTypes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_KnownTypes.Unmarshal(m, b)
-}
-func (m *KnownTypes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_KnownTypes.Marshal(b, m, deterministic)
-}
-func (m *KnownTypes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_KnownTypes.Merge(m, src)
-}
-func (m *KnownTypes) XXX_Size() int {
-	return xxx_messageInfo_KnownTypes.Size(m)
-}
-func (m *KnownTypes) XXX_DiscardUnknown() {
-	xxx_messageInfo_KnownTypes.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_KnownTypes proto.InternalMessageInfo
-
 func (m *KnownTypes) GetOptBool() *known.BoolValue {
 	if m != nil {
 		return m.OptBool
@@ -1321,7 +1032,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[16].MessageOf(m)
 }
 func (m *Nests_OptGroup) Reset()         { *m = Nests_OptGroup{} }
-func (m *Nests_OptGroup) String() string { return proto.CompactTextString(m) }
+func (m *Nests_OptGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Nests_OptGroup) ProtoMessage()    {}
 
 // Deprecated: Use Nests_OptGroup.ProtoReflect.Type instead.
@@ -1329,24 +1040,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{4, 0}
 }
 
-func (m *Nests_OptGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nests_OptGroup.Unmarshal(m, b)
-}
-func (m *Nests_OptGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nests_OptGroup.Marshal(b, m, deterministic)
-}
-func (m *Nests_OptGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nests_OptGroup.Merge(m, src)
-}
-func (m *Nests_OptGroup) XXX_Size() int {
-	return xxx_messageInfo_Nests_OptGroup.Size(m)
-}
-func (m *Nests_OptGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nests_OptGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nests_OptGroup proto.InternalMessageInfo
-
 func (m *Nests_OptGroup) GetOptString() string {
 	if m != nil && m.OptString != nil {
 		return *m.OptString
@@ -1379,7 +1072,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[17].MessageOf(m)
 }
 func (m *Nests_RptGroup) Reset()         { *m = Nests_RptGroup{} }
-func (m *Nests_RptGroup) String() string { return proto.CompactTextString(m) }
+func (m *Nests_RptGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Nests_RptGroup) ProtoMessage()    {}
 
 // Deprecated: Use Nests_RptGroup.ProtoReflect.Type instead.
@@ -1387,24 +1080,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{4, 1}
 }
 
-func (m *Nests_RptGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nests_RptGroup.Unmarshal(m, b)
-}
-func (m *Nests_RptGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nests_RptGroup.Marshal(b, m, deterministic)
-}
-func (m *Nests_RptGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nests_RptGroup.Merge(m, src)
-}
-func (m *Nests_RptGroup) XXX_Size() int {
-	return xxx_messageInfo_Nests_RptGroup.Size(m)
-}
-func (m *Nests_RptGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nests_RptGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nests_RptGroup proto.InternalMessageInfo
-
 func (m *Nests_RptGroup) GetRptString() []string {
 	if m != nil {
 		return m.RptString
@@ -1423,7 +1098,7 @@
 	return xxx_File_pb2_test_proto_messageTypes[18].MessageOf(m)
 }
 func (m *Nests_OptGroup_OptNestedGroup) Reset()         { *m = Nests_OptGroup_OptNestedGroup{} }
-func (m *Nests_OptGroup_OptNestedGroup) String() string { return proto.CompactTextString(m) }
+func (m *Nests_OptGroup_OptNestedGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Nests_OptGroup_OptNestedGroup) ProtoMessage()    {}
 
 // Deprecated: Use Nests_OptGroup_OptNestedGroup.ProtoReflect.Type instead.
@@ -1431,24 +1106,6 @@
 	return xxx_File_pb2_test_proto_rawdesc_gzipped, []int{4, 0, 0}
 }
 
-func (m *Nests_OptGroup_OptNestedGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nests_OptGroup_OptNestedGroup.Unmarshal(m, b)
-}
-func (m *Nests_OptGroup_OptNestedGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nests_OptGroup_OptNestedGroup.Marshal(b, m, deterministic)
-}
-func (m *Nests_OptGroup_OptNestedGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nests_OptGroup_OptNestedGroup.Merge(m, src)
-}
-func (m *Nests_OptGroup_OptNestedGroup) XXX_Size() int {
-	return xxx_messageInfo_Nests_OptGroup_OptNestedGroup.Size(m)
-}
-func (m *Nests_OptGroup_OptNestedGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nests_OptGroup_OptNestedGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nests_OptGroup_OptNestedGroup proto.InternalMessageInfo
-
 func (m *Nests_OptGroup_OptNestedGroup) GetOptFixed32() uint32 {
 	if m != nil && m.OptFixed32 != nil {
 		return *m.OptFixed32
@@ -2123,7 +1780,6 @@
 	if File_pb2_test_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 20)
 	extensionTypes := make([]protoreflect.ExtensionType, 19)
 	File_pb2_test_proto = protoimpl.FileBuilder{
 		RawDescriptor:        xxx_File_pb2_test_proto_rawdesc,
@@ -2131,56 +1787,11 @@
 		DependencyIndexes:    xxx_File_pb2_test_proto_depIdxs,
 		LegacyExtensions:     xxx_File_pb2_test_proto_extDescs,
 		EnumOutputTypes:      xxx_File_pb2_test_proto_enumTypes,
-		MessageOutputTypes:   messageTypes,
+		MessageOutputTypes:   xxx_File_pb2_test_proto_messageTypes,
 		ExtensionOutputTypes: extensionTypes,
+		FilesRegistry:        protoregistry.GlobalFiles,
+		TypesRegistry:        protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_pb2_test_proto_goTypes[2:][:20]
-	for i, mt := range messageTypes {
-		xxx_File_pb2_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_pb2_test_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("pb2/test.proto", xxx_File_pb2_test_proto_rawdesc_gzipped)
-	proto.RegisterEnum("pb2.Enum", Enum_name, Enum_value)
-	proto.RegisterEnum("pb2.Enums_NestedEnum", Enums_NestedEnum_name, Enums_NestedEnum_value)
-	proto.RegisterType((*Scalars)(nil), "pb2.Scalars")
-	proto.RegisterType((*Enums)(nil), "pb2.Enums")
-	proto.RegisterType((*Repeats)(nil), "pb2.Repeats")
-	proto.RegisterType((*Nested)(nil), "pb2.Nested")
-	proto.RegisterType((*Nests)(nil), "pb2.Nests")
-	proto.RegisterType((*Requireds)(nil), "pb2.Requireds")
-	proto.RegisterType((*PartialRequired)(nil), "pb2.PartialRequired")
-	proto.RegisterType((*NestedWithRequired)(nil), "pb2.NestedWithRequired")
-	proto.RegisterType((*IndirectRequired)(nil), "pb2.IndirectRequired")
-	proto.RegisterMapType((map[string]*NestedWithRequired)(nil), "pb2.IndirectRequired.StrToNestedEntry")
-	proto.RegisterType((*Extensions)(nil), "pb2.Extensions")
-	proto.RegisterType((*ExtensionsContainer)(nil), "pb2.ExtensionsContainer")
-	proto.RegisterType((*MessageSet)(nil), "pb2.MessageSet")
-	proto.RegisterType((*MessageSetExtension)(nil), "pb2.MessageSetExtension")
-	proto.RegisterType((*FakeMessageSet)(nil), "pb2.FakeMessageSet")
-	proto.RegisterType((*FakeMessageSetExtension)(nil), "pb2.FakeMessageSetExtension")
-	proto.RegisterType((*KnownTypes)(nil), "pb2.KnownTypes")
-	proto.RegisterType((*Nests_OptGroup)(nil), "pb2.Nests.OptGroup")
-	proto.RegisterType((*Nests_RptGroup)(nil), "pb2.Nests.RptGroup")
-	proto.RegisterType((*Nests_OptGroup_OptNestedGroup)(nil), "pb2.Nests.OptGroup.OptNestedGroup")
-	proto.RegisterExtension(E_OptExtBool)
-	proto.RegisterExtension(E_OptExtString)
-	proto.RegisterExtension(E_OptExtEnum)
-	proto.RegisterExtension(E_OptExtNested)
-	proto.RegisterExtension(E_RptExtFixed32)
-	proto.RegisterExtension(E_RptExtEnum)
-	proto.RegisterExtension(E_RptExtNested)
-	proto.RegisterExtension(E_MessageSetExtension)
-	proto.RegisterExtension(E_ExtensionsContainer_OptExtBool)
-	proto.RegisterExtension(E_ExtensionsContainer_OptExtString)
-	proto.RegisterExtension(E_ExtensionsContainer_OptExtEnum)
-	proto.RegisterExtension(E_ExtensionsContainer_OptExtNested)
-	proto.RegisterExtension(E_ExtensionsContainer_RptExtString)
-	proto.RegisterExtension(E_ExtensionsContainer_RptExtEnum)
-	proto.RegisterExtension(E_ExtensionsContainer_RptExtNested)
-	proto.RegisterExtension(E_MessageSetExtension_MessageSetExtension)
-	proto.RegisterExtension(E_MessageSetExtension_NotMessageSetExtension)
-	proto.RegisterExtension(E_MessageSetExtension_ExtNested)
-	proto.RegisterExtension(E_FakeMessageSetExtension_MessageSetExtension)
 	xxx_File_pb2_test_proto_goTypes = nil
 	xxx_File_pb2_test_proto_depIdxs = nil
 }
diff --git a/encoding/testprotos/pb3/test.pb.go b/encoding/testprotos/pb3/test.pb.go
index 9372908..65c6067 100644
--- a/encoding/testprotos/pb3/test.pb.go
+++ b/encoding/testprotos/pb3/test.pb.go
@@ -4,10 +4,9 @@
 package pb3
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Enum int32
@@ -118,7 +117,7 @@
 	return xxx_File_pb3_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Scalars) Reset()         { *m = Scalars{} }
-func (m *Scalars) String() string { return proto.CompactTextString(m) }
+func (m *Scalars) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Scalars) ProtoMessage()    {}
 
 // Deprecated: Use Scalars.ProtoReflect.Type instead.
@@ -126,24 +125,6 @@
 	return xxx_File_pb3_test_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Scalars) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Scalars.Unmarshal(m, b)
-}
-func (m *Scalars) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Scalars.Marshal(b, m, deterministic)
-}
-func (m *Scalars) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Scalars.Merge(m, src)
-}
-func (m *Scalars) XXX_Size() int {
-	return xxx_messageInfo_Scalars.Size(m)
-}
-func (m *Scalars) XXX_DiscardUnknown() {
-	xxx_messageInfo_Scalars.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Scalars proto.InternalMessageInfo
-
 func (m *Scalars) GetSBool() bool {
 	if m != nil {
 		return m.SBool
@@ -262,7 +243,7 @@
 	return xxx_File_pb3_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Enums) Reset()         { *m = Enums{} }
-func (m *Enums) String() string { return proto.CompactTextString(m) }
+func (m *Enums) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Enums) ProtoMessage()    {}
 
 // Deprecated: Use Enums.ProtoReflect.Type instead.
@@ -270,24 +251,6 @@
 	return xxx_File_pb3_test_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *Enums) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Enums.Unmarshal(m, b)
-}
-func (m *Enums) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Enums.Marshal(b, m, deterministic)
-}
-func (m *Enums) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Enums.Merge(m, src)
-}
-func (m *Enums) XXX_Size() int {
-	return xxx_messageInfo_Enums.Size(m)
-}
-func (m *Enums) XXX_DiscardUnknown() {
-	xxx_messageInfo_Enums.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Enums proto.InternalMessageInfo
-
 func (m *Enums) GetSEnum() Enum {
 	if m != nil {
 		return m.SEnum
@@ -314,7 +277,7 @@
 	return xxx_File_pb3_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Nests) Reset()         { *m = Nests{} }
-func (m *Nests) String() string { return proto.CompactTextString(m) }
+func (m *Nests) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Nests) ProtoMessage()    {}
 
 // Deprecated: Use Nests.ProtoReflect.Type instead.
@@ -322,24 +285,6 @@
 	return xxx_File_pb3_test_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *Nests) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nests.Unmarshal(m, b)
-}
-func (m *Nests) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nests.Marshal(b, m, deterministic)
-}
-func (m *Nests) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nests.Merge(m, src)
-}
-func (m *Nests) XXX_Size() int {
-	return xxx_messageInfo_Nests.Size(m)
-}
-func (m *Nests) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nests.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nests proto.InternalMessageInfo
-
 func (m *Nests) GetSNested() *Nested {
 	if m != nil {
 		return m.SNested
@@ -360,7 +305,7 @@
 	return xxx_File_pb3_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Nested) Reset()         { *m = Nested{} }
-func (m *Nested) String() string { return proto.CompactTextString(m) }
+func (m *Nested) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Nested) ProtoMessage()    {}
 
 // Deprecated: Use Nested.ProtoReflect.Type instead.
@@ -368,24 +313,6 @@
 	return xxx_File_pb3_test_proto_rawdesc_gzipped, []int{3}
 }
 
-func (m *Nested) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nested.Unmarshal(m, b)
-}
-func (m *Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nested.Marshal(b, m, deterministic)
-}
-func (m *Nested) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nested.Merge(m, src)
-}
-func (m *Nested) XXX_Size() int {
-	return xxx_messageInfo_Nested.Size(m)
-}
-func (m *Nested) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nested.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nested proto.InternalMessageInfo
-
 func (m *Nested) GetSString() string {
 	if m != nil {
 		return m.SString
@@ -416,7 +343,7 @@
 	return xxx_File_pb3_test_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Oneofs) Reset()         { *m = Oneofs{} }
-func (m *Oneofs) String() string { return proto.CompactTextString(m) }
+func (m *Oneofs) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Oneofs) ProtoMessage()    {}
 
 // Deprecated: Use Oneofs.ProtoReflect.Type instead.
@@ -424,24 +351,6 @@
 	return xxx_File_pb3_test_proto_rawdesc_gzipped, []int{4}
 }
 
-func (m *Oneofs) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Oneofs.Unmarshal(m, b)
-}
-func (m *Oneofs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Oneofs.Marshal(b, m, deterministic)
-}
-func (m *Oneofs) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Oneofs.Merge(m, src)
-}
-func (m *Oneofs) XXX_Size() int {
-	return xxx_messageInfo_Oneofs.Size(m)
-}
-func (m *Oneofs) XXX_DiscardUnknown() {
-	xxx_messageInfo_Oneofs.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Oneofs proto.InternalMessageInfo
-
 type isOneofs_Union interface {
 	isOneofs_Union()
 }
@@ -517,7 +426,7 @@
 	return xxx_File_pb3_test_proto_messageTypes[5].MessageOf(m)
 }
 func (m *Maps) Reset()         { *m = Maps{} }
-func (m *Maps) String() string { return proto.CompactTextString(m) }
+func (m *Maps) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Maps) ProtoMessage()    {}
 
 // Deprecated: Use Maps.ProtoReflect.Type instead.
@@ -525,24 +434,6 @@
 	return xxx_File_pb3_test_proto_rawdesc_gzipped, []int{5}
 }
 
-func (m *Maps) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Maps.Unmarshal(m, b)
-}
-func (m *Maps) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Maps.Marshal(b, m, deterministic)
-}
-func (m *Maps) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Maps.Merge(m, src)
-}
-func (m *Maps) XXX_Size() int {
-	return xxx_messageInfo_Maps.Size(m)
-}
-func (m *Maps) XXX_DiscardUnknown() {
-	xxx_messageInfo_Maps.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Maps proto.InternalMessageInfo
-
 func (m *Maps) GetInt32ToStr() map[int32]string {
 	if m != nil {
 		return m.Int32ToStr
@@ -590,7 +481,7 @@
 	return xxx_File_pb3_test_proto_messageTypes[6].MessageOf(m)
 }
 func (m *JSONNames) Reset()         { *m = JSONNames{} }
-func (m *JSONNames) String() string { return proto.CompactTextString(m) }
+func (m *JSONNames) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*JSONNames) ProtoMessage()    {}
 
 // Deprecated: Use JSONNames.ProtoReflect.Type instead.
@@ -598,24 +489,6 @@
 	return xxx_File_pb3_test_proto_rawdesc_gzipped, []int{6}
 }
 
-func (m *JSONNames) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_JSONNames.Unmarshal(m, b)
-}
-func (m *JSONNames) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_JSONNames.Marshal(b, m, deterministic)
-}
-func (m *JSONNames) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_JSONNames.Merge(m, src)
-}
-func (m *JSONNames) XXX_Size() int {
-	return xxx_messageInfo_JSONNames.Size(m)
-}
-func (m *JSONNames) XXX_DiscardUnknown() {
-	xxx_messageInfo_JSONNames.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_JSONNames proto.InternalMessageInfo
-
 func (m *JSONNames) GetSString() string {
 	if m != nil {
 		return m.SString
@@ -780,34 +653,15 @@
 	if File_pb3_test_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 12)
 	File_pb3_test_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_pb3_test_proto_rawdesc,
 		GoTypes:            xxx_File_pb3_test_proto_goTypes,
 		DependencyIndexes:  xxx_File_pb3_test_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_pb3_test_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_pb3_test_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_pb3_test_proto_goTypes[2:][:12]
-	for i, mt := range messageTypes {
-		xxx_File_pb3_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_pb3_test_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("pb3/test.proto", xxx_File_pb3_test_proto_rawdesc_gzipped)
-	proto.RegisterEnum("pb3.Enum", Enum_name, Enum_value)
-	proto.RegisterEnum("pb3.Enums_NestedEnum", Enums_NestedEnum_name, Enums_NestedEnum_value)
-	proto.RegisterType((*Scalars)(nil), "pb3.Scalars")
-	proto.RegisterType((*Enums)(nil), "pb3.Enums")
-	proto.RegisterType((*Nests)(nil), "pb3.Nests")
-	proto.RegisterType((*Nested)(nil), "pb3.Nested")
-	proto.RegisterType((*Oneofs)(nil), "pb3.Oneofs")
-	proto.RegisterType((*Maps)(nil), "pb3.Maps")
-	proto.RegisterMapType((map[bool]uint32)(nil), "pb3.Maps.BoolToUint32Entry")
-	proto.RegisterMapType((map[int32]string)(nil), "pb3.Maps.Int32ToStrEntry")
-	proto.RegisterMapType((map[string]*Nested)(nil), "pb3.Maps.StrToNestedEntry")
-	proto.RegisterMapType((map[string]*Oneofs)(nil), "pb3.Maps.StrToOneofsEntry")
-	proto.RegisterMapType((map[uint64]Enum)(nil), "pb3.Maps.Uint64ToEnumEntry")
-	proto.RegisterType((*JSONNames)(nil), "pb3.JSONNames")
 	xxx_File_pb3_test_proto_goTypes = nil
 	xxx_File_pb3_test_proto_depIdxs = nil
 }
diff --git a/go.mod b/go.mod
index 1c30251..cc9b075 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module github.com/golang/protobuf/v2
 
 require (
-	github.com/golang/protobuf v1.2.1-0.20190322195920-d94fb84e04b7
+	github.com/golang/protobuf v1.2.1-0.20190326022002-be03c15fcaa2
 	github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42
 )
diff --git a/go.sum b/go.sum
index 3cf168d..f2f4001 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,6 @@
-github.com/golang/protobuf v1.2.1-0.20190322195920-d94fb84e04b7 h1:u9KfmPcHwYTSPJyTFv1ZXkTU96h4cdgvTFOS6YBai60=
 github.com/golang/protobuf v1.2.1-0.20190322195920-d94fb84e04b7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.2.1-0.20190326022002-be03c15fcaa2 h1:lkKDUagzhHJnfyahshk3wkddt6PWmUy/gVOV35CWQrA=
+github.com/golang/protobuf v1.2.1-0.20190326022002-be03c15fcaa2/go.mod h1:rZ4veVXHB1S2+o7TKqD9Isxml062IeDutnCDtFPUlCc=
+github.com/golang/protobuf/v2 v2.0.0-20190322201422-f503c300f70e/go.mod h1:25ZALhydMFaBRgPH58a8zpFe9YXMAMjOYWtB6pNPcoo=
 github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42 h1:q3pnF5JFBNRz8sRD+IRj7Y6DMyYGTNqnZ9axTbSfoNI=
 github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
diff --git a/internal/fileinit/desc.go b/internal/fileinit/desc.go
index e375e3f..73004d3 100644
--- a/internal/fileinit/desc.go
+++ b/internal/fileinit/desc.go
@@ -13,6 +13,7 @@
 	"reflect"
 	"sync"
 
+	pimpl "github.com/golang/protobuf/v2/internal/impl"
 	pragma "github.com/golang/protobuf/v2/internal/pragma"
 	ptype "github.com/golang/protobuf/v2/internal/prototype"
 	pfmt "github.com/golang/protobuf/v2/internal/typefmt"
@@ -110,7 +111,7 @@
 	// MessageOutputTypes is where Init stores all initialized message types
 	// in "flattened ordering". This includes slots for map entry messages,
 	// which are skipped over.
-	MessageOutputTypes []pref.MessageType
+	MessageOutputTypes []pimpl.MessageType
 	// ExtensionOutputTypes is where Init stores all initialized extension types
 	// in "flattened ordering".
 	ExtensionOutputTypes []pref.ExtensionType
@@ -138,12 +139,19 @@
 	}
 
 	// Copy type descriptors to the output.
+	//
+	// While iterating over the messages, we also determine whether the message
+	// is a map entry type.
+	messageGoTypes := fb.GoTypes[len(fd.allEnums):][:len(fd.allMessages)]
 	for i := range fd.allEnums {
 		fb.EnumOutputTypes[i] = &fd.allEnums[i]
 	}
 	for i := range fd.allMessages {
-		if mt, _ := fd.allMessages[i].asDesc().(pref.MessageType); mt != nil {
-			fb.MessageOutputTypes[i] = mt
+		if messageGoTypes[i] == nil {
+			fd.allMessages[i].isMapEntry = true
+		} else {
+			fb.MessageOutputTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+			fb.MessageOutputTypes[i].PBType = fd.allMessages[i].asDesc().(pref.MessageType)
 		}
 	}
 	for i := range fd.allExtensions {
diff --git a/internal/fileinit/desc_init.go b/internal/fileinit/desc_init.go
index d1310a4..f339b0d 100644
--- a/internal/fileinit/desc_init.go
+++ b/internal/fileinit/desc_init.go
@@ -19,13 +19,6 @@
 	file.initDecls(len(fb.EnumOutputTypes), len(fb.MessageOutputTypes), len(fb.ExtensionOutputTypes))
 	file.unmarshalSeed(fb.RawDescriptor)
 
-	// Determine which message descriptors represent map entries based on the
-	// lack of an associated Go type.
-	messageDecls := file.GoTypes[len(file.allEnums):]
-	for i := range file.allMessages {
-		file.allMessages[i].isMapEntry = messageDecls[i] == nil
-	}
-
 	// Extended message dependencies are eagerly handled since registration
 	// needs this information at program init time.
 	for i := range file.allExtensions {
diff --git a/internal/legacy/enum.go b/internal/legacy/enum.go
index 23eebd8..831b94c 100644
--- a/internal/legacy/enum.go
+++ b/internal/legacy/enum.go
@@ -36,7 +36,7 @@
 
 	// Slow-path: derive enum descriptor and initialize EnumType.
 	var m sync.Map // map[protoreflect.EnumNumber]proto.Enum
-	ed := loadEnumDesc(t)
+	ed := LoadEnumDesc(t)
 	et := ptype.GoEnum(ed, func(et pref.EnumType, n pref.EnumNumber) pref.Enum {
 		if e, ok := m.Load(n); ok {
 			return e.(pref.Enum)
@@ -81,9 +81,11 @@
 
 var enumNumberType = reflect.TypeOf(pref.EnumNumber(0))
 
-// loadEnumDesc returns an EnumDescriptor derived from the Go type,
+// LoadEnumDesc returns an EnumDescriptor derived from the Go type,
 // which must be an int32 kind and not implement the v2 API already.
-func loadEnumDesc(t reflect.Type) pref.EnumDescriptor {
+//
+// This is exported for testing purposes.
+func LoadEnumDesc(t reflect.Type) pref.EnumDescriptor {
 	// Fast-path: check if an EnumDescriptor is cached for this concrete type.
 	if ed, ok := enumDescCache.Load(t); ok {
 		return ed.(pref.EnumDescriptor)
@@ -105,7 +107,7 @@
 	}
 	if ed, ok := ev.(enumV1); ok {
 		b, idxs := ed.EnumDescriptor()
-		fd := loadFileDesc(b)
+		fd := LoadFileDesc(b)
 
 		// Derive syntax.
 		switch fd.GetSyntax() {
diff --git a/internal/legacy/extension.go b/internal/legacy/extension.go
index 19205ea..b14b21d 100644
--- a/internal/legacy/extension.go
+++ b/internal/legacy/extension.go
@@ -112,7 +112,7 @@
 		}
 		if ed, ok := ev.(enumV1); ok && protoPkg == "" {
 			b, _ := ed.EnumDescriptor()
-			protoPkg = loadFileDesc(b).GetPackage()
+			protoPkg = LoadFileDesc(b).GetPackage()
 		}
 
 		if protoPkg != "" {
diff --git a/internal/legacy/file.go b/internal/legacy/file.go
index c438c1d..f4984c8 100644
--- a/internal/legacy/file.go
+++ b/internal/legacy/file.go
@@ -34,13 +34,15 @@
 
 var fileDescCache sync.Map // map[*byte]*descriptorpb.FileDescriptorProto
 
-// loadFileDesc unmarshals b as a compressed FileDescriptorProto message.
+// LoadFileDesc unmarshals b as a compressed FileDescriptorProto message.
 //
 // This assumes that b is immutable and that b does not refer to part of a
 // concatenated series of GZIP files (which would require shenanigans that
 // rely on the concatenation properties of both protobufs and GZIP).
 // File descriptors generated by protoc-gen-go do not rely on that property.
-func loadFileDesc(b []byte) *descriptorpb.FileDescriptorProto {
+//
+// This is exported for testing purposes.
+func LoadFileDesc(b []byte) *descriptorpb.FileDescriptorProto {
 	// Fast-path: check whether we already have a cached file descriptor.
 	if fd, ok := fileDescCache.Load(&b[0]); ok {
 		return fd.(*descriptorpb.FileDescriptorProto)
diff --git a/internal/legacy/file_test.go b/internal/legacy/file_test.go
index 8ac6d9f..1a8df96 100644
--- a/internal/legacy/file_test.go
+++ b/internal/legacy/file_test.go
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package legacy
+package legacy_test
 
 import (
 	"reflect"
 	"testing"
 
+	legacy "github.com/golang/protobuf/v2/internal/legacy"
 	pragma "github.com/golang/protobuf/v2/internal/pragma"
 	pdesc "github.com/golang/protobuf/v2/reflect/protodesc"
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
@@ -28,7 +29,7 @@
 )
 
 func mustLoadFileDesc(b []byte, _ []int) pref.FileDescriptor {
-	fd, err := pdesc.NewFile(loadFileDesc(b), nil)
+	fd, err := pdesc.NewFile(legacy.LoadFileDesc(b), nil)
 	if err != nil {
 		panic(err)
 	}
@@ -40,343 +41,343 @@
 
 	fileDescP2_20160225 := mustLoadFileDesc(new(proto2_20160225.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20160225.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20160225.SiblingEnum(0))),
 		want: fileDescP2_20160225.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20160225.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20160225.Message_ChildEnum(0))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.SiblingMessage))),
 		want: fileDescP2_20160225.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ChildMessage))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message))),
 		want: fileDescP2_20160225.Messages().ByName("Message"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_NamedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_NamedGroup))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("NamedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OptionalGroup))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RequiredGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RequiredGroup))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RepeatedGroup))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OneofGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OneofGroup))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("OneofGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionOptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionOptionalGroup))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionRepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionRepeatedGroup))),
 		want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
 	}}...)
 
 	fileDescP3_20160225 := mustLoadFileDesc(new(proto3_20160225.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20160225.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20160225.SiblingEnum(0))),
 		want: fileDescP3_20160225.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20160225.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20160225.Message_ChildEnum(0))),
 		want: fileDescP3_20160225.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20160225.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20160225.SiblingMessage))),
 		want: fileDescP3_20160225.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message_ChildMessage))),
 		want: fileDescP3_20160225.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message))),
 		want: fileDescP3_20160225.Messages().ByName("Message"),
 	}}...)
 
 	fileDescP2_20160519 := mustLoadFileDesc(new(proto2_20160519.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20160519.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20160519.SiblingEnum(0))),
 		want: fileDescP2_20160519.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20160519.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20160519.Message_ChildEnum(0))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.SiblingMessage))),
 		want: fileDescP2_20160519.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ChildMessage))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message))),
 		want: fileDescP2_20160519.Messages().ByName("Message"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_NamedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_NamedGroup))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("NamedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OptionalGroup))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RequiredGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RequiredGroup))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RepeatedGroup))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OneofGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OneofGroup))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("OneofGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionOptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionOptionalGroup))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionRepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionRepeatedGroup))),
 		want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
 	}}...)
 
 	fileDescP3_20160519 := mustLoadFileDesc(new(proto3_20160519.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20160519.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20160519.SiblingEnum(0))),
 		want: fileDescP3_20160519.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20160519.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20160519.Message_ChildEnum(0))),
 		want: fileDescP3_20160519.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20160519.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20160519.SiblingMessage))),
 		want: fileDescP3_20160519.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message_ChildMessage))),
 		want: fileDescP3_20160519.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message))),
 		want: fileDescP3_20160519.Messages().ByName("Message"),
 	}}...)
 
 	fileDescP2_20180125 := mustLoadFileDesc(new(proto2_20180125.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20180125.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20180125.SiblingEnum(0))),
 		want: fileDescP2_20180125.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20180125.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20180125.Message_ChildEnum(0))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.SiblingMessage))),
 		want: fileDescP2_20180125.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ChildMessage))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message))),
 		want: fileDescP2_20180125.Messages().ByName("Message"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_NamedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_NamedGroup))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("NamedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OptionalGroup))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RequiredGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RequiredGroup))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RepeatedGroup))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OneofGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OneofGroup))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("OneofGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionOptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionOptionalGroup))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionRepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionRepeatedGroup))),
 		want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
 	}}...)
 
 	fileDescP3_20180125 := mustLoadFileDesc(new(proto3_20180125.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20180125.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20180125.SiblingEnum(0))),
 		want: fileDescP3_20180125.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20180125.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20180125.Message_ChildEnum(0))),
 		want: fileDescP3_20180125.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180125.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180125.SiblingMessage))),
 		want: fileDescP3_20180125.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message_ChildMessage))),
 		want: fileDescP3_20180125.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message))),
 		want: fileDescP3_20180125.Messages().ByName("Message"),
 	}}...)
 
 	fileDescP2_20180430 := mustLoadFileDesc(new(proto2_20180430.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20180430.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20180430.SiblingEnum(0))),
 		want: fileDescP2_20180430.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20180430.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20180430.Message_ChildEnum(0))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.SiblingMessage))),
 		want: fileDescP2_20180430.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ChildMessage))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message))),
 		want: fileDescP2_20180430.Messages().ByName("Message"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_NamedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_NamedGroup))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("NamedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OptionalGroup))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RequiredGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RequiredGroup))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RepeatedGroup))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OneofGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OneofGroup))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("OneofGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionOptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionOptionalGroup))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionRepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionRepeatedGroup))),
 		want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
 	}}...)
 
 	fileDescP3_20180430 := mustLoadFileDesc(new(proto3_20180430.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20180430.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20180430.SiblingEnum(0))),
 		want: fileDescP3_20180430.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20180430.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20180430.Message_ChildEnum(0))),
 		want: fileDescP3_20180430.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180430.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180430.SiblingMessage))),
 		want: fileDescP3_20180430.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message_ChildMessage))),
 		want: fileDescP3_20180430.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message))),
 		want: fileDescP3_20180430.Messages().ByName("Message"),
 	}}...)
 
 	fileDescP2_20180814 := mustLoadFileDesc(new(proto2_20180814.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20180814.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20180814.SiblingEnum(0))),
 		want: fileDescP2_20180814.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20180814.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20180814.Message_ChildEnum(0))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.SiblingMessage))),
 		want: fileDescP2_20180814.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ChildMessage))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message))),
 		want: fileDescP2_20180814.Messages().ByName("Message"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_NamedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_NamedGroup))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("NamedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OptionalGroup))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RequiredGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RequiredGroup))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RepeatedGroup))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OneofGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OneofGroup))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("OneofGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionOptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionOptionalGroup))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionRepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionRepeatedGroup))),
 		want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
 	}}...)
 
 	fileDescP3_20180814 := mustLoadFileDesc(new(proto3_20180814.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20180814.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20180814.SiblingEnum(0))),
 		want: fileDescP3_20180814.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20180814.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20180814.Message_ChildEnum(0))),
 		want: fileDescP3_20180814.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180814.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180814.SiblingMessage))),
 		want: fileDescP3_20180814.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message_ChildMessage))),
 		want: fileDescP3_20180814.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message))),
 		want: fileDescP3_20180814.Messages().ByName("Message"),
 	}}...)
 
 	fileDescP2_20181126 := mustLoadFileDesc(new(proto2_20181126.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20181126.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20181126.SiblingEnum(0))),
 		want: fileDescP2_20181126.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto2_20181126.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto2_20181126.Message_ChildEnum(0))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.SiblingMessage))),
 		want: fileDescP2_20181126.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_ChildMessage))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message))),
 		want: fileDescP2_20181126.Messages().ByName("Message"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_NamedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_NamedGroup))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("NamedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_OptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_OptionalGroup))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_RequiredGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_RequiredGroup))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_RepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_RepeatedGroup))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_OneofGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_OneofGroup))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("OneofGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_ExtensionOptionalGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_ExtensionOptionalGroup))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_ExtensionRepeatedGroup))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto2_20181126.Message_ExtensionRepeatedGroup))),
 		want: fileDescP2_20181126.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
 	}}...)
 
 	fileDescP3_20181126 := mustLoadFileDesc(new(proto3_20181126.Message).Descriptor())
 	tests = append(tests, []struct{ got, want pref.Descriptor }{{
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20181126.SiblingEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20181126.SiblingEnum(0))),
 		want: fileDescP3_20181126.Enums().ByName("SiblingEnum"),
 	}, {
-		got:  loadEnumDesc(reflect.TypeOf(proto3_20181126.Message_ChildEnum(0))),
+		got:  legacy.LoadEnumDesc(reflect.TypeOf(proto3_20181126.Message_ChildEnum(0))),
 		want: fileDescP3_20181126.Messages().ByName("Message").Enums().ByName("ChildEnum"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20181126.SiblingMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20181126.SiblingMessage))),
 		want: fileDescP3_20181126.Messages().ByName("SiblingMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20181126.Message_ChildMessage))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20181126.Message_ChildMessage))),
 		want: fileDescP3_20181126.Messages().ByName("Message").Messages().ByName("ChildMessage"),
 	}, {
-		got:  loadMessageDesc(reflect.TypeOf(new(proto3_20181126.Message))),
+		got:  legacy.LoadMessageDesc(reflect.TypeOf(new(proto3_20181126.Message))),
 		want: fileDescP3_20181126.Messages().ByName("Message"),
 	}}...)
 
diff --git a/internal/legacy/message.go b/internal/legacy/message.go
index cc20053..9f9742d 100644
--- a/internal/legacy/message.go
+++ b/internal/legacy/message.go
@@ -38,7 +38,7 @@
 	}
 
 	// Slow-path: derive message descriptor and initialize MessageType.
-	md := loadMessageDesc(t)
+	md := LoadMessageDesc(t)
 	mt := new(pimpl.MessageType)
 	mt.GoType = t
 	mt.PBType = ptype.GoMessage(md, func(pref.MessageType) pref.Message {
@@ -54,9 +54,11 @@
 var messageDescLock sync.Mutex
 var messageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDescriptor
 
-// loadMessageDesc returns an MessageDescriptor derived from the Go type,
+// LoadMessageDesc returns an MessageDescriptor derived from the Go type,
 // which must be a *struct kind and not implement the v2 API already.
-func loadMessageDesc(t reflect.Type) pref.MessageDescriptor {
+//
+// This is exported for testing purposes.
+func LoadMessageDesc(t reflect.Type) pref.MessageDescriptor {
 	return messageDescSet{}.Load(t)
 }
 
@@ -124,7 +126,7 @@
 	}
 	if md, ok := mv.(messageV1); ok {
 		b, idxs := md.Descriptor()
-		fd := loadFileDesc(b)
+		fd := LoadFileDesc(b)
 
 		// Derive syntax.
 		switch fd.GetSyntax() {
@@ -235,7 +237,7 @@
 		if ev, ok := reflect.Zero(t).Interface().(pref.Enum); ok {
 			f.EnumType = ev.Type()
 		} else {
-			f.EnumType = loadEnumDesc(t)
+			f.EnumType = LoadEnumDesc(t)
 		}
 	}
 	if f.MessageType == nil && (f.Kind == pref.MessageKind || f.Kind == pref.GroupKind) {
diff --git a/internal/testprotos/conformance/conformance.pb.go b/internal/testprotos/conformance/conformance.pb.go
index e70227d..b351f4c 100644
--- a/internal/testprotos/conformance/conformance.pb.go
+++ b/internal/testprotos/conformance/conformance.pb.go
@@ -4,10 +4,9 @@
 package conformance_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type WireFormat int32
@@ -123,7 +122,7 @@
 	return xxx_File_conformance_conformance_proto_messageTypes[0].MessageOf(m)
 }
 func (m *FailureSet) Reset()         { *m = FailureSet{} }
-func (m *FailureSet) String() string { return proto.CompactTextString(m) }
+func (m *FailureSet) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FailureSet) ProtoMessage()    {}
 
 // Deprecated: Use FailureSet.ProtoReflect.Type instead.
@@ -131,24 +130,6 @@
 	return xxx_File_conformance_conformance_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *FailureSet) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FailureSet.Unmarshal(m, b)
-}
-func (m *FailureSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FailureSet.Marshal(b, m, deterministic)
-}
-func (m *FailureSet) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FailureSet.Merge(m, src)
-}
-func (m *FailureSet) XXX_Size() int {
-	return xxx_messageInfo_FailureSet.Size(m)
-}
-func (m *FailureSet) XXX_DiscardUnknown() {
-	xxx_messageInfo_FailureSet.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FailureSet proto.InternalMessageInfo
-
 func (m *FailureSet) GetFailure() []string {
 	if m != nil {
 		return m.Failure
@@ -198,7 +179,7 @@
 	return xxx_File_conformance_conformance_proto_messageTypes[1].MessageOf(m)
 }
 func (m *ConformanceRequest) Reset()         { *m = ConformanceRequest{} }
-func (m *ConformanceRequest) String() string { return proto.CompactTextString(m) }
+func (m *ConformanceRequest) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ConformanceRequest) ProtoMessage()    {}
 
 // Deprecated: Use ConformanceRequest.ProtoReflect.Type instead.
@@ -206,24 +187,6 @@
 	return xxx_File_conformance_conformance_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *ConformanceRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConformanceRequest.Unmarshal(m, b)
-}
-func (m *ConformanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConformanceRequest.Marshal(b, m, deterministic)
-}
-func (m *ConformanceRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConformanceRequest.Merge(m, src)
-}
-func (m *ConformanceRequest) XXX_Size() int {
-	return xxx_messageInfo_ConformanceRequest.Size(m)
-}
-func (m *ConformanceRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConformanceRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ConformanceRequest proto.InternalMessageInfo
-
 type isConformanceRequest_Payload interface {
 	isConformanceRequest_Payload()
 }
@@ -368,7 +331,7 @@
 	return xxx_File_conformance_conformance_proto_messageTypes[2].MessageOf(m)
 }
 func (m *ConformanceResponse) Reset()         { *m = ConformanceResponse{} }
-func (m *ConformanceResponse) String() string { return proto.CompactTextString(m) }
+func (m *ConformanceResponse) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ConformanceResponse) ProtoMessage()    {}
 
 // Deprecated: Use ConformanceResponse.ProtoReflect.Type instead.
@@ -376,24 +339,6 @@
 	return xxx_File_conformance_conformance_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *ConformanceResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ConformanceResponse.Unmarshal(m, b)
-}
-func (m *ConformanceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ConformanceResponse.Marshal(b, m, deterministic)
-}
-func (m *ConformanceResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ConformanceResponse.Merge(m, src)
-}
-func (m *ConformanceResponse) XXX_Size() int {
-	return xxx_messageInfo_ConformanceResponse.Size(m)
-}
-func (m *ConformanceResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_ConformanceResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ConformanceResponse proto.InternalMessageInfo
-
 type isConformanceResponse_Result interface {
 	isConformanceResponse_Result()
 }
@@ -536,7 +481,7 @@
 	return xxx_File_conformance_conformance_proto_messageTypes[3].MessageOf(m)
 }
 func (m *JspbEncodingConfig) Reset()         { *m = JspbEncodingConfig{} }
-func (m *JspbEncodingConfig) String() string { return proto.CompactTextString(m) }
+func (m *JspbEncodingConfig) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*JspbEncodingConfig) ProtoMessage()    {}
 
 // Deprecated: Use JspbEncodingConfig.ProtoReflect.Type instead.
@@ -544,24 +489,6 @@
 	return xxx_File_conformance_conformance_proto_rawdesc_gzipped, []int{3}
 }
 
-func (m *JspbEncodingConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_JspbEncodingConfig.Unmarshal(m, b)
-}
-func (m *JspbEncodingConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_JspbEncodingConfig.Marshal(b, m, deterministic)
-}
-func (m *JspbEncodingConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_JspbEncodingConfig.Merge(m, src)
-}
-func (m *JspbEncodingConfig) XXX_Size() int {
-	return xxx_messageInfo_JspbEncodingConfig.Size(m)
-}
-func (m *JspbEncodingConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_JspbEncodingConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_JspbEncodingConfig proto.InternalMessageInfo
-
 func (m *JspbEncodingConfig) GetUseJspbArrayAnyFormat() bool {
 	if m != nil {
 		return m.UseJspbArrayAnyFormat
@@ -682,26 +609,15 @@
 	if File_conformance_conformance_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 4)
 	File_conformance_conformance_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_conformance_conformance_proto_rawdesc,
 		GoTypes:            xxx_File_conformance_conformance_proto_goTypes,
 		DependencyIndexes:  xxx_File_conformance_conformance_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_conformance_conformance_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_conformance_conformance_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_conformance_conformance_proto_goTypes[2:][:4]
-	for i, mt := range messageTypes {
-		xxx_File_conformance_conformance_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_conformance_conformance_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("conformance/conformance.proto", xxx_File_conformance_conformance_proto_rawdesc_gzipped)
-	proto.RegisterEnum("conformance.WireFormat", WireFormat_name, WireFormat_value)
-	proto.RegisterEnum("conformance.TestCategory", TestCategory_name, TestCategory_value)
-	proto.RegisterType((*FailureSet)(nil), "conformance.FailureSet")
-	proto.RegisterType((*ConformanceRequest)(nil), "conformance.ConformanceRequest")
-	proto.RegisterType((*ConformanceResponse)(nil), "conformance.ConformanceResponse")
-	proto.RegisterType((*JspbEncodingConfig)(nil), "conformance.JspbEncodingConfig")
 	xxx_File_conformance_conformance_proto_goTypes = nil
 	xxx_File_conformance_conformance_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/legacy/legacy.pb.go b/internal/testprotos/legacy/legacy.pb.go
index 5940e58..ff9da05 100644
--- a/internal/testprotos/legacy/legacy.pb.go
+++ b/internal/testprotos/legacy/legacy.pb.go
@@ -4,7 +4,6 @@
 package legacy
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	proto2_v0_0 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v0.0.0-20160225-2fc053c5"
 	proto2_v0_01 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v0.0.0-20160519-a4ab9ec5"
 	proto2_v1_0 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
@@ -18,8 +17,8 @@
 	proto3_v1_2 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.2.0-20180814-aa810b61"
 	proto3_v1_21 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.2.1-20181126-8d0c54c1"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Legacy struct {
@@ -44,7 +43,7 @@
 	return xxx_File_legacy_legacy_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Legacy) Reset()         { *m = Legacy{} }
-func (m *Legacy) String() string { return proto.CompactTextString(m) }
+func (m *Legacy) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Legacy) ProtoMessage()    {}
 
 // Deprecated: Use Legacy.ProtoReflect.Type instead.
@@ -52,24 +51,6 @@
 	return xxx_File_legacy_legacy_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Legacy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Legacy.Unmarshal(m, b)
-}
-func (m *Legacy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Legacy.Marshal(b, m, deterministic)
-}
-func (m *Legacy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Legacy.Merge(m, src)
-}
-func (m *Legacy) XXX_Size() int {
-	return xxx_messageInfo_Legacy.Size(m)
-}
-func (m *Legacy) XXX_DiscardUnknown() {
-	xxx_messageInfo_Legacy.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Legacy proto.InternalMessageInfo
-
 func (m *Legacy) GetF1() *proto2_v0_0.Message {
 	if m != nil {
 		return m.F1
@@ -292,20 +273,14 @@
 	if File_legacy_legacy_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_legacy_legacy_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_legacy_legacy_proto_rawdesc,
 		GoTypes:            xxx_File_legacy_legacy_proto_goTypes,
 		DependencyIndexes:  xxx_File_legacy_legacy_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_legacy_legacy_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_legacy_legacy_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_legacy_legacy_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_legacy_legacy_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("legacy/legacy.proto", xxx_File_legacy_legacy_proto_rawdesc_gzipped)
-	proto.RegisterType((*Legacy)(nil), "google.golang.org.Legacy")
 	xxx_File_legacy_legacy_proto_goTypes = nil
 	xxx_File_legacy_legacy_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/ext.pb.go b/internal/testprotos/test/ext.pb.go
index 065a38e..aa1fa3b 100644
--- a/internal/testprotos/test/ext.pb.go
+++ b/internal/testprotos/test/ext.pb.go
@@ -4,8 +4,8 @@
 package test
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 )
@@ -67,9 +67,9 @@
 		DependencyIndexes:    xxx_File_test_ext_proto_depIdxs,
 		LegacyExtensions:     xxx_File_test_ext_proto_extDescs,
 		ExtensionOutputTypes: extensionTypes,
+		FilesRegistry:        protoregistry.GlobalFiles,
+		TypesRegistry:        protoregistry.GlobalTypes,
 	}.Init()
-	proto.RegisterFile("test/ext.proto", xxx_File_test_ext_proto_rawdesc_gzipped)
-	proto.RegisterExtension(E_ForeignInt32Extension)
 	xxx_File_test_ext_proto_goTypes = nil
 	xxx_File_test_ext_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go
index 24ef243..7d3790a 100644
--- a/internal/testprotos/test/test.pb.go
+++ b/internal/testprotos/test/test.pb.go
@@ -4,11 +4,10 @@
 package test
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type ForeignEnum int32
@@ -309,7 +308,7 @@
 	return xxx_File_test_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *TestAllTypes) Reset()         { *m = TestAllTypes{} }
-func (m *TestAllTypes) String() string { return proto.CompactTextString(m) }
+func (m *TestAllTypes) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestAllTypes) ProtoMessage()    {}
 
 // Deprecated: Use TestAllTypes.ProtoReflect.Type instead.
@@ -317,24 +316,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *TestAllTypes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestAllTypes.Unmarshal(m, b)
-}
-func (m *TestAllTypes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestAllTypes.Marshal(b, m, deterministic)
-}
-func (m *TestAllTypes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestAllTypes.Merge(m, src)
-}
-func (m *TestAllTypes) XXX_Size() int {
-	return xxx_messageInfo_TestAllTypes.Size(m)
-}
-func (m *TestAllTypes) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestAllTypes.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestAllTypes proto.InternalMessageInfo
-
 const Default_TestAllTypes_DefaultInt32 int32 = 81
 const Default_TestAllTypes_DefaultInt64 int64 = 82
 const Default_TestAllTypes_DefaultUint32 uint32 = 83
@@ -1059,7 +1040,7 @@
 	return xxx_File_test_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *TestDeprecatedMessage) Reset()         { *m = TestDeprecatedMessage{} }
-func (m *TestDeprecatedMessage) String() string { return proto.CompactTextString(m) }
+func (m *TestDeprecatedMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestDeprecatedMessage) ProtoMessage()    {}
 
 // Deprecated: Use TestDeprecatedMessage.ProtoReflect.Type instead.
@@ -1067,24 +1048,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *TestDeprecatedMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestDeprecatedMessage.Unmarshal(m, b)
-}
-func (m *TestDeprecatedMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestDeprecatedMessage.Marshal(b, m, deterministic)
-}
-func (m *TestDeprecatedMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestDeprecatedMessage.Merge(m, src)
-}
-func (m *TestDeprecatedMessage) XXX_Size() int {
-	return xxx_messageInfo_TestDeprecatedMessage.Size(m)
-}
-func (m *TestDeprecatedMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestDeprecatedMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestDeprecatedMessage proto.InternalMessageInfo
-
 // Deprecated: Do not use.
 func (m *TestDeprecatedMessage) GetDeprecatedInt32() int32 {
 	if m != nil && m.DeprecatedInt32 != nil {
@@ -1137,7 +1100,7 @@
 	return xxx_File_test_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *ForeignMessage) Reset()         { *m = ForeignMessage{} }
-func (m *ForeignMessage) String() string { return proto.CompactTextString(m) }
+func (m *ForeignMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ForeignMessage) ProtoMessage()    {}
 
 // Deprecated: Use ForeignMessage.ProtoReflect.Type instead.
@@ -1145,24 +1108,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *ForeignMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ForeignMessage.Unmarshal(m, b)
-}
-func (m *ForeignMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ForeignMessage.Marshal(b, m, deterministic)
-}
-func (m *ForeignMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ForeignMessage.Merge(m, src)
-}
-func (m *ForeignMessage) XXX_Size() int {
-	return xxx_messageInfo_ForeignMessage.Size(m)
-}
-func (m *ForeignMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_ForeignMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ForeignMessage proto.InternalMessageInfo
-
 func (m *ForeignMessage) GetC() int32 {
 	if m != nil && m.C != nil {
 		return *m.C
@@ -1187,7 +1132,7 @@
 	return xxx_File_test_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *TestReservedFields) Reset()         { *m = TestReservedFields{} }
-func (m *TestReservedFields) String() string { return proto.CompactTextString(m) }
+func (m *TestReservedFields) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestReservedFields) ProtoMessage()    {}
 
 // Deprecated: Use TestReservedFields.ProtoReflect.Type instead.
@@ -1195,24 +1140,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{3}
 }
 
-func (m *TestReservedFields) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestReservedFields.Unmarshal(m, b)
-}
-func (m *TestReservedFields) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestReservedFields.Marshal(b, m, deterministic)
-}
-func (m *TestReservedFields) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestReservedFields.Merge(m, src)
-}
-func (m *TestReservedFields) XXX_Size() int {
-	return xxx_messageInfo_TestReservedFields.Size(m)
-}
-func (m *TestReservedFields) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestReservedFields.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestReservedFields proto.InternalMessageInfo
-
 type TestAllExtensions struct {
 	XXX_NoUnkeyedLiteral   struct{}                    `json:"-"`
 	XXX_InternalExtensions protoimpl.ExtensionFieldsV1 `json:"-"`
@@ -1224,7 +1151,7 @@
 	return xxx_File_test_test_proto_messageTypes[4].MessageOf(m)
 }
 func (m *TestAllExtensions) Reset()         { *m = TestAllExtensions{} }
-func (m *TestAllExtensions) String() string { return proto.CompactTextString(m) }
+func (m *TestAllExtensions) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestAllExtensions) ProtoMessage()    {}
 
 // Deprecated: Use TestAllExtensions.ProtoReflect.Type instead.
@@ -1241,24 +1168,6 @@
 	return extRange_TestAllExtensions
 }
 
-func (m *TestAllExtensions) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestAllExtensions.Unmarshal(m, b)
-}
-func (m *TestAllExtensions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestAllExtensions.Marshal(b, m, deterministic)
-}
-func (m *TestAllExtensions) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestAllExtensions.Merge(m, src)
-}
-func (m *TestAllExtensions) XXX_Size() int {
-	return xxx_messageInfo_TestAllExtensions.Size(m)
-}
-func (m *TestAllExtensions) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestAllExtensions.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestAllExtensions proto.InternalMessageInfo
-
 type OptionalGroupExtension struct {
 	A                    *int32   `protobuf:"varint,17,opt,name=a" json:"a,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -1270,7 +1179,7 @@
 	return xxx_File_test_test_proto_messageTypes[5].MessageOf(m)
 }
 func (m *OptionalGroupExtension) Reset()         { *m = OptionalGroupExtension{} }
-func (m *OptionalGroupExtension) String() string { return proto.CompactTextString(m) }
+func (m *OptionalGroupExtension) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*OptionalGroupExtension) ProtoMessage()    {}
 
 // Deprecated: Use OptionalGroupExtension.ProtoReflect.Type instead.
@@ -1278,24 +1187,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{5}
 }
 
-func (m *OptionalGroupExtension) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OptionalGroupExtension.Unmarshal(m, b)
-}
-func (m *OptionalGroupExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OptionalGroupExtension.Marshal(b, m, deterministic)
-}
-func (m *OptionalGroupExtension) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OptionalGroupExtension.Merge(m, src)
-}
-func (m *OptionalGroupExtension) XXX_Size() int {
-	return xxx_messageInfo_OptionalGroupExtension.Size(m)
-}
-func (m *OptionalGroupExtension) XXX_DiscardUnknown() {
-	xxx_messageInfo_OptionalGroupExtension.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OptionalGroupExtension proto.InternalMessageInfo
-
 func (m *OptionalGroupExtension) GetA() int32 {
 	if m != nil && m.A != nil {
 		return *m.A
@@ -1314,7 +1205,7 @@
 	return xxx_File_test_test_proto_messageTypes[6].MessageOf(m)
 }
 func (m *RepeatedGroupExtension) Reset()         { *m = RepeatedGroupExtension{} }
-func (m *RepeatedGroupExtension) String() string { return proto.CompactTextString(m) }
+func (m *RepeatedGroupExtension) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*RepeatedGroupExtension) ProtoMessage()    {}
 
 // Deprecated: Use RepeatedGroupExtension.ProtoReflect.Type instead.
@@ -1322,24 +1213,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{6}
 }
 
-func (m *RepeatedGroupExtension) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RepeatedGroupExtension.Unmarshal(m, b)
-}
-func (m *RepeatedGroupExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RepeatedGroupExtension.Marshal(b, m, deterministic)
-}
-func (m *RepeatedGroupExtension) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RepeatedGroupExtension.Merge(m, src)
-}
-func (m *RepeatedGroupExtension) XXX_Size() int {
-	return xxx_messageInfo_RepeatedGroupExtension.Size(m)
-}
-func (m *RepeatedGroupExtension) XXX_DiscardUnknown() {
-	xxx_messageInfo_RepeatedGroupExtension.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RepeatedGroupExtension proto.InternalMessageInfo
-
 func (m *RepeatedGroupExtension) GetA() int32 {
 	if m != nil && m.A != nil {
 		return *m.A
@@ -1357,7 +1230,7 @@
 	return xxx_File_test_test_proto_messageTypes[7].MessageOf(m)
 }
 func (m *TestNestedExtension) Reset()         { *m = TestNestedExtension{} }
-func (m *TestNestedExtension) String() string { return proto.CompactTextString(m) }
+func (m *TestNestedExtension) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestNestedExtension) ProtoMessage()    {}
 
 // Deprecated: Use TestNestedExtension.ProtoReflect.Type instead.
@@ -1365,24 +1238,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{7}
 }
 
-func (m *TestNestedExtension) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestNestedExtension.Unmarshal(m, b)
-}
-func (m *TestNestedExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestNestedExtension.Marshal(b, m, deterministic)
-}
-func (m *TestNestedExtension) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestNestedExtension.Merge(m, src)
-}
-func (m *TestNestedExtension) XXX_Size() int {
-	return xxx_messageInfo_TestNestedExtension.Size(m)
-}
-func (m *TestNestedExtension) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestNestedExtension.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestNestedExtension proto.InternalMessageInfo
-
 // Test that RPC services work.
 type FooRequest struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -1394,7 +1249,7 @@
 	return xxx_File_test_test_proto_messageTypes[8].MessageOf(m)
 }
 func (m *FooRequest) Reset()         { *m = FooRequest{} }
-func (m *FooRequest) String() string { return proto.CompactTextString(m) }
+func (m *FooRequest) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FooRequest) ProtoMessage()    {}
 
 // Deprecated: Use FooRequest.ProtoReflect.Type instead.
@@ -1402,24 +1257,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{8}
 }
 
-func (m *FooRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FooRequest.Unmarshal(m, b)
-}
-func (m *FooRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FooRequest.Marshal(b, m, deterministic)
-}
-func (m *FooRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FooRequest.Merge(m, src)
-}
-func (m *FooRequest) XXX_Size() int {
-	return xxx_messageInfo_FooRequest.Size(m)
-}
-func (m *FooRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_FooRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FooRequest proto.InternalMessageInfo
-
 type FooResponse struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -1430,7 +1267,7 @@
 	return xxx_File_test_test_proto_messageTypes[9].MessageOf(m)
 }
 func (m *FooResponse) Reset()         { *m = FooResponse{} }
-func (m *FooResponse) String() string { return proto.CompactTextString(m) }
+func (m *FooResponse) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FooResponse) ProtoMessage()    {}
 
 // Deprecated: Use FooResponse.ProtoReflect.Type instead.
@@ -1438,24 +1275,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{9}
 }
 
-func (m *FooResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FooResponse.Unmarshal(m, b)
-}
-func (m *FooResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FooResponse.Marshal(b, m, deterministic)
-}
-func (m *FooResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FooResponse.Merge(m, src)
-}
-func (m *FooResponse) XXX_Size() int {
-	return xxx_messageInfo_FooResponse.Size(m)
-}
-func (m *FooResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_FooResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FooResponse proto.InternalMessageInfo
-
 type TestAllTypes_NestedMessage struct {
 	A                    *int32        `protobuf:"varint,1,opt,name=a" json:"a,omitempty"`
 	Corecursive          *TestAllTypes `protobuf:"bytes,2,opt,name=corecursive" json:"corecursive,omitempty"`
@@ -1468,7 +1287,7 @@
 	return xxx_File_test_test_proto_messageTypes[10].MessageOf(m)
 }
 func (m *TestAllTypes_NestedMessage) Reset()         { *m = TestAllTypes_NestedMessage{} }
-func (m *TestAllTypes_NestedMessage) String() string { return proto.CompactTextString(m) }
+func (m *TestAllTypes_NestedMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestAllTypes_NestedMessage) ProtoMessage()    {}
 
 // Deprecated: Use TestAllTypes_NestedMessage.ProtoReflect.Type instead.
@@ -1476,24 +1295,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{0, 0}
 }
 
-func (m *TestAllTypes_NestedMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestAllTypes_NestedMessage.Unmarshal(m, b)
-}
-func (m *TestAllTypes_NestedMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestAllTypes_NestedMessage.Marshal(b, m, deterministic)
-}
-func (m *TestAllTypes_NestedMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestAllTypes_NestedMessage.Merge(m, src)
-}
-func (m *TestAllTypes_NestedMessage) XXX_Size() int {
-	return xxx_messageInfo_TestAllTypes_NestedMessage.Size(m)
-}
-func (m *TestAllTypes_NestedMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestAllTypes_NestedMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestAllTypes_NestedMessage proto.InternalMessageInfo
-
 func (m *TestAllTypes_NestedMessage) GetA() int32 {
 	if m != nil && m.A != nil {
 		return *m.A
@@ -1519,7 +1320,7 @@
 	return xxx_File_test_test_proto_messageTypes[11].MessageOf(m)
 }
 func (m *TestAllTypes_OptionalGroup) Reset()         { *m = TestAllTypes_OptionalGroup{} }
-func (m *TestAllTypes_OptionalGroup) String() string { return proto.CompactTextString(m) }
+func (m *TestAllTypes_OptionalGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestAllTypes_OptionalGroup) ProtoMessage()    {}
 
 // Deprecated: Use TestAllTypes_OptionalGroup.ProtoReflect.Type instead.
@@ -1527,24 +1328,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{0, 1}
 }
 
-func (m *TestAllTypes_OptionalGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestAllTypes_OptionalGroup.Unmarshal(m, b)
-}
-func (m *TestAllTypes_OptionalGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestAllTypes_OptionalGroup.Marshal(b, m, deterministic)
-}
-func (m *TestAllTypes_OptionalGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestAllTypes_OptionalGroup.Merge(m, src)
-}
-func (m *TestAllTypes_OptionalGroup) XXX_Size() int {
-	return xxx_messageInfo_TestAllTypes_OptionalGroup.Size(m)
-}
-func (m *TestAllTypes_OptionalGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestAllTypes_OptionalGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestAllTypes_OptionalGroup proto.InternalMessageInfo
-
 func (m *TestAllTypes_OptionalGroup) GetA() int32 {
 	if m != nil && m.A != nil {
 		return *m.A
@@ -1563,7 +1346,7 @@
 	return xxx_File_test_test_proto_messageTypes[12].MessageOf(m)
 }
 func (m *TestAllTypes_RepeatedGroup) Reset()         { *m = TestAllTypes_RepeatedGroup{} }
-func (m *TestAllTypes_RepeatedGroup) String() string { return proto.CompactTextString(m) }
+func (m *TestAllTypes_RepeatedGroup) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*TestAllTypes_RepeatedGroup) ProtoMessage()    {}
 
 // Deprecated: Use TestAllTypes_RepeatedGroup.ProtoReflect.Type instead.
@@ -1571,24 +1354,6 @@
 	return xxx_File_test_test_proto_rawdesc_gzipped, []int{0, 2}
 }
 
-func (m *TestAllTypes_RepeatedGroup) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TestAllTypes_RepeatedGroup.Unmarshal(m, b)
-}
-func (m *TestAllTypes_RepeatedGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TestAllTypes_RepeatedGroup.Marshal(b, m, deterministic)
-}
-func (m *TestAllTypes_RepeatedGroup) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TestAllTypes_RepeatedGroup.Merge(m, src)
-}
-func (m *TestAllTypes_RepeatedGroup) XXX_Size() int {
-	return xxx_messageInfo_TestAllTypes_RepeatedGroup.Size(m)
-}
-func (m *TestAllTypes_RepeatedGroup) XXX_DiscardUnknown() {
-	xxx_messageInfo_TestAllTypes_RepeatedGroup.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TestAllTypes_RepeatedGroup proto.InternalMessageInfo
-
 func (m *TestAllTypes_RepeatedGroup) GetA() int32 {
 	if m != nil && m.A != nil {
 		return *m.A
@@ -2909,7 +2674,6 @@
 	xxx_File_test_test_import_proto_init()
 	xxx_File_test_test_public_proto_init()
 	xxx_File_test_test_weak_proto_init()
-	messageTypes := make([]protoreflect.MessageType, 30)
 	extensionTypes := make([]protoreflect.ExtensionType, 37)
 	File_test_test_proto = protoimpl.FileBuilder{
 		RawDescriptor:        xxx_File_test_test_proto_rawdesc,
@@ -2917,86 +2681,11 @@
 		DependencyIndexes:    xxx_File_test_test_proto_depIdxs,
 		LegacyExtensions:     xxx_File_test_test_proto_extDescs,
 		EnumOutputTypes:      xxx_File_test_test_proto_enumTypes,
-		MessageOutputTypes:   messageTypes,
+		MessageOutputTypes:   xxx_File_test_test_proto_messageTypes,
 		ExtensionOutputTypes: extensionTypes,
+		FilesRegistry:        protoregistry.GlobalFiles,
+		TypesRegistry:        protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_test_test_proto_goTypes[4:][:30]
-	for i, mt := range messageTypes {
-		xxx_File_test_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_test_test_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("test/test.proto", xxx_File_test_test_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.proto.test.ForeignEnum", ForeignEnum_name, ForeignEnum_value)
-	proto.RegisterEnum("goproto.proto.test.TestReservedEnumFields", TestReservedEnumFields_name, TestReservedEnumFields_value)
-	proto.RegisterEnum("goproto.proto.test.TestAllTypes_NestedEnum", TestAllTypes_NestedEnum_name, TestAllTypes_NestedEnum_value)
-	proto.RegisterEnum("goproto.proto.test.TestDeprecatedMessage_DeprecatedEnum", TestDeprecatedMessage_DeprecatedEnum_name, TestDeprecatedMessage_DeprecatedEnum_value)
-	proto.RegisterType((*TestAllTypes)(nil), "goproto.proto.test.TestAllTypes")
-	proto.RegisterMapType((map[bool]bool)(nil), "goproto.proto.test.TestAllTypes.MapBoolBoolEntry")
-	proto.RegisterMapType((map[uint32]uint32)(nil), "goproto.proto.test.TestAllTypes.MapFixed32Fixed32Entry")
-	proto.RegisterMapType((map[uint64]uint64)(nil), "goproto.proto.test.TestAllTypes.MapFixed64Fixed64Entry")
-	proto.RegisterMapType((map[int32]float64)(nil), "goproto.proto.test.TestAllTypes.MapInt32DoubleEntry")
-	proto.RegisterMapType((map[int32]float32)(nil), "goproto.proto.test.TestAllTypes.MapInt32FloatEntry")
-	proto.RegisterMapType((map[int32]int32)(nil), "goproto.proto.test.TestAllTypes.MapInt32Int32Entry")
-	proto.RegisterMapType((map[int64]int64)(nil), "goproto.proto.test.TestAllTypes.MapInt64Int64Entry")
-	proto.RegisterMapType((map[int32]int32)(nil), "goproto.proto.test.TestAllTypes.MapSfixed32Sfixed32Entry")
-	proto.RegisterMapType((map[int64]int64)(nil), "goproto.proto.test.TestAllTypes.MapSfixed64Sfixed64Entry")
-	proto.RegisterMapType((map[int32]int32)(nil), "goproto.proto.test.TestAllTypes.MapSint32Sint32Entry")
-	proto.RegisterMapType((map[int64]int64)(nil), "goproto.proto.test.TestAllTypes.MapSint64Sint64Entry")
-	proto.RegisterMapType((map[string][]byte)(nil), "goproto.proto.test.TestAllTypes.MapStringBytesEntry")
-	proto.RegisterMapType((map[string]TestAllTypes_NestedEnum)(nil), "goproto.proto.test.TestAllTypes.MapStringNestedEnumEntry")
-	proto.RegisterMapType((map[string]*TestAllTypes_NestedMessage)(nil), "goproto.proto.test.TestAllTypes.MapStringNestedMessageEntry")
-	proto.RegisterMapType((map[string]string)(nil), "goproto.proto.test.TestAllTypes.MapStringStringEntry")
-	proto.RegisterMapType((map[uint32]uint32)(nil), "goproto.proto.test.TestAllTypes.MapUint32Uint32Entry")
-	proto.RegisterMapType((map[uint64]uint64)(nil), "goproto.proto.test.TestAllTypes.MapUint64Uint64Entry")
-	proto.RegisterType((*TestDeprecatedMessage)(nil), "goproto.proto.test.TestDeprecatedMessage")
-	proto.RegisterType((*ForeignMessage)(nil), "goproto.proto.test.ForeignMessage")
-	proto.RegisterType((*TestReservedFields)(nil), "goproto.proto.test.TestReservedFields")
-	proto.RegisterType((*TestAllExtensions)(nil), "goproto.proto.test.TestAllExtensions")
-	proto.RegisterType((*OptionalGroupExtension)(nil), "goproto.proto.test.OptionalGroup_extension")
-	proto.RegisterType((*RepeatedGroupExtension)(nil), "goproto.proto.test.RepeatedGroup_extension")
-	proto.RegisterType((*TestNestedExtension)(nil), "goproto.proto.test.TestNestedExtension")
-	proto.RegisterType((*FooRequest)(nil), "goproto.proto.test.FooRequest")
-	proto.RegisterType((*FooResponse)(nil), "goproto.proto.test.FooResponse")
-	proto.RegisterType((*TestAllTypes_NestedMessage)(nil), "goproto.proto.test.TestAllTypes.NestedMessage")
-	proto.RegisterType((*TestAllTypes_OptionalGroup)(nil), "goproto.proto.test.TestAllTypes.OptionalGroup")
-	proto.RegisterType((*TestAllTypes_RepeatedGroup)(nil), "goproto.proto.test.TestAllTypes.RepeatedGroup")
-	proto.RegisterExtension(E_OptionalInt32Extension)
-	proto.RegisterExtension(E_OptionalInt64Extension)
-	proto.RegisterExtension(E_OptionalUint32Extension)
-	proto.RegisterExtension(E_OptionalUint64Extension)
-	proto.RegisterExtension(E_OptionalSint32Extension)
-	proto.RegisterExtension(E_OptionalSint64Extension)
-	proto.RegisterExtension(E_OptionalFixed32Extension)
-	proto.RegisterExtension(E_OptionalFixed64Extension)
-	proto.RegisterExtension(E_OptionalSfixed32Extension)
-	proto.RegisterExtension(E_OptionalSfixed64Extension)
-	proto.RegisterExtension(E_OptionalFloatExtension)
-	proto.RegisterExtension(E_OptionalDoubleExtension)
-	proto.RegisterExtension(E_OptionalBoolExtension)
-	proto.RegisterExtension(E_OptionalStringExtension)
-	proto.RegisterExtension(E_OptionalBytesExtension)
-	proto.RegisterExtension(E_OptionalgroupExtension)
-	proto.RegisterExtension(E_OptionalNestedMessageExtension)
-	proto.RegisterExtension(E_OptionalNestedEnumExtension)
-	proto.RegisterExtension(E_RepeatedInt32Extension)
-	proto.RegisterExtension(E_RepeatedInt64Extension)
-	proto.RegisterExtension(E_RepeatedUint32Extension)
-	proto.RegisterExtension(E_RepeatedUint64Extension)
-	proto.RegisterExtension(E_RepeatedSint32Extension)
-	proto.RegisterExtension(E_RepeatedSint64Extension)
-	proto.RegisterExtension(E_RepeatedFixed32Extension)
-	proto.RegisterExtension(E_RepeatedFixed64Extension)
-	proto.RegisterExtension(E_RepeatedSfixed32Extension)
-	proto.RegisterExtension(E_RepeatedSfixed64Extension)
-	proto.RegisterExtension(E_RepeatedFloatExtension)
-	proto.RegisterExtension(E_RepeatedDoubleExtension)
-	proto.RegisterExtension(E_RepeatedBoolExtension)
-	proto.RegisterExtension(E_RepeatedStringExtension)
-	proto.RegisterExtension(E_RepeatedBytesExtension)
-	proto.RegisterExtension(E_RepeatedgroupExtension)
-	proto.RegisterExtension(E_RepeatedNestedMessageExtension)
-	proto.RegisterExtension(E_RepeatedNestedEnumExtension)
-	proto.RegisterExtension(E_TestNestedExtension_NestedStringExtension)
 	xxx_File_test_test_proto_goTypes = nil
 	xxx_File_test_test_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/test_import.pb.go b/internal/testprotos/test/test_import.pb.go
index 82cadcd..bcde0f1 100644
--- a/internal/testprotos/test/test_import.pb.go
+++ b/internal/testprotos/test/test_import.pb.go
@@ -4,10 +4,9 @@
 package test
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type ImportEnum int32
@@ -66,7 +65,7 @@
 	return xxx_File_test_test_import_proto_messageTypes[0].MessageOf(m)
 }
 func (m *ImportMessage) Reset()         { *m = ImportMessage{} }
-func (m *ImportMessage) String() string { return proto.CompactTextString(m) }
+func (m *ImportMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ImportMessage) ProtoMessage()    {}
 
 // Deprecated: Use ImportMessage.ProtoReflect.Type instead.
@@ -74,24 +73,6 @@
 	return xxx_File_test_test_import_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *ImportMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ImportMessage.Unmarshal(m, b)
-}
-func (m *ImportMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ImportMessage.Marshal(b, m, deterministic)
-}
-func (m *ImportMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ImportMessage.Merge(m, src)
-}
-func (m *ImportMessage) XXX_Size() int {
-	return xxx_messageInfo_ImportMessage.Size(m)
-}
-func (m *ImportMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_ImportMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ImportMessage proto.InternalMessageInfo
-
 var xxx_File_test_test_import_proto_rawdesc = []byte{
 	// 150 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x16, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f,
@@ -125,22 +106,15 @@
 	if File_test_test_import_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_test_test_import_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_test_test_import_proto_rawdesc,
 		GoTypes:            xxx_File_test_test_import_proto_goTypes,
 		DependencyIndexes:  xxx_File_test_test_import_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_test_test_import_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_test_test_import_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_test_test_import_proto_goTypes[1:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_test_test_import_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_test_test_import_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("test/test_import.proto", xxx_File_test_test_import_proto_rawdesc_gzipped)
-	proto.RegisterEnum("goproto.proto.test.ImportEnum", ImportEnum_name, ImportEnum_value)
-	proto.RegisterType((*ImportMessage)(nil), "goproto.proto.test.ImportMessage")
 	xxx_File_test_test_import_proto_goTypes = nil
 	xxx_File_test_test_import_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/test_public.pb.go b/internal/testprotos/test/test_public.pb.go
index 6e5494a..db795c5 100644
--- a/internal/testprotos/test/test_public.pb.go
+++ b/internal/testprotos/test/test_public.pb.go
@@ -4,10 +4,9 @@
 package test
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type PublicImportMessage struct {
@@ -20,7 +19,7 @@
 	return xxx_File_test_test_public_proto_messageTypes[0].MessageOf(m)
 }
 func (m *PublicImportMessage) Reset()         { *m = PublicImportMessage{} }
-func (m *PublicImportMessage) String() string { return proto.CompactTextString(m) }
+func (m *PublicImportMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*PublicImportMessage) ProtoMessage()    {}
 
 // Deprecated: Use PublicImportMessage.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_test_test_public_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *PublicImportMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PublicImportMessage.Unmarshal(m, b)
-}
-func (m *PublicImportMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PublicImportMessage.Marshal(b, m, deterministic)
-}
-func (m *PublicImportMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PublicImportMessage.Merge(m, src)
-}
-func (m *PublicImportMessage) XXX_Size() int {
-	return xxx_messageInfo_PublicImportMessage.Size(m)
-}
-func (m *PublicImportMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_PublicImportMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PublicImportMessage proto.InternalMessageInfo
-
 var xxx_File_test_test_public_proto_rawdesc = []byte{
 	// 125 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x16, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c,
@@ -75,20 +56,14 @@
 	if File_test_test_public_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_test_test_public_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_test_test_public_proto_rawdesc,
 		GoTypes:            xxx_File_test_test_public_proto_goTypes,
 		DependencyIndexes:  xxx_File_test_test_public_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_test_test_public_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_test_test_public_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_test_test_public_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_test_test_public_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("test/test_public.proto", xxx_File_test_test_public_proto_rawdesc_gzipped)
-	proto.RegisterType((*PublicImportMessage)(nil), "goproto.proto.test.PublicImportMessage")
 	xxx_File_test_test_public_proto_goTypes = nil
 	xxx_File_test_test_public_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/test_weak.pb.go b/internal/testprotos/test/test_weak.pb.go
index ce220c2..7562089 100644
--- a/internal/testprotos/test/test_weak.pb.go
+++ b/internal/testprotos/test/test_weak.pb.go
@@ -4,10 +4,9 @@
 package test
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type WeakImportMessage struct {
@@ -20,7 +19,7 @@
 	return xxx_File_test_test_weak_proto_messageTypes[0].MessageOf(m)
 }
 func (m *WeakImportMessage) Reset()         { *m = WeakImportMessage{} }
-func (m *WeakImportMessage) String() string { return proto.CompactTextString(m) }
+func (m *WeakImportMessage) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*WeakImportMessage) ProtoMessage()    {}
 
 // Deprecated: Use WeakImportMessage.ProtoReflect.Type instead.
@@ -28,24 +27,6 @@
 	return xxx_File_test_test_weak_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *WeakImportMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_WeakImportMessage.Unmarshal(m, b)
-}
-func (m *WeakImportMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_WeakImportMessage.Marshal(b, m, deterministic)
-}
-func (m *WeakImportMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_WeakImportMessage.Merge(m, src)
-}
-func (m *WeakImportMessage) XXX_Size() int {
-	return xxx_messageInfo_WeakImportMessage.Size(m)
-}
-func (m *WeakImportMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_WeakImportMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_WeakImportMessage proto.InternalMessageInfo
-
 var xxx_File_test_test_weak_proto_rawdesc = []byte{
 	// 121 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x14, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x65, 0x61, 0x6b,
@@ -75,20 +56,14 @@
 	if File_test_test_weak_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_test_test_weak_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_test_test_weak_proto_rawdesc,
 		GoTypes:            xxx_File_test_test_weak_proto_goTypes,
 		DependencyIndexes:  xxx_File_test_test_weak_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_test_test_weak_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_test_test_weak_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_test_test_weak_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_test_test_weak_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("test/test_weak.proto", xxx_File_test_test_weak_proto_rawdesc_gzipped)
-	proto.RegisterType((*WeakImportMessage)(nil), "goproto.proto.test.WeakImportMessage")
 	xxx_File_test_test_weak_proto_goTypes = nil
 	xxx_File_test_test_weak_proto_depIdxs = nil
 }
diff --git a/reflect/protoregistry/testprotos/test.pb.go b/reflect/protoregistry/testprotos/test.pb.go
index f204118..a988c39 100644
--- a/reflect/protoregistry/testprotos/test.pb.go
+++ b/reflect/protoregistry/testprotos/test.pb.go
@@ -4,11 +4,10 @@
 package testprotos
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type Enum1 int32
@@ -160,7 +159,7 @@
 	return xxx_File_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message1) Reset()         { *m = Message1{} }
-func (m *Message1) String() string { return proto.CompactTextString(m) }
+func (m *Message1) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message1) ProtoMessage()    {}
 
 // Deprecated: Use Message1.ProtoReflect.Type instead.
@@ -177,24 +176,6 @@
 	return extRange_Message1
 }
 
-func (m *Message1) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message1.Unmarshal(m, b)
-}
-func (m *Message1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message1.Marshal(b, m, deterministic)
-}
-func (m *Message1) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message1.Merge(m, src)
-}
-func (m *Message1) XXX_Size() int {
-	return xxx_messageInfo_Message1.Size(m)
-}
-func (m *Message1) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message1.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message1 proto.InternalMessageInfo
-
 type Message2 struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -205,7 +186,7 @@
 	return xxx_File_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Message2) Reset()         { *m = Message2{} }
-func (m *Message2) String() string { return proto.CompactTextString(m) }
+func (m *Message2) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message2) ProtoMessage()    {}
 
 // Deprecated: Use Message2.ProtoReflect.Type instead.
@@ -213,24 +194,6 @@
 	return xxx_File_test_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *Message2) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message2.Unmarshal(m, b)
-}
-func (m *Message2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message2.Marshal(b, m, deterministic)
-}
-func (m *Message2) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message2.Merge(m, src)
-}
-func (m *Message2) XXX_Size() int {
-	return xxx_messageInfo_Message2.Size(m)
-}
-func (m *Message2) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message2.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message2 proto.InternalMessageInfo
-
 type Message3 struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -241,7 +204,7 @@
 	return xxx_File_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Message3) Reset()         { *m = Message3{} }
-func (m *Message3) String() string { return proto.CompactTextString(m) }
+func (m *Message3) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message3) ProtoMessage()    {}
 
 // Deprecated: Use Message3.ProtoReflect.Type instead.
@@ -249,24 +212,6 @@
 	return xxx_File_test_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *Message3) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message3.Unmarshal(m, b)
-}
-func (m *Message3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message3.Marshal(b, m, deterministic)
-}
-func (m *Message3) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message3.Merge(m, src)
-}
-func (m *Message3) XXX_Size() int {
-	return xxx_messageInfo_Message3.Size(m)
-}
-func (m *Message3) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message3.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message3 proto.InternalMessageInfo
-
 type Message4 struct {
 	BoolField            *bool    `protobuf:"varint,30,opt,name=bool_field,json=boolField" json:"bool_field,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -278,7 +223,7 @@
 	return xxx_File_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Message4) Reset()         { *m = Message4{} }
-func (m *Message4) String() string { return proto.CompactTextString(m) }
+func (m *Message4) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Message4) ProtoMessage()    {}
 
 // Deprecated: Use Message4.ProtoReflect.Type instead.
@@ -286,24 +231,6 @@
 	return xxx_File_test_proto_rawdesc_gzipped, []int{3}
 }
 
-func (m *Message4) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Message4.Unmarshal(m, b)
-}
-func (m *Message4) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Message4.Marshal(b, m, deterministic)
-}
-func (m *Message4) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Message4.Merge(m, src)
-}
-func (m *Message4) XXX_Size() int {
-	return xxx_messageInfo_Message4.Size(m)
-}
-func (m *Message4) XXX_DiscardUnknown() {
-	xxx_messageInfo_Message4.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Message4 proto.InternalMessageInfo
-
 func (m *Message4) GetBoolField() bool {
 	if m != nil && m.BoolField != nil {
 		return *m.BoolField
@@ -460,7 +387,6 @@
 	if File_test_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 4)
 	extensionTypes := make([]protoreflect.ExtensionType, 6)
 	File_test_proto = protoimpl.FileBuilder{
 		RawDescriptor:        xxx_File_test_proto_rawdesc,
@@ -468,28 +394,11 @@
 		DependencyIndexes:    xxx_File_test_proto_depIdxs,
 		LegacyExtensions:     xxx_File_test_proto_extDescs,
 		EnumOutputTypes:      xxx_File_test_proto_enumTypes,
-		MessageOutputTypes:   messageTypes,
+		MessageOutputTypes:   xxx_File_test_proto_messageTypes,
 		ExtensionOutputTypes: extensionTypes,
+		FilesRegistry:        protoregistry.GlobalFiles,
+		TypesRegistry:        protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_test_proto_goTypes[3:][:4]
-	for i, mt := range messageTypes {
-		xxx_File_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_test_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("test.proto", xxx_File_test_proto_rawdesc_gzipped)
-	proto.RegisterEnum("testprotos.Enum1", Enum1_name, Enum1_value)
-	proto.RegisterEnum("testprotos.Enum2", Enum2_name, Enum2_value)
-	proto.RegisterEnum("testprotos.Enum3", Enum3_name, Enum3_value)
-	proto.RegisterType((*Message1)(nil), "testprotos.Message1")
-	proto.RegisterType((*Message2)(nil), "testprotos.Message2")
-	proto.RegisterType((*Message3)(nil), "testprotos.Message3")
-	proto.RegisterType((*Message4)(nil), "testprotos.Message4")
-	proto.RegisterExtension(E_StringField)
-	proto.RegisterExtension(E_EnumField)
-	proto.RegisterExtension(E_MessageField)
-	proto.RegisterExtension(E_Message4_MessageField)
-	proto.RegisterExtension(E_Message4_EnumField)
-	proto.RegisterExtension(E_Message4_StringField)
 	xxx_File_test_proto_goTypes = nil
 	xxx_File_test_proto_depIdxs = nil
 }
diff --git a/types/descriptor/descriptor.pb.go b/types/descriptor/descriptor.pb.go
index 0bd0862..b5bc7c1 100644
--- a/types/descriptor/descriptor.pb.go
+++ b/types/descriptor/descriptor.pb.go
@@ -9,7 +9,6 @@
 	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 type FieldDescriptorProto_Type int32
@@ -2958,21 +2957,15 @@
 	if File_google_protobuf_descriptor_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 27)
 	File_google_protobuf_descriptor_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_descriptor_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_descriptor_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_descriptor_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_google_protobuf_descriptor_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_descriptor_proto_messageTypes,
 		FilesRegistry:      protoregistry.GlobalFiles,
 		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_descriptor_proto_goTypes[6:][:27]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_descriptor_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_descriptor_proto_messageTypes[i].PBType = mt
-	}
 	prototype.X.RegisterExtensionRangeOptions((*ExtensionRangeOptions)(nil))
 	prototype.X.RegisterFileOptions((*FileOptions)(nil))
 	prototype.X.RegisterMessageOptions((*MessageOptions)(nil))
diff --git a/types/known/any.pb.go b/types/known/any.pb.go
index c175276..a15067c 100644
--- a/types/known/any.pb.go
+++ b/types/known/any.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // `Any` contains an arbitrary serialized protocol buffer message along with a
@@ -131,7 +130,7 @@
 	return xxx_File_google_protobuf_any_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Any) Reset()         { *m = Any{} }
-func (m *Any) String() string { return proto.CompactTextString(m) }
+func (m *Any) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Any) ProtoMessage()    {}
 
 // Deprecated: Use Any.ProtoReflect.Type instead.
@@ -141,24 +140,6 @@
 
 func (*Any) XXX_WellKnownType() string { return "Any" }
 
-func (m *Any) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Any.Unmarshal(m, b)
-}
-func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Any.Marshal(b, m, deterministic)
-}
-func (m *Any) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Any.Merge(m, src)
-}
-func (m *Any) XXX_Size() int {
-	return xxx_messageInfo_Any.Size(m)
-}
-func (m *Any) XXX_DiscardUnknown() {
-	xxx_messageInfo_Any.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Any proto.InternalMessageInfo
-
 func (m *Any) GetTypeUrl() string {
 	if m != nil {
 		return m.TypeUrl
@@ -209,20 +190,14 @@
 	if File_google_protobuf_any_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_google_protobuf_any_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_any_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_any_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_any_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_any_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_any_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_any_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_any_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/any.proto", xxx_File_google_protobuf_any_proto_rawdesc_gzipped)
-	proto.RegisterType((*Any)(nil), "google.protobuf.Any")
 	xxx_File_google_protobuf_any_proto_goTypes = nil
 	xxx_File_google_protobuf_any_proto_depIdxs = nil
 }
diff --git a/types/known/api.pb.go b/types/known/api.pb.go
index ac69c8f..57550db 100644
--- a/types/known/api.pb.go
+++ b/types/known/api.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // Api is a light-weight descriptor for an API Interface.
@@ -65,7 +64,7 @@
 	return xxx_File_google_protobuf_api_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Api) Reset()         { *m = Api{} }
-func (m *Api) String() string { return proto.CompactTextString(m) }
+func (m *Api) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Api) ProtoMessage()    {}
 
 // Deprecated: Use Api.ProtoReflect.Type instead.
@@ -73,24 +72,6 @@
 	return xxx_File_google_protobuf_api_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Api) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Api.Unmarshal(m, b)
-}
-func (m *Api) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Api.Marshal(b, m, deterministic)
-}
-func (m *Api) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Api.Merge(m, src)
-}
-func (m *Api) XXX_Size() int {
-	return xxx_messageInfo_Api.Size(m)
-}
-func (m *Api) XXX_DiscardUnknown() {
-	xxx_messageInfo_Api.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Api proto.InternalMessageInfo
-
 func (m *Api) GetName() string {
 	if m != nil {
 		return m.Name
@@ -165,7 +146,7 @@
 	return xxx_File_google_protobuf_api_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Method) Reset()         { *m = Method{} }
-func (m *Method) String() string { return proto.CompactTextString(m) }
+func (m *Method) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Method) ProtoMessage()    {}
 
 // Deprecated: Use Method.ProtoReflect.Type instead.
@@ -173,24 +154,6 @@
 	return xxx_File_google_protobuf_api_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *Method) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Method.Unmarshal(m, b)
-}
-func (m *Method) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Method.Marshal(b, m, deterministic)
-}
-func (m *Method) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Method.Merge(m, src)
-}
-func (m *Method) XXX_Size() int {
-	return xxx_messageInfo_Method.Size(m)
-}
-func (m *Method) XXX_DiscardUnknown() {
-	xxx_messageInfo_Method.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Method proto.InternalMessageInfo
-
 func (m *Method) GetName() string {
 	if m != nil {
 		return m.Name
@@ -333,7 +296,7 @@
 	return xxx_File_google_protobuf_api_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Mixin) Reset()         { *m = Mixin{} }
-func (m *Mixin) String() string { return proto.CompactTextString(m) }
+func (m *Mixin) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Mixin) ProtoMessage()    {}
 
 // Deprecated: Use Mixin.ProtoReflect.Type instead.
@@ -341,24 +304,6 @@
 	return xxx_File_google_protobuf_api_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *Mixin) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Mixin.Unmarshal(m, b)
-}
-func (m *Mixin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Mixin.Marshal(b, m, deterministic)
-}
-func (m *Mixin) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Mixin.Merge(m, src)
-}
-func (m *Mixin) XXX_Size() int {
-	return xxx_messageInfo_Mixin.Size(m)
-}
-func (m *Mixin) XXX_DiscardUnknown() {
-	xxx_messageInfo_Mixin.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Mixin proto.InternalMessageInfo
-
 func (m *Mixin) GetName() string {
 	if m != nil {
 		return m.Name
@@ -468,22 +413,14 @@
 	}
 	xxx_File_google_protobuf_source_context_proto_init()
 	xxx_File_google_protobuf_type_proto_init()
-	messageTypes := make([]protoreflect.MessageType, 3)
 	File_google_protobuf_api_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_api_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_api_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_api_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_api_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_api_proto_goTypes[0:][:3]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_api_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_api_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/api.proto", xxx_File_google_protobuf_api_proto_rawdesc_gzipped)
-	proto.RegisterType((*Api)(nil), "google.protobuf.Api")
-	proto.RegisterType((*Method)(nil), "google.protobuf.Method")
-	proto.RegisterType((*Mixin)(nil), "google.protobuf.Mixin")
 	xxx_File_google_protobuf_api_proto_goTypes = nil
 	xxx_File_google_protobuf_api_proto_depIdxs = nil
 }
diff --git a/types/known/duration.pb.go b/types/known/duration.pb.go
index dc4b761..7b03e8a 100644
--- a/types/known/duration.pb.go
+++ b/types/known/duration.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // A Duration represents a signed, fixed-length span of time represented
@@ -91,7 +90,7 @@
 	return xxx_File_google_protobuf_duration_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Duration) Reset()         { *m = Duration{} }
-func (m *Duration) String() string { return proto.CompactTextString(m) }
+func (m *Duration) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Duration) ProtoMessage()    {}
 
 // Deprecated: Use Duration.ProtoReflect.Type instead.
@@ -101,24 +100,6 @@
 
 func (*Duration) XXX_WellKnownType() string { return "Duration" }
 
-func (m *Duration) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Duration.Unmarshal(m, b)
-}
-func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Duration.Marshal(b, m, deterministic)
-}
-func (m *Duration) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Duration.Merge(m, src)
-}
-func (m *Duration) XXX_Size() int {
-	return xxx_messageInfo_Duration.Size(m)
-}
-func (m *Duration) XXX_DiscardUnknown() {
-	xxx_messageInfo_Duration.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Duration proto.InternalMessageInfo
-
 func (m *Duration) GetSeconds() int64 {
 	if m != nil {
 		return m.Seconds
@@ -170,20 +151,14 @@
 	if File_google_protobuf_duration_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_google_protobuf_duration_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_duration_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_duration_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_duration_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_duration_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_duration_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_duration_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_duration_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/duration.proto", xxx_File_google_protobuf_duration_proto_rawdesc_gzipped)
-	proto.RegisterType((*Duration)(nil), "google.protobuf.Duration")
 	xxx_File_google_protobuf_duration_proto_goTypes = nil
 	xxx_File_google_protobuf_duration_proto_depIdxs = nil
 }
diff --git a/types/known/empty.pb.go b/types/known/empty.pb.go
index 1877968..e1099e3 100644
--- a/types/known/empty.pb.go
+++ b/types/known/empty.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // A generic empty message that you can re-use to avoid defining duplicated
@@ -29,7 +28,7 @@
 	return xxx_File_google_protobuf_empty_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Empty) Reset()         { *m = Empty{} }
-func (m *Empty) String() string { return proto.CompactTextString(m) }
+func (m *Empty) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Empty) ProtoMessage()    {}
 
 // Deprecated: Use Empty.ProtoReflect.Type instead.
@@ -39,24 +38,6 @@
 
 func (*Empty) XXX_WellKnownType() string { return "Empty" }
 
-func (m *Empty) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Empty.Unmarshal(m, b)
-}
-func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
-}
-func (m *Empty) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Empty.Merge(m, src)
-}
-func (m *Empty) XXX_Size() int {
-	return xxx_messageInfo_Empty.Size(m)
-}
-func (m *Empty) XXX_DiscardUnknown() {
-	xxx_messageInfo_Empty.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Empty proto.InternalMessageInfo
-
 var xxx_File_google_protobuf_empty_proto_rawdesc = []byte{
 	// 198 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
@@ -91,20 +72,14 @@
 	if File_google_protobuf_empty_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_google_protobuf_empty_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_empty_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_empty_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_empty_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_empty_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_empty_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_empty_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_empty_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/empty.proto", xxx_File_google_protobuf_empty_proto_rawdesc_gzipped)
-	proto.RegisterType((*Empty)(nil), "google.protobuf.Empty")
 	xxx_File_google_protobuf_empty_proto_goTypes = nil
 	xxx_File_google_protobuf_empty_proto_depIdxs = nil
 }
diff --git a/types/known/field_mask.pb.go b/types/known/field_mask.pb.go
index ad2aa2e..b248dfc 100644
--- a/types/known/field_mask.pb.go
+++ b/types/known/field_mask.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // `FieldMask` represents a set of symbolic field paths, for example:
@@ -221,7 +220,7 @@
 	return xxx_File_google_protobuf_field_mask_proto_messageTypes[0].MessageOf(m)
 }
 func (m *FieldMask) Reset()         { *m = FieldMask{} }
-func (m *FieldMask) String() string { return proto.CompactTextString(m) }
+func (m *FieldMask) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FieldMask) ProtoMessage()    {}
 
 // Deprecated: Use FieldMask.ProtoReflect.Type instead.
@@ -229,24 +228,6 @@
 	return xxx_File_google_protobuf_field_mask_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *FieldMask) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FieldMask.Unmarshal(m, b)
-}
-func (m *FieldMask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FieldMask.Marshal(b, m, deterministic)
-}
-func (m *FieldMask) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FieldMask.Merge(m, src)
-}
-func (m *FieldMask) XXX_Size() int {
-	return xxx_messageInfo_FieldMask.Size(m)
-}
-func (m *FieldMask) XXX_DiscardUnknown() {
-	xxx_messageInfo_FieldMask.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FieldMask proto.InternalMessageInfo
-
 func (m *FieldMask) GetPaths() []string {
 	if m != nil {
 		return m.Paths
@@ -290,20 +271,14 @@
 	if File_google_protobuf_field_mask_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_google_protobuf_field_mask_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_field_mask_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_field_mask_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_field_mask_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_field_mask_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_field_mask_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_field_mask_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_field_mask_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/field_mask.proto", xxx_File_google_protobuf_field_mask_proto_rawdesc_gzipped)
-	proto.RegisterType((*FieldMask)(nil), "google.protobuf.FieldMask")
 	xxx_File_google_protobuf_field_mask_proto_goTypes = nil
 	xxx_File_google_protobuf_field_mask_proto_depIdxs = nil
 }
diff --git a/types/known/source_context.pb.go b/types/known/source_context.pb.go
index 1bbcd54..0d8d942 100644
--- a/types/known/source_context.pb.go
+++ b/types/known/source_context.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // `SourceContext` represents information about the source of a
@@ -25,7 +24,7 @@
 	return xxx_File_google_protobuf_source_context_proto_messageTypes[0].MessageOf(m)
 }
 func (m *SourceContext) Reset()         { *m = SourceContext{} }
-func (m *SourceContext) String() string { return proto.CompactTextString(m) }
+func (m *SourceContext) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*SourceContext) ProtoMessage()    {}
 
 // Deprecated: Use SourceContext.ProtoReflect.Type instead.
@@ -33,24 +32,6 @@
 	return xxx_File_google_protobuf_source_context_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *SourceContext) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SourceContext.Unmarshal(m, b)
-}
-func (m *SourceContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SourceContext.Marshal(b, m, deterministic)
-}
-func (m *SourceContext) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SourceContext.Merge(m, src)
-}
-func (m *SourceContext) XXX_Size() int {
-	return xxx_messageInfo_SourceContext.Size(m)
-}
-func (m *SourceContext) XXX_DiscardUnknown() {
-	xxx_messageInfo_SourceContext.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SourceContext proto.InternalMessageInfo
-
 func (m *SourceContext) GetFileName() string {
 	if m != nil {
 		return m.FileName
@@ -95,20 +76,14 @@
 	if File_google_protobuf_source_context_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_google_protobuf_source_context_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_source_context_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_source_context_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_source_context_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_source_context_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_source_context_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_source_context_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_source_context_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/source_context.proto", xxx_File_google_protobuf_source_context_proto_rawdesc_gzipped)
-	proto.RegisterType((*SourceContext)(nil), "google.protobuf.SourceContext")
 	xxx_File_google_protobuf_source_context_proto_goTypes = nil
 	xxx_File_google_protobuf_source_context_proto_depIdxs = nil
 }
diff --git a/types/known/struct.pb.go b/types/known/struct.pb.go
index 9fc8f8f..824614b 100644
--- a/types/known/struct.pb.go
+++ b/types/known/struct.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // `NullValue` is a singleton enumeration to represent the null value for the
@@ -69,7 +68,7 @@
 	return xxx_File_google_protobuf_struct_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Struct) Reset()         { *m = Struct{} }
-func (m *Struct) String() string { return proto.CompactTextString(m) }
+func (m *Struct) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Struct) ProtoMessage()    {}
 
 // Deprecated: Use Struct.ProtoReflect.Type instead.
@@ -79,24 +78,6 @@
 
 func (*Struct) XXX_WellKnownType() string { return "Struct" }
 
-func (m *Struct) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Struct.Unmarshal(m, b)
-}
-func (m *Struct) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Struct.Marshal(b, m, deterministic)
-}
-func (m *Struct) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Struct.Merge(m, src)
-}
-func (m *Struct) XXX_Size() int {
-	return xxx_messageInfo_Struct.Size(m)
-}
-func (m *Struct) XXX_DiscardUnknown() {
-	xxx_messageInfo_Struct.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Struct proto.InternalMessageInfo
-
 func (m *Struct) GetFields() map[string]*Value {
 	if m != nil {
 		return m.Fields
@@ -136,7 +117,7 @@
 	return xxx_File_google_protobuf_struct_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Value) Reset()         { *m = Value{} }
-func (m *Value) String() string { return proto.CompactTextString(m) }
+func (m *Value) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Value) ProtoMessage()    {}
 
 // Deprecated: Use Value.ProtoReflect.Type instead.
@@ -146,24 +127,6 @@
 
 func (*Value) XXX_WellKnownType() string { return "Value" }
 
-func (m *Value) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Value.Unmarshal(m, b)
-}
-func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Value.Marshal(b, m, deterministic)
-}
-func (m *Value) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Value.Merge(m, src)
-}
-func (m *Value) XXX_Size() int {
-	return xxx_messageInfo_Value.Size(m)
-}
-func (m *Value) XXX_DiscardUnknown() {
-	xxx_messageInfo_Value.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Value proto.InternalMessageInfo
-
 type isValue_Kind interface {
 	isValue_Kind()
 }
@@ -280,7 +243,7 @@
 	return xxx_File_google_protobuf_struct_proto_messageTypes[2].MessageOf(m)
 }
 func (m *ListValue) Reset()         { *m = ListValue{} }
-func (m *ListValue) String() string { return proto.CompactTextString(m) }
+func (m *ListValue) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*ListValue) ProtoMessage()    {}
 
 // Deprecated: Use ListValue.ProtoReflect.Type instead.
@@ -290,24 +253,6 @@
 
 func (*ListValue) XXX_WellKnownType() string { return "ListValue" }
 
-func (m *ListValue) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ListValue.Unmarshal(m, b)
-}
-func (m *ListValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ListValue.Marshal(b, m, deterministic)
-}
-func (m *ListValue) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListValue.Merge(m, src)
-}
-func (m *ListValue) XXX_Size() int {
-	return xxx_messageInfo_ListValue.Size(m)
-}
-func (m *ListValue) XXX_DiscardUnknown() {
-	xxx_messageInfo_ListValue.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ListValue proto.InternalMessageInfo
-
 func (m *ListValue) GetValues() []*Value {
 	if m != nil {
 		return m.Values
@@ -395,25 +340,15 @@
 	if File_google_protobuf_struct_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 4)
 	File_google_protobuf_struct_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_struct_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_struct_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_struct_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_google_protobuf_struct_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_struct_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_struct_proto_goTypes[1:][:4]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_struct_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_struct_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/struct.proto", xxx_File_google_protobuf_struct_proto_rawdesc_gzipped)
-	proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value)
-	proto.RegisterType((*Struct)(nil), "google.protobuf.Struct")
-	proto.RegisterMapType((map[string]*Value)(nil), "google.protobuf.Struct.FieldsEntry")
-	proto.RegisterType((*Value)(nil), "google.protobuf.Value")
-	proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue")
 	xxx_File_google_protobuf_struct_proto_goTypes = nil
 	xxx_File_google_protobuf_struct_proto_depIdxs = nil
 }
diff --git a/types/known/timestamp.pb.go b/types/known/timestamp.pb.go
index 3251172..7ec6c98 100644
--- a/types/known/timestamp.pb.go
+++ b/types/known/timestamp.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // A Timestamp represents a point in time independent of any time zone or local
@@ -111,7 +110,7 @@
 	return xxx_File_google_protobuf_timestamp_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Timestamp) Reset()         { *m = Timestamp{} }
-func (m *Timestamp) String() string { return proto.CompactTextString(m) }
+func (m *Timestamp) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Timestamp) ProtoMessage()    {}
 
 // Deprecated: Use Timestamp.ProtoReflect.Type instead.
@@ -121,24 +120,6 @@
 
 func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" }
 
-func (m *Timestamp) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Timestamp.Unmarshal(m, b)
-}
-func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic)
-}
-func (m *Timestamp) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Timestamp.Merge(m, src)
-}
-func (m *Timestamp) XXX_Size() int {
-	return xxx_messageInfo_Timestamp.Size(m)
-}
-func (m *Timestamp) XXX_DiscardUnknown() {
-	xxx_messageInfo_Timestamp.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Timestamp proto.InternalMessageInfo
-
 func (m *Timestamp) GetSeconds() int64 {
 	if m != nil {
 		return m.Seconds
@@ -191,20 +172,14 @@
 	if File_google_protobuf_timestamp_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 1)
 	File_google_protobuf_timestamp_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_timestamp_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_timestamp_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_timestamp_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_timestamp_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_timestamp_proto_goTypes[0:][:1]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_timestamp_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_timestamp_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/timestamp.proto", xxx_File_google_protobuf_timestamp_proto_rawdesc_gzipped)
-	proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp")
 	xxx_File_google_protobuf_timestamp_proto_goTypes = nil
 	xxx_File_google_protobuf_timestamp_proto_depIdxs = nil
 }
diff --git a/types/known/type.pb.go b/types/known/type.pb.go
index b183a9b..25a0497 100644
--- a/types/known/type.pb.go
+++ b/types/known/type.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // The syntax in which a protocol buffer element is defined.
@@ -223,7 +222,7 @@
 	return xxx_File_google_protobuf_type_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Type) Reset()         { *m = Type{} }
-func (m *Type) String() string { return proto.CompactTextString(m) }
+func (m *Type) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Type) ProtoMessage()    {}
 
 // Deprecated: Use Type.ProtoReflect.Type instead.
@@ -231,24 +230,6 @@
 	return xxx_File_google_protobuf_type_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Type) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Type.Unmarshal(m, b)
-}
-func (m *Type) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Type.Marshal(b, m, deterministic)
-}
-func (m *Type) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Type.Merge(m, src)
-}
-func (m *Type) XXX_Size() int {
-	return xxx_messageInfo_Type.Size(m)
-}
-func (m *Type) XXX_DiscardUnknown() {
-	xxx_messageInfo_Type.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Type proto.InternalMessageInfo
-
 func (m *Type) GetName() string {
 	if m != nil {
 		return m.Name
@@ -324,7 +305,7 @@
 	return xxx_File_google_protobuf_type_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Field) Reset()         { *m = Field{} }
-func (m *Field) String() string { return proto.CompactTextString(m) }
+func (m *Field) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Field) ProtoMessage()    {}
 
 // Deprecated: Use Field.ProtoReflect.Type instead.
@@ -332,24 +313,6 @@
 	return xxx_File_google_protobuf_type_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *Field) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Field.Unmarshal(m, b)
-}
-func (m *Field) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Field.Marshal(b, m, deterministic)
-}
-func (m *Field) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Field.Merge(m, src)
-}
-func (m *Field) XXX_Size() int {
-	return xxx_messageInfo_Field.Size(m)
-}
-func (m *Field) XXX_DiscardUnknown() {
-	xxx_messageInfo_Field.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Field proto.InternalMessageInfo
-
 func (m *Field) GetKind() Field_Kind {
 	if m != nil {
 		return m.Kind
@@ -441,7 +404,7 @@
 	return xxx_File_google_protobuf_type_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Enum) Reset()         { *m = Enum{} }
-func (m *Enum) String() string { return proto.CompactTextString(m) }
+func (m *Enum) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Enum) ProtoMessage()    {}
 
 // Deprecated: Use Enum.ProtoReflect.Type instead.
@@ -449,24 +412,6 @@
 	return xxx_File_google_protobuf_type_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *Enum) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Enum.Unmarshal(m, b)
-}
-func (m *Enum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Enum.Marshal(b, m, deterministic)
-}
-func (m *Enum) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Enum.Merge(m, src)
-}
-func (m *Enum) XXX_Size() int {
-	return xxx_messageInfo_Enum.Size(m)
-}
-func (m *Enum) XXX_DiscardUnknown() {
-	xxx_messageInfo_Enum.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Enum proto.InternalMessageInfo
-
 func (m *Enum) GetName() string {
 	if m != nil {
 		return m.Name
@@ -519,7 +464,7 @@
 	return xxx_File_google_protobuf_type_proto_messageTypes[3].MessageOf(m)
 }
 func (m *EnumValue) Reset()         { *m = EnumValue{} }
-func (m *EnumValue) String() string { return proto.CompactTextString(m) }
+func (m *EnumValue) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*EnumValue) ProtoMessage()    {}
 
 // Deprecated: Use EnumValue.ProtoReflect.Type instead.
@@ -527,24 +472,6 @@
 	return xxx_File_google_protobuf_type_proto_rawdesc_gzipped, []int{3}
 }
 
-func (m *EnumValue) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_EnumValue.Unmarshal(m, b)
-}
-func (m *EnumValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_EnumValue.Marshal(b, m, deterministic)
-}
-func (m *EnumValue) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_EnumValue.Merge(m, src)
-}
-func (m *EnumValue) XXX_Size() int {
-	return xxx_messageInfo_EnumValue.Size(m)
-}
-func (m *EnumValue) XXX_DiscardUnknown() {
-	xxx_messageInfo_EnumValue.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_EnumValue proto.InternalMessageInfo
-
 func (m *EnumValue) GetName() string {
 	if m != nil {
 		return m.Name
@@ -588,7 +515,7 @@
 	return xxx_File_google_protobuf_type_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Option) Reset()         { *m = Option{} }
-func (m *Option) String() string { return proto.CompactTextString(m) }
+func (m *Option) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Option) ProtoMessage()    {}
 
 // Deprecated: Use Option.ProtoReflect.Type instead.
@@ -596,24 +523,6 @@
 	return xxx_File_google_protobuf_type_proto_rawdesc_gzipped, []int{4}
 }
 
-func (m *Option) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Option.Unmarshal(m, b)
-}
-func (m *Option) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Option.Marshal(b, m, deterministic)
-}
-func (m *Option) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Option.Merge(m, src)
-}
-func (m *Option) XXX_Size() int {
-	return xxx_messageInfo_Option.Size(m)
-}
-func (m *Option) XXX_DiscardUnknown() {
-	xxx_messageInfo_Option.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Option proto.InternalMessageInfo
-
 func (m *Option) GetName() string {
 	if m != nil {
 		return m.Name
@@ -790,28 +699,15 @@
 	}
 	xxx_File_google_protobuf_any_proto_init()
 	xxx_File_google_protobuf_source_context_proto_init()
-	messageTypes := make([]protoreflect.MessageType, 5)
 	File_google_protobuf_type_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_type_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_type_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_type_proto_depIdxs,
 		EnumOutputTypes:    xxx_File_google_protobuf_type_proto_enumTypes,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_type_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_type_proto_goTypes[3:][:5]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_type_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_type_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/type.proto", xxx_File_google_protobuf_type_proto_rawdesc_gzipped)
-	proto.RegisterEnum("google.protobuf.Syntax", Syntax_name, Syntax_value)
-	proto.RegisterEnum("google.protobuf.Field_Kind", Field_Kind_name, Field_Kind_value)
-	proto.RegisterEnum("google.protobuf.Field_Cardinality", Field_Cardinality_name, Field_Cardinality_value)
-	proto.RegisterType((*Type)(nil), "google.protobuf.Type")
-	proto.RegisterType((*Field)(nil), "google.protobuf.Field")
-	proto.RegisterType((*Enum)(nil), "google.protobuf.Enum")
-	proto.RegisterType((*EnumValue)(nil), "google.protobuf.EnumValue")
-	proto.RegisterType((*Option)(nil), "google.protobuf.Option")
 	xxx_File_google_protobuf_type_proto_goTypes = nil
 	xxx_File_google_protobuf_type_proto_depIdxs = nil
 }
diff --git a/types/known/wrappers.pb.go b/types/known/wrappers.pb.go
index 7dc0c1c..0b9e8a9 100644
--- a/types/known/wrappers.pb.go
+++ b/types/known/wrappers.pb.go
@@ -4,10 +4,9 @@
 package known_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
 )
 
 // Wrapper message for `double`.
@@ -25,7 +24,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[0].MessageOf(m)
 }
 func (m *DoubleValue) Reset()         { *m = DoubleValue{} }
-func (m *DoubleValue) String() string { return proto.CompactTextString(m) }
+func (m *DoubleValue) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*DoubleValue) ProtoMessage()    {}
 
 // Deprecated: Use DoubleValue.ProtoReflect.Type instead.
@@ -35,24 +34,6 @@
 
 func (*DoubleValue) XXX_WellKnownType() string { return "DoubleValue" }
 
-func (m *DoubleValue) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DoubleValue.Unmarshal(m, b)
-}
-func (m *DoubleValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DoubleValue.Marshal(b, m, deterministic)
-}
-func (m *DoubleValue) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DoubleValue.Merge(m, src)
-}
-func (m *DoubleValue) XXX_Size() int {
-	return xxx_messageInfo_DoubleValue.Size(m)
-}
-func (m *DoubleValue) XXX_DiscardUnknown() {
-	xxx_messageInfo_DoubleValue.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DoubleValue proto.InternalMessageInfo
-
 func (m *DoubleValue) GetValue() float64 {
 	if m != nil {
 		return m.Value
@@ -75,7 +56,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[1].MessageOf(m)
 }
 func (m *FloatValue) Reset()         { *m = FloatValue{} }
-func (m *FloatValue) String() string { return proto.CompactTextString(m) }
+func (m *FloatValue) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*FloatValue) ProtoMessage()    {}
 
 // Deprecated: Use FloatValue.ProtoReflect.Type instead.
@@ -85,24 +66,6 @@
 
 func (*FloatValue) XXX_WellKnownType() string { return "FloatValue" }
 
-func (m *FloatValue) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FloatValue.Unmarshal(m, b)
-}
-func (m *FloatValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FloatValue.Marshal(b, m, deterministic)
-}
-func (m *FloatValue) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FloatValue.Merge(m, src)
-}
-func (m *FloatValue) XXX_Size() int {
-	return xxx_messageInfo_FloatValue.Size(m)
-}
-func (m *FloatValue) XXX_DiscardUnknown() {
-	xxx_messageInfo_FloatValue.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FloatValue proto.InternalMessageInfo
-
 func (m *FloatValue) GetValue() float32 {
 	if m != nil {
 		return m.Value
@@ -125,7 +88,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Int64Value) Reset()         { *m = Int64Value{} }
-func (m *Int64Value) String() string { return proto.CompactTextString(m) }
+func (m *Int64Value) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Int64Value) ProtoMessage()    {}
 
 // Deprecated: Use Int64Value.ProtoReflect.Type instead.
@@ -135,24 +98,6 @@
 
 func (*Int64Value) XXX_WellKnownType() string { return "Int64Value" }
 
-func (m *Int64Value) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Int64Value.Unmarshal(m, b)
-}
-func (m *Int64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Int64Value.Marshal(b, m, deterministic)
-}
-func (m *Int64Value) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Int64Value.Merge(m, src)
-}
-func (m *Int64Value) XXX_Size() int {
-	return xxx_messageInfo_Int64Value.Size(m)
-}
-func (m *Int64Value) XXX_DiscardUnknown() {
-	xxx_messageInfo_Int64Value.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Int64Value proto.InternalMessageInfo
-
 func (m *Int64Value) GetValue() int64 {
 	if m != nil {
 		return m.Value
@@ -175,7 +120,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[3].MessageOf(m)
 }
 func (m *UInt64Value) Reset()         { *m = UInt64Value{} }
-func (m *UInt64Value) String() string { return proto.CompactTextString(m) }
+func (m *UInt64Value) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*UInt64Value) ProtoMessage()    {}
 
 // Deprecated: Use UInt64Value.ProtoReflect.Type instead.
@@ -185,24 +130,6 @@
 
 func (*UInt64Value) XXX_WellKnownType() string { return "UInt64Value" }
 
-func (m *UInt64Value) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UInt64Value.Unmarshal(m, b)
-}
-func (m *UInt64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UInt64Value.Marshal(b, m, deterministic)
-}
-func (m *UInt64Value) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UInt64Value.Merge(m, src)
-}
-func (m *UInt64Value) XXX_Size() int {
-	return xxx_messageInfo_UInt64Value.Size(m)
-}
-func (m *UInt64Value) XXX_DiscardUnknown() {
-	xxx_messageInfo_UInt64Value.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_UInt64Value proto.InternalMessageInfo
-
 func (m *UInt64Value) GetValue() uint64 {
 	if m != nil {
 		return m.Value
@@ -225,7 +152,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Int32Value) Reset()         { *m = Int32Value{} }
-func (m *Int32Value) String() string { return proto.CompactTextString(m) }
+func (m *Int32Value) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Int32Value) ProtoMessage()    {}
 
 // Deprecated: Use Int32Value.ProtoReflect.Type instead.
@@ -235,24 +162,6 @@
 
 func (*Int32Value) XXX_WellKnownType() string { return "Int32Value" }
 
-func (m *Int32Value) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Int32Value.Unmarshal(m, b)
-}
-func (m *Int32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Int32Value.Marshal(b, m, deterministic)
-}
-func (m *Int32Value) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Int32Value.Merge(m, src)
-}
-func (m *Int32Value) XXX_Size() int {
-	return xxx_messageInfo_Int32Value.Size(m)
-}
-func (m *Int32Value) XXX_DiscardUnknown() {
-	xxx_messageInfo_Int32Value.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Int32Value proto.InternalMessageInfo
-
 func (m *Int32Value) GetValue() int32 {
 	if m != nil {
 		return m.Value
@@ -275,7 +184,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[5].MessageOf(m)
 }
 func (m *UInt32Value) Reset()         { *m = UInt32Value{} }
-func (m *UInt32Value) String() string { return proto.CompactTextString(m) }
+func (m *UInt32Value) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*UInt32Value) ProtoMessage()    {}
 
 // Deprecated: Use UInt32Value.ProtoReflect.Type instead.
@@ -285,24 +194,6 @@
 
 func (*UInt32Value) XXX_WellKnownType() string { return "UInt32Value" }
 
-func (m *UInt32Value) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UInt32Value.Unmarshal(m, b)
-}
-func (m *UInt32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UInt32Value.Marshal(b, m, deterministic)
-}
-func (m *UInt32Value) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UInt32Value.Merge(m, src)
-}
-func (m *UInt32Value) XXX_Size() int {
-	return xxx_messageInfo_UInt32Value.Size(m)
-}
-func (m *UInt32Value) XXX_DiscardUnknown() {
-	xxx_messageInfo_UInt32Value.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_UInt32Value proto.InternalMessageInfo
-
 func (m *UInt32Value) GetValue() uint32 {
 	if m != nil {
 		return m.Value
@@ -325,7 +216,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[6].MessageOf(m)
 }
 func (m *BoolValue) Reset()         { *m = BoolValue{} }
-func (m *BoolValue) String() string { return proto.CompactTextString(m) }
+func (m *BoolValue) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*BoolValue) ProtoMessage()    {}
 
 // Deprecated: Use BoolValue.ProtoReflect.Type instead.
@@ -335,24 +226,6 @@
 
 func (*BoolValue) XXX_WellKnownType() string { return "BoolValue" }
 
-func (m *BoolValue) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BoolValue.Unmarshal(m, b)
-}
-func (m *BoolValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BoolValue.Marshal(b, m, deterministic)
-}
-func (m *BoolValue) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BoolValue.Merge(m, src)
-}
-func (m *BoolValue) XXX_Size() int {
-	return xxx_messageInfo_BoolValue.Size(m)
-}
-func (m *BoolValue) XXX_DiscardUnknown() {
-	xxx_messageInfo_BoolValue.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BoolValue proto.InternalMessageInfo
-
 func (m *BoolValue) GetValue() bool {
 	if m != nil {
 		return m.Value
@@ -375,7 +248,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[7].MessageOf(m)
 }
 func (m *StringValue) Reset()         { *m = StringValue{} }
-func (m *StringValue) String() string { return proto.CompactTextString(m) }
+func (m *StringValue) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*StringValue) ProtoMessage()    {}
 
 // Deprecated: Use StringValue.ProtoReflect.Type instead.
@@ -385,24 +258,6 @@
 
 func (*StringValue) XXX_WellKnownType() string { return "StringValue" }
 
-func (m *StringValue) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_StringValue.Unmarshal(m, b)
-}
-func (m *StringValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_StringValue.Marshal(b, m, deterministic)
-}
-func (m *StringValue) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_StringValue.Merge(m, src)
-}
-func (m *StringValue) XXX_Size() int {
-	return xxx_messageInfo_StringValue.Size(m)
-}
-func (m *StringValue) XXX_DiscardUnknown() {
-	xxx_messageInfo_StringValue.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_StringValue proto.InternalMessageInfo
-
 func (m *StringValue) GetValue() string {
 	if m != nil {
 		return m.Value
@@ -425,7 +280,7 @@
 	return xxx_File_google_protobuf_wrappers_proto_messageTypes[8].MessageOf(m)
 }
 func (m *BytesValue) Reset()         { *m = BytesValue{} }
-func (m *BytesValue) String() string { return proto.CompactTextString(m) }
+func (m *BytesValue) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*BytesValue) ProtoMessage()    {}
 
 // Deprecated: Use BytesValue.ProtoReflect.Type instead.
@@ -435,24 +290,6 @@
 
 func (*BytesValue) XXX_WellKnownType() string { return "BytesValue" }
 
-func (m *BytesValue) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BytesValue.Unmarshal(m, b)
-}
-func (m *BytesValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BytesValue.Marshal(b, m, deterministic)
-}
-func (m *BytesValue) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BytesValue.Merge(m, src)
-}
-func (m *BytesValue) XXX_Size() int {
-	return xxx_messageInfo_BytesValue.Size(m)
-}
-func (m *BytesValue) XXX_DiscardUnknown() {
-	xxx_messageInfo_BytesValue.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BytesValue proto.InternalMessageInfo
-
 func (m *BytesValue) GetValue() []byte {
 	if m != nil {
 		return m.Value
@@ -522,28 +359,14 @@
 	if File_google_protobuf_wrappers_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 9)
 	File_google_protobuf_wrappers_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_wrappers_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_wrappers_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_wrappers_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_wrappers_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_wrappers_proto_goTypes[0:][:9]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_wrappers_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_wrappers_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/wrappers.proto", xxx_File_google_protobuf_wrappers_proto_rawdesc_gzipped)
-	proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue")
-	proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue")
-	proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value")
-	proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value")
-	proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value")
-	proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value")
-	proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue")
-	proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue")
-	proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue")
 	xxx_File_google_protobuf_wrappers_proto_goTypes = nil
 	xxx_File_google_protobuf_wrappers_proto_depIdxs = nil
 }
diff --git a/types/plugin/plugin.pb.go b/types/plugin/plugin.pb.go
index 2dbae9d..57633fb 100644
--- a/types/plugin/plugin.pb.go
+++ b/types/plugin/plugin.pb.go
@@ -4,11 +4,10 @@
 package plugin_proto
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
 	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
 	descriptor "github.com/golang/protobuf/v2/types/descriptor"
-	reflect "reflect"
 )
 
 // The version number of protocol compiler.
@@ -28,7 +27,7 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Version) Reset()         { *m = Version{} }
-func (m *Version) String() string { return proto.CompactTextString(m) }
+func (m *Version) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*Version) ProtoMessage()    {}
 
 // Deprecated: Use Version.ProtoReflect.Type instead.
@@ -36,24 +35,6 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{0}
 }
 
-func (m *Version) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Version.Unmarshal(m, b)
-}
-func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Version.Marshal(b, m, deterministic)
-}
-func (m *Version) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Version.Merge(m, src)
-}
-func (m *Version) XXX_Size() int {
-	return xxx_messageInfo_Version.Size(m)
-}
-func (m *Version) XXX_DiscardUnknown() {
-	xxx_messageInfo_Version.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Version proto.InternalMessageInfo
-
 func (m *Version) GetMajor() int32 {
 	if m != nil && m.Major != nil {
 		return *m.Major
@@ -116,7 +97,7 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[1].MessageOf(m)
 }
 func (m *CodeGeneratorRequest) Reset()         { *m = CodeGeneratorRequest{} }
-func (m *CodeGeneratorRequest) String() string { return proto.CompactTextString(m) }
+func (m *CodeGeneratorRequest) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*CodeGeneratorRequest) ProtoMessage()    {}
 
 // Deprecated: Use CodeGeneratorRequest.ProtoReflect.Type instead.
@@ -124,24 +105,6 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{1}
 }
 
-func (m *CodeGeneratorRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CodeGeneratorRequest.Unmarshal(m, b)
-}
-func (m *CodeGeneratorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CodeGeneratorRequest.Marshal(b, m, deterministic)
-}
-func (m *CodeGeneratorRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CodeGeneratorRequest.Merge(m, src)
-}
-func (m *CodeGeneratorRequest) XXX_Size() int {
-	return xxx_messageInfo_CodeGeneratorRequest.Size(m)
-}
-func (m *CodeGeneratorRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_CodeGeneratorRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_CodeGeneratorRequest proto.InternalMessageInfo
-
 func (m *CodeGeneratorRequest) GetFileToGenerate() []string {
 	if m != nil {
 		return m.FileToGenerate
@@ -191,7 +154,7 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[2].MessageOf(m)
 }
 func (m *CodeGeneratorResponse) Reset()         { *m = CodeGeneratorResponse{} }
-func (m *CodeGeneratorResponse) String() string { return proto.CompactTextString(m) }
+func (m *CodeGeneratorResponse) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*CodeGeneratorResponse) ProtoMessage()    {}
 
 // Deprecated: Use CodeGeneratorResponse.ProtoReflect.Type instead.
@@ -199,24 +162,6 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{2}
 }
 
-func (m *CodeGeneratorResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CodeGeneratorResponse.Unmarshal(m, b)
-}
-func (m *CodeGeneratorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CodeGeneratorResponse.Marshal(b, m, deterministic)
-}
-func (m *CodeGeneratorResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CodeGeneratorResponse.Merge(m, src)
-}
-func (m *CodeGeneratorResponse) XXX_Size() int {
-	return xxx_messageInfo_CodeGeneratorResponse.Size(m)
-}
-func (m *CodeGeneratorResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_CodeGeneratorResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_CodeGeneratorResponse proto.InternalMessageInfo
-
 func (m *CodeGeneratorResponse) GetError() string {
 	if m != nil && m.Error != nil {
 		return *m.Error
@@ -294,7 +239,7 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[3].MessageOf(m)
 }
 func (m *CodeGeneratorResponse_File) Reset()         { *m = CodeGeneratorResponse_File{} }
-func (m *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(m) }
+func (m *CodeGeneratorResponse_File) String() string { return protoimpl.X.MessageStringOf(m) }
 func (*CodeGeneratorResponse_File) ProtoMessage()    {}
 
 // Deprecated: Use CodeGeneratorResponse_File.ProtoReflect.Type instead.
@@ -302,24 +247,6 @@
 	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{2, 0}
 }
 
-func (m *CodeGeneratorResponse_File) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CodeGeneratorResponse_File.Unmarshal(m, b)
-}
-func (m *CodeGeneratorResponse_File) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CodeGeneratorResponse_File.Marshal(b, m, deterministic)
-}
-func (m *CodeGeneratorResponse_File) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CodeGeneratorResponse_File.Merge(m, src)
-}
-func (m *CodeGeneratorResponse_File) XXX_Size() int {
-	return xxx_messageInfo_CodeGeneratorResponse_File.Size(m)
-}
-func (m *CodeGeneratorResponse_File) XXX_DiscardUnknown() {
-	xxx_messageInfo_CodeGeneratorResponse_File.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_CodeGeneratorResponse_File proto.InternalMessageInfo
-
 func (m *CodeGeneratorResponse_File) GetName() string {
 	if m != nil && m.Name != nil {
 		return *m.Name
@@ -418,23 +345,14 @@
 	if File_google_protobuf_compiler_plugin_proto != nil {
 		return
 	}
-	messageTypes := make([]protoreflect.MessageType, 4)
 	File_google_protobuf_compiler_plugin_proto = protoimpl.FileBuilder{
 		RawDescriptor:      xxx_File_google_protobuf_compiler_plugin_proto_rawdesc,
 		GoTypes:            xxx_File_google_protobuf_compiler_plugin_proto_goTypes,
 		DependencyIndexes:  xxx_File_google_protobuf_compiler_plugin_proto_depIdxs,
-		MessageOutputTypes: messageTypes,
+		MessageOutputTypes: xxx_File_google_protobuf_compiler_plugin_proto_messageTypes,
+		FilesRegistry:      protoregistry.GlobalFiles,
+		TypesRegistry:      protoregistry.GlobalTypes,
 	}.Init()
-	messageGoTypes := xxx_File_google_protobuf_compiler_plugin_proto_goTypes[0:][:4]
-	for i, mt := range messageTypes {
-		xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[i].PBType = mt
-	}
-	proto.RegisterFile("google/protobuf/compiler/plugin.proto", xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped)
-	proto.RegisterType((*Version)(nil), "google.protobuf.compiler.Version")
-	proto.RegisterType((*CodeGeneratorRequest)(nil), "google.protobuf.compiler.CodeGeneratorRequest")
-	proto.RegisterType((*CodeGeneratorResponse)(nil), "google.protobuf.compiler.CodeGeneratorResponse")
-	proto.RegisterType((*CodeGeneratorResponse_File)(nil), "google.protobuf.compiler.CodeGeneratorResponse.File")
 	xxx_File_google_protobuf_compiler_plugin_proto_goTypes = nil
 	xxx_File_google_protobuf_compiler_plugin_proto_depIdxs = nil
 }