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 33c525e..8a1a6a4 100644
--- a/cmd/protoc-gen-go-grpc/testdata/grpc/deprecation.pb.go
+++ b/cmd/protoc-gen-go-grpc/testdata/grpc/deprecation.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
 )
@@ -57,6 +56,11 @@
 var file_grpc_deprecation_proto_depIdxs = []int32{
 	0, // goproto.protoc.grpc.DeprecatedService.DeprecatedCall:input_type -> goproto.protoc.grpc.Request
 	1, // goproto.protoc.grpc.DeprecatedService.DeprecatedCall:output_type -> goproto.protoc.grpc.Response
+	1, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_grpc_deprecation_proto_init() }
@@ -65,13 +69,18 @@
 		return
 	}
 	file_grpc_grpc_proto_init()
-	File_grpc_deprecation_proto = protoimpl.FileBuilder{
-		RawDescriptor:     file_grpc_deprecation_proto_rawDesc,
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_grpc_deprecation_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
 		GoTypes:           file_grpc_deprecation_proto_goTypes,
 		DependencyIndexes: file_grpc_deprecation_proto_depIdxs,
-		FilesRegistry:     protoregistry.GlobalFiles,
-		TypesRegistry:     protoregistry.GlobalTypes,
-	}.Init()
+	}.Build()
+	File_grpc_deprecation_proto = out.File
 	file_grpc_deprecation_proto_rawDesc = nil
 	file_grpc_deprecation_proto_goTypes = nil
 	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 8a047bb..77bcc61 100644
--- a/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
+++ b/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -129,13 +128,18 @@
 }
 var file_grpc_grpc_proto_depIdxs = []int32{
 	0, // goproto.protoc.grpc.test_service.unary_call:input_type -> goproto.protoc.grpc.Request
-	1, // goproto.protoc.grpc.test_service.unary_call:output_type -> goproto.protoc.grpc.Response
 	0, // goproto.protoc.grpc.test_service.downstream_call:input_type -> goproto.protoc.grpc.Request
-	1, // goproto.protoc.grpc.test_service.downstream_call:output_type -> goproto.protoc.grpc.Response
 	0, // goproto.protoc.grpc.test_service.upstream_call:input_type -> goproto.protoc.grpc.Request
-	1, // goproto.protoc.grpc.test_service.upstream_call:output_type -> goproto.protoc.grpc.Response
 	0, // goproto.protoc.grpc.test_service.bidi_call:input_type -> goproto.protoc.grpc.Request
+	1, // goproto.protoc.grpc.test_service.unary_call:output_type -> goproto.protoc.grpc.Response
+	1, // goproto.protoc.grpc.test_service.downstream_call:output_type -> goproto.protoc.grpc.Response
+	1, // goproto.protoc.grpc.test_service.upstream_call:output_type -> goproto.protoc.grpc.Response
 	1, // goproto.protoc.grpc.test_service.bidi_call:output_type -> goproto.protoc.grpc.Response
+	4, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_grpc_grpc_proto_init() }
@@ -143,14 +147,19 @@
 	if File_grpc_grpc_proto != nil {
 		return
 	}
-	File_grpc_grpc_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_grpc_grpc_proto_rawDesc,
-		GoTypes:            file_grpc_grpc_proto_goTypes,
-		DependencyIndexes:  file_grpc_grpc_proto_depIdxs,
-		MessageOutputTypes: file_grpc_grpc_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_grpc_grpc_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_grpc_grpc_proto_goTypes,
+		DependencyIndexes: file_grpc_grpc_proto_depIdxs,
+		MessageInfos:      file_grpc_grpc_proto_msgTypes,
+	}.Build()
+	File_grpc_grpc_proto = out.File
 	file_grpc_grpc_proto_rawDesc = nil
 	file_grpc_grpc_proto_goTypes = nil
 	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 a17af06..b3556a4 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -44,6 +44,7 @@
 	protoimplPackage     = protogen.GoImportPath("google.golang.org/protobuf/runtime/protoimpl")
 	protoreflectPackage  = protogen.GoImportPath("google.golang.org/protobuf/reflect/protoreflect")
 	protoregistryPackage = protogen.GoImportPath("google.golang.org/protobuf/reflect/protoregistry")
+	prototypePackage     = protogen.GoImportPath("google.golang.org/protobuf/reflect/prototype")
 )
 
 type fileInfo struct {
@@ -65,7 +66,7 @@
 	}
 
 	// Collect all enums, messages, and extensions in "flattened ordering".
-	// See fileinit.FileBuilder.
+	// See filetype.TypeBuilder.
 	f.allEnums = append(f.allEnums, f.Enums...)
 	f.allMessages = append(f.allMessages, f.Messages...)
 	f.allExtensions = append(f.allExtensions, f.Extensions...)
@@ -625,7 +626,7 @@
 		return
 	}
 
-	g.P("var ", extDecsVarName(f), " = []", protoifacePackage.Ident("ExtensionDescV1"), "{")
+	g.P("var ", extDescsVarName(f), " = []", protoifacePackage.Ident("ExtensionDescV1"), "{")
 	for _, extension := range f.allExtensions {
 		// Special case for proto2 message sets: If this extension is extending
 		// proto2.bridge.MessageSet, and its final name component is "message_set_extension",
@@ -668,7 +669,7 @@
 		}
 		fieldName := string(ed.Name())
 		g.P("// extend ", targetName, " { ", ed.Cardinality().String(), " ", typeName, " ", fieldName, " = ", ed.Number(), "; }")
-		g.P(extensionVar(f.File, extension), " = &", extDecsVarName(f), "[", i, "]")
+		g.P(extensionVar(f.File, extension), " = &", extDescsVarName(f), "[", i, "]")
 		g.P()
 	}
 	g.P(")")
diff --git a/cmd/protoc-gen-go/internal_gengo/reflect.go b/cmd/protoc-gen-go/internal_gengo/reflect.go
index 53d7c96..c58a3ef 100644
--- a/cmd/protoc-gen-go/internal_gengo/reflect.go
+++ b/cmd/protoc-gen-go/internal_gengo/reflect.go
@@ -25,7 +25,7 @@
 
 	genFileDescriptor(gen, g, f)
 	if len(f.allEnums) > 0 {
-		g.P("var ", enumTypesVarName(f), " = make([]", protoreflectPackage.Ident("EnumType"), ",", len(f.allEnums), ")")
+		g.P("var ", enumTypesVarName(f), " = make([]", prototypePackage.Ident("Enum"), ",", len(f.allEnums), ")")
 	}
 	if len(f.allMessages) > 0 {
 		g.P("var ", messageTypesVarName(f), " = make([]", protoimplPackage.Ident("MessageInfo"), ",", len(f.allMessages), ")")
@@ -73,17 +73,16 @@
 		}
 	}
 
-	// This ordering is significant. See protoimpl.FileBuilder.GoTypes.
+	// This ordering is significant.
+	// See filetype.TypeBuilder.DependencyIndexes.
+	var depOffsets []string
 	for _, enum := range f.allEnums {
 		genEnum(enum, "")
 	}
 	for _, message := range f.allMessages {
 		genMessage(message, "")
 	}
-	for _, extension := range f.allExtensions {
-		source := string(extension.Desc.FullName())
-		genMessage(extension.Extendee, source+":extendee")
-	}
+	depOffsets = append(depOffsets, fmt.Sprintf("%d, // starting offset of field type_name sub-list", len(depIdxs)))
 	for _, message := range f.allMessages {
 		for _, field := range message.Fields {
 			if field.Desc.IsWeak() {
@@ -94,18 +93,34 @@
 			genMessage(field.Message, source+":type_name")
 		}
 	}
+	depOffsets = append(depOffsets, fmt.Sprintf("%d, // starting offset of extension extendee sub-list", len(depIdxs)))
+	for _, extension := range f.allExtensions {
+		source := string(extension.Desc.FullName())
+		genMessage(extension.Extendee, source+":extendee")
+	}
+	depOffsets = append(depOffsets, fmt.Sprintf("%d, // starting offset of extension type_name sub-list", len(depIdxs)))
 	for _, extension := range f.allExtensions {
 		source := string(extension.Desc.FullName())
 		genEnum(extension.Enum, source+":type_name")
 		genMessage(extension.Message, source+":type_name")
 	}
+	depOffsets = append(depOffsets, fmt.Sprintf("%d, // starting offset of method input_type sub-list", len(depIdxs)))
 	for _, service := range f.Services {
 		for _, method := range service.Methods {
 			source := string(method.Desc.FullName())
 			genMessage(method.Input, source+":input_type")
+		}
+	}
+	depOffsets = append(depOffsets, fmt.Sprintf("%d, // starting offset of method output_type sub-list", len(depIdxs)))
+	for _, service := range f.Services {
+		for _, method := range service.Methods {
+			source := string(method.Desc.FullName())
 			genMessage(method.Output, source+":output_type")
 		}
 	}
+	for i := len(depOffsets) - 1; i >= 0; i-- {
+		depIdxs = append(depIdxs, depOffsets[i])
+	}
 	if len(depIdxs) > math.MaxInt32 {
 		panic("too many dependencies") // sanity check
 	}
@@ -140,29 +155,27 @@
 		g.P(initFuncName(impFile), "()")
 	}
 
-	if len(f.allExtensions) > 0 {
-		g.P("extensionTypes := make([]", protoreflectPackage.Ident("ExtensionType"), ",", len(f.allExtensions), ")")
-	}
-
-	g.P(f.GoDescriptorIdent, " = ", protoimplPackage.Ident("FileBuilder"), "{")
+	g.P("out := ", protoimplPackage.Ident("TypeBuilder"), "{")
+	g.P("File: ", protoimplPackage.Ident("DescBuilder"), "{")
 	g.P("RawDescriptor: ", rawDescVarName(f), ",")
+	g.P("NumEnums: ", len(f.allEnums), ",")
+	g.P("NumMessages: ", len(f.allMessages), ",")
+	g.P("NumExtensions: ", len(f.allExtensions), ",")
+	g.P("NumServices: ", len(f.Services), ",")
+	g.P("},")
 	g.P("GoTypes: ", goTypesVarName(f), ",")
 	g.P("DependencyIndexes: ", depIdxsVarName(f), ",")
-	if len(f.allExtensions) > 0 {
-		g.P("LegacyExtensions: ", extDecsVarName(f), ",")
-	}
-	if len(f.allEnums) > 0 {
-		g.P("EnumOutputTypes: ", enumTypesVarName(f), ",")
-	}
 	if len(f.allMessages) > 0 {
-		g.P("MessageOutputTypes: ", messageTypesVarName(f), ",")
+		g.P("MessageInfos: ", messageTypesVarName(f), ",")
 	}
 	if len(f.allExtensions) > 0 {
-		g.P("ExtensionOutputTypes: extensionTypes,")
+		g.P("LegacyExtensions: ", extDescsVarName(f), ",")
 	}
-	g.P("FilesRegistry: ", protoregistryPackage.Ident("GlobalFiles"), ",")
-	g.P("TypesRegistry: ", protoregistryPackage.Ident("GlobalTypes"), ",")
-	g.P("}.Init()")
+	g.P("}.Build()")
+	g.P(f.GoDescriptorIdent, " = out.File")
+	if len(f.allEnums) > 0 {
+		g.P(enumTypesVarName(f), " = out.Enums")
+	}
 
 	// Set inputs to nil to allow GC to reclaim resources.
 	g.P(rawDescVarName(f), " = nil")
@@ -235,7 +248,7 @@
 
 	// Descriptor method.
 	g.P("func (", enum.GoIdent, ") Descriptor() ", protoreflectPackage.Ident("EnumDescriptor"), " {")
-	g.P("return ", typesVar, "[", idx, "].Descriptor()")
+	g.P("return ", typesVar, "[", idx, "].EnumDescriptor")
 	g.P("}")
 	g.P()
 
@@ -281,7 +294,7 @@
 func messageTypesVarName(f *fileInfo) string {
 	return fileVarName(f.File, "msgTypes")
 }
-func extDecsVarName(f *fileInfo) string {
+func extDescsVarName(f *fileInfo) string {
 	return fileVarName(f.File, "extDescs")
 }
 func initFuncName(f *protogen.File) string {
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
index 1759e76..e81a04f 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -45,7 +45,7 @@
 }
 
 func (AnnotationsTestEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_annotations_annotations_proto_enumTypes[0].Descriptor()
+	return file_annotations_annotations_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x AnnotationsTestEnum) Number() protoreflect.EnumNumber {
@@ -138,28 +138,39 @@
 	return file_annotations_annotations_proto_rawDescData
 }
 
-var file_annotations_annotations_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_annotations_annotations_proto_enumTypes = make([]prototype.Enum, 1)
 var file_annotations_annotations_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 var file_annotations_annotations_proto_goTypes = []interface{}{
 	(AnnotationsTestEnum)(0),       // 0: goproto.protoc.annotations.AnnotationsTestEnum
 	(*AnnotationsTestMessage)(nil), // 1: goproto.protoc.annotations.AnnotationsTestMessage
 }
-var file_annotations_annotations_proto_depIdxs = []int32{}
+var file_annotations_annotations_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_annotations_annotations_proto_init() }
 func file_annotations_annotations_proto_init() {
 	if File_annotations_annotations_proto != nil {
 		return
 	}
-	File_annotations_annotations_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_annotations_annotations_proto_rawDesc,
-		GoTypes:            file_annotations_annotations_proto_goTypes,
-		DependencyIndexes:  file_annotations_annotations_proto_depIdxs,
-		EnumOutputTypes:    file_annotations_annotations_proto_enumTypes,
-		MessageOutputTypes: file_annotations_annotations_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_annotations_annotations_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_annotations_annotations_proto_goTypes,
+		DependencyIndexes: file_annotations_annotations_proto_depIdxs,
+		MessageInfos:      file_annotations_annotations_proto_msgTypes,
+	}.Build()
+	File_annotations_annotations_proto = out.File
+	file_annotations_annotations_proto_enumTypes = out.Enums
 	file_annotations_annotations_proto_rawDesc = nil
 	file_annotations_annotations_proto_goTypes = nil
 	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 1a979ed..a70d989 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:639 end:658} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:675 end:722} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1947 end:1969} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1980 end:2000} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:3021 end:3044}
\ No newline at end of file
+annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:631 end:650} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:667 end:714} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1941 end:1963} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1974 end:1994} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:3015 end:3038}
\ 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 da5aabe..6cdb147 100644
--- a/cmd/protoc-gen-go/testdata/comments/comments.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
@@ -7,7 +7,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -289,21 +288,32 @@
 	(*Message2_Message2A)(nil), // 4: goproto.protoc.comments.Message2.Message2A
 	(*Message2_Message2B)(nil), // 5: goproto.protoc.comments.Message2.Message2B
 }
-var file_comments_comments_proto_depIdxs = []int32{}
+var file_comments_comments_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_comments_comments_proto_init() }
 func file_comments_comments_proto_init() {
 	if File_comments_comments_proto != nil {
 		return
 	}
-	File_comments_comments_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_comments_comments_proto_rawDesc,
-		GoTypes:            file_comments_comments_proto_goTypes,
-		DependencyIndexes:  file_comments_comments_proto_depIdxs,
-		MessageOutputTypes: file_comments_comments_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_comments_comments_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   6,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_comments_comments_proto_goTypes,
+		DependencyIndexes: file_comments_comments_proto_depIdxs,
+		MessageInfos:      file_comments_comments_proto_msgTypes,
+	}.Build()
+	File_comments_comments_proto = out.File
 	file_comments_comments_proto_rawDesc = nil
 	file_comments_comments_proto_goTypes = nil
 	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 b19b6d0..22db118 100644
--- a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -44,7 +44,7 @@
 }
 
 func (DeprecatedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_comments_deprecated_proto_enumTypes[0].Descriptor()
+	return file_comments_deprecated_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x DeprecatedEnum) Number() protoreflect.EnumNumber {
@@ -128,28 +128,39 @@
 	return file_comments_deprecated_proto_rawDescData
 }
 
-var file_comments_deprecated_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_comments_deprecated_proto_enumTypes = make([]prototype.Enum, 1)
 var file_comments_deprecated_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 var file_comments_deprecated_proto_goTypes = []interface{}{
 	(DeprecatedEnum)(0),       // 0: goproto.protoc.comments.DeprecatedEnum
 	(*DeprecatedMessage)(nil), // 1: goproto.protoc.comments.DeprecatedMessage
 }
-var file_comments_deprecated_proto_depIdxs = []int32{}
+var file_comments_deprecated_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_comments_deprecated_proto_init() }
 func file_comments_deprecated_proto_init() {
 	if File_comments_deprecated_proto != nil {
 		return
 	}
-	File_comments_deprecated_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_comments_deprecated_proto_rawDesc,
-		GoTypes:            file_comments_deprecated_proto_goTypes,
-		DependencyIndexes:  file_comments_deprecated_proto_depIdxs,
-		EnumOutputTypes:    file_comments_deprecated_proto_enumTypes,
-		MessageOutputTypes: file_comments_deprecated_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_comments_deprecated_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_comments_deprecated_proto_goTypes,
+		DependencyIndexes: file_comments_deprecated_proto_depIdxs,
+		MessageInfos:      file_comments_deprecated_proto_msgTypes,
+	}.Build()
+	File_comments_deprecated_proto = out.File
+	file_comments_deprecated_proto_enumTypes = out.Enums
 	file_comments_deprecated_proto_rawDesc = nil
 	file_comments_deprecated_proto_goTypes = nil
 	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 1e74be1..4364047 100644
--- a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -142,21 +141,32 @@
 	(*BaseMessage)(nil),                 // 0: goproto.protoc.extension.base.BaseMessage
 	(*MessageSetWireFormatMessage)(nil), // 1: goproto.protoc.extension.base.MessageSetWireFormatMessage
 }
-var file_extensions_base_base_proto_depIdxs = []int32{}
+var file_extensions_base_base_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_extensions_base_base_proto_init() }
 func file_extensions_base_base_proto_init() {
 	if File_extensions_base_base_proto != nil {
 		return
 	}
-	File_extensions_base_base_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_extensions_base_base_proto_rawDesc,
-		GoTypes:            file_extensions_base_base_proto_goTypes,
-		DependencyIndexes:  file_extensions_base_base_proto_depIdxs,
-		MessageOutputTypes: file_extensions_base_base_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_extensions_base_base_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_extensions_base_base_proto_goTypes,
+		DependencyIndexes: file_extensions_base_base_proto_depIdxs,
+		MessageInfos:      file_extensions_base_base_proto_msgTypes,
+	}.Build()
+	File_extensions_base_base_proto = out.File
 	file_extensions_base_base_proto_rawDesc = nil
 	file_extensions_base_base_proto_goTypes = nil
 	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 3d2627f..167390f 100644
--- a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
@@ -7,7 +7,7 @@
 	base "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/extensions/base"
 	extra "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/extensions/extra"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -47,7 +47,7 @@
 }
 
 func (Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_extensions_ext_ext_proto_enumTypes[0].Descriptor()
+	return file_extensions_ext_ext_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Enum) Number() protoreflect.EnumNumber {
@@ -1155,7 +1155,7 @@
 	return file_extensions_ext_ext_proto_rawDescData
 }
 
-var file_extensions_ext_ext_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_extensions_ext_ext_proto_enumTypes = make([]prototype.Enum, 1)
 var file_extensions_ext_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
 var file_extensions_ext_ext_proto_goTypes = []interface{}{
 	(Enum)(0),                             // 0: goproto.protoc.extension.ext.Enum
@@ -1228,6 +1228,11 @@
 	6,  // goproto.protoc.extension.ext.message_set_extension:type_name -> goproto.protoc.extension.ext.MessageSetWireFormatExtension
 	8,  // goproto.protoc.extension.ext.ExtendingMessage.extending_message_submessage:type_name -> goproto.protoc.extension.ext.ExtendingMessage.ExtendingMessageSubmessage
 	6,  // goproto.protoc.extension.ext.MessageSetWireFormatExtension.message_set_extension:type_name -> goproto.protoc.extension.ext.MessageSetWireFormatExtension
+	56, // starting offset of method output_type sub-list
+	56, // starting offset of method input_type sub-list
+	44, // starting offset of extension type_name sub-list
+	0,  // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_extensions_ext_ext_proto_init() }
@@ -1235,18 +1240,21 @@
 	if File_extensions_ext_ext_proto != nil {
 		return
 	}
-	extensionTypes := make([]protoreflect.ExtensionType, 44)
-	File_extensions_ext_ext_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_extensions_ext_ext_proto_rawDesc,
-		GoTypes:              file_extensions_ext_ext_proto_goTypes,
-		DependencyIndexes:    file_extensions_ext_ext_proto_depIdxs,
-		LegacyExtensions:     file_extensions_ext_ext_proto_extDescs,
-		EnumOutputTypes:      file_extensions_ext_ext_proto_enumTypes,
-		MessageOutputTypes:   file_extensions_ext_ext_proto_msgTypes,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_extensions_ext_ext_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   8,
+			NumExtensions: 44,
+			NumServices:   0,
+		},
+		GoTypes:           file_extensions_ext_ext_proto_goTypes,
+		DependencyIndexes: file_extensions_ext_ext_proto_depIdxs,
+		MessageInfos:      file_extensions_ext_ext_proto_msgTypes,
+		LegacyExtensions:  file_extensions_ext_ext_proto_extDescs,
+	}.Build()
+	File_extensions_ext_ext_proto = out.File
+	file_extensions_ext_ext_proto_enumTypes = out.Enums
 	file_extensions_ext_ext_proto_rawDesc = nil
 	file_extensions_ext_ext_proto_goTypes = nil
 	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 e46cdba..93a95dc 100644
--- a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -87,21 +86,32 @@
 var file_extensions_extra_extra_proto_goTypes = []interface{}{
 	(*ExtraMessage)(nil), // 0: goproto.protoc.extension.extra.ExtraMessage
 }
-var file_extensions_extra_extra_proto_depIdxs = []int32{}
+var file_extensions_extra_extra_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_extensions_extra_extra_proto_init() }
 func file_extensions_extra_extra_proto_init() {
 	if File_extensions_extra_extra_proto != nil {
 		return
 	}
-	File_extensions_extra_extra_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_extensions_extra_extra_proto_rawDesc,
-		GoTypes:            file_extensions_extra_extra_proto_goTypes,
-		DependencyIndexes:  file_extensions_extra_extra_proto_depIdxs,
-		MessageOutputTypes: file_extensions_extra_extra_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_extensions_extra_extra_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_extensions_extra_extra_proto_goTypes,
+		DependencyIndexes: file_extensions_extra_extra_proto_depIdxs,
+		MessageInfos:      file_extensions_extra_extra_proto_msgTypes,
+	}.Build()
+	File_extensions_extra_extra_proto = out.File
 	file_extensions_extra_extra_proto_rawDesc = nil
 	file_extensions_extra_extra_proto_goTypes = nil
 	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 f98c06b..c88a642 100644
--- a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	descriptorpb "google.golang.org/protobuf/types/descriptorpb"
@@ -46,7 +46,7 @@
 }
 
 func (Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_extensions_proto3_ext3_proto_enumTypes[0].Descriptor()
+	return file_extensions_proto3_ext3_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Enum) Number() protoreflect.EnumNumber {
@@ -686,7 +686,7 @@
 	return file_extensions_proto3_ext3_proto_rawDescData
 }
 
-var file_extensions_proto3_ext3_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_extensions_proto3_ext3_proto_enumTypes = make([]prototype.Enum, 1)
 var file_extensions_proto3_ext3_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 var file_extensions_proto3_ext3_proto_goTypes = []interface{}{
 	(Enum)(0),                           // 0: goproto.protoc.extension.proto3.Enum
@@ -694,44 +694,49 @@
 	(*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions
 }
 var file_extensions_proto3_ext3_proto_depIdxs = []int32{
-	2, // goproto.protoc.extension.proto3.extension_bool:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_enum:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_int32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_sint32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_uint32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_int64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_sint64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_uint64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_sfixed32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_fixed32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_float:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_sfixed64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_fixed64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_double:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_string:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_bytes:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.extension_Message:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_bool:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_enum:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_int32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_sint32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_uint32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_int64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_sint64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_uint64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_sfixed32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_fixed32:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_float:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_sfixed64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_fixed64:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_double:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_string:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_bytes:extendee -> google.protobuf.MessageOptions
-	2, // goproto.protoc.extension.proto3.repeated_extension_Message:extendee -> google.protobuf.MessageOptions
-	0, // goproto.protoc.extension.proto3.extension_enum:type_name -> goproto.protoc.extension.proto3.Enum
-	1, // goproto.protoc.extension.proto3.extension_Message:type_name -> goproto.protoc.extension.proto3.Message
-	0, // goproto.protoc.extension.proto3.repeated_extension_enum:type_name -> goproto.protoc.extension.proto3.Enum
-	1, // goproto.protoc.extension.proto3.repeated_extension_Message:type_name -> goproto.protoc.extension.proto3.Message
+	2,  // goproto.protoc.extension.proto3.extension_bool:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_enum:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_int32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_sint32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_uint32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_int64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_sint64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_uint64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_sfixed32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_fixed32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_float:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_sfixed64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_fixed64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_double:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_string:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_bytes:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.extension_Message:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_bool:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_enum:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_int32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_sint32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_uint32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_int64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_sint64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_uint64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_sfixed32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_fixed32:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_float:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_sfixed64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_fixed64:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_double:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_string:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_bytes:extendee -> google.protobuf.MessageOptions
+	2,  // goproto.protoc.extension.proto3.repeated_extension_Message:extendee -> google.protobuf.MessageOptions
+	0,  // goproto.protoc.extension.proto3.extension_enum:type_name -> goproto.protoc.extension.proto3.Enum
+	1,  // goproto.protoc.extension.proto3.extension_Message:type_name -> goproto.protoc.extension.proto3.Message
+	0,  // goproto.protoc.extension.proto3.repeated_extension_enum:type_name -> goproto.protoc.extension.proto3.Enum
+	1,  // goproto.protoc.extension.proto3.repeated_extension_Message:type_name -> goproto.protoc.extension.proto3.Message
+	38, // starting offset of method output_type sub-list
+	38, // starting offset of method input_type sub-list
+	34, // starting offset of extension type_name sub-list
+	0,  // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_extensions_proto3_ext3_proto_init() }
@@ -739,18 +744,21 @@
 	if File_extensions_proto3_ext3_proto != nil {
 		return
 	}
-	extensionTypes := make([]protoreflect.ExtensionType, 34)
-	File_extensions_proto3_ext3_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_extensions_proto3_ext3_proto_rawDesc,
-		GoTypes:              file_extensions_proto3_ext3_proto_goTypes,
-		DependencyIndexes:    file_extensions_proto3_ext3_proto_depIdxs,
-		LegacyExtensions:     file_extensions_proto3_ext3_proto_extDescs,
-		EnumOutputTypes:      file_extensions_proto3_ext3_proto_enumTypes,
-		MessageOutputTypes:   file_extensions_proto3_ext3_proto_msgTypes,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_extensions_proto3_ext3_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 34,
+			NumServices:   0,
+		},
+		GoTypes:           file_extensions_proto3_ext3_proto_goTypes,
+		DependencyIndexes: file_extensions_proto3_ext3_proto_depIdxs,
+		MessageInfos:      file_extensions_proto3_ext3_proto_msgTypes,
+		LegacyExtensions:  file_extensions_proto3_ext3_proto_extDescs,
+	}.Build()
+	File_extensions_proto3_ext3_proto = out.File
+	file_extensions_proto3_ext3_proto_enumTypes = out.Enums
 	file_extensions_proto3_ext3_proto_rawDesc = nil
 	file_extensions_proto3_ext3_proto_goTypes = nil
 	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 8680fd2..9a9b3cb 100644
--- a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
+++ b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -382,21 +381,32 @@
 	(*Message)(nil),                      // 0: goproto.protoc.fieldnames.Message
 	(*Message_OneofMessageConflict)(nil), // 1: goproto.protoc.fieldnames.Message.OneofMessageConflict
 }
-var file_fieldnames_fieldnames_proto_depIdxs = []int32{}
+var file_fieldnames_fieldnames_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_fieldnames_fieldnames_proto_init() }
 func file_fieldnames_fieldnames_proto_init() {
 	if File_fieldnames_fieldnames_proto != nil {
 		return
 	}
-	File_fieldnames_fieldnames_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_fieldnames_fieldnames_proto_rawDesc,
-		GoTypes:            file_fieldnames_fieldnames_proto_goTypes,
-		DependencyIndexes:  file_fieldnames_fieldnames_proto_depIdxs,
-		MessageOutputTypes: file_fieldnames_fieldnames_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_fieldnames_fieldnames_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_fieldnames_fieldnames_proto_goTypes,
+		DependencyIndexes: file_fieldnames_fieldnames_proto_depIdxs,
+		MessageInfos:      file_fieldnames_fieldnames_proto_msgTypes,
+	}.Build()
+	File_fieldnames_fieldnames_proto = out.File
 	file_fieldnames_fieldnames_proto_rawDesc = nil
 	file_fieldnames_fieldnames_proto_goTypes = nil
 	file_fieldnames_fieldnames_proto_depIdxs = nil
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 d142745..9ff5681 100644
--- a/cmd/protoc-gen-go/testdata/import_public/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
@@ -6,7 +6,6 @@
 import (
 	sub "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/import_public/sub"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -160,6 +159,11 @@
 	1, // goproto.protoc.import_public.Public.m:type_name -> goproto.protoc.import_public.sub.M
 	2, // goproto.protoc.import_public.Public.e:type_name -> goproto.protoc.import_public.sub.E
 	3, // goproto.protoc.import_public.Public.local:type_name -> goproto.protoc.import_public.Local
+	3, // starting offset of method output_type sub-list
+	3, // starting offset of method input_type sub-list
+	3, // starting offset of extension type_name sub-list
+	3, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_import_public_a_proto_init() }
@@ -168,14 +172,19 @@
 		return
 	}
 	file_import_public_b_proto_init()
-	File_import_public_a_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_import_public_a_proto_rawDesc,
-		GoTypes:            file_import_public_a_proto_goTypes,
-		DependencyIndexes:  file_import_public_a_proto_depIdxs,
-		MessageOutputTypes: file_import_public_a_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_import_public_a_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_import_public_a_proto_goTypes,
+		DependencyIndexes: file_import_public_a_proto_depIdxs,
+		MessageInfos:      file_import_public_a_proto_msgTypes,
+	}.Build()
+	File_import_public_a_proto = out.File
 	file_import_public_a_proto_rawDesc = nil
 	file_import_public_a_proto_goTypes = nil
 	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 8fc7556..da6a3a6 100644
--- a/cmd/protoc-gen-go/testdata/import_public/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
@@ -6,7 +6,6 @@
 import (
 	sub "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/import_public/sub"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -107,6 +106,11 @@
 var file_import_public_b_proto_depIdxs = []int32{
 	1, // goproto.protoc.import_public.Local.m:type_name -> goproto.protoc.import_public.sub.M
 	2, // goproto.protoc.import_public.Local.e:type_name -> goproto.protoc.import_public.sub.E
+	2, // starting offset of method output_type sub-list
+	2, // starting offset of method input_type sub-list
+	2, // starting offset of extension type_name sub-list
+	2, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_import_public_b_proto_init() }
@@ -114,14 +118,19 @@
 	if File_import_public_b_proto != nil {
 		return
 	}
-	File_import_public_b_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_import_public_b_proto_rawDesc,
-		GoTypes:            file_import_public_b_proto_goTypes,
-		DependencyIndexes:  file_import_public_b_proto_depIdxs,
-		MessageOutputTypes: file_import_public_b_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_import_public_b_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_import_public_b_proto_goTypes,
+		DependencyIndexes: file_import_public_b_proto_depIdxs,
+		MessageInfos:      file_import_public_b_proto_msgTypes,
+	}.Build()
+	File_import_public_b_proto = out.File
 	file_import_public_b_proto_rawDesc = nil
 	file_import_public_b_proto_goTypes = nil
 	file_import_public_b_proto_depIdxs = nil
diff --git a/cmd/protoc-gen-go/testdata/import_public/c.pb.go b/cmd/protoc-gen-go/testdata/import_public/c.pb.go
index 07d1578..955f91b 100644
--- a/cmd/protoc-gen-go/testdata/import_public/c.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/c.pb.go
@@ -6,7 +6,6 @@
 import (
 	sub2 "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/import_public/sub2"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -112,6 +111,11 @@
 var file_import_public_c_proto_depIdxs = []int32{
 	1, // goproto.protoc.import_public.UsingPublicImport.local:type_name -> goproto.protoc.import_public.Local
 	2, // goproto.protoc.import_public.UsingPublicImport.sub2:type_name -> goproto.protoc.import_public.sub2.Sub2Message
+	2, // starting offset of method output_type sub-list
+	2, // starting offset of method input_type sub-list
+	2, // starting offset of extension type_name sub-list
+	2, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_import_public_c_proto_init() }
@@ -120,14 +124,19 @@
 		return
 	}
 	file_import_public_a_proto_init()
-	File_import_public_c_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_import_public_c_proto_rawDesc,
-		GoTypes:            file_import_public_c_proto_goTypes,
-		DependencyIndexes:  file_import_public_c_proto_depIdxs,
-		MessageOutputTypes: file_import_public_c_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_import_public_c_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_import_public_c_proto_goTypes,
+		DependencyIndexes: file_import_public_c_proto_depIdxs,
+		MessageInfos:      file_import_public_c_proto_msgTypes,
+	}.Build()
+	File_import_public_c_proto = out.File
 	file_import_public_c_proto_rawDesc = nil
 	file_import_public_c_proto_goTypes = nil
 	file_import_public_c_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 68f0084..fc5a845 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
@@ -6,7 +6,7 @@
 import (
 	sub2 "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/import_public/sub2"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	math "math"
@@ -51,7 +51,7 @@
 }
 
 func (E) Descriptor() protoreflect.EnumDescriptor {
-	return file_import_public_sub_a_proto_enumTypes[0].Descriptor()
+	return file_import_public_sub_a_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x E) Number() protoreflect.EnumNumber {
@@ -100,7 +100,7 @@
 }
 
 func (M_Subenum) Descriptor() protoreflect.EnumDescriptor {
-	return file_import_public_sub_a_proto_enumTypes[1].Descriptor()
+	return file_import_public_sub_a_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x M_Subenum) Number() protoreflect.EnumNumber {
@@ -149,7 +149,7 @@
 }
 
 func (M_Submessage_Submessage_Subenum) Descriptor() protoreflect.EnumDescriptor {
-	return file_import_public_sub_a_proto_enumTypes[2].Descriptor()
+	return file_import_public_sub_a_proto_enumTypes[2].EnumDescriptor
 }
 
 func (x M_Submessage_Submessage_Subenum) Number() protoreflect.EnumNumber {
@@ -452,7 +452,7 @@
 	return file_import_public_sub_a_proto_rawDescData
 }
 
-var file_import_public_sub_a_proto_enumTypes = make([]protoreflect.EnumType, 3)
+var file_import_public_sub_a_proto_enumTypes = make([]prototype.Enum, 3)
 var file_import_public_sub_a_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 var file_import_public_sub_a_proto_goTypes = []interface{}{
 	(E)(0),                               // 0: goproto.protoc.import_public.sub.E
@@ -463,8 +463,13 @@
 	(*M2)(nil),                           // 5: goproto.protoc.import_public.sub.M2
 }
 var file_import_public_sub_a_proto_depIdxs = []int32{
-	3, // goproto.protoc.import_public.sub.extension_field:extendee -> goproto.protoc.import_public.sub.M
 	5, // goproto.protoc.import_public.sub.M.m2:type_name -> goproto.protoc.import_public.sub.M2
+	3, // goproto.protoc.import_public.sub.extension_field:extendee -> goproto.protoc.import_public.sub.M
+	2, // starting offset of method output_type sub-list
+	2, // starting offset of method input_type sub-list
+	2, // starting offset of extension type_name sub-list
+	1, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_import_public_sub_a_proto_init() }
@@ -473,18 +478,21 @@
 		return
 	}
 	file_import_public_sub_b_proto_init()
-	extensionTypes := make([]protoreflect.ExtensionType, 1)
-	File_import_public_sub_a_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_import_public_sub_a_proto_rawDesc,
-		GoTypes:              file_import_public_sub_a_proto_goTypes,
-		DependencyIndexes:    file_import_public_sub_a_proto_depIdxs,
-		LegacyExtensions:     file_import_public_sub_a_proto_extDescs,
-		EnumOutputTypes:      file_import_public_sub_a_proto_enumTypes,
-		MessageOutputTypes:   file_import_public_sub_a_proto_msgTypes,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_import_public_sub_a_proto_rawDesc,
+			NumEnums:      3,
+			NumMessages:   2,
+			NumExtensions: 1,
+			NumServices:   0,
+		},
+		GoTypes:           file_import_public_sub_a_proto_goTypes,
+		DependencyIndexes: file_import_public_sub_a_proto_depIdxs,
+		MessageInfos:      file_import_public_sub_a_proto_msgTypes,
+		LegacyExtensions:  file_import_public_sub_a_proto_extDescs,
+	}.Build()
+	File_import_public_sub_a_proto = out.File
+	file_import_public_sub_a_proto_enumTypes = out.Enums
 	file_import_public_sub_a_proto_rawDesc = nil
 	file_import_public_sub_a_proto_goTypes = nil
 	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 114c142..dfa99ab 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -77,21 +76,32 @@
 var file_import_public_sub_b_proto_goTypes = []interface{}{
 	(*M2)(nil), // 0: goproto.protoc.import_public.sub.M2
 }
-var file_import_public_sub_b_proto_depIdxs = []int32{}
+var file_import_public_sub_b_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_import_public_sub_b_proto_init() }
 func file_import_public_sub_b_proto_init() {
 	if File_import_public_sub_b_proto != nil {
 		return
 	}
-	File_import_public_sub_b_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_import_public_sub_b_proto_rawDesc,
-		GoTypes:            file_import_public_sub_b_proto_goTypes,
-		DependencyIndexes:  file_import_public_sub_b_proto_depIdxs,
-		MessageOutputTypes: file_import_public_sub_b_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_import_public_sub_b_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_import_public_sub_b_proto_goTypes,
+		DependencyIndexes: file_import_public_sub_b_proto_depIdxs,
+		MessageInfos:      file_import_public_sub_b_proto_msgTypes,
+	}.Build()
+	File_import_public_sub_b_proto = out.File
 	file_import_public_sub_b_proto_rawDesc = nil
 	file_import_public_sub_b_proto_goTypes = nil
 	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 4b84080..cde2a6f 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -78,21 +77,32 @@
 var file_import_public_sub2_a_proto_goTypes = []interface{}{
 	(*Sub2Message)(nil), // 0: goproto.protoc.import_public.sub2.Sub2Message
 }
-var file_import_public_sub2_a_proto_depIdxs = []int32{}
+var file_import_public_sub2_a_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_import_public_sub2_a_proto_init() }
 func file_import_public_sub2_a_proto_init() {
 	if File_import_public_sub2_a_proto != nil {
 		return
 	}
-	File_import_public_sub2_a_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_import_public_sub2_a_proto_rawDesc,
-		GoTypes:            file_import_public_sub2_a_proto_goTypes,
-		DependencyIndexes:  file_import_public_sub2_a_proto_depIdxs,
-		MessageOutputTypes: file_import_public_sub2_a_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_import_public_sub2_a_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_import_public_sub2_a_proto_goTypes,
+		DependencyIndexes: file_import_public_sub2_a_proto_depIdxs,
+		MessageInfos:      file_import_public_sub2_a_proto_msgTypes,
+	}.Build()
+	File_import_public_sub2_a_proto = out.File
 	file_import_public_sub2_a_proto_rawDesc = nil
 	file_import_public_sub2_a_proto_goTypes = nil
 	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 db047a2..8cdb704 100644
--- a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -75,21 +74,32 @@
 var file_imports_fmt_m_proto_goTypes = []interface{}{
 	(*M)(nil), // 0: fmt.M
 }
-var file_imports_fmt_m_proto_depIdxs = []int32{}
+var file_imports_fmt_m_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_imports_fmt_m_proto_init() }
 func file_imports_fmt_m_proto_init() {
 	if File_imports_fmt_m_proto != nil {
 		return
 	}
-	File_imports_fmt_m_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_fmt_m_proto_rawDesc,
-		GoTypes:            file_imports_fmt_m_proto_goTypes,
-		DependencyIndexes:  file_imports_fmt_m_proto_depIdxs,
-		MessageOutputTypes: file_imports_fmt_m_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_fmt_m_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_fmt_m_proto_goTypes,
+		DependencyIndexes: file_imports_fmt_m_proto_depIdxs,
+		MessageInfos:      file_imports_fmt_m_proto_msgTypes,
+	}.Build()
+	File_imports_fmt_m_proto = out.File
 	file_imports_fmt_m_proto_rawDesc = nil
 	file_imports_fmt_m_proto_goTypes = nil
 	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 8530e07..1106dc6 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
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -45,7 +45,7 @@
 }
 
 func (E1) Descriptor() protoreflect.EnumDescriptor {
-	return file_imports_test_a_1_m1_proto_enumTypes[0].Descriptor()
+	return file_imports_test_a_1_m1_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x E1) Number() protoreflect.EnumNumber {
@@ -152,7 +152,7 @@
 	return file_imports_test_a_1_m1_proto_rawDescData
 }
 
-var file_imports_test_a_1_m1_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_imports_test_a_1_m1_proto_enumTypes = make([]prototype.Enum, 1)
 var file_imports_test_a_1_m1_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 var file_imports_test_a_1_m1_proto_goTypes = []interface{}{
 	(E1)(0),      // 0: test.a.E1
@@ -161,6 +161,11 @@
 }
 var file_imports_test_a_1_m1_proto_depIdxs = []int32{
 	1, // test.a.M1_1.m1:type_name -> test.a.M1
+	1, // starting offset of method output_type sub-list
+	1, // starting offset of method input_type sub-list
+	1, // starting offset of extension type_name sub-list
+	1, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_imports_test_a_1_m1_proto_init() }
@@ -168,15 +173,20 @@
 	if File_imports_test_a_1_m1_proto != nil {
 		return
 	}
-	File_imports_test_a_1_m1_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_a_1_m1_proto_rawDesc,
-		GoTypes:            file_imports_test_a_1_m1_proto_goTypes,
-		DependencyIndexes:  file_imports_test_a_1_m1_proto_depIdxs,
-		EnumOutputTypes:    file_imports_test_a_1_m1_proto_enumTypes,
-		MessageOutputTypes: file_imports_test_a_1_m1_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_a_1_m1_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_a_1_m1_proto_goTypes,
+		DependencyIndexes: file_imports_test_a_1_m1_proto_depIdxs,
+		MessageInfos:      file_imports_test_a_1_m1_proto_msgTypes,
+	}.Build()
+	File_imports_test_a_1_m1_proto = out.File
+	file_imports_test_a_1_m1_proto_enumTypes = out.Enums
 	file_imports_test_a_1_m1_proto_rawDesc = nil
 	file_imports_test_a_1_m1_proto_goTypes = nil
 	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 911f7b2..1884c23 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -76,21 +75,32 @@
 var file_imports_test_a_1_m2_proto_goTypes = []interface{}{
 	(*M2)(nil), // 0: test.a.M2
 }
-var file_imports_test_a_1_m2_proto_depIdxs = []int32{}
+var file_imports_test_a_1_m2_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_imports_test_a_1_m2_proto_init() }
 func file_imports_test_a_1_m2_proto_init() {
 	if File_imports_test_a_1_m2_proto != nil {
 		return
 	}
-	File_imports_test_a_1_m2_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_a_1_m2_proto_rawDesc,
-		GoTypes:            file_imports_test_a_1_m2_proto_goTypes,
-		DependencyIndexes:  file_imports_test_a_1_m2_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_a_1_m2_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_a_1_m2_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_a_1_m2_proto_goTypes,
+		DependencyIndexes: file_imports_test_a_1_m2_proto_depIdxs,
+		MessageInfos:      file_imports_test_a_1_m2_proto_msgTypes,
+	}.Build()
+	File_imports_test_a_1_m2_proto = out.File
 	file_imports_test_a_1_m2_proto_rawDesc = nil
 	file_imports_test_a_1_m2_proto_goTypes = nil
 	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 fa28027..319f61f 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -76,21 +75,32 @@
 var file_imports_test_a_2_m3_proto_goTypes = []interface{}{
 	(*M3)(nil), // 0: test.a.M3
 }
-var file_imports_test_a_2_m3_proto_depIdxs = []int32{}
+var file_imports_test_a_2_m3_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_imports_test_a_2_m3_proto_init() }
 func file_imports_test_a_2_m3_proto_init() {
 	if File_imports_test_a_2_m3_proto != nil {
 		return
 	}
-	File_imports_test_a_2_m3_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_a_2_m3_proto_rawDesc,
-		GoTypes:            file_imports_test_a_2_m3_proto_goTypes,
-		DependencyIndexes:  file_imports_test_a_2_m3_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_a_2_m3_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_a_2_m3_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_a_2_m3_proto_goTypes,
+		DependencyIndexes: file_imports_test_a_2_m3_proto_depIdxs,
+		MessageInfos:      file_imports_test_a_2_m3_proto_msgTypes,
+	}.Build()
+	File_imports_test_a_2_m3_proto = out.File
 	file_imports_test_a_2_m3_proto_rawDesc = nil
 	file_imports_test_a_2_m3_proto_goTypes = nil
 	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 0d86e4e..47695eb 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -76,21 +75,32 @@
 var file_imports_test_a_2_m4_proto_goTypes = []interface{}{
 	(*M4)(nil), // 0: test.a.M4
 }
-var file_imports_test_a_2_m4_proto_depIdxs = []int32{}
+var file_imports_test_a_2_m4_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_imports_test_a_2_m4_proto_init() }
 func file_imports_test_a_2_m4_proto_init() {
 	if File_imports_test_a_2_m4_proto != nil {
 		return
 	}
-	File_imports_test_a_2_m4_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_a_2_m4_proto_rawDesc,
-		GoTypes:            file_imports_test_a_2_m4_proto_goTypes,
-		DependencyIndexes:  file_imports_test_a_2_m4_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_a_2_m4_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_a_2_m4_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_a_2_m4_proto_goTypes,
+		DependencyIndexes: file_imports_test_a_2_m4_proto_depIdxs,
+		MessageInfos:      file_imports_test_a_2_m4_proto_msgTypes,
+	}.Build()
+	File_imports_test_a_2_m4_proto = out.File
 	file_imports_test_a_2_m4_proto_rawDesc = nil
 	file_imports_test_a_2_m4_proto_goTypes = nil
 	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 0dc09b0..acda349 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -77,21 +76,32 @@
 var file_imports_test_b_1_m1_proto_goTypes = []interface{}{
 	(*M1)(nil), // 0: test.b.part1.M1
 }
-var file_imports_test_b_1_m1_proto_depIdxs = []int32{}
+var file_imports_test_b_1_m1_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_imports_test_b_1_m1_proto_init() }
 func file_imports_test_b_1_m1_proto_init() {
 	if File_imports_test_b_1_m1_proto != nil {
 		return
 	}
-	File_imports_test_b_1_m1_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_b_1_m1_proto_rawDesc,
-		GoTypes:            file_imports_test_b_1_m1_proto_goTypes,
-		DependencyIndexes:  file_imports_test_b_1_m1_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_b_1_m1_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_b_1_m1_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_b_1_m1_proto_goTypes,
+		DependencyIndexes: file_imports_test_b_1_m1_proto_depIdxs,
+		MessageInfos:      file_imports_test_b_1_m1_proto_msgTypes,
+	}.Build()
+	File_imports_test_b_1_m1_proto = out.File
 	file_imports_test_b_1_m1_proto_rawDesc = nil
 	file_imports_test_b_1_m1_proto_goTypes = nil
 	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 484a323..16e918f 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -77,21 +76,32 @@
 var file_imports_test_b_1_m2_proto_goTypes = []interface{}{
 	(*M2)(nil), // 0: test.b.part2.M2
 }
-var file_imports_test_b_1_m2_proto_depIdxs = []int32{}
+var file_imports_test_b_1_m2_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_imports_test_b_1_m2_proto_init() }
 func file_imports_test_b_1_m2_proto_init() {
 	if File_imports_test_b_1_m2_proto != nil {
 		return
 	}
-	File_imports_test_b_1_m2_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_b_1_m2_proto_rawDesc,
-		GoTypes:            file_imports_test_b_1_m2_proto_goTypes,
-		DependencyIndexes:  file_imports_test_b_1_m2_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_b_1_m2_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_b_1_m2_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_b_1_m2_proto_goTypes,
+		DependencyIndexes: file_imports_test_b_1_m2_proto_depIdxs,
+		MessageInfos:      file_imports_test_b_1_m2_proto_msgTypes,
+	}.Build()
+	File_imports_test_b_1_m2_proto = out.File
 	file_imports_test_b_1_m2_proto_rawDesc = nil
 	file_imports_test_b_1_m2_proto_goTypes = nil
 	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 b893f08..9d28776 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
@@ -6,7 +6,6 @@
 import (
 	test_a_1 "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/imports/test_a_1"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -91,6 +90,11 @@
 }
 var file_imports_test_import_a1m1_proto_depIdxs = []int32{
 	1, // test.A1M1.f:type_name -> test.a.M1
+	1, // starting offset of method output_type sub-list
+	1, // starting offset of method input_type sub-list
+	1, // starting offset of extension type_name sub-list
+	1, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_imports_test_import_a1m1_proto_init() }
@@ -98,14 +102,19 @@
 	if File_imports_test_import_a1m1_proto != nil {
 		return
 	}
-	File_imports_test_import_a1m1_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_import_a1m1_proto_rawDesc,
-		GoTypes:            file_imports_test_import_a1m1_proto_goTypes,
-		DependencyIndexes:  file_imports_test_import_a1m1_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_import_a1m1_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_import_a1m1_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_import_a1m1_proto_goTypes,
+		DependencyIndexes: file_imports_test_import_a1m1_proto_depIdxs,
+		MessageInfos:      file_imports_test_import_a1m1_proto_msgTypes,
+	}.Build()
+	File_imports_test_import_a1m1_proto = out.File
 	file_imports_test_import_a1m1_proto_rawDesc = nil
 	file_imports_test_import_a1m1_proto_goTypes = nil
 	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 06a25da..55d689a 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
@@ -6,7 +6,6 @@
 import (
 	test_a_1 "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/imports/test_a_1"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -91,6 +90,11 @@
 }
 var file_imports_test_import_a1m2_proto_depIdxs = []int32{
 	1, // test.A1M2.f:type_name -> test.a.M2
+	1, // starting offset of method output_type sub-list
+	1, // starting offset of method input_type sub-list
+	1, // starting offset of extension type_name sub-list
+	1, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_imports_test_import_a1m2_proto_init() }
@@ -98,14 +102,19 @@
 	if File_imports_test_import_a1m2_proto != nil {
 		return
 	}
-	File_imports_test_import_a1m2_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_import_a1m2_proto_rawDesc,
-		GoTypes:            file_imports_test_import_a1m2_proto_goTypes,
-		DependencyIndexes:  file_imports_test_import_a1m2_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_import_a1m2_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_import_a1m2_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_import_a1m2_proto_goTypes,
+		DependencyIndexes: file_imports_test_import_a1m2_proto_depIdxs,
+		MessageInfos:      file_imports_test_import_a1m2_proto_msgTypes,
+	}.Build()
+	File_imports_test_import_a1m2_proto = out.File
 	file_imports_test_import_a1m2_proto_rawDesc = nil
 	file_imports_test_import_a1m2_proto_goTypes = nil
 	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 2f50784..cd82745 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
@@ -9,7 +9,6 @@
 	_ "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/imports/test_a_2"
 	test_b_1 "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/imports/test_b_1"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -152,6 +151,11 @@
 	3, // test.All.bm1:type_name -> test.b.part1.M1
 	4, // test.All.bm2:type_name -> test.b.part2.M2
 	5, // test.All.fmt:type_name -> fmt.M
+	5, // starting offset of method output_type sub-list
+	5, // starting offset of method input_type sub-list
+	5, // starting offset of extension type_name sub-list
+	5, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_imports_test_import_all_proto_init() }
@@ -159,14 +163,19 @@
 	if File_imports_test_import_all_proto != nil {
 		return
 	}
-	File_imports_test_import_all_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_imports_test_import_all_proto_rawDesc,
-		GoTypes:            file_imports_test_import_all_proto_goTypes,
-		DependencyIndexes:  file_imports_test_import_all_proto_depIdxs,
-		MessageOutputTypes: file_imports_test_import_all_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_imports_test_import_all_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imports_test_import_all_proto_goTypes,
+		DependencyIndexes: file_imports_test_import_all_proto_depIdxs,
+		MessageInfos:      file_imports_test_import_all_proto_msgTypes,
+	}.Build()
+	File_imports_test_import_all_proto = out.File
 	file_imports_test_import_all_proto_rawDesc = nil
 	file_imports_test_import_all_proto_goTypes = nil
 	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 2d997fb..45db54d 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
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -108,21 +107,32 @@
 var file_issue780_oneof_conflict_test_proto_goTypes = []interface{}{
 	(*Foo)(nil), // 0: oneoftest.Foo
 }
-var file_issue780_oneof_conflict_test_proto_depIdxs = []int32{}
+var file_issue780_oneof_conflict_test_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_issue780_oneof_conflict_test_proto_init() }
 func file_issue780_oneof_conflict_test_proto_init() {
 	if File_issue780_oneof_conflict_test_proto != nil {
 		return
 	}
-	File_issue780_oneof_conflict_test_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_issue780_oneof_conflict_test_proto_rawDesc,
-		GoTypes:            file_issue780_oneof_conflict_test_proto_goTypes,
-		DependencyIndexes:  file_issue780_oneof_conflict_test_proto_depIdxs,
-		MessageOutputTypes: file_issue780_oneof_conflict_test_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_issue780_oneof_conflict_test_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_issue780_oneof_conflict_test_proto_goTypes,
+		DependencyIndexes: file_issue780_oneof_conflict_test_proto_depIdxs,
+		MessageInfos:      file_issue780_oneof_conflict_test_proto_msgTypes,
+	}.Build()
+	File_issue780_oneof_conflict_test_proto = out.File
 	file_issue780_oneof_conflict_test_proto_rawDesc = nil
 	file_issue780_oneof_conflict_test_proto_goTypes = nil
 	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 a9e3cf5..15c743f 100644
--- a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
+++ b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -45,7 +45,7 @@
 }
 
 func (Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_nopackage_nopackage_proto_enumTypes[0].Descriptor()
+	return file_nopackage_nopackage_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Enum) Number() protoreflect.EnumNumber {
@@ -140,7 +140,7 @@
 	return file_nopackage_nopackage_proto_rawDescData
 }
 
-var file_nopackage_nopackage_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_nopackage_nopackage_proto_enumTypes = make([]prototype.Enum, 1)
 var file_nopackage_nopackage_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 var file_nopackage_nopackage_proto_goTypes = []interface{}{
 	(Enum)(0),       // 0: Enum
@@ -148,6 +148,11 @@
 }
 var file_nopackage_nopackage_proto_depIdxs = []int32{
 	0, // Message.enum_field:type_name -> Enum
+	1, // starting offset of method output_type sub-list
+	1, // starting offset of method input_type sub-list
+	1, // starting offset of extension type_name sub-list
+	1, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_nopackage_nopackage_proto_init() }
@@ -155,15 +160,20 @@
 	if File_nopackage_nopackage_proto != nil {
 		return
 	}
-	File_nopackage_nopackage_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_nopackage_nopackage_proto_rawDesc,
-		GoTypes:            file_nopackage_nopackage_proto_goTypes,
-		DependencyIndexes:  file_nopackage_nopackage_proto_depIdxs,
-		EnumOutputTypes:    file_nopackage_nopackage_proto_enumTypes,
-		MessageOutputTypes: file_nopackage_nopackage_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_nopackage_nopackage_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_nopackage_nopackage_proto_goTypes,
+		DependencyIndexes: file_nopackage_nopackage_proto_depIdxs,
+		MessageInfos:      file_nopackage_nopackage_proto_msgTypes,
+	}.Build()
+	File_nopackage_nopackage_proto = out.File
+	file_nopackage_nopackage_proto_enumTypes = out.Enums
 	file_nopackage_nopackage_proto_rawDesc = nil
 	file_nopackage_nopackage_proto_goTypes = nil
 	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 8f9c18b..b741f56 100644
--- a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -51,7 +51,7 @@
 }
 
 func (EnumType1) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto2_enum_proto_enumTypes[0].Descriptor()
+	return file_proto2_enum_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x EnumType1) Number() protoreflect.EnumNumber {
@@ -103,7 +103,7 @@
 }
 
 func (EnumType2) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto2_enum_proto_enumTypes[1].Descriptor()
+	return file_proto2_enum_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x EnumType2) Number() protoreflect.EnumNumber {
@@ -154,7 +154,7 @@
 }
 
 func (EnumContainerMessage1_NestedEnumType1A) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto2_enum_proto_enumTypes[2].Descriptor()
+	return file_proto2_enum_proto_enumTypes[2].EnumDescriptor
 }
 
 func (x EnumContainerMessage1_NestedEnumType1A) Number() protoreflect.EnumNumber {
@@ -203,7 +203,7 @@
 }
 
 func (EnumContainerMessage1_NestedEnumType1B) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto2_enum_proto_enumTypes[3].Descriptor()
+	return file_proto2_enum_proto_enumTypes[3].EnumDescriptor
 }
 
 func (x EnumContainerMessage1_NestedEnumType1B) Number() protoreflect.EnumNumber {
@@ -254,7 +254,7 @@
 }
 
 func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto2_enum_proto_enumTypes[4].Descriptor()
+	return file_proto2_enum_proto_enumTypes[4].EnumDescriptor
 }
 
 func (x EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Number() protoreflect.EnumNumber {
@@ -303,7 +303,7 @@
 }
 
 func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto2_enum_proto_enumTypes[5].Descriptor()
+	return file_proto2_enum_proto_enumTypes[5].EnumDescriptor
 }
 
 func (x EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Number() protoreflect.EnumNumber {
@@ -458,7 +458,7 @@
 	return file_proto2_enum_proto_rawDescData
 }
 
-var file_proto2_enum_proto_enumTypes = make([]protoreflect.EnumType, 6)
+var file_proto2_enum_proto_enumTypes = make([]prototype.Enum, 6)
 var file_proto2_enum_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 var file_proto2_enum_proto_goTypes = []interface{}{
 	(EnumType1)(0), // 0: goproto.protoc.proto2.EnumType1
@@ -473,6 +473,11 @@
 var file_proto2_enum_proto_depIdxs = []int32{
 	1, // goproto.protoc.proto2.EnumContainerMessage1.default_duplicate1:type_name -> goproto.protoc.proto2.EnumType2
 	1, // goproto.protoc.proto2.EnumContainerMessage1.default_duplicate2:type_name -> goproto.protoc.proto2.EnumType2
+	2, // starting offset of method output_type sub-list
+	2, // starting offset of method input_type sub-list
+	2, // starting offset of extension type_name sub-list
+	2, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_proto2_enum_proto_init() }
@@ -480,15 +485,20 @@
 	if File_proto2_enum_proto != nil {
 		return
 	}
-	File_proto2_enum_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_proto2_enum_proto_rawDesc,
-		GoTypes:            file_proto2_enum_proto_goTypes,
-		DependencyIndexes:  file_proto2_enum_proto_depIdxs,
-		EnumOutputTypes:    file_proto2_enum_proto_enumTypes,
-		MessageOutputTypes: file_proto2_enum_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_proto2_enum_proto_rawDesc,
+			NumEnums:      6,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_proto2_enum_proto_goTypes,
+		DependencyIndexes: file_proto2_enum_proto_depIdxs,
+		MessageInfos:      file_proto2_enum_proto_msgTypes,
+	}.Build()
+	File_proto2_enum_proto = out.File
+	file_proto2_enum_proto_enumTypes = out.Enums
 	file_proto2_enum_proto_rawDesc = nil
 	file_proto2_enum_proto_goTypes = nil
 	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 afc649d..58970fc 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	math "math"
@@ -49,7 +49,7 @@
 }
 
 func (FieldTestMessage_Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto2_fields_proto_enumTypes[0].Descriptor()
+	return file_proto2_fields_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
@@ -1687,7 +1687,7 @@
 	return file_proto2_fields_proto_rawDescData
 }
 
-var file_proto2_fields_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_proto2_fields_proto_enumTypes = make([]prototype.Enum, 1)
 var file_proto2_fields_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
 var file_proto2_fields_proto_goTypes = []interface{}{
 	(FieldTestMessage_Enum)(0),             // 0: goproto.protoc.proto2.FieldTestMessage.Enum
@@ -1702,24 +1702,29 @@
 	(*FieldTestMessage_Message)(nil),       // 9: goproto.protoc.proto2.FieldTestMessage.Message
 }
 var file_proto2_fields_proto_depIdxs = []int32{
-	0, // goproto.protoc.proto2.FieldTestMessage.optional_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
-	9, // goproto.protoc.proto2.FieldTestMessage.optional_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
-	2, // goproto.protoc.proto2.FieldTestMessage.optionalgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.OptionalGroup
-	0, // goproto.protoc.proto2.FieldTestMessage.required_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
-	9, // goproto.protoc.proto2.FieldTestMessage.required_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
-	3, // goproto.protoc.proto2.FieldTestMessage.requiredgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.RequiredGroup
-	0, // goproto.protoc.proto2.FieldTestMessage.repeated_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
-	9, // goproto.protoc.proto2.FieldTestMessage.repeated_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
-	4, // goproto.protoc.proto2.FieldTestMessage.repeatedgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.RepeatedGroup
-	0, // goproto.protoc.proto2.FieldTestMessage.default_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
-	5, // goproto.protoc.proto2.FieldTestMessage.map_int32_int64:type_name -> goproto.protoc.proto2.FieldTestMessage.MapInt32Int64Entry
-	6, // goproto.protoc.proto2.FieldTestMessage.map_string_message:type_name -> goproto.protoc.proto2.FieldTestMessage.MapStringMessageEntry
-	7, // goproto.protoc.proto2.FieldTestMessage.map_fixed64_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.MapFixed64EnumEntry
-	0, // goproto.protoc.proto2.FieldTestMessage.oneof_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
-	9, // goproto.protoc.proto2.FieldTestMessage.oneof_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
-	8, // goproto.protoc.proto2.FieldTestMessage.oneofgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.OneofGroup
-	9, // goproto.protoc.proto2.FieldTestMessage.MapStringMessageEntry.value:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
-	0, // goproto.protoc.proto2.FieldTestMessage.MapFixed64EnumEntry.value:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
+	0,  // goproto.protoc.proto2.FieldTestMessage.optional_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
+	9,  // goproto.protoc.proto2.FieldTestMessage.optional_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
+	2,  // goproto.protoc.proto2.FieldTestMessage.optionalgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.OptionalGroup
+	0,  // goproto.protoc.proto2.FieldTestMessage.required_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
+	9,  // goproto.protoc.proto2.FieldTestMessage.required_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
+	3,  // goproto.protoc.proto2.FieldTestMessage.requiredgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.RequiredGroup
+	0,  // goproto.protoc.proto2.FieldTestMessage.repeated_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
+	9,  // goproto.protoc.proto2.FieldTestMessage.repeated_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
+	4,  // goproto.protoc.proto2.FieldTestMessage.repeatedgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.RepeatedGroup
+	0,  // goproto.protoc.proto2.FieldTestMessage.default_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
+	5,  // goproto.protoc.proto2.FieldTestMessage.map_int32_int64:type_name -> goproto.protoc.proto2.FieldTestMessage.MapInt32Int64Entry
+	6,  // goproto.protoc.proto2.FieldTestMessage.map_string_message:type_name -> goproto.protoc.proto2.FieldTestMessage.MapStringMessageEntry
+	7,  // goproto.protoc.proto2.FieldTestMessage.map_fixed64_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.MapFixed64EnumEntry
+	0,  // goproto.protoc.proto2.FieldTestMessage.oneof_enum:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
+	9,  // goproto.protoc.proto2.FieldTestMessage.oneof_Message:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
+	8,  // goproto.protoc.proto2.FieldTestMessage.oneofgroup:type_name -> goproto.protoc.proto2.FieldTestMessage.OneofGroup
+	9,  // goproto.protoc.proto2.FieldTestMessage.MapStringMessageEntry.value:type_name -> goproto.protoc.proto2.FieldTestMessage.Message
+	0,  // goproto.protoc.proto2.FieldTestMessage.MapFixed64EnumEntry.value:type_name -> goproto.protoc.proto2.FieldTestMessage.Enum
+	18, // starting offset of method output_type sub-list
+	18, // starting offset of method input_type sub-list
+	18, // starting offset of extension type_name sub-list
+	18, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_proto2_fields_proto_init() }
@@ -1727,15 +1732,20 @@
 	if File_proto2_fields_proto != nil {
 		return
 	}
-	File_proto2_fields_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_proto2_fields_proto_rawDesc,
-		GoTypes:            file_proto2_fields_proto_goTypes,
-		DependencyIndexes:  file_proto2_fields_proto_depIdxs,
-		EnumOutputTypes:    file_proto2_fields_proto_enumTypes,
-		MessageOutputTypes: file_proto2_fields_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_proto2_fields_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_proto2_fields_proto_goTypes,
+		DependencyIndexes: file_proto2_fields_proto_depIdxs,
+		MessageInfos:      file_proto2_fields_proto_msgTypes,
+	}.Build()
+	File_proto2_fields_proto = out.File
+	file_proto2_fields_proto_enumTypes = out.Enums
 	file_proto2_fields_proto_rawDesc = nil
 	file_proto2_fields_proto_goTypes = nil
 	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 1533c5d..16da78e 100644
--- a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -177,6 +176,11 @@
 	1, // goproto.protoc.proto2.Layer1.l2:type_name -> goproto.protoc.proto2.Layer1.Layer2
 	2, // goproto.protoc.proto2.Layer1.l3:type_name -> goproto.protoc.proto2.Layer1.Layer2.Layer3
 	2, // goproto.protoc.proto2.Layer1.Layer2.l3:type_name -> goproto.protoc.proto2.Layer1.Layer2.Layer3
+	3, // starting offset of method output_type sub-list
+	3, // starting offset of method input_type sub-list
+	3, // starting offset of extension type_name sub-list
+	3, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_proto2_nested_messages_proto_init() }
@@ -184,14 +188,19 @@
 	if File_proto2_nested_messages_proto != nil {
 		return
 	}
-	File_proto2_nested_messages_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_proto2_nested_messages_proto_rawDesc,
-		GoTypes:            file_proto2_nested_messages_proto_goTypes,
-		DependencyIndexes:  file_proto2_nested_messages_proto_depIdxs,
-		MessageOutputTypes: file_proto2_nested_messages_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_proto2_nested_messages_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_proto2_nested_messages_proto_goTypes,
+		DependencyIndexes: file_proto2_nested_messages_proto_depIdxs,
+		MessageInfos:      file_proto2_nested_messages_proto_msgTypes,
+	}.Build()
+	File_proto2_nested_messages_proto = out.File
 	file_proto2_nested_messages_proto_rawDesc = nil
 	file_proto2_nested_messages_proto_goTypes = nil
 	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 3bd3917..dfa61e5 100644
--- a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -98,6 +97,11 @@
 }
 var file_proto2_proto2_proto_depIdxs = []int32{
 	0, // goproto.protoc.proto2.Message.m:type_name -> goproto.protoc.proto2.Message
+	1, // starting offset of method output_type sub-list
+	1, // starting offset of method input_type sub-list
+	1, // starting offset of extension type_name sub-list
+	1, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_proto2_proto2_proto_init() }
@@ -105,14 +109,19 @@
 	if File_proto2_proto2_proto != nil {
 		return
 	}
-	File_proto2_proto2_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_proto2_proto2_proto_rawDesc,
-		GoTypes:            file_proto2_proto2_proto_goTypes,
-		DependencyIndexes:  file_proto2_proto2_proto_depIdxs,
-		MessageOutputTypes: file_proto2_proto2_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_proto2_proto2_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_proto2_proto2_proto_goTypes,
+		DependencyIndexes: file_proto2_proto2_proto_depIdxs,
+		MessageInfos:      file_proto2_proto2_proto_msgTypes,
+	}.Build()
+	File_proto2_proto2_proto = out.File
 	file_proto2_proto2_proto_rawDesc = nil
 	file_proto2_proto2_proto_goTypes = nil
 	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 7515d4a..97a38fc 100644
--- a/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
 )
@@ -50,7 +50,7 @@
 }
 
 func (Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto3_enum_proto_enumTypes[0].Descriptor()
+	return file_proto3_enum_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Enum) Number() protoreflect.EnumNumber {
@@ -89,25 +89,36 @@
 	return file_proto3_enum_proto_rawDescData
 }
 
-var file_proto3_enum_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_proto3_enum_proto_enumTypes = make([]prototype.Enum, 1)
 var file_proto3_enum_proto_goTypes = []interface{}{
 	(Enum)(0), // 0: goproto.protoc.proto3.Enum
 }
-var file_proto3_enum_proto_depIdxs = []int32{}
+var file_proto3_enum_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_proto3_enum_proto_init() }
 func file_proto3_enum_proto_init() {
 	if File_proto3_enum_proto != nil {
 		return
 	}
-	File_proto3_enum_proto = protoimpl.FileBuilder{
-		RawDescriptor:     file_proto3_enum_proto_rawDesc,
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_proto3_enum_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
 		GoTypes:           file_proto3_enum_proto_goTypes,
 		DependencyIndexes: file_proto3_enum_proto_depIdxs,
-		EnumOutputTypes:   file_proto3_enum_proto_enumTypes,
-		FilesRegistry:     protoregistry.GlobalFiles,
-		TypesRegistry:     protoregistry.GlobalTypes,
-	}.Init()
+	}.Build()
+	File_proto3_enum_proto = out.File
+	file_proto3_enum_proto_enumTypes = out.Enums
 	file_proto3_enum_proto_rawDesc = nil
 	file_proto3_enum_proto_goTypes = nil
 	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 81906e9..6023685 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -45,7 +45,7 @@
 }
 
 func (FieldTestMessage_Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_proto3_fields_proto_enumTypes[0].Descriptor()
+	return file_proto3_fields_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
@@ -577,7 +577,7 @@
 	return file_proto3_fields_proto_rawDescData
 }
 
-var file_proto3_fields_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_proto3_fields_proto_enumTypes = make([]prototype.Enum, 1)
 var file_proto3_fields_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
 var file_proto3_fields_proto_goTypes = []interface{}{
 	(FieldTestMessage_Enum)(0),       // 0: goproto.protoc.proto3.FieldTestMessage.Enum
@@ -597,6 +597,11 @@
 	4, // goproto.protoc.proto3.FieldTestMessage.map_fixed64_enum:type_name -> goproto.protoc.proto3.FieldTestMessage.MapFixed64EnumEntry
 	5, // goproto.protoc.proto3.FieldTestMessage.MapStringMessageEntry.value:type_name -> goproto.protoc.proto3.FieldTestMessage.Message
 	0, // goproto.protoc.proto3.FieldTestMessage.MapFixed64EnumEntry.value:type_name -> goproto.protoc.proto3.FieldTestMessage.Enum
+	9, // starting offset of method output_type sub-list
+	9, // starting offset of method input_type sub-list
+	9, // starting offset of extension type_name sub-list
+	9, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_proto3_fields_proto_init() }
@@ -604,15 +609,20 @@
 	if File_proto3_fields_proto != nil {
 		return
 	}
-	File_proto3_fields_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_proto3_fields_proto_rawDesc,
-		GoTypes:            file_proto3_fields_proto_goTypes,
-		DependencyIndexes:  file_proto3_fields_proto_depIdxs,
-		EnumOutputTypes:    file_proto3_fields_proto_enumTypes,
-		MessageOutputTypes: file_proto3_fields_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_proto3_fields_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   5,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_proto3_fields_proto_goTypes,
+		DependencyIndexes: file_proto3_fields_proto_depIdxs,
+		MessageInfos:      file_proto3_fields_proto_msgTypes,
+	}.Build()
+	File_proto3_fields_proto = out.File
+	file_proto3_fields_proto_enumTypes = out.Enums
 	file_proto3_fields_proto_rawDesc = nil
 	file_proto3_fields_proto_goTypes = nil
 	file_proto3_fields_proto_depIdxs = nil
diff --git a/encoding/prototext/other_test.go b/encoding/prototext/other_test.go
index 978a358..ec1842f 100644
--- a/encoding/prototext/other_test.go
+++ b/encoding/prototext/other_test.go
@@ -1,3 +1,7 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 package prototext_test
 
 import (
diff --git a/encoding/testprotos/pb2/test.pb.go b/encoding/testprotos/pb2/test.pb.go
index 63b9cf0..738abe7 100644
--- a/encoding/testprotos/pb2/test.pb.go
+++ b/encoding/testprotos/pb2/test.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	anypb "google.golang.org/protobuf/types/known/anypb"
@@ -58,7 +58,7 @@
 }
 
 func (Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_pb2_test_proto_enumTypes[0].Descriptor()
+	return file_pb2_test_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Enum) Number() protoreflect.EnumNumber {
@@ -113,7 +113,7 @@
 }
 
 func (Enums_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_pb2_test_proto_enumTypes[1].Descriptor()
+	return file_pb2_test_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
@@ -1941,7 +1941,7 @@
 	return file_pb2_test_proto_rawDescData
 }
 
-var file_pb2_test_proto_enumTypes = make([]protoreflect.EnumType, 2)
+var file_pb2_test_proto_enumTypes = make([]prototype.Enum, 2)
 var file_pb2_test_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
 var file_pb2_test_proto_goTypes = []interface{}{
 	(Enum)(0),                             // 0: pb2.Enum
@@ -1986,27 +1986,6 @@
 	(*fieldmaskpb.FieldMask)(nil),         // 39: google.protobuf.FieldMask
 }
 var file_pb2_test_proto_depIdxs = []int32{
-	11, // pb2.opt_ext_bool:extendee -> pb2.Extensions
-	11, // pb2.opt_ext_string:extendee -> pb2.Extensions
-	11, // pb2.opt_ext_enum:extendee -> pb2.Extensions
-	11, // pb2.opt_ext_nested:extendee -> pb2.Extensions
-	11, // pb2.opt_ext_partial:extendee -> pb2.Extensions
-	11, // pb2.rpt_ext_fixed32:extendee -> pb2.Extensions
-	11, // pb2.rpt_ext_enum:extendee -> pb2.Extensions
-	11, // pb2.rpt_ext_nested:extendee -> pb2.Extensions
-	13, // pb2.message_set_extension:extendee -> pb2.MessageSet
-	11, // pb2.ExtensionsContainer.opt_ext_bool:extendee -> pb2.Extensions
-	11, // pb2.ExtensionsContainer.opt_ext_string:extendee -> pb2.Extensions
-	11, // pb2.ExtensionsContainer.opt_ext_enum:extendee -> pb2.Extensions
-	11, // pb2.ExtensionsContainer.opt_ext_nested:extendee -> pb2.Extensions
-	11, // pb2.ExtensionsContainer.opt_ext_partial:extendee -> pb2.Extensions
-	11, // pb2.ExtensionsContainer.rpt_ext_string:extendee -> pb2.Extensions
-	11, // pb2.ExtensionsContainer.rpt_ext_enum:extendee -> pb2.Extensions
-	11, // pb2.ExtensionsContainer.rpt_ext_nested:extendee -> pb2.Extensions
-	13, // pb2.MessageSetExtension.message_set_extension:extendee -> pb2.MessageSet
-	13, // pb2.MessageSetExtension.not_message_set_extension:extendee -> pb2.MessageSet
-	13, // pb2.MessageSetExtension.ext_nested:extendee -> pb2.MessageSet
-	15, // pb2.FakeMessageSetExtension.message_set_extension:extendee -> pb2.FakeMessageSet
 	0,  // pb2.Enums.opt_enum:type_name -> pb2.Enum
 	0,  // pb2.Enums.rpt_enum:type_name -> pb2.Enum
 	1,  // pb2.Enums.opt_nested_enum:type_name -> pb2.Enums.NestedEnum
@@ -2043,6 +2022,27 @@
 	5,  // pb2.Nests.OptGroup.opt_nested:type_name -> pb2.Nested
 	20, // pb2.Nests.OptGroup.optnestedgroup:type_name -> pb2.Nests.OptGroup.OptNestedGroup
 	9,  // pb2.IndirectRequired.StrToNestedEntry.value:type_name -> pb2.NestedWithRequired
+	11, // pb2.opt_ext_bool:extendee -> pb2.Extensions
+	11, // pb2.opt_ext_string:extendee -> pb2.Extensions
+	11, // pb2.opt_ext_enum:extendee -> pb2.Extensions
+	11, // pb2.opt_ext_nested:extendee -> pb2.Extensions
+	11, // pb2.opt_ext_partial:extendee -> pb2.Extensions
+	11, // pb2.rpt_ext_fixed32:extendee -> pb2.Extensions
+	11, // pb2.rpt_ext_enum:extendee -> pb2.Extensions
+	11, // pb2.rpt_ext_nested:extendee -> pb2.Extensions
+	13, // pb2.message_set_extension:extendee -> pb2.MessageSet
+	11, // pb2.ExtensionsContainer.opt_ext_bool:extendee -> pb2.Extensions
+	11, // pb2.ExtensionsContainer.opt_ext_string:extendee -> pb2.Extensions
+	11, // pb2.ExtensionsContainer.opt_ext_enum:extendee -> pb2.Extensions
+	11, // pb2.ExtensionsContainer.opt_ext_nested:extendee -> pb2.Extensions
+	11, // pb2.ExtensionsContainer.opt_ext_partial:extendee -> pb2.Extensions
+	11, // pb2.ExtensionsContainer.rpt_ext_string:extendee -> pb2.Extensions
+	11, // pb2.ExtensionsContainer.rpt_ext_enum:extendee -> pb2.Extensions
+	11, // pb2.ExtensionsContainer.rpt_ext_nested:extendee -> pb2.Extensions
+	13, // pb2.MessageSetExtension.message_set_extension:extendee -> pb2.MessageSet
+	13, // pb2.MessageSetExtension.not_message_set_extension:extendee -> pb2.MessageSet
+	13, // pb2.MessageSetExtension.ext_nested:extendee -> pb2.MessageSet
+	15, // pb2.FakeMessageSetExtension.message_set_extension:extendee -> pb2.FakeMessageSet
 	0,  // pb2.opt_ext_enum:type_name -> pb2.Enum
 	5,  // pb2.opt_ext_nested:type_name -> pb2.Nested
 	8,  // pb2.opt_ext_partial:type_name -> pb2.PartialRequired
@@ -2058,6 +2058,11 @@
 	14, // pb2.MessageSetExtension.not_message_set_extension:type_name -> pb2.MessageSetExtension
 	5,  // pb2.MessageSetExtension.ext_nested:type_name -> pb2.Nested
 	16, // pb2.FakeMessageSetExtension.message_set_extension:type_name -> pb2.FakeMessageSetExtension
+	72, // starting offset of method output_type sub-list
+	72, // starting offset of method input_type sub-list
+	57, // starting offset of extension type_name sub-list
+	36, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_pb2_test_proto_init() }
@@ -2065,18 +2070,21 @@
 	if File_pb2_test_proto != nil {
 		return
 	}
-	extensionTypes := make([]protoreflect.ExtensionType, 21)
-	File_pb2_test_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_pb2_test_proto_rawDesc,
-		GoTypes:              file_pb2_test_proto_goTypes,
-		DependencyIndexes:    file_pb2_test_proto_depIdxs,
-		LegacyExtensions:     file_pb2_test_proto_extDescs,
-		EnumOutputTypes:      file_pb2_test_proto_enumTypes,
-		MessageOutputTypes:   file_pb2_test_proto_msgTypes,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_pb2_test_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   20,
+			NumExtensions: 21,
+			NumServices:   0,
+		},
+		GoTypes:           file_pb2_test_proto_goTypes,
+		DependencyIndexes: file_pb2_test_proto_depIdxs,
+		MessageInfos:      file_pb2_test_proto_msgTypes,
+		LegacyExtensions:  file_pb2_test_proto_extDescs,
+	}.Build()
+	File_pb2_test_proto = out.File
+	file_pb2_test_proto_enumTypes = out.Enums
 	file_pb2_test_proto_rawDesc = nil
 	file_pb2_test_proto_goTypes = nil
 	file_pb2_test_proto_depIdxs = nil
diff --git a/encoding/testprotos/pb3/test.pb.go b/encoding/testprotos/pb3/test.pb.go
index 0ec0eaf..1b0349a 100644
--- a/encoding/testprotos/pb3/test.pb.go
+++ b/encoding/testprotos/pb3/test.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -54,7 +54,7 @@
 }
 
 func (Enum) Descriptor() protoreflect.EnumDescriptor {
-	return file_pb3_test_proto_enumTypes[0].Descriptor()
+	return file_pb3_test_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Enum) Number() protoreflect.EnumNumber {
@@ -102,7 +102,7 @@
 }
 
 func (Enums_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_pb3_test_proto_enumTypes[1].Descriptor()
+	return file_pb3_test_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
@@ -720,7 +720,7 @@
 	return file_pb3_test_proto_rawDescData
 }
 
-var file_pb3_test_proto_enumTypes = make([]protoreflect.EnumType, 2)
+var file_pb3_test_proto_enumTypes = make([]prototype.Enum, 2)
 var file_pb3_test_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
 var file_pb3_test_proto_goTypes = []interface{}{
 	(Enum)(0),             // 0: pb3.Enum
@@ -753,6 +753,11 @@
 	0,  // pb3.Maps.Uint64ToEnumEntry.value:type_name -> pb3.Enum
 	5,  // pb3.Maps.StrToNestedEntry.value:type_name -> pb3.Nested
 	6,  // pb3.Maps.StrToOneofsEntry.value:type_name -> pb3.Oneofs
+	14, // starting offset of method output_type sub-list
+	14, // starting offset of method input_type sub-list
+	14, // starting offset of extension type_name sub-list
+	14, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_pb3_test_proto_init() }
@@ -760,15 +765,20 @@
 	if File_pb3_test_proto != nil {
 		return
 	}
-	File_pb3_test_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_pb3_test_proto_rawDesc,
-		GoTypes:            file_pb3_test_proto_goTypes,
-		DependencyIndexes:  file_pb3_test_proto_depIdxs,
-		EnumOutputTypes:    file_pb3_test_proto_enumTypes,
-		MessageOutputTypes: file_pb3_test_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_pb3_test_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   12,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_pb3_test_proto_goTypes,
+		DependencyIndexes: file_pb3_test_proto_depIdxs,
+		MessageInfos:      file_pb3_test_proto_msgTypes,
+	}.Build()
+	File_pb3_test_proto = out.File
+	file_pb3_test_proto_enumTypes = out.Enums
 	file_pb3_test_proto_rawDesc = nil
 	file_pb3_test_proto_goTypes = nil
 	file_pb3_test_proto_depIdxs = nil
diff --git a/internal/cmd/generate-types/main.go b/internal/cmd/generate-types/main.go
index 66a852d..d6bb972 100644
--- a/internal/cmd/generate-types/main.go
+++ b/internal/cmd/generate-types/main.go
@@ -20,7 +20,6 @@
 	"strconv"
 	"strings"
 	"text/template"
-	"unicode"
 )
 
 var (
@@ -38,8 +37,7 @@
 	repoRoot = strings.TrimSpace(string(out))
 
 	chdirRoot()
-	writeSource("internal/fileinit/desc_list_gen.go", generateFileinitDescList())
-	writeSource("internal/prototype/protofile_list_gen.go", generateListTypes())
+	writeSource("internal/filedesc/desc_list_gen.go", generateDescListTypes())
 	writeSource("internal/impl/encode_gen.go", generateImplEncode())
 	writeSource("proto/decode_gen.go", generateProtoDecode())
 	writeSource("proto/encode_gen.go", generateProtoEncode())
@@ -83,138 +81,19 @@
 	}
 }
 
-func generateListTypes() string {
-	// TODO: If Go2 has generics, replace this with a single container type.
-	return mustExecute(listTypesTemplate, []DescriptorType{
-		MessageDesc, FieldDesc, OneofDesc, ExtensionDesc, EnumDesc, EnumValueDesc, ServiceDesc, MethodDesc,
-	})
-}
-
-var listTypesTemplate = template.Must(template.New("").Funcs(template.FuncMap{
-	"unexport": func(t DescriptorType) Expr {
-		return Expr(string(unicode.ToLower(rune(t[0]))) + string(t[1:]))
-	},
-}).Parse(`
-	{{- range .}}
-	{{$nameList     := (printf "%ss"     (unexport .))}} {{/* e.g., "messages" */}}
-	{{$nameListMeta := (printf "%ssMeta" (unexport .))}} {{/* e.g., "messagesMeta" */}}
-	{{$nameMeta     := (printf "%sMeta"  (unexport .))}} {{/* e.g., "messageMeta" */}}
-	{{$nameDesc     := (printf "%sDesc"  (unexport .))}} {{/* e.g., "messageDesc" */}}
-
-	type {{$nameListMeta}} struct {
-		once     sync.Once
-		typs     []{{.}}
-		nameOnce sync.Once
-		byName   map[protoreflect.Name]*{{.}}
-		{{- if (eq . "Field")}}
-		jsonOnce sync.Once
-		byJSON   map[string]*{{.}}
-		{{- end}}
-		{{- if .NumberExpr}}
-		numOnce  sync.Once
-		byNum    map[{{.NumberExpr}}]*{{.}}
-		{{- end}}
-	}
-	type {{$nameList}} {{$nameListMeta}}
-
-	func (p *{{$nameListMeta}}) lazyInit(parent protoreflect.Descriptor, ts []{{.}}) *{{$nameList}} {
-		p.once.Do(func() {
-			nb := getNameBuilder()
-			defer putNameBuilder(nb)
-			metas := make([]{{$nameMeta}}, len(ts))
-			for i := range ts {
-				t := &ts[i]
-				if t.{{$nameMeta}} != nil {
-					panic("already initialized")
-				}
-				t.{{$nameMeta}} = &metas[i]
-				t.inheritedMeta.init(nb, parent, i, t.Name, {{printf "%v" (eq . "EnumValue")}})
-			}
-			p.typs = ts
-		})
-		return (*{{$nameList}})(p)
-	}
-	func (p *{{$nameList}}) Len() int            { return len(p.typs) }
-	func (p *{{$nameList}}) Get(i int) {{.Expr}} { return {{$nameDesc}}{&p.typs[i]} }
-	func (p *{{$nameList}}) ByName(s protoreflect.Name) {{.Expr}} {
-		p.nameOnce.Do(func() {
-			if len(p.typs) > 0 {
-				p.byName = make(map[protoreflect.Name]*{{.}}, len(p.typs))
-				for i := range p.typs {
-					t := &p.typs[i]
-					p.byName[t.Name] = t
-				}
-			}
-		})
-		t := p.byName[s]
-		if t == nil {
-			return nil
-		}
-		return {{$nameDesc}}{t}
-	}
-	{{- if (eq . "Field")}}
-	func (p *{{$nameList}}) ByJSONName(s string) {{.Expr}} {
-		p.jsonOnce.Do(func() {
-			if len(p.typs) > 0 {
-				p.byJSON = make(map[string]*{{.}}, len(p.typs))
-				for i := range p.typs {
-					t := &p.typs[i]
-					s := {{$nameDesc}}{t}.JSONName()
-					if _, ok := p.byJSON[s]; !ok {
-						p.byJSON[s] = t
-					}
-				}
-			}
-		})
-		t := p.byJSON[s]
-		if t == nil {
-			return nil
-		}
-		return {{$nameDesc}}{t}
-	}
-	{{- end}}
-	{{- if .NumberExpr}}
-	func (p *{{$nameList}}) ByNumber(n {{.NumberExpr}}) {{.Expr}} {
-		p.numOnce.Do(func() {
-			if len(p.typs) > 0 {
-				p.byNum = make(map[{{.NumberExpr}}]*{{.}}, len(p.typs))
-				for i := range p.typs {
-					t := &p.typs[i]
-					if _, ok := p.byNum[t.Number]; !ok {
-						p.byNum[t.Number] = t
-					}
-				}
-			}
-		})
-		t := p.byNum[n]
-		if t == nil {
-			return nil
-		}
-		return {{$nameDesc}}{t}
-	}
-	{{- end}}
-	func (p *{{$nameList}}) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-	func (p *{{$nameList}}) ProtoInternal(pragma.DoNotImplement) {}
-	{{- end}}
-`))
-
-func generateFileinitDescList() string {
-	return mustExecute(fileinitDescListTemplate, []DescriptorType{
+func generateDescListTypes() string {
+	return mustExecute(descListTypesTemplate, []DescriptorType{
 		EnumDesc, EnumValueDesc, MessageDesc, FieldDesc, OneofDesc, ExtensionDesc, ServiceDesc, MethodDesc,
 	})
 }
 
-var fileinitDescListTemplate = template.Must(template.New("").Funcs(template.FuncMap{
-	"unexport": func(t DescriptorType) Expr {
-		return Expr(string(unicode.ToLower(rune(t[0]))) + string(t[1:]))
-	},
-}).Parse(`
+var descListTypesTemplate = template.Must(template.New("").Parse(`
 	{{- range .}}
-	{{$nameList := (printf "%sDescs" (unexport .))}} {{/* e.g., "messageDescs" */}}
-	{{$nameDesc := (printf "%sDesc"  (unexport .))}} {{/* e.g., "messageDesc" */}}
+	{{$nameList := (printf "%ss" .)}} {{/* e.g., "Messages" */}}
+	{{$nameDesc := (printf "%s"  .)}} {{/* e.g., "Message" */}}
 
 	type {{$nameList}} struct {
-		list   []{{$nameDesc}}
+		List   []{{$nameDesc}}
 		once   sync.Once
 		byName map[protoreflect.Name]*{{$nameDesc}} // protected by once
 		{{- if (eq . "Field")}}
@@ -226,22 +105,14 @@
 	}
 
 	func (p *{{$nameList}}) Len() int {
-		return len(p.list)
+		return len(p.List)
 	}
 	func (p *{{$nameList}}) Get(i int) {{.Expr}} {
-		{{- if (eq . "Message")}}
-		return p.list[i].asDesc()
-		{{- else}}
-		return &p.list[i]
-		{{- end}}
+		return &p.List[i]
 	}
 	func (p *{{$nameList}}) ByName(s protoreflect.Name) {{.Expr}} {
 		if d := p.lazyInit().byName[s]; d != nil {
-			{{- if (eq . "Message")}}
-			return d.asDesc()
-			{{- else}}
 			return d
-			{{- end}}
 		}
 		return nil
 	}
@@ -267,16 +138,16 @@
 	func (p *{{$nameList}}) ProtoInternal(pragma.DoNotImplement) {}
 	func (p *{{$nameList}}) lazyInit() *{{$nameList}} {
 		p.once.Do(func() {
-			if len(p.list) > 0 {
-				p.byName = make(map[protoreflect.Name]*{{$nameDesc}}, len(p.list))
+			if len(p.List) > 0 {
+				p.byName = make(map[protoreflect.Name]*{{$nameDesc}}, len(p.List))
 				{{- if (eq . "Field")}}
-				p.byJSON = make(map[string]*{{$nameDesc}}, len(p.list))
+				p.byJSON = make(map[string]*{{$nameDesc}}, len(p.List))
 				{{- end}}
 				{{- if .NumberExpr}}
-				p.byNum = make(map[{{.NumberExpr}}]*{{$nameDesc}}, len(p.list))
+				p.byNum = make(map[{{.NumberExpr}}]*{{$nameDesc}}, len(p.List))
 				{{- end}}
-				for i := range p.list {
-					d := &p.list[i]
+				for i := range p.List {
+					d := &p.List[i]
 					if _, ok := p.byName[d.Name()]; !ok {
 						p.byName[d.Name()] = d
 					}
diff --git a/internal/cmd/pbdump/pbdump.go b/internal/cmd/pbdump/pbdump.go
index 7a7c3ce..8bc1753 100644
--- a/internal/cmd/pbdump/pbdump.go
+++ b/internal/cmd/pbdump/pbdump.go
@@ -19,8 +19,8 @@
 
 	"google.golang.org/protobuf/internal/encoding/pack"
 	"google.golang.org/protobuf/internal/encoding/wire"
-	"google.golang.org/protobuf/internal/prototype"
 	"google.golang.org/protobuf/internal/scalar"
+	"google.golang.org/protobuf/reflect/protodesc"
 	"google.golang.org/protobuf/reflect/protoreflect"
 
 	"google.golang.org/protobuf/types/descriptorpb"
@@ -202,41 +202,43 @@
 
 // Descriptor returns the field tree as a message descriptor.
 func (fs fields) Descriptor() (protoreflect.MessageDescriptor, error) {
-	ftyp, err := prototype.NewFile(&prototype.File{
-		Syntax:   protoreflect.Proto2,
-		Messages: []prototype.Message{fs.messageDescriptor("M")},
-	})
+	fd, err := protodesc.NewFile(&descriptorpb.FileDescriptorProto{
+		Name:        scalar.String("dump.proto"),
+		Syntax:      scalar.String("proto2"),
+		MessageType: []*descriptorpb.DescriptorProto{fs.messageDescriptor("M")},
+	}, nil)
 	if err != nil {
 		return nil, err
 	}
-	return ftyp.Messages().Get(0), nil
+	return fd.Messages().Get(0), nil
 }
-func (fs fields) messageDescriptor(name protoreflect.FullName) prototype.Message {
-	m := prototype.Message{Name: name.Name()}
+func (fs fields) messageDescriptor(name protoreflect.FullName) *descriptorpb.DescriptorProto {
+	m := &descriptorpb.DescriptorProto{Name: scalar.String(string(name.Name()))}
 	for _, n := range fs.sortedNums() {
-		f := prototype.Field{
-			Name:        protoreflect.Name(fmt.Sprintf("f%d", n)),
-			Number:      n,
-			Cardinality: protoreflect.Optional,
-			Kind:        fs[n].kind,
+		k := fs[n].kind
+		if !k.IsValid() {
+			k = protoreflect.MessageKind
 		}
-		if !f.Kind.IsValid() {
-			f.Kind = protoreflect.MessageKind
+		f := &descriptorpb.FieldDescriptorProto{
+			Name:   scalar.String(fmt.Sprintf("f%d", n)),
+			Number: scalar.Int32(int32(n)),
+			Label:  descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum(),
+			Type:   descriptorpb.FieldDescriptorProto_Type(k).Enum(),
 		}
-		switch f.Kind {
+		switch k {
 		case protoreflect.BoolKind, protoreflect.EnumKind,
 			protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Uint32Kind,
 			protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Uint64Kind,
 			protoreflect.Sfixed32Kind, protoreflect.Fixed32Kind, protoreflect.FloatKind,
 			protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind, protoreflect.DoubleKind:
-			f.Cardinality = protoreflect.Repeated
+			f.Label = descriptorpb.FieldDescriptorProto_LABEL_REPEATED.Enum()
 			f.Options = &descriptorpb.FieldOptions{Packed: scalar.Bool(true)}
 		case protoreflect.MessageKind, protoreflect.GroupKind:
 			s := name.Append(protoreflect.Name(fmt.Sprintf("M%d", n)))
-			f.MessageType = prototype.PlaceholderMessage(s)
-			m.Messages = append(m.Messages, fs[n].sub.messageDescriptor(s))
+			f.TypeName = scalar.String(string("." + s))
+			m.NestedType = append(m.NestedType, fs[n].sub.messageDescriptor(s))
 		}
-		m.Fields = append(m.Fields, f)
+		m.Field = append(m.Field, f)
 	}
 	return m
 }
diff --git a/internal/cmd/pbdump/pbdump_test.go b/internal/cmd/pbdump/pbdump_test.go
index 57ec1b5..a3f6998 100644
--- a/internal/cmd/pbdump/pbdump_test.go
+++ b/internal/cmd/pbdump/pbdump_test.go
@@ -9,13 +9,22 @@
 	"strings"
 	"testing"
 
-	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-cmp/cmp/cmpopts"
-
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/encoding/prototext"
+	"google.golang.org/protobuf/proto"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+
+	"google.golang.org/protobuf/types/descriptorpb"
 )
 
+func mustMakeMessage(s string) *descriptorpb.DescriptorProto {
+	s = fmt.Sprintf(`name:"test.proto" syntax:"proto2" message_type:[{%s}]`, s)
+	pb := new(descriptorpb.FileDescriptorProto)
+	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
+		panic(err)
+	}
+	return pb.MessageType[0]
+}
+
 func TestFields(t *testing.T) {
 	type fieldsKind struct {
 		kind   pref.Kind
@@ -23,11 +32,11 @@
 	}
 	tests := []struct {
 		inFields []fieldsKind
-		wantMsg  ptype.Message
+		wantMsg  *descriptorpb.DescriptorProto
 		wantErr  string
 	}{{
 		inFields: []fieldsKind{{pref.MessageKind, ""}},
-		wantMsg:  ptype.Message{Name: "M"},
+		wantMsg:  mustMakeMessage(`name:"M"`),
 	}, {
 		inFields: []fieldsKind{{pref.MessageKind, "987654321"}},
 		wantErr:  "invalid field: 987654321",
@@ -52,44 +61,33 @@
 			{pref.MessageKind, "  10.20.30, 10.21   "},
 			{pref.GroupKind, "10"},
 		},
-		wantMsg: ptype.Message{
-			Name: "M",
-			Fields: []ptype.Field{
-				{Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.GroupKind, MessageType: ptype.PlaceholderMessage("M.M10")},
-			},
-			Messages: []ptype.Message{{
-				Name: "M10",
-				Fields: []ptype.Field{
-					{Name: "f20", Number: 20, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20")},
-					{Name: "f21", Number: 21, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M21")},
-				},
-				Messages: []ptype.Message{{
-					Name: "M20",
-					Fields: []ptype.Field{
-						{Name: "f30", Number: 30, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20.M30")},
-						{Name: "f31", Number: 31, Cardinality: pref.Repeated, Kind: pref.Int32Kind},
-					},
-					Messages: []ptype.Message{{
-						Name: "M30",
-					}},
+		wantMsg: mustMakeMessage(`
+			name: "M"
+			field: [
+				{name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_GROUP type_name:".M.M10"}
+			]
+			nested_type: [{
+				name: "M10"
+				field: [
+					{name:"f20" number:20 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".M.M10.M20"},
+					{name:"f21" number:21 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".M.M10.M21"}
+				]
+				nested_type: [{
+					name: "M20"
+					field:[
+						{name:"f30" number:30 label:LABEL_OPTIONAL type:TYPE_MESSAGE, type_name:".M.M10.M20.M30"},
+						{name:"f31" number:31 label:LABEL_REPEATED type:TYPE_INT32 options:{packed:true}}
+					]
+					nested_type: [{
+						name: "M30"
+					}]
 				}, {
-					Name: "M21",
-				}},
-			}},
-		},
+					name: "M21"
+				}]
+			}]
+		`),
 	}}
 
-	opts := cmp.Options{
-		cmp.Comparer(func(x, y pref.Descriptor) bool {
-			if x == nil || y == nil {
-				return x == nil && y == nil
-			}
-			return x.FullName() == y.FullName()
-		}),
-		cmpopts.IgnoreFields(ptype.Field{}, "Default"),
-		cmpopts.IgnoreFields(ptype.Field{}, "Options"),
-		cmpopts.IgnoreUnexported(ptype.Message{}, ptype.Field{}),
-	}
 	for _, tt := range tests {
 		t.Run("", func(t *testing.T) {
 			var fields fields
@@ -106,8 +104,8 @@
 				t.Errorf("all Set calls succeeded, want %v error", tt.wantErr)
 			}
 			gotMsg := fields.messageDescriptor("M")
-			if diff := cmp.Diff(tt.wantMsg, gotMsg, opts); diff != "" {
-				t.Errorf("messageDescriptor() mismatch (-want +got):\n%v", diff)
+			if !proto.Equal(gotMsg, tt.wantMsg) {
+				t.Errorf("messageDescriptor() mismatch:\ngot  %v\nwant %v", gotMsg, tt.wantMsg)
 			}
 			if _, err := fields.Descriptor(); err != nil {
 				t.Errorf("Descriptor() = %v, want nil error", err)
diff --git a/internal/descopts/options.go b/internal/descopts/options.go
index 8ea9307..8401be8 100644
--- a/internal/descopts/options.go
+++ b/internal/descopts/options.go
@@ -5,14 +5,14 @@
 // Package descopts contains the nil pointers to concrete descriptor options.
 //
 // This package exists as a form of reverse dependency injection so that certain
-// packages (e.g., internal/fileinit can avoid a direct dependency on the
-// descriptor proto package).
+// packages (e.g., internal/filedesc and internal/filetype can avoid a direct
+// dependency on the descriptor proto package).
 package descopts
 
 import pref "google.golang.org/protobuf/reflect/protoreflect"
 
 // These variables are set by the init function in descriptor.pb.go via logic
-// in internal/fileinit. In other words, so long as the descriptor proto package
+// in internal/filetype. In other words, so long as the descriptor proto package
 // is linked in, these variables will be populated.
 //
 // Each variable is populated with a nil pointer to the options struct.
diff --git a/internal/encoding/defval/default.go b/internal/encoding/defval/default.go
index a15df02..f03acdf 100644
--- a/internal/encoding/defval/default.go
+++ b/internal/encoding/defval/default.go
@@ -34,54 +34,55 @@
 )
 
 // Unmarshal deserializes the default string s according to the given kind k.
-// When using the Descriptor format on an enum kind, a Value of type string
-// representing the enum identifier is returned. It is the caller's
-// responsibility to verify that the identifier is valid.
-func Unmarshal(s string, k pref.Kind, f Format) (pref.Value, error) {
+// When k is an enum, a list of enum value descriptors must be provided.
+func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) (pref.Value, pref.EnumValueDescriptor, error) {
 	switch k {
 	case pref.BoolKind:
 		if f == GoTag {
 			switch s {
 			case "1":
-				return pref.ValueOf(true), nil
+				return pref.ValueOf(true), nil, nil
 			case "0":
-				return pref.ValueOf(false), nil
+				return pref.ValueOf(false), nil, nil
 			}
 		} else {
 			switch s {
 			case "true":
-				return pref.ValueOf(true), nil
+				return pref.ValueOf(true), nil, nil
 			case "false":
-				return pref.ValueOf(false), nil
+				return pref.ValueOf(false), nil, nil
 			}
 		}
 	case pref.EnumKind:
 		if f == GoTag {
-			// Go tags used the numeric form of the enum value.
+			// Go tags use the numeric form of the enum value.
 			if n, err := strconv.ParseInt(s, 10, 32); err == nil {
-				return pref.ValueOf(pref.EnumNumber(n)), nil
+				if ev := evs.ByNumber(pref.EnumNumber(n)); ev != nil {
+					return pref.ValueOf(ev.Number()), ev, nil
+				}
 			}
 		} else {
-			// Descriptor default_value used the enum identifier.
-			if pref.Name(s).IsValid() {
-				return pref.ValueOf(s), nil
+			// Descriptor default_value use the enum identifier.
+			ev := evs.ByName(pref.Name(s))
+			if ev != nil {
+				return pref.ValueOf(ev.Number()), ev, nil
 			}
 		}
 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
 		if v, err := strconv.ParseInt(s, 10, 32); err == nil {
-			return pref.ValueOf(int32(v)), nil
+			return pref.ValueOf(int32(v)), nil, nil
 		}
 	case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
 		if v, err := strconv.ParseInt(s, 10, 64); err == nil {
-			return pref.ValueOf(int64(v)), nil
+			return pref.ValueOf(int64(v)), nil, nil
 		}
 	case pref.Uint32Kind, pref.Fixed32Kind:
 		if v, err := strconv.ParseUint(s, 10, 32); err == nil {
-			return pref.ValueOf(uint32(v)), nil
+			return pref.ValueOf(uint32(v)), nil, nil
 		}
 	case pref.Uint64Kind, pref.Fixed64Kind:
 		if v, err := strconv.ParseUint(s, 10, 64); err == nil {
-			return pref.ValueOf(uint64(v)), nil
+			return pref.ValueOf(uint64(v)), nil, nil
 		}
 	case pref.FloatKind, pref.DoubleKind:
 		var v float64
@@ -98,25 +99,26 @@
 		}
 		if err == nil {
 			if k == pref.FloatKind {
-				return pref.ValueOf(float32(v)), nil
+				return pref.ValueOf(float32(v)), nil, nil
 			} else {
-				return pref.ValueOf(float64(v)), nil
+				return pref.ValueOf(float64(v)), nil, nil
 			}
 		}
 	case pref.StringKind:
 		// String values are already unescaped and can be used as is.
-		return pref.ValueOf(s), nil
+		return pref.ValueOf(s), nil, nil
 	case pref.BytesKind:
 		if b, ok := unmarshalBytes(s); ok {
-			return pref.ValueOf(b), nil
+			return pref.ValueOf(b), nil, nil
 		}
 	}
-	return pref.Value{}, errors.New("invalid default value for %v: %q", k, s)
+	return pref.Value{}, nil, errors.New("invalid default value for %v: %q", k, s)
 }
 
 // Marshal serializes v as the default string according to the given kind k.
-// Enums are serialized in numeric form regardless of format chosen.
-func Marshal(v pref.Value, k pref.Kind, f Format) (string, error) {
+// When specifying the Descriptor format for an enum kind, the associated
+// enum value descriptor must be provided.
+func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) (string, error) {
 	switch k {
 	case pref.BoolKind:
 		if f == GoTag {
@@ -133,7 +135,11 @@
 			}
 		}
 	case pref.EnumKind:
-		return strconv.FormatInt(int64(v.Enum()), 10), nil
+		if f == GoTag {
+			return strconv.FormatInt(int64(v.Enum()), 10), nil
+		} else {
+			return string(ev.Name()), nil
+		}
 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
 		return strconv.FormatInt(v.Int(), 10), nil
 	case pref.Uint32Kind, pref.Fixed32Kind, pref.Uint64Kind, pref.Fixed64Kind:
diff --git a/internal/encoding/defval/default_test.go b/internal/encoding/defval/default_test.go
index a25a93f..d81150d 100644
--- a/internal/encoding/defval/default_test.go
+++ b/internal/encoding/defval/default_test.go
@@ -2,52 +2,103 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package defval
+package defval_test
 
 import (
 	"math"
 	"reflect"
 	"testing"
 
+	"google.golang.org/protobuf/internal/encoding/defval"
+	fdesc "google.golang.org/protobuf/internal/filedesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 )
 
 func Test(t *testing.T) {
+	evs := fdesc.EnumValues{List: []fdesc.EnumValue{{}}}
+	evs.List[0].L0.ParentFile = fdesc.SurrogateProto2
+	evs.List[0].L0.FullName = "ALPHA"
+	evs.List[0].L1.Number = 1
+
 	V := pref.ValueOf
 	tests := []struct {
 		val   pref.Value
+		enum  pref.EnumValueDescriptor
+		enums pref.EnumValueDescriptors
 		kind  pref.Kind
 		strPB string
 		strGo string
-	}{
-		{V(bool(true)), pref.BoolKind, "true", "1"},
-		{V(int32(-0x1234)), pref.Int32Kind, "-4660", "-4660"},
-		{V(float32(math.Pi)), pref.FloatKind, "3.1415927", "3.1415927"},
-		{V(float64(math.Pi)), pref.DoubleKind, "3.141592653589793", "3.141592653589793"},
-		{V(string("hello, \xde\xad\xbe\xef\n")), pref.StringKind, "hello, \xde\xad\xbe\xef\n", "hello, \xde\xad\xbe\xef\n"},
-		{V([]byte("hello, \xde\xad\xbe\xef\n")), pref.BytesKind, "hello, \\336\\255\\276\\357\\n", "hello, \\336\\255\\276\\357\\n"},
-	}
+	}{{
+		val:   V(bool(true)),
+		enum:  nil,
+		enums: nil,
+		kind:  pref.BoolKind,
+		strPB: "true",
+		strGo: "1",
+	}, {
+		val:   V(int32(-0x1234)),
+		enum:  nil,
+		enums: nil,
+		kind:  pref.Int32Kind,
+		strPB: "-4660",
+		strGo: "-4660",
+	}, {
+		val:   V(float32(math.Pi)),
+		enum:  nil,
+		enums: nil,
+		kind:  pref.FloatKind,
+		strPB: "3.1415927",
+		strGo: "3.1415927",
+	}, {
+		val:   V(float64(math.Pi)),
+		enum:  nil,
+		enums: nil,
+		kind:  pref.DoubleKind,
+		strPB: "3.141592653589793",
+		strGo: "3.141592653589793",
+	}, {
+		val:   V(string("hello, \xde\xad\xbe\xef\n")),
+		enum:  nil,
+		enums: nil,
+		kind:  pref.StringKind,
+		strPB: "hello, \xde\xad\xbe\xef\n",
+		strGo: "hello, \xde\xad\xbe\xef\n",
+	}, {
+		val:   V([]byte("hello, \xde\xad\xbe\xef\n")),
+		enum:  nil,
+		enums: nil,
+		kind:  pref.BytesKind,
+		strPB: "hello, \\336\\255\\276\\357\\n",
+		strGo: "hello, \\336\\255\\276\\357\\n",
+	}, {
+		val:   V(pref.EnumNumber(1)),
+		enum:  &evs.List[0],
+		enums: &evs,
+		kind:  pref.EnumKind,
+		strPB: "ALPHA",
+		strGo: "1",
+	}}
 
 	for _, tt := range tests {
 		t.Run("", func(t *testing.T) {
-			gotStrPB, _ := Marshal(tt.val, tt.kind, Descriptor)
-			if gotStrPB != tt.strPB {
-				t.Errorf("Marshal(%v, %v, Descriptor) = %q, want %q", tt.val, tt.kind, gotStrPB, tt.strPB)
+			gotStr, _ := defval.Marshal(tt.val, tt.enum, tt.kind, defval.Descriptor)
+			if gotStr != tt.strPB {
+				t.Errorf("Marshal(%v, %v, Descriptor) = %q, want %q", tt.val, tt.kind, gotStr, tt.strPB)
 			}
 
-			gotStrGo, _ := Marshal(tt.val, tt.kind, GoTag)
-			if gotStrGo != tt.strGo {
-				t.Errorf("Marshal(%v, %v, GoTag) = %q, want %q", tt.val, tt.kind, gotStrGo, tt.strGo)
+			gotStr, _ = defval.Marshal(tt.val, tt.enum, tt.kind, defval.GoTag)
+			if gotStr != tt.strGo {
+				t.Errorf("Marshal(%v, %v, GoTag) = %q, want %q", tt.val, tt.kind, gotStr, tt.strGo)
 			}
 
-			gotValPB, _ := Unmarshal(tt.strPB, tt.kind, Descriptor)
-			if !reflect.DeepEqual(gotValPB.Interface(), tt.val.Interface()) {
-				t.Errorf("Unmarshal(%v, %v, Descriptor) = %q, want %q", tt.strPB, tt.kind, gotValPB, tt.val)
+			gotVal, gotEnum, _ := defval.Unmarshal(tt.strPB, tt.kind, tt.enums, defval.Descriptor)
+			if !reflect.DeepEqual(gotVal.Interface(), tt.val.Interface()) || gotEnum != tt.enum {
+				t.Errorf("Unmarshal(%v, %v, Descriptor) = (%q, %v), want (%q, %v)", tt.strPB, tt.kind, gotVal, gotEnum, tt.val, tt.enum)
 			}
 
-			gotValGo, _ := Unmarshal(tt.strGo, tt.kind, GoTag)
-			if !reflect.DeepEqual(gotValGo.Interface(), tt.val.Interface()) {
-				t.Errorf("Unmarshal(%v, %v, GoTag) = %q, want %q", tt.strGo, tt.kind, gotValGo, tt.val)
+			gotVal, gotEnum, _ = defval.Unmarshal(tt.strGo, tt.kind, tt.enums, defval.GoTag)
+			if !reflect.DeepEqual(gotVal.Interface(), tt.val.Interface()) || gotEnum != tt.enum {
+				t.Errorf("Unmarshal(%v, %v, GoTag) = (%q, %v), want (%q, %v)", tt.strGo, tt.kind, gotVal, gotEnum, tt.val, tt.enum)
 			}
 		})
 	}
diff --git a/internal/encoding/pack/pack_test.go b/internal/encoding/pack/pack_test.go
index d2f8baa..d6704e9 100644
--- a/internal/encoding/pack/pack_test.go
+++ b/internal/encoding/pack/pack_test.go
@@ -11,35 +11,47 @@
 	"math"
 	"testing"
 
-	cmp "github.com/google/go-cmp/cmp"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"github.com/google/go-cmp/cmp"
+	"google.golang.org/protobuf/encoding/prototext"
+	pdesc "google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+
+	"google.golang.org/protobuf/types/descriptorpb"
 )
 
 var msgDesc = func() pref.MessageDescriptor {
-	mtyp, err := ptype.NewMessage(&ptype.StandaloneMessage{
-		Syntax:   pref.Proto2,
-		FullName: "Message",
-		Fields: []ptype.Field{
-			{Name: "F1", Number: 1, Cardinality: pref.Repeated, Kind: pref.BoolKind, IsPacked: ptype.True},
-			{Name: "F2", Number: 2, Cardinality: pref.Repeated, Kind: pref.Int64Kind, IsPacked: ptype.True},
-			{Name: "F3", Number: 3, Cardinality: pref.Repeated, Kind: pref.Sint64Kind, IsPacked: ptype.True},
-			{Name: "F4", Number: 4, Cardinality: pref.Repeated, Kind: pref.Uint64Kind, IsPacked: ptype.True},
-			{Name: "F5", Number: 5, Cardinality: pref.Repeated, Kind: pref.Fixed32Kind, IsPacked: ptype.True},
-			{Name: "F6", Number: 6, Cardinality: pref.Repeated, Kind: pref.Sfixed32Kind, IsPacked: ptype.True},
-			{Name: "F7", Number: 7, Cardinality: pref.Repeated, Kind: pref.FloatKind, IsPacked: ptype.True},
-			{Name: "F8", Number: 8, Cardinality: pref.Repeated, Kind: pref.Fixed64Kind, IsPacked: ptype.True},
-			{Name: "F9", Number: 9, Cardinality: pref.Repeated, Kind: pref.Sfixed64Kind, IsPacked: ptype.True},
-			{Name: "F10", Number: 10, Cardinality: pref.Repeated, Kind: pref.DoubleKind, IsPacked: ptype.True},
-			{Name: "F11", Number: 11, Cardinality: pref.Optional, Kind: pref.StringKind},
-			{Name: "F12", Number: 12, Cardinality: pref.Optional, Kind: pref.BytesKind},
-			{Name: "F13", Number: 13, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("Message")},
-			{Name: "F14", Number: 14, Cardinality: pref.Optional, Kind: pref.GroupKind, MessageType: ptype.PlaceholderMessage("Message")}},
-	})
+	const s = `
+		name:   "test.proto"
+		syntax: "proto2"
+		message_type: [{
+			name: "Message"
+			field: [
+				{name:"F1"  number:1  label:LABEL_REPEATED type:TYPE_BOOL     options:{packed:true}},
+				{name:"F2"  number:2  label:LABEL_REPEATED type:TYPE_INT64    options:{packed:true}},
+				{name:"F3"  number:3  label:LABEL_REPEATED type:TYPE_SINT64   options:{packed:true}},
+				{name:"F4"  number:4  label:LABEL_REPEATED type:TYPE_UINT64   options:{packed:true}},
+				{name:"F5"  number:5  label:LABEL_REPEATED type:TYPE_FIXED32  options:{packed:true}},
+				{name:"F6"  number:6  label:LABEL_REPEATED type:TYPE_SFIXED32 options:{packed:true}},
+				{name:"F7"  number:7  label:LABEL_REPEATED type:TYPE_FLOAT    options:{packed:true}},
+				{name:"F8"  number:8  label:LABEL_REPEATED type:TYPE_FIXED64  options:{packed:true}},
+				{name:"F9"  number:9  label:LABEL_REPEATED type:TYPE_SFIXED64 options:{packed:true}},
+				{name:"F10" number:10 label:LABEL_REPEATED type:TYPE_DOUBLE   options:{packed:true}},
+				{name:"F11" number:11 label:LABEL_OPTIONAL type:TYPE_STRING},
+				{name:"F12" number:12 label:LABEL_OPTIONAL type:TYPE_BYTES},
+				{name:"F13" number:13 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".Message"},
+				{name:"F14" number:14 label:LABEL_OPTIONAL type:TYPE_GROUP   type_name:".Message"}
+			]
+		}]
+	`
+	pb := new(descriptorpb.FileDescriptorProto)
+	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
+		panic(err)
+	}
+	fd, err := pdesc.NewFile(pb, nil)
 	if err != nil {
 		panic(err)
 	}
-	return mtyp
+	return fd.Messages().Get(0)
 }()
 
 // dhex decodes a hex-string and returns the bytes and panics if s is invalid.
diff --git a/internal/encoding/tag/tag.go b/internal/encoding/tag/tag.go
index f1f24e8..1c568e3 100644
--- a/internal/encoding/tag/tag.go
+++ b/internal/encoding/tag/tag.go
@@ -12,7 +12,7 @@
 	"strings"
 
 	defval "google.golang.org/protobuf/internal/encoding/defval"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	fdesc "google.golang.org/protobuf/internal/filedesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 )
 
@@ -24,11 +24,13 @@
 // tag does not record sufficient information to determine that.
 // The type is the underlying field type (e.g., a repeated field may be
 // represented by []T, but the Go type passed in is just T).
-// This does not populate the EnumType or MessageType (except for weak message).
+// A list of enum value descriptors must be provided for enum fields.
+// This does not populate the Enum or Message (except for weak message).
 //
 // This function is a best effort attempt; parsing errors are ignored.
-func Unmarshal(tag string, goType reflect.Type) ptype.Field {
-	f := ptype.Field{}
+func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) pref.FieldDescriptor {
+	f := new(fdesc.Field)
+	f.L0.ParentFile = fdesc.SurrogateProto2
 	for len(tag) > 0 {
 		i := strings.IndexByte(tag, ',')
 		if i < 0 {
@@ -36,88 +38,92 @@
 		}
 		switch s := tag[:i]; {
 		case strings.HasPrefix(s, "name="):
-			f.Name = pref.Name(s[len("name="):])
+			f.L0.FullName = pref.FullName(s[len("name="):])
 		case strings.Trim(s, "0123456789") == "":
 			n, _ := strconv.ParseUint(s, 10, 32)
-			f.Number = pref.FieldNumber(n)
+			f.L1.Number = pref.FieldNumber(n)
 		case s == "opt":
-			f.Cardinality = pref.Optional
+			f.L1.Cardinality = pref.Optional
 		case s == "req":
-			f.Cardinality = pref.Required
+			f.L1.Cardinality = pref.Required
 		case s == "rep":
-			f.Cardinality = pref.Repeated
+			f.L1.Cardinality = pref.Repeated
 		case s == "varint":
 			switch goType.Kind() {
 			case reflect.Bool:
-				f.Kind = pref.BoolKind
+				f.L1.Kind = pref.BoolKind
 			case reflect.Int32:
-				f.Kind = pref.Int32Kind
+				f.L1.Kind = pref.Int32Kind
 			case reflect.Int64:
-				f.Kind = pref.Int64Kind
+				f.L1.Kind = pref.Int64Kind
 			case reflect.Uint32:
-				f.Kind = pref.Uint32Kind
+				f.L1.Kind = pref.Uint32Kind
 			case reflect.Uint64:
-				f.Kind = pref.Uint64Kind
+				f.L1.Kind = pref.Uint64Kind
 			}
 		case s == "zigzag32":
 			if goType.Kind() == reflect.Int32 {
-				f.Kind = pref.Sint32Kind
+				f.L1.Kind = pref.Sint32Kind
 			}
 		case s == "zigzag64":
 			if goType.Kind() == reflect.Int64 {
-				f.Kind = pref.Sint64Kind
+				f.L1.Kind = pref.Sint64Kind
 			}
 		case s == "fixed32":
 			switch goType.Kind() {
 			case reflect.Int32:
-				f.Kind = pref.Sfixed32Kind
+				f.L1.Kind = pref.Sfixed32Kind
 			case reflect.Uint32:
-				f.Kind = pref.Fixed32Kind
+				f.L1.Kind = pref.Fixed32Kind
 			case reflect.Float32:
-				f.Kind = pref.FloatKind
+				f.L1.Kind = pref.FloatKind
 			}
 		case s == "fixed64":
 			switch goType.Kind() {
 			case reflect.Int64:
-				f.Kind = pref.Sfixed64Kind
+				f.L1.Kind = pref.Sfixed64Kind
 			case reflect.Uint64:
-				f.Kind = pref.Fixed64Kind
+				f.L1.Kind = pref.Fixed64Kind
 			case reflect.Float64:
-				f.Kind = pref.DoubleKind
+				f.L1.Kind = pref.DoubleKind
 			}
 		case s == "bytes":
 			switch {
 			case goType.Kind() == reflect.String:
-				f.Kind = pref.StringKind
+				f.L1.Kind = pref.StringKind
 			case goType.Kind() == reflect.Slice && goType.Elem() == byteType:
-				f.Kind = pref.BytesKind
+				f.L1.Kind = pref.BytesKind
 			default:
-				f.Kind = pref.MessageKind
+				f.L1.Kind = pref.MessageKind
 			}
 		case s == "group":
-			f.Kind = pref.GroupKind
+			f.L1.Kind = pref.GroupKind
 		case strings.HasPrefix(s, "enum="):
-			f.Kind = pref.EnumKind
+			f.L1.Kind = pref.EnumKind
 		case strings.HasPrefix(s, "json="):
-			f.JSONName = s[len("json="):]
+			f.L1.JSONName = fdesc.JSONName(s[len("json="):])
 		case s == "packed":
-			f.IsPacked = ptype.True
+			f.L1.HasPacked = true
+			f.L1.IsPacked = true
 		case strings.HasPrefix(s, "weak="):
-			f.IsWeak = true
-			f.MessageType = ptype.PlaceholderMessage(pref.FullName(s[len("weak="):]))
+			f.L1.IsWeak = true
+			f.L1.Message = fdesc.PlaceholderMessage(pref.FullName(s[len("weak="):]))
 		case strings.HasPrefix(s, "def="):
 			// The default tag is special in that everything afterwards is the
 			// default regardless of the presence of commas.
 			s, i = tag[len("def="):], len(tag)
-			f.Default, _ = defval.Unmarshal(s, f.Kind, defval.GoTag)
+			v, ev, _ := defval.Unmarshal(s, f.L1.Kind, evs, defval.GoTag)
+			f.L1.Default = fdesc.DefaultValue(v, ev)
+		case s == "proto3":
+			f.L0.ParentFile = fdesc.SurrogateProto3
 		}
 		tag = strings.TrimPrefix(tag[i:], ",")
 	}
 
 	// The generator uses the group message name instead of the field name.
 	// We obtain the real field name by lowercasing the group name.
-	if f.Kind == pref.GroupKind {
-		f.Name = pref.Name(strings.ToLower(string(f.Name)))
+	if f.L1.Kind == pref.GroupKind {
+		f.L0.FullName = pref.FullName(strings.ToLower(string(f.L0.FullName)))
 	}
 	return f
 }
@@ -169,7 +175,8 @@
 		name = string(fd.Message().Name())
 	}
 	tag = append(tag, "name="+name)
-	if jsonName := fd.JSONName(); jsonName != "" && jsonName != name {
+	if jsonName := fd.JSONName(); jsonName != "" && jsonName != name && !fd.IsExtension() {
+		// TODO: The jsonName != name condition looks wrong.
 		tag = append(tag, "json="+jsonName)
 	}
 	// The previous implementation does not tag extension fields as proto3,
@@ -186,7 +193,7 @@
 	}
 	// This must appear last in the tag, since commas in strings aren't escaped.
 	if fd.HasDefault() {
-		def, _ := defval.Marshal(fd.Default(), fd.Kind(), defval.GoTag)
+		def, _ := defval.Marshal(fd.Default(), fd.DefaultEnumValue(), fd.Kind(), defval.GoTag)
 		tag = append(tag, "def="+def)
 	}
 	return strings.Join(tag, ",")
diff --git a/internal/encoding/tag/tag_test.go b/internal/encoding/tag/tag_test.go
index 0433b42..680ba52 100644
--- a/internal/encoding/tag/tag_test.go
+++ b/internal/encoding/tag/tag_test.go
@@ -2,54 +2,40 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package tag
+package tag_test
 
 import (
 	"reflect"
 	"testing"
 
-	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-cmp/cmp/cmpopts"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/internal/encoding/tag"
+	fdesc "google.golang.org/protobuf/internal/filedesc"
+	"google.golang.org/protobuf/proto"
+	pdesc "google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 )
 
 func Test(t *testing.T) {
-	m := &ptype.StandaloneMessage{
-		Syntax:   pref.Proto3,
-		FullName: "golang.org.example.FooMessage",
-		Fields: []ptype.Field{{
-			Name:        "foo_field",
-			Number:      1337,
-			Cardinality: pref.Repeated,
-			Kind:        pref.BytesKind,
-			JSONName:    "fooField",
-			Default:     pref.ValueOf([]byte("hello, \xde\xad\xbe\xef\n")),
-		}},
-	}
-	md, err := ptype.NewMessage(m)
-	if err != nil {
-		t.Fatalf("unexpected NewMessage error: %v", err)
-	}
+	fd := new(fdesc.Field)
+	fd.L0.ParentFile = fdesc.SurrogateProto3
+	fd.L0.FullName = "foo_field"
+	fd.L1.Number = 1337
+	fd.L1.Cardinality = pref.Repeated
+	fd.L1.Kind = pref.BytesKind
+	fd.L1.JSONName = fdesc.JSONName("fooField")
+	fd.L1.Default = fdesc.DefaultValue(pref.ValueOf([]byte("hello, \xde\xad\xbe\xef\n")), nil)
 
 	// Marshal test.
-	gotTag := Marshal(md.Fields().Get(0), "")
+	gotTag := tag.Marshal(fd, "")
 	wantTag := `bytes,1337,rep,name=foo_field,json=fooField,proto3,def=hello, \336\255\276\357\n`
 	if gotTag != wantTag {
 		t.Errorf("Marshal() = `%v`, want `%v`", gotTag, wantTag)
 	}
 
 	// Unmarshal test.
-	gotField := Unmarshal(wantTag, reflect.TypeOf([]byte{}))
-	wantField := m.Fields[0]
-	opts := cmp.Options{
-		cmp.Transformer("UnwrapValue", func(x pref.Value) interface{} {
-			return x.Interface()
-		}),
-		cmpopts.IgnoreUnexported(ptype.Field{}),
-		cmpopts.IgnoreFields(ptype.Field{}, "Options"),
-	}
-	if diff := cmp.Diff(wantField, gotField, opts); diff != "" {
-		t.Errorf("Unmarshal() mismatch (-want +got):\n%v", diff)
+	gotFD := tag.Unmarshal(wantTag, reflect.TypeOf([]byte{}), nil)
+	wantFD := fd
+	if !proto.Equal(pdesc.ToFieldDescriptorProto(gotFD), pdesc.ToFieldDescriptorProto(wantFD)) {
+		t.Errorf("Umarshal() mismatch:\ngot  %v\nwant %v", gotFD, wantFD)
 	}
 }
diff --git a/internal/filedesc/build.go b/internal/filedesc/build.go
new file mode 100644
index 0000000..28bd370
--- /dev/null
+++ b/internal/filedesc/build.go
@@ -0,0 +1,150 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package filedesc provides functionality for constructing descriptors.
+package filedesc
+
+import (
+	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/internal/fieldnum"
+	"google.golang.org/protobuf/reflect/protoreflect"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+	preg "google.golang.org/protobuf/reflect/protoregistry"
+)
+
+// DescBuilder construct a protoreflect.FileDescriptor from the raw descriptor.
+type DescBuilder struct {
+	// RawDescriptor is the wire-encoded bytes of FileDescriptorProto
+	// and must be populated.
+	RawDescriptor []byte
+
+	// NumEnums is the total number of enums declared in the file.
+	NumEnums int32
+	// NumMessages is the total number of messages declared in the file.
+	// It includes the implicit message declarations for map entries.
+	NumMessages int32
+	// NumExtensions is the total number of extensions declared in the file.
+	NumExtensions int32
+	// NumServices is the total number of services declared in the file.
+	NumServices int32
+
+	// TypeResolver resolves extension field types for descriptor options.
+	// If nil, it uses protoregistry.GlobalTypes.
+	TypeResolver interface {
+		preg.ExtensionTypeResolver
+	}
+
+	// FileRegistry is use to lookup file, enum, and message dependencies.
+	// Once constructed, the file descriptor is registered here.
+	// If nil, it uses protoregistry.GlobalFiles.
+	FileRegistry interface {
+		FindFileByPath(string) (protoreflect.FileDescriptor, error)
+		FindEnumByName(pref.FullName) (pref.EnumDescriptor, error)
+		FindMessageByName(pref.FullName) (pref.MessageDescriptor, error)
+		Register(...pref.FileDescriptor) error
+	}
+}
+
+// resolverByIndex is an interface DescBuilder.FileRegistry may implement.
+// If so, it permits looking up an enum or message dependency based on the
+// sub-list and element index into filetype.TypeBuilder.DependencyIndexes.
+type resolverByIndex interface {
+	FindEnumByIndex(int32, int32, []Enum, []Message) pref.EnumDescriptor
+	FindMessageByIndex(int32, int32, []Enum, []Message) pref.MessageDescriptor
+}
+
+// Indexes of each sub-list in filetype.TypeBuilder.DependencyIndexes.
+const (
+	listFieldDeps int32 = iota
+	listExtTargets
+	listExtDeps
+	listMethInDeps
+	listMethOutDeps
+)
+
+// Build constructs a FileDescriptor given the parameters set in DescBuilder.
+// It assumes that the inputs are well-formed and panics if any inconsistencies
+// are encountered.
+//
+// If NumEnums+NumMessages+NumExtensions+NumServices is zero,
+// then Build automatically derives them from the raw descriptor.
+func (db DescBuilder) Build() (out struct {
+	File pref.FileDescriptor
+
+	// Enums is all enum descriptors in "flattened ordering".
+	Enums []Enum
+	// Messages is all message descriptors in "flattened ordering".
+	// It includes the implicit message declarations for map entries.
+	Messages []Message
+	// Extensions is all extension descriptors in "flattened ordering".
+	Extensions []Extension
+	// Service is all service descriptors in "flattened ordering".
+	Services []Service
+}) {
+	// Populate the counts if uninitialized.
+	if db.NumEnums+db.NumMessages+db.NumExtensions+db.NumServices == 0 {
+		db.unmarshalCounts(db.RawDescriptor, true)
+	}
+
+	// Initialize resolvers and registries if unpopulated.
+	if db.TypeResolver == nil {
+		db.TypeResolver = preg.GlobalTypes
+	}
+	if db.FileRegistry == nil {
+		db.FileRegistry = preg.GlobalFiles
+	}
+
+	fd := newRawFile(db)
+	out.File = fd
+	out.Enums = fd.allEnums
+	out.Messages = fd.allMessages
+	out.Extensions = fd.allExtensions
+	out.Services = fd.allServices
+
+	if err := db.FileRegistry.Register(fd); err != nil {
+		panic(err)
+	}
+	return out
+}
+
+// unmarshalCounts counts the number of enum, message, extension, and service
+// declarations in the raw message, which is either a FileDescriptorProto
+// or a MessageDescriptorProto depending on whether isFile is set.
+func (db *DescBuilder) unmarshalCounts(b []byte, isFile bool) {
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			if isFile {
+				switch num {
+				case fieldnum.FileDescriptorProto_EnumType:
+					db.NumEnums++
+				case fieldnum.FileDescriptorProto_MessageType:
+					db.unmarshalCounts(v, false)
+					db.NumMessages++
+				case fieldnum.FileDescriptorProto_Extension:
+					db.NumExtensions++
+				case fieldnum.FileDescriptorProto_Service:
+					db.NumServices++
+				}
+			} else {
+				switch num {
+				case fieldnum.DescriptorProto_EnumType:
+					db.NumEnums++
+				case fieldnum.DescriptorProto_NestedType:
+					db.unmarshalCounts(v, false)
+					db.NumMessages++
+				case fieldnum.DescriptorProto_Extension:
+					db.NumExtensions++
+				}
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+}
diff --git a/internal/fileinit/fileinit_test.go b/internal/filedesc/build_test.go
similarity index 92%
rename from internal/fileinit/fileinit_test.go
rename to internal/filedesc/build_test.go
index aca3a20..edeb56e 100644
--- a/internal/fileinit/fileinit_test.go
+++ b/internal/filedesc/build_test.go
@@ -1,4 +1,8 @@
-package fileinit_test
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package filedesc_test
 
 import (
 	"bytes"
@@ -17,10 +21,10 @@
 func TestInit(t *testing.T) {
 	// Compare the FileDescriptorProto for the same test file from two different sources:
 	//
-	// 1. The result of passing the fileinit-produced FileDescriptor through protodesc.
+	// 1. The result of passing the filedesc-produced FileDescriptor through protodesc.
 	// 2. The protoc-generated wire-encoded message.
 	//
-	// This serves as a test of both fileinit and protodesc.
+	// This serves as a test of both filedesc and protodesc.
 	got := protodesc.ToFileDescriptorProto(testpb.File_test_test_proto)
 
 	want := &descriptorpb.FileDescriptorProto{}
diff --git a/internal/filedesc/desc.go b/internal/filedesc/desc.go
new file mode 100644
index 0000000..40c47dc
--- /dev/null
+++ b/internal/filedesc/desc.go
@@ -0,0 +1,555 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package filedesc
+
+import (
+	"bytes"
+	"fmt"
+	"sync"
+	"sync/atomic"
+
+	"google.golang.org/protobuf/internal/descfmt"
+	"google.golang.org/protobuf/internal/descopts"
+	"google.golang.org/protobuf/internal/encoding/defval"
+	"google.golang.org/protobuf/internal/pragma"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// The types in this file may have a suffix:
+//	• L0: Contains fields common to all descriptors (except File) and
+//	must be initialized up front.
+//	• L1: Contains fields specific to a descriptor and
+//	must be initialized up front.
+//	• L2: Contains fields that are lazily initialized when constructing
+//	from the raw file descriptor. When constructing as a literal, the L2
+//	fields must be initialized up front.
+//
+// The types are exported so that packages like reflect/protodesc can
+// directly construct descriptors.
+
+type (
+	File struct {
+		fileRaw
+		L1 FileL1
+
+		once uint32     // atomically set if L2 is valid
+		mu   sync.Mutex // protects L2
+		L2   *FileL2
+	}
+	FileL1 struct {
+		Syntax  pref.Syntax
+		Path    string
+		Package pref.FullName
+
+		Enums      Enums
+		Messages   Messages
+		Extensions Extensions
+		Services   Services
+	}
+	FileL2 struct {
+		Options func() pref.ProtoMessage
+		Imports FileImports
+	}
+)
+
+func (fd *File) ParentFile() pref.FileDescriptor { return fd }
+func (fd *File) Parent() pref.Descriptor         { return nil }
+func (fd *File) Index() int                      { return 0 }
+func (fd *File) Syntax() pref.Syntax             { return fd.L1.Syntax }
+func (fd *File) Name() pref.Name                 { return fd.L1.Package.Name() }
+func (fd *File) FullName() pref.FullName         { return fd.L1.Package }
+func (fd *File) IsPlaceholder() bool             { return false }
+func (fd *File) Options() pref.ProtoMessage {
+	if f := fd.lazyInit().Options; f != nil {
+		return f()
+	}
+	return descopts.File
+}
+func (fd *File) Path() string                          { return fd.L1.Path }
+func (fd *File) Package() pref.FullName                { return fd.L1.Package }
+func (fd *File) Imports() pref.FileImports             { return &fd.lazyInit().Imports }
+func (fd *File) Enums() pref.EnumDescriptors           { return &fd.L1.Enums }
+func (fd *File) Messages() pref.MessageDescriptors     { return &fd.L1.Messages }
+func (fd *File) Extensions() pref.ExtensionDescriptors { return &fd.L1.Extensions }
+func (fd *File) Services() pref.ServiceDescriptors     { return &fd.L1.Services }
+func (fd *File) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, fd) }
+func (fd *File) ProtoType(pref.FileDescriptor)         {}
+func (fd *File) ProtoInternal(pragma.DoNotImplement)   {}
+
+func (fd *File) lazyInit() *FileL2 {
+	if atomic.LoadUint32(&fd.once) == 0 {
+		fd.lazyInitOnce()
+	}
+	return fd.L2
+}
+
+func (fd *File) lazyInitOnce() {
+	fd.mu.Lock()
+	if fd.L2 == nil {
+		fd.lazyRawInit() // recursively initializes all L2 structures
+	}
+	atomic.StoreUint32(&fd.once, 1)
+	fd.mu.Unlock()
+}
+
+// ProtoLegacyRawDesc is a pseudo-internal API for allowing the v1 code
+// to be able to retrieve the raw descriptor.
+//
+// WARNING: This method is exempt from the compatibility promise and may be
+// removed in the future without warning.
+func (fd *File) ProtoLegacyRawDesc() []byte {
+	return fd.builder.RawDescriptor
+}
+
+type (
+	Enum struct {
+		Base
+		L1 EnumL1
+		L2 *EnumL2 // protected by fileDesc.once
+	}
+	EnumL1 struct{}
+	EnumL2 struct {
+		Options        func() pref.ProtoMessage
+		Values         EnumValues
+		ReservedNames  Names
+		ReservedRanges EnumRanges
+	}
+
+	EnumValue struct {
+		Base
+		L1 EnumValueL1
+	}
+	EnumValueL1 struct {
+		Options func() pref.ProtoMessage
+		Number  pref.EnumNumber
+	}
+)
+
+func (ed *Enum) Options() pref.ProtoMessage {
+	if f := ed.lazyInit().Options; f != nil {
+		return f()
+	}
+	return descopts.Enum
+}
+func (ed *Enum) Values() pref.EnumValueDescriptors { return &ed.lazyInit().Values }
+func (ed *Enum) ReservedNames() pref.Names         { return &ed.lazyInit().ReservedNames }
+func (ed *Enum) ReservedRanges() pref.EnumRanges   { return &ed.lazyInit().ReservedRanges }
+func (ed *Enum) Format(s fmt.State, r rune)        { descfmt.FormatDesc(s, r, ed) }
+func (ed *Enum) ProtoType(pref.EnumDescriptor)     {}
+func (ed *Enum) lazyInit() *EnumL2 {
+	ed.L0.ParentFile.lazyInit() // implicitly initializes L2
+	return ed.L2
+}
+
+func (ed *EnumValue) Options() pref.ProtoMessage {
+	if f := ed.L1.Options; f != nil {
+		return f()
+	}
+	return descopts.EnumValue
+}
+func (ed *EnumValue) Number() pref.EnumNumber            { return ed.L1.Number }
+func (ed *EnumValue) Format(s fmt.State, r rune)         { descfmt.FormatDesc(s, r, ed) }
+func (ed *EnumValue) ProtoType(pref.EnumValueDescriptor) {}
+
+type (
+	Message struct {
+		Base
+		L1 MessageL1
+		L2 *MessageL2 // protected by fileDesc.once
+	}
+	MessageL1 struct {
+		Enums      Enums
+		Messages   Messages
+		Extensions Extensions
+	}
+	MessageL2 struct {
+		Options               func() pref.ProtoMessage
+		IsMapEntry            bool // promoted from google.protobuf.MessageOptions
+		IsMessageSet          bool // promoted from google.protobuf.MessageOptions
+		Fields                Fields
+		Oneofs                Oneofs
+		ReservedNames         Names
+		ReservedRanges        FieldRanges
+		RequiredNumbers       FieldNumbers // must be consistent with Fields.Cardinality
+		ExtensionRanges       FieldRanges
+		ExtensionRangeOptions []func() pref.ProtoMessage // must be same length as ExtensionRanges
+	}
+
+	Field struct {
+		Base
+		L1 FieldL1
+	}
+	FieldL1 struct {
+		Options         func() pref.ProtoMessage
+		Number          pref.FieldNumber
+		Cardinality     pref.Cardinality // must be consistent with Message.RequiredNumbers
+		Kind            pref.Kind
+		JSONName        jsonName
+		IsWeak          bool // promoted from google.protobuf.FieldOptions
+		HasPacked       bool // promoted from google.protobuf.FieldOptions
+		IsPacked        bool // promoted from google.protobuf.FieldOptions
+		Default         defaultValue
+		ContainingOneof pref.OneofDescriptor // must be consistent with Message.Oneofs.Fields
+		Enum            pref.EnumDescriptor
+		Message         pref.MessageDescriptor
+	}
+
+	Oneof struct {
+		Base
+		L1 OneofL1
+	}
+	OneofL1 struct {
+		Options func() pref.ProtoMessage
+		Fields  OneofFields // must be consistent with Message.Fields.ContainingOneof
+	}
+)
+
+func (md *Message) Options() pref.ProtoMessage {
+	if f := md.lazyInit().Options; f != nil {
+		return f()
+	}
+	return descopts.Message
+}
+func (md *Message) IsMapEntry() bool                   { return md.lazyInit().IsMapEntry }
+func (md *Message) Fields() pref.FieldDescriptors      { return &md.lazyInit().Fields }
+func (md *Message) Oneofs() pref.OneofDescriptors      { return &md.lazyInit().Oneofs }
+func (md *Message) ReservedNames() pref.Names          { return &md.lazyInit().ReservedNames }
+func (md *Message) ReservedRanges() pref.FieldRanges   { return &md.lazyInit().ReservedRanges }
+func (md *Message) RequiredNumbers() pref.FieldNumbers { return &md.lazyInit().RequiredNumbers }
+func (md *Message) ExtensionRanges() pref.FieldRanges  { return &md.lazyInit().ExtensionRanges }
+func (md *Message) ExtensionRangeOptions(i int) pref.ProtoMessage {
+	if f := md.lazyInit().ExtensionRangeOptions[i]; f != nil {
+		return f()
+	}
+	return descopts.ExtensionRange
+}
+func (md *Message) Enums() pref.EnumDescriptors           { return &md.L1.Enums }
+func (md *Message) Messages() pref.MessageDescriptors     { return &md.L1.Messages }
+func (md *Message) Extensions() pref.ExtensionDescriptors { return &md.L1.Extensions }
+func (md *Message) ProtoType(pref.MessageDescriptor)      {}
+func (md *Message) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, md) }
+func (md *Message) lazyInit() *MessageL2 {
+	md.L0.ParentFile.lazyInit() // implicitly initializes L2
+	return md.L2
+}
+
+// IsMessageSet is a pseudo-internal API for checking whether a message
+// should serialize in the proto1 message format.
+//
+// WARNING: This method is exempt from the compatibility promise and may be
+// removed in the future without warning.
+func (md *Message) IsMessageSet() bool {
+	return md.lazyInit().IsMessageSet
+}
+
+func (fd *Field) Options() pref.ProtoMessage {
+	if f := fd.L1.Options; f != nil {
+		return f()
+	}
+	return descopts.Field
+}
+func (fd *Field) Number() pref.FieldNumber      { return fd.L1.Number }
+func (fd *Field) Cardinality() pref.Cardinality { return fd.L1.Cardinality }
+func (fd *Field) Kind() pref.Kind               { return fd.L1.Kind }
+func (fd *Field) HasJSONName() bool             { return fd.L1.JSONName.has }
+func (fd *Field) JSONName() string              { return fd.L1.JSONName.get(fd) }
+func (fd *Field) IsPacked() bool {
+	if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != pref.Proto2 && fd.L1.Cardinality == pref.Repeated {
+		switch fd.L1.Kind {
+		case pref.StringKind, pref.BytesKind, pref.MessageKind, pref.GroupKind:
+		default:
+			return true
+		}
+	}
+	return fd.L1.IsPacked
+}
+func (fd *Field) IsExtension() bool { return false }
+func (fd *Field) IsWeak() bool      { return fd.L1.IsWeak }
+func (fd *Field) IsList() bool      { return fd.Cardinality() == pref.Repeated && !fd.IsMap() }
+func (fd *Field) IsMap() bool       { return fd.Message() != nil && fd.Message().IsMapEntry() }
+func (fd *Field) MapKey() pref.FieldDescriptor {
+	if !fd.IsMap() {
+		return nil
+	}
+	return fd.Message().Fields().ByNumber(1)
+}
+func (fd *Field) MapValue() pref.FieldDescriptor {
+	if !fd.IsMap() {
+		return nil
+	}
+	return fd.Message().Fields().ByNumber(2)
+}
+func (fd *Field) HasDefault() bool                           { return fd.L1.Default.has }
+func (fd *Field) Default() pref.Value                        { return fd.L1.Default.get(fd) }
+func (fd *Field) DefaultEnumValue() pref.EnumValueDescriptor { return fd.L1.Default.enum }
+func (fd *Field) ContainingOneof() pref.OneofDescriptor      { return fd.L1.ContainingOneof }
+func (fd *Field) ContainingMessage() pref.MessageDescriptor {
+	return fd.L0.Parent.(pref.MessageDescriptor)
+}
+func (fd *Field) Enum() pref.EnumDescriptor       { return fd.L1.Enum }
+func (fd *Field) Message() pref.MessageDescriptor { return fd.L1.Message }
+func (fd *Field) Format(s fmt.State, r rune)      { descfmt.FormatDesc(s, r, fd) }
+func (fd *Field) ProtoType(pref.FieldDescriptor)  {}
+
+func (od *Oneof) Options() pref.ProtoMessage {
+	if f := od.L1.Options; f != nil {
+		return f()
+	}
+	return descopts.Oneof
+}
+func (od *Oneof) Fields() pref.FieldDescriptors  { return &od.L1.Fields }
+func (od *Oneof) Format(s fmt.State, r rune)     { descfmt.FormatDesc(s, r, od) }
+func (od *Oneof) ProtoType(pref.OneofDescriptor) {}
+
+type (
+	Extension struct {
+		Base
+		L1 ExtensionL1
+		L2 *ExtensionL2 // protected by fileDesc.once
+	}
+	ExtensionL1 struct {
+		Number   pref.FieldNumber
+		Extendee pref.MessageDescriptor
+		Kind     pref.Kind
+	}
+	ExtensionL2 struct {
+		Options     func() pref.ProtoMessage
+		Cardinality pref.Cardinality
+		JSONName    jsonName
+		IsPacked    bool // promoted from google.protobuf.FieldOptions
+		Default     defaultValue
+		Enum        pref.EnumDescriptor
+		Message     pref.MessageDescriptor
+	}
+)
+
+func (xd *Extension) Options() pref.ProtoMessage {
+	if f := xd.lazyInit().Options; f != nil {
+		return f()
+	}
+	return descopts.Field
+}
+func (xd *Extension) Number() pref.FieldNumber                   { return xd.L1.Number }
+func (xd *Extension) Cardinality() pref.Cardinality              { return xd.lazyInit().Cardinality }
+func (xd *Extension) Kind() pref.Kind                            { return xd.L1.Kind }
+func (xd *Extension) HasJSONName() bool                          { return xd.lazyInit().JSONName.has }
+func (xd *Extension) JSONName() string                           { return xd.lazyInit().JSONName.get(xd) }
+func (xd *Extension) IsPacked() bool                             { return xd.lazyInit().IsPacked }
+func (xd *Extension) IsExtension() bool                          { return true }
+func (xd *Extension) IsWeak() bool                               { return false }
+func (xd *Extension) IsList() bool                               { return xd.Cardinality() == pref.Repeated }
+func (xd *Extension) IsMap() bool                                { return false }
+func (xd *Extension) MapKey() pref.FieldDescriptor               { return nil }
+func (xd *Extension) MapValue() pref.FieldDescriptor             { return nil }
+func (xd *Extension) HasDefault() bool                           { return xd.lazyInit().Default.has }
+func (xd *Extension) Default() pref.Value                        { return xd.lazyInit().Default.get(xd) }
+func (xd *Extension) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().Default.enum }
+func (xd *Extension) ContainingOneof() pref.OneofDescriptor      { return nil }
+func (xd *Extension) ContainingMessage() pref.MessageDescriptor  { return xd.L1.Extendee }
+func (xd *Extension) Enum() pref.EnumDescriptor                  { return xd.lazyInit().Enum }
+func (xd *Extension) Message() pref.MessageDescriptor            { return xd.lazyInit().Message }
+func (xd *Extension) Format(s fmt.State, r rune)                 { descfmt.FormatDesc(s, r, xd) }
+func (xd *Extension) ProtoType(pref.FieldDescriptor)             {}
+func (xd *Extension) ProtoInternal(pragma.DoNotImplement)        {}
+func (xd *Extension) lazyInit() *ExtensionL2 {
+	xd.L0.ParentFile.lazyInit() // implicitly initializes L2
+	return xd.L2
+}
+
+type (
+	Service struct {
+		Base
+		L1 ServiceL1
+		L2 *ServiceL2 // protected by fileDesc.once
+	}
+	ServiceL1 struct{}
+	ServiceL2 struct {
+		Options func() pref.ProtoMessage
+		Methods Methods
+	}
+
+	Method struct {
+		Base
+		L1 MethodL1
+	}
+	MethodL1 struct {
+		Options           func() pref.ProtoMessage
+		Input             pref.MessageDescriptor
+		Output            pref.MessageDescriptor
+		IsStreamingClient bool
+		IsStreamingServer bool
+	}
+)
+
+func (sd *Service) Options() pref.ProtoMessage {
+	if f := sd.lazyInit().Options; f != nil {
+		return f()
+	}
+	return descopts.Service
+}
+func (sd *Service) Methods() pref.MethodDescriptors     { return &sd.lazyInit().Methods }
+func (sd *Service) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, sd) }
+func (sd *Service) ProtoType(pref.ServiceDescriptor)    {}
+func (sd *Service) ProtoInternal(pragma.DoNotImplement) {}
+func (sd *Service) lazyInit() *ServiceL2 {
+	sd.L0.ParentFile.lazyInit() // implicitly initializes L2
+	return sd.L2
+}
+
+func (md *Method) Options() pref.ProtoMessage {
+	if f := md.L1.Options; f != nil {
+		return f()
+	}
+	return descopts.Method
+}
+func (md *Method) Input() pref.MessageDescriptor       { return md.L1.Input }
+func (md *Method) Output() pref.MessageDescriptor      { return md.L1.Output }
+func (md *Method) IsStreamingClient() bool             { return md.L1.IsStreamingClient }
+func (md *Method) IsStreamingServer() bool             { return md.L1.IsStreamingServer }
+func (md *Method) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, md) }
+func (md *Method) ProtoType(pref.MethodDescriptor)     {}
+func (md *Method) ProtoInternal(pragma.DoNotImplement) {}
+
+// Surrogate files are can be used to create standalone descriptors
+// where the syntax is only information derived from the parent file.
+var (
+	SurrogateProto2 = &File{L1: FileL1{Syntax: pref.Proto2}, L2: &FileL2{}}
+	SurrogateProto3 = &File{L1: FileL1{Syntax: pref.Proto3}, L2: &FileL2{}}
+)
+
+type (
+	Base struct {
+		L0 BaseL0
+	}
+	BaseL0 struct {
+		FullName   pref.FullName // must be populated
+		ParentFile *File         // must be populated
+		Parent     pref.Descriptor
+		Index      int
+	}
+)
+
+func (d *Base) Name() pref.Name         { return d.L0.FullName.Name() }
+func (d *Base) FullName() pref.FullName { return d.L0.FullName }
+func (d *Base) ParentFile() pref.FileDescriptor {
+	if d.L0.ParentFile == SurrogateProto2 || d.L0.ParentFile == SurrogateProto3 {
+		return nil // surrogate files are not real parents
+	}
+	return d.L0.ParentFile
+}
+func (d *Base) Parent() pref.Descriptor             { return d.L0.Parent }
+func (d *Base) Index() int                          { return d.L0.Index }
+func (d *Base) Syntax() pref.Syntax                 { return d.L0.ParentFile.Syntax() }
+func (d *Base) IsPlaceholder() bool                 { return false }
+func (d *Base) ProtoInternal(pragma.DoNotImplement) {}
+
+func JSONName(s string) jsonName {
+	return jsonName{has: true, name: s}
+}
+
+type jsonName struct {
+	has  bool
+	once sync.Once
+	name string
+}
+
+func (js *jsonName) get(fd pref.FieldDescriptor) string {
+	if !js.has {
+		js.once.Do(func() {
+			js.name = makeJSONName(fd.Name())
+		})
+	}
+	return js.name
+}
+
+// makeJSONName creates a JSON name from the protobuf short name.
+func makeJSONName(s pref.Name) string {
+	var b []byte
+	var wasUnderscore bool
+	for i := 0; i < len(s); i++ { // proto identifiers are always ASCII
+		c := s[i]
+		if c != '_' {
+			isLower := 'a' <= c && c <= 'z'
+			if wasUnderscore && isLower {
+				c -= 'a' - 'A'
+			}
+			b = append(b, c)
+		}
+		wasUnderscore = c == '_'
+	}
+	return string(b)
+}
+
+func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue {
+	dv := defaultValue{has: v.IsValid(), val: v, enum: ev}
+	if b, ok := v.Interface().([]byte); ok {
+		// Store a copy of the default bytes, so that we can detect
+		// accidental mutations of the original value.
+		dv.bytes = append([]byte(nil), b...)
+	}
+	return dv
+}
+
+func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) defaultValue {
+	var evs pref.EnumValueDescriptors
+	if k == pref.EnumKind {
+		// If the enum is declared within the same file, be careful not to
+		// blindly call the Values method, lest we bind ourselves in a deadlock.
+		if ed, ok := ed.(*Enum); ok && ed.L0.ParentFile == pf {
+			evs = &ed.L2.Values
+		} else {
+			evs = ed.Values()
+		}
+	}
+
+	v, ev, err := defval.Unmarshal(string(b), k, evs, defval.Descriptor)
+	if err != nil {
+		panic(err)
+	}
+	return DefaultValue(v, ev)
+}
+
+type defaultValue struct {
+	has   bool
+	val   pref.Value
+	enum  pref.EnumValueDescriptor
+	bytes []byte
+}
+
+func (dv *defaultValue) get(fd pref.FieldDescriptor) pref.Value {
+	// Return the zero value as the default if unpopulated.
+	if !dv.has {
+		switch fd.Kind() {
+		case pref.BoolKind:
+			return pref.ValueOf(false)
+		case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
+			return pref.ValueOf(int32(0))
+		case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
+			return pref.ValueOf(int64(0))
+		case pref.Uint32Kind, pref.Fixed32Kind:
+			return pref.ValueOf(uint32(0))
+		case pref.Uint64Kind, pref.Fixed64Kind:
+			return pref.ValueOf(uint64(0))
+		case pref.FloatKind:
+			return pref.ValueOf(float32(0))
+		case pref.DoubleKind:
+			return pref.ValueOf(float64(0))
+		case pref.StringKind:
+			return pref.ValueOf(string(""))
+		case pref.BytesKind:
+			return pref.ValueOf([]byte(nil))
+		case pref.EnumKind:
+			return pref.ValueOf(fd.Enum().Values().Get(0).Number())
+		}
+	}
+
+	if len(dv.bytes) > 0 && !bytes.Equal(dv.bytes, dv.val.Bytes()) {
+		// TODO: Avoid panic if we're running with the race detector
+		// and instead spawn a goroutine that periodically resets
+		// this value back to the original to induce a race.
+		panic("detected mutation on the default bytes")
+	}
+	return dv.val
+}
diff --git a/internal/filedesc/desc_init.go b/internal/filedesc/desc_init.go
new file mode 100644
index 0000000..03abf8f
--- /dev/null
+++ b/internal/filedesc/desc_init.go
@@ -0,0 +1,390 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package filedesc
+
+import (
+	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/internal/fieldnum"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// fileRaw is a data struct used when initializing a file descriptor from
+// a raw FileDescriptorProto.
+type fileRaw struct {
+	builder       DescBuilder
+	allEnums      []Enum
+	allMessages   []Message
+	allExtensions []Extension
+	allServices   []Service
+}
+
+func newRawFile(db DescBuilder) *File {
+	fd := &File{fileRaw: fileRaw{builder: db}}
+	fd.initDecls(db.NumEnums, db.NumMessages, db.NumExtensions, db.NumServices)
+	fd.unmarshalSeed(db.RawDescriptor)
+
+	// Extended message targets are eagerly resolved since registration
+	// needs this information at program init time.
+	for i := range fd.allExtensions {
+		xd := &fd.allExtensions[i]
+		xd.L1.Extendee = fd.resolveMessageDependency(xd.L1.Extendee, listExtTargets, int32(i))
+	}
+
+	fd.checkDecls()
+	return fd
+}
+
+// initDecls pre-allocates slices for the exact number of enums, messages
+// (including map entries), extensions, and services declared in the proto file.
+// This is done to avoid regrowing the slice, which would change the address
+// for any previously seen declaration.
+//
+// The alloc methods "allocates" slices by pulling from the capacity.
+func (fd *File) initDecls(numEnums, numMessages, numExtensions, numServices int32) {
+	fd.allEnums = make([]Enum, 0, numEnums)
+	fd.allMessages = make([]Message, 0, numMessages)
+	fd.allExtensions = make([]Extension, 0, numExtensions)
+	fd.allServices = make([]Service, 0, numServices)
+}
+
+func (fd *File) allocEnums(n int) []Enum {
+	total := len(fd.allEnums)
+	es := fd.allEnums[total : total+n]
+	fd.allEnums = fd.allEnums[:total+n]
+	return es
+}
+func (fd *File) allocMessages(n int) []Message {
+	total := len(fd.allMessages)
+	ms := fd.allMessages[total : total+n]
+	fd.allMessages = fd.allMessages[:total+n]
+	return ms
+}
+func (fd *File) allocExtensions(n int) []Extension {
+	total := len(fd.allExtensions)
+	xs := fd.allExtensions[total : total+n]
+	fd.allExtensions = fd.allExtensions[:total+n]
+	return xs
+}
+func (fd *File) allocServices(n int) []Service {
+	total := len(fd.allServices)
+	xs := fd.allServices[total : total+n]
+	fd.allServices = fd.allServices[:total+n]
+	return xs
+}
+
+// checkDecls performs a sanity check that the expected number of expected
+// declarations matches the number that were found in the descriptor proto.
+func (fd *File) checkDecls() {
+	switch {
+	case len(fd.allEnums) != cap(fd.allEnums):
+	case len(fd.allMessages) != cap(fd.allMessages):
+	case len(fd.allExtensions) != cap(fd.allExtensions):
+	case len(fd.allServices) != cap(fd.allServices):
+	default:
+		return
+	}
+	panic("mismatching cardinality")
+}
+
+func (fd *File) unmarshalSeed(b []byte) {
+	nb := getNameBuilder()
+	defer putNameBuilder(nb)
+
+	var prevField pref.FieldNumber
+	var numEnums, numMessages, numExtensions, numServices int
+	var posEnums, posMessages, posExtensions, posServices int
+	b0 := b
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FileDescriptorProto_Syntax:
+				switch string(v) {
+				case "proto2":
+					fd.L1.Syntax = pref.Proto2
+				case "proto3":
+					fd.L1.Syntax = pref.Proto3
+				default:
+					panic("invalid syntax")
+				}
+			case fieldnum.FileDescriptorProto_Name:
+				fd.L1.Path = nb.MakeString(v)
+			case fieldnum.FileDescriptorProto_Package:
+				fd.L1.Package = pref.FullName(nb.MakeString(v))
+			case fieldnum.FileDescriptorProto_EnumType:
+				if prevField != fieldnum.FileDescriptorProto_EnumType {
+					if numEnums > 0 {
+						panic("non-contiguous repeated field")
+					}
+					posEnums = len(b0) - len(b) - n - m
+				}
+				numEnums++
+			case fieldnum.FileDescriptorProto_MessageType:
+				if prevField != fieldnum.FileDescriptorProto_MessageType {
+					if numMessages > 0 {
+						panic("non-contiguous repeated field")
+					}
+					posMessages = len(b0) - len(b) - n - m
+				}
+				numMessages++
+			case fieldnum.FileDescriptorProto_Extension:
+				if prevField != fieldnum.FileDescriptorProto_Extension {
+					if numExtensions > 0 {
+						panic("non-contiguous repeated field")
+					}
+					posExtensions = len(b0) - len(b) - n - m
+				}
+				numExtensions++
+			case fieldnum.FileDescriptorProto_Service:
+				if prevField != fieldnum.FileDescriptorProto_Service {
+					if numServices > 0 {
+						panic("non-contiguous repeated field")
+					}
+					posServices = len(b0) - len(b) - n - m
+				}
+				numServices++
+			}
+			prevField = num
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+			prevField = -1 // ignore known field numbers of unknown wire type
+		}
+	}
+
+	// If syntax is missing, it is assumed to be proto2.
+	if fd.L1.Syntax == 0 {
+		fd.L1.Syntax = pref.Proto2
+	}
+
+	// Must allocate all declarations before parsing each descriptor type
+	// to ensure we handled all descriptors in "flattened ordering".
+	if numEnums > 0 {
+		fd.L1.Enums.List = fd.allocEnums(numEnums)
+	}
+	if numMessages > 0 {
+		fd.L1.Messages.List = fd.allocMessages(numMessages)
+	}
+	if numExtensions > 0 {
+		fd.L1.Extensions.List = fd.allocExtensions(numExtensions)
+	}
+	if numServices > 0 {
+		fd.L1.Services.List = fd.allocServices(numServices)
+	}
+
+	if numEnums > 0 {
+		b := b0[posEnums:]
+		for i := range fd.L1.Enums.List {
+			_, n := wire.ConsumeVarint(b)
+			v, m := wire.ConsumeBytes(b[n:])
+			fd.L1.Enums.List[i].unmarshalSeed(v, nb, fd, fd, i)
+			b = b[n+m:]
+		}
+	}
+	if numMessages > 0 {
+		b := b0[posMessages:]
+		for i := range fd.L1.Messages.List {
+			_, n := wire.ConsumeVarint(b)
+			v, m := wire.ConsumeBytes(b[n:])
+			fd.L1.Messages.List[i].unmarshalSeed(v, nb, fd, fd, i)
+			b = b[n+m:]
+		}
+	}
+	if numExtensions > 0 {
+		b := b0[posExtensions:]
+		for i := range fd.L1.Extensions.List {
+			_, n := wire.ConsumeVarint(b)
+			v, m := wire.ConsumeBytes(b[n:])
+			fd.L1.Extensions.List[i].unmarshalSeed(v, nb, fd, fd, i)
+			b = b[n+m:]
+		}
+	}
+	if numServices > 0 {
+		b := b0[posServices:]
+		for i := range fd.L1.Services.List {
+			_, n := wire.ConsumeVarint(b)
+			v, m := wire.ConsumeBytes(b[n:])
+			fd.L1.Services.List[i].unmarshalSeed(v, nb, fd, fd, i)
+			b = b[n+m:]
+		}
+	}
+}
+
+func (ed *Enum) unmarshalSeed(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	ed.L0.ParentFile = pf
+	ed.L0.Parent = pd
+	ed.L0.Index = i
+
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.EnumDescriptorProto_Name:
+				ed.L0.FullName = nb.AppendFullName(pd.FullName(), v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+}
+
+func (md *Message) unmarshalSeed(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	md.L0.ParentFile = pf
+	md.L0.Parent = pd
+	md.L0.Index = i
+
+	var prevField pref.FieldNumber
+	var numEnums, numMessages, numExtensions int
+	var posEnums, posMessages, posExtensions int
+	b0 := b
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.DescriptorProto_Name:
+				md.L0.FullName = nb.AppendFullName(pd.FullName(), v)
+			case fieldnum.DescriptorProto_EnumType:
+				if prevField != fieldnum.DescriptorProto_EnumType {
+					if numEnums > 0 {
+						panic("non-contiguous repeated field")
+					}
+					posEnums = len(b0) - len(b) - n - m
+				}
+				numEnums++
+			case fieldnum.DescriptorProto_NestedType:
+				if prevField != fieldnum.DescriptorProto_NestedType {
+					if numMessages > 0 {
+						panic("non-contiguous repeated field")
+					}
+					posMessages = len(b0) - len(b) - n - m
+				}
+				numMessages++
+			case fieldnum.DescriptorProto_Extension:
+				if prevField != fieldnum.DescriptorProto_Extension {
+					if numExtensions > 0 {
+						panic("non-contiguous repeated field")
+					}
+					posExtensions = len(b0) - len(b) - n - m
+				}
+				numExtensions++
+			}
+			prevField = num
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+			prevField = -1 // ignore known field numbers of unknown wire type
+		}
+	}
+
+	// Must allocate all declarations before parsing each descriptor type
+	// to ensure we handled all descriptors in "flattened ordering".
+	if numEnums > 0 {
+		md.L1.Enums.List = pf.allocEnums(numEnums)
+	}
+	if numMessages > 0 {
+		md.L1.Messages.List = pf.allocMessages(numMessages)
+	}
+	if numExtensions > 0 {
+		md.L1.Extensions.List = pf.allocExtensions(numExtensions)
+	}
+
+	if numEnums > 0 {
+		b := b0[posEnums:]
+		for i := range md.L1.Enums.List {
+			_, n := wire.ConsumeVarint(b)
+			v, m := wire.ConsumeBytes(b[n:])
+			md.L1.Enums.List[i].unmarshalSeed(v, nb, pf, md, i)
+			b = b[n+m:]
+		}
+	}
+	if numMessages > 0 {
+		b := b0[posMessages:]
+		for i := range md.L1.Messages.List {
+			_, n := wire.ConsumeVarint(b)
+			v, m := wire.ConsumeBytes(b[n:])
+			md.L1.Messages.List[i].unmarshalSeed(v, nb, pf, md, i)
+			b = b[n+m:]
+		}
+	}
+	if numExtensions > 0 {
+		b := b0[posExtensions:]
+		for i := range md.L1.Extensions.List {
+			_, n := wire.ConsumeVarint(b)
+			v, m := wire.ConsumeBytes(b[n:])
+			md.L1.Extensions.List[i].unmarshalSeed(v, nb, pf, md, i)
+			b = b[n+m:]
+		}
+	}
+}
+
+func (xd *Extension) unmarshalSeed(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	xd.L0.ParentFile = pf
+	xd.L0.Parent = pd
+	xd.L0.Index = i
+
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldDescriptorProto_Number:
+				xd.L1.Number = pref.FieldNumber(v)
+			case fieldnum.FieldDescriptorProto_Type:
+				xd.L1.Kind = pref.Kind(v)
+			}
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldDescriptorProto_Name:
+				xd.L0.FullName = nb.AppendFullName(pd.FullName(), v)
+			case fieldnum.FieldDescriptorProto_Extendee:
+				xd.L1.Extendee = PlaceholderMessage(nb.MakeFullName(v))
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+}
+
+func (sd *Service) unmarshalSeed(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	sd.L0.ParentFile = pf
+	sd.L0.Parent = pd
+	sd.L0.Index = i
+
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.ServiceDescriptorProto_Name:
+				sd.L0.FullName = nb.AppendFullName(pd.FullName(), v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+}
diff --git a/internal/filedesc/desc_lazy.go b/internal/filedesc/desc_lazy.go
new file mode 100644
index 0000000..8b8ab5a
--- /dev/null
+++ b/internal/filedesc/desc_lazy.go
@@ -0,0 +1,686 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package filedesc
+
+import (
+	"reflect"
+
+	"google.golang.org/protobuf/internal/descopts"
+	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/internal/fieldnum"
+	"google.golang.org/protobuf/proto"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+func (fd *File) lazyRawInit() {
+	fd.unmarshalFull(fd.builder.RawDescriptor)
+	fd.resolveMessages()
+	fd.resolveExtensions()
+	fd.resolveServices()
+}
+
+func (file *File) resolveMessages() {
+	var depIdx int32
+	for i := range file.allMessages {
+		md := &file.allMessages[i]
+
+		// Resolve message field dependencies.
+		for j := range md.L2.Fields.List {
+			fd := &md.L2.Fields.List[j]
+
+			// Weak fields are only resolved by name.
+			if fd.L1.IsWeak {
+				r := file.builder.FileRegistry
+				if md, _ := r.FindMessageByName(fd.L1.Message.FullName()); md != nil {
+					fd.L1.Message = md
+				}
+				continue
+			}
+
+			// Resolve message field dependency.
+			switch fd.L1.Kind {
+			case pref.EnumKind:
+				fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx)
+				depIdx++
+			case pref.MessageKind, pref.GroupKind:
+				fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx)
+				depIdx++
+			}
+
+			// Default is resolved here since it depends on Enum being resolved.
+			if v := fd.L1.Default.val; v.IsValid() {
+				fd.L1.Default = unmarshalDefault(v.Bytes(), fd.L1.Kind, file, fd.L1.Enum)
+			}
+		}
+	}
+}
+
+func (file *File) resolveExtensions() {
+	var depIdx int32
+	for i := range file.allExtensions {
+		xd := &file.allExtensions[i]
+
+		// Resolve extension field dependency.
+		switch xd.L1.Kind {
+		case pref.EnumKind:
+			xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx)
+			depIdx++
+		case pref.MessageKind, pref.GroupKind:
+			xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx)
+			depIdx++
+		}
+
+		// Default is resolved here since it depends on Enum being resolved.
+		if v := xd.L2.Default.val; v.IsValid() {
+			xd.L2.Default = unmarshalDefault(v.Bytes(), xd.L1.Kind, file, xd.L2.Enum)
+		}
+	}
+}
+
+func (file *File) resolveServices() {
+	var depIdx int32
+	for i := range file.allServices {
+		sd := &file.allServices[i]
+
+		// Resolve method dependencies.
+		for j := range sd.L2.Methods.List {
+			md := &sd.L2.Methods.List[j]
+			md.L1.Input = file.resolveMessageDependency(md.L1.Input, listMethInDeps, depIdx)
+			md.L1.Output = file.resolveMessageDependency(md.L1.Output, listMethOutDeps, depIdx)
+			depIdx++
+		}
+	}
+}
+
+func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref.EnumDescriptor {
+	r := file.builder.FileRegistry
+	if r, ok := r.(resolverByIndex); ok {
+		if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil {
+			return ed2
+		}
+	}
+	for i := range file.allEnums {
+		if ed2 := &file.allEnums[i]; ed2.L0.FullName == ed.FullName() {
+			return ed2
+		}
+	}
+	if ed2, _ := r.FindEnumByName(ed.FullName()); ed2 != nil {
+		return ed2
+	}
+	return ed
+}
+
+func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32) pref.MessageDescriptor {
+	r := file.builder.FileRegistry
+	if r, ok := r.(resolverByIndex); ok {
+		if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil {
+			return md2
+		}
+	}
+	for i := range file.allMessages {
+		if md2 := &file.allMessages[i]; md2.L0.FullName == md.FullName() {
+			return md2
+		}
+	}
+	if md2, _ := r.FindMessageByName(md.FullName()); md2 != nil {
+		return md2
+	}
+	return md
+}
+
+func (fd *File) unmarshalFull(b []byte) {
+	nb := getNameBuilder()
+	defer putNameBuilder(nb)
+
+	var enumIdx, messageIdx, extensionIdx, serviceIdx int
+	var rawOptions []byte
+	fd.L2 = new(FileL2)
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FileDescriptorProto_PublicDependency:
+				fd.L2.Imports[v].IsPublic = true
+			case fieldnum.FileDescriptorProto_WeakDependency:
+				fd.L2.Imports[v].IsWeak = true
+			}
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FileDescriptorProto_Dependency:
+				path := nb.MakeString(v)
+				imp, _ := fd.builder.FileRegistry.FindFileByPath(path)
+				if imp == nil {
+					imp = PlaceholderFile(path)
+				}
+				fd.L2.Imports = append(fd.L2.Imports, pref.FileImport{FileDescriptor: imp})
+			case fieldnum.FileDescriptorProto_EnumType:
+				fd.L1.Enums.List[enumIdx].unmarshalFull(v, nb)
+				enumIdx++
+			case fieldnum.FileDescriptorProto_MessageType:
+				fd.L1.Messages.List[messageIdx].unmarshalFull(v, nb)
+				messageIdx++
+			case fieldnum.FileDescriptorProto_Extension:
+				fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, nb)
+				extensionIdx++
+			case fieldnum.FileDescriptorProto_Service:
+				fd.L1.Services.List[serviceIdx].unmarshalFull(v, nb)
+				serviceIdx++
+			case fieldnum.FileDescriptorProto_Options:
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	fd.L2.Options = fd.builder.optionsUnmarshaler(descopts.File, rawOptions)
+}
+
+func (ed *Enum) unmarshalFull(b []byte, nb *nameBuilder) {
+	var rawValues [][]byte
+	var rawOptions []byte
+	ed.L2 = new(EnumL2)
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.EnumDescriptorProto_Value:
+				rawValues = append(rawValues, v)
+			case fieldnum.EnumDescriptorProto_ReservedName:
+				ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, pref.Name(nb.MakeString(v)))
+			case fieldnum.EnumDescriptorProto_ReservedRange:
+				ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v))
+			case fieldnum.EnumDescriptorProto_Options:
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	if len(rawValues) > 0 {
+		ed.L2.Values.List = make([]EnumValue, len(rawValues))
+		for i, b := range rawValues {
+			ed.L2.Values.List[i].unmarshalFull(b, nb, ed.L0.ParentFile, ed, i)
+		}
+	}
+	ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(descopts.Enum, rawOptions)
+}
+
+func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) {
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.EnumDescriptorProto_EnumReservedRange_Start:
+				r[0] = pref.EnumNumber(v)
+			case fieldnum.EnumDescriptorProto_EnumReservedRange_End:
+				r[1] = pref.EnumNumber(v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	return r
+}
+
+func (vd *EnumValue) unmarshalFull(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	vd.L0.ParentFile = pf
+	vd.L0.Parent = pd
+	vd.L0.Index = i
+
+	var rawOptions []byte
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.EnumValueDescriptorProto_Number:
+				vd.L1.Number = pref.EnumNumber(v)
+			}
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.EnumValueDescriptorProto_Name:
+				// NOTE: Enum values are in the same scope as the enum parent.
+				vd.L0.FullName = nb.AppendFullName(pd.Parent().FullName(), v)
+			case fieldnum.EnumValueDescriptorProto_Options:
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	vd.L1.Options = pf.builder.optionsUnmarshaler(descopts.EnumValue, rawOptions)
+}
+
+func (md *Message) unmarshalFull(b []byte, nb *nameBuilder) {
+	var rawFields, rawOneofs [][]byte
+	var enumIdx, messageIdx, extensionIdx int
+	var rawOptions []byte
+	md.L2 = new(MessageL2)
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.DescriptorProto_Field:
+				rawFields = append(rawFields, v)
+			case fieldnum.DescriptorProto_OneofDecl:
+				rawOneofs = append(rawOneofs, v)
+			case fieldnum.DescriptorProto_ReservedName:
+				md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, pref.Name(nb.MakeString(v)))
+			case fieldnum.DescriptorProto_ReservedRange:
+				md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v))
+			case fieldnum.DescriptorProto_ExtensionRange:
+				r, rawOptions := unmarshalMessageExtensionRange(v)
+				opts := md.L0.ParentFile.builder.optionsUnmarshaler(descopts.ExtensionRange, rawOptions)
+				md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r)
+				md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts)
+			case fieldnum.DescriptorProto_EnumType:
+				md.L1.Enums.List[enumIdx].unmarshalFull(v, nb)
+				enumIdx++
+			case fieldnum.DescriptorProto_NestedType:
+				md.L1.Messages.List[messageIdx].unmarshalFull(v, nb)
+				messageIdx++
+			case fieldnum.DescriptorProto_Extension:
+				md.L1.Extensions.List[extensionIdx].unmarshalFull(v, nb)
+				extensionIdx++
+			case fieldnum.DescriptorProto_Options:
+				md.unmarshalOptions(v)
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	if len(rawFields) > 0 || len(rawOneofs) > 0 {
+		md.L2.Fields.List = make([]Field, len(rawFields))
+		md.L2.Oneofs.List = make([]Oneof, len(rawOneofs))
+		for i, b := range rawFields {
+			fd := &md.L2.Fields.List[i]
+			fd.unmarshalFull(b, nb, md.L0.ParentFile, md, i)
+			if fd.L1.Cardinality == pref.Required {
+				md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number)
+			}
+		}
+		for i, b := range rawOneofs {
+			od := &md.L2.Oneofs.List[i]
+			od.unmarshalFull(b, nb, md.L0.ParentFile, md, i)
+		}
+	}
+	md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(descopts.Message, rawOptions)
+}
+
+func (md *Message) unmarshalOptions(b []byte) {
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.MessageOptions_MapEntry:
+				md.L2.IsMapEntry = wire.DecodeBool(v)
+			case fieldnum.MessageOptions_MessageSetWireFormat:
+				md.L2.IsMessageSet = wire.DecodeBool(v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+}
+
+func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) {
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.DescriptorProto_ReservedRange_Start:
+				r[0] = pref.FieldNumber(v)
+			case fieldnum.DescriptorProto_ReservedRange_End:
+				r[1] = pref.FieldNumber(v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	return r
+}
+
+func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions []byte) {
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.DescriptorProto_ExtensionRange_Start:
+				r[0] = pref.FieldNumber(v)
+			case fieldnum.DescriptorProto_ExtensionRange_End:
+				r[1] = pref.FieldNumber(v)
+			}
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.DescriptorProto_ExtensionRange_Options:
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	return r, rawOptions
+}
+
+func (fd *Field) unmarshalFull(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	fd.L0.ParentFile = pf
+	fd.L0.Parent = pd
+	fd.L0.Index = i
+
+	var rawTypeName []byte
+	var rawOptions []byte
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldDescriptorProto_Number:
+				fd.L1.Number = pref.FieldNumber(v)
+			case fieldnum.FieldDescriptorProto_Label:
+				fd.L1.Cardinality = pref.Cardinality(v)
+			case fieldnum.FieldDescriptorProto_Type:
+				fd.L1.Kind = pref.Kind(v)
+			case fieldnum.FieldDescriptorProto_OneofIndex:
+				// In Message.unmarshalFull, we allocate slices for both
+				// the field and oneof descriptors before unmarshaling either
+				// of them. This ensures pointers to slice elements are stable.
+				od := &pd.(*Message).L2.Oneofs.List[v]
+				od.L1.Fields.List = append(od.L1.Fields.List, fd)
+				if fd.L1.ContainingOneof != nil {
+					panic("oneof type already set")
+				}
+				fd.L1.ContainingOneof = od
+			}
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldDescriptorProto_Name:
+				fd.L0.FullName = nb.AppendFullName(pd.FullName(), v)
+			case fieldnum.FieldDescriptorProto_JsonName:
+				fd.L1.JSONName = JSONName(nb.MakeString(v))
+			case fieldnum.FieldDescriptorProto_DefaultValue:
+				fd.L1.Default.val = pref.ValueOf(v) // temporarily store as bytes; later resolved in resolveMessages
+			case fieldnum.FieldDescriptorProto_TypeName:
+				rawTypeName = v
+			case fieldnum.FieldDescriptorProto_Options:
+				fd.unmarshalOptions(v)
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	if rawTypeName != nil {
+		name := nb.MakeFullName(rawTypeName)
+		switch fd.L1.Kind {
+		case pref.EnumKind:
+			fd.L1.Enum = PlaceholderEnum(name)
+		case pref.MessageKind, pref.GroupKind:
+			fd.L1.Message = PlaceholderMessage(name)
+		}
+	}
+	fd.L1.Options = pf.builder.optionsUnmarshaler(descopts.Field, rawOptions)
+}
+
+func (fd *Field) unmarshalOptions(b []byte) {
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldOptions_Packed:
+				fd.L1.HasPacked = true
+				fd.L1.IsPacked = wire.DecodeBool(v)
+			case fieldnum.FieldOptions_Weak:
+				fd.L1.IsWeak = wire.DecodeBool(v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+}
+
+func (od *Oneof) unmarshalFull(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	od.L0.ParentFile = pf
+	od.L0.Parent = pd
+	od.L0.Index = i
+
+	var rawOptions []byte
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.OneofDescriptorProto_Name:
+				od.L0.FullName = nb.AppendFullName(pd.FullName(), v)
+			case fieldnum.OneofDescriptorProto_Options:
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	od.L1.Options = pf.builder.optionsUnmarshaler(descopts.Oneof, rawOptions)
+}
+
+func (xd *Extension) unmarshalFull(b []byte, nb *nameBuilder) {
+	var rawTypeName []byte
+	var rawOptions []byte
+	xd.L2 = new(ExtensionL2)
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldDescriptorProto_Label:
+				xd.L2.Cardinality = pref.Cardinality(v)
+			}
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldDescriptorProto_JsonName:
+				xd.L2.JSONName = JSONName(nb.MakeString(v))
+			case fieldnum.FieldDescriptorProto_DefaultValue:
+				xd.L2.Default.val = pref.ValueOf(v) // temporarily store as bytes; later resolved in resolveExtensions
+			case fieldnum.FieldDescriptorProto_TypeName:
+				rawTypeName = v
+			case fieldnum.FieldDescriptorProto_Options:
+				xd.unmarshalOptions(v)
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	if rawTypeName != nil {
+		name := nb.MakeFullName(rawTypeName)
+		switch xd.L1.Kind {
+		case pref.EnumKind:
+			xd.L2.Enum = PlaceholderEnum(name)
+		case pref.MessageKind, pref.GroupKind:
+			xd.L2.Message = PlaceholderMessage(name)
+		}
+	}
+	xd.L2.Options = xd.L0.ParentFile.builder.optionsUnmarshaler(descopts.Field, rawOptions)
+}
+
+func (xd *Extension) unmarshalOptions(b []byte) {
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.FieldOptions_Packed:
+				xd.L2.IsPacked = wire.DecodeBool(v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+}
+
+func (sd *Service) unmarshalFull(b []byte, nb *nameBuilder) {
+	var rawMethods [][]byte
+	var rawOptions []byte
+	sd.L2 = new(ServiceL2)
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.ServiceDescriptorProto_Method:
+				rawMethods = append(rawMethods, v)
+			case fieldnum.ServiceDescriptorProto_Options:
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	if len(rawMethods) > 0 {
+		sd.L2.Methods.List = make([]Method, len(rawMethods))
+		for i, b := range rawMethods {
+			sd.L2.Methods.List[i].unmarshalFull(b, nb, sd.L0.ParentFile, sd, i)
+		}
+	}
+	sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(descopts.Service, rawOptions)
+}
+
+func (md *Method) unmarshalFull(b []byte, nb *nameBuilder, pf *File, pd pref.Descriptor, i int) {
+	md.L0.ParentFile = pf
+	md.L0.Parent = pd
+	md.L0.Index = i
+
+	var rawOptions []byte
+	for len(b) > 0 {
+		num, typ, n := wire.ConsumeTag(b)
+		b = b[n:]
+		switch typ {
+		case wire.VarintType:
+			v, m := wire.ConsumeVarint(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.MethodDescriptorProto_ClientStreaming:
+				md.L1.IsStreamingClient = wire.DecodeBool(v)
+			case fieldnum.MethodDescriptorProto_ServerStreaming:
+				md.L1.IsStreamingServer = wire.DecodeBool(v)
+			}
+		case wire.BytesType:
+			v, m := wire.ConsumeBytes(b)
+			b = b[m:]
+			switch num {
+			case fieldnum.MethodDescriptorProto_Name:
+				md.L0.FullName = nb.AppendFullName(pd.FullName(), v)
+			case fieldnum.MethodDescriptorProto_InputType:
+				md.L1.Input = PlaceholderMessage(nb.MakeFullName(v))
+			case fieldnum.MethodDescriptorProto_OutputType:
+				md.L1.Output = PlaceholderMessage(nb.MakeFullName(v))
+			case fieldnum.MethodDescriptorProto_Options:
+				rawOptions = appendOptions(rawOptions, v)
+			}
+		default:
+			m := wire.ConsumeFieldValue(num, typ, b)
+			b = b[m:]
+		}
+	}
+	md.L1.Options = pf.builder.optionsUnmarshaler(descopts.Method, rawOptions)
+}
+
+// appendOptions appends src to dst, where the returned slice is never nil.
+// This is necessary to distinguish between empty and unpopulated options.
+func appendOptions(dst, src []byte) []byte {
+	if dst == nil {
+		dst = []byte{}
+	}
+	return append(dst, src...)
+}
+
+func (db *DescBuilder) optionsUnmarshaler(p pref.ProtoMessage, b []byte) func() pref.ProtoMessage {
+	if b == nil {
+		return nil
+	}
+	return func() pref.ProtoMessage {
+		p := reflect.New(reflect.TypeOf(p).Elem()).Interface().(pref.ProtoMessage)
+		if err := (proto.UnmarshalOptions{
+			AllowPartial: true,
+			Resolver:     db.TypeResolver,
+		}).Unmarshal(b, p); err != nil {
+			panic(err)
+		}
+		return p
+	}
+}
diff --git a/internal/filedesc/desc_list.go b/internal/filedesc/desc_list.go
new file mode 100644
index 0000000..bbded60
--- /dev/null
+++ b/internal/filedesc/desc_list.go
@@ -0,0 +1,189 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package filedesc
+
+import (
+	"fmt"
+	"sort"
+	"sync"
+
+	"google.golang.org/protobuf/internal/descfmt"
+	"google.golang.org/protobuf/internal/pragma"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+type FileImports []pref.FileImport
+
+func (p *FileImports) Len() int                            { return len(*p) }
+func (p *FileImports) Get(i int) pref.FileImport           { return (*p)[i] }
+func (p *FileImports) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
+func (p *FileImports) ProtoInternal(pragma.DoNotImplement) {}
+
+type Names struct {
+	List []pref.Name
+	once sync.Once
+	has  map[pref.Name]struct{} // protected by once
+}
+
+func (p *Names) Len() int            { return len(p.List) }
+func (p *Names) Get(i int) pref.Name { return p.List[i] }
+func (p *Names) Has(s pref.Name) bool {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.has = make(map[pref.Name]struct{}, len(p.List))
+			for _, s := range p.List {
+				p.has[s] = struct{}{}
+			}
+		}
+	})
+	_, ok := p.has[s]
+	return ok
+}
+func (p *Names) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
+func (p *Names) ProtoInternal(pragma.DoNotImplement) {}
+
+type EnumRanges struct {
+	List   [][2]pref.EnumNumber // start inclusive; end inclusive
+	once   sync.Once
+	sorted [][2]pref.EnumNumber         // protected by once
+	has    map[pref.EnumNumber]struct{} // protected by once
+}
+
+func (p *EnumRanges) Len() int                     { return len(p.List) }
+func (p *EnumRanges) Get(i int) [2]pref.EnumNumber { return p.List[i] }
+func (p *EnumRanges) Has(n pref.EnumNumber) bool {
+	p.once.Do(func() {
+		for _, r := range p.List {
+			if r[0] == r[1]-0 {
+				if p.has == nil {
+					p.has = make(map[pref.EnumNumber]struct{}, len(p.List))
+				}
+				p.has[r[0]] = struct{}{}
+			} else {
+				p.sorted = append(p.sorted, r)
+			}
+		}
+		sort.Slice(p.sorted, func(i, j int) bool {
+			return p.sorted[i][0] < p.sorted[j][0]
+		})
+	})
+	if _, ok := p.has[n]; ok {
+		return true
+	}
+	for ls := p.sorted; len(ls) > 0; {
+		i := len(ls) / 2
+		switch r := ls[i]; {
+		case n < r[0]:
+			ls = ls[:i] // search lower
+		case n > r[1]:
+			ls = ls[i+1:] // search upper
+		default:
+			return true
+		}
+	}
+	return false
+}
+func (p *EnumRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
+func (p *EnumRanges) ProtoInternal(pragma.DoNotImplement) {}
+
+type FieldRanges struct {
+	List   [][2]pref.FieldNumber // start inclusive; end exclusive
+	once   sync.Once
+	sorted [][2]pref.FieldNumber         // protected by once
+	has    map[pref.FieldNumber]struct{} // protected by once
+}
+
+func (p *FieldRanges) Len() int                      { return len(p.List) }
+func (p *FieldRanges) Get(i int) [2]pref.FieldNumber { return p.List[i] }
+func (p *FieldRanges) Has(n pref.FieldNumber) bool {
+	p.once.Do(func() {
+		for _, r := range p.List {
+			if r[0] == r[1]-1 {
+				if p.has == nil {
+					p.has = make(map[pref.FieldNumber]struct{}, len(p.List))
+				}
+				p.has[r[0]] = struct{}{}
+			} else {
+				p.sorted = append(p.sorted, r)
+			}
+		}
+		sort.Slice(p.sorted, func(i, j int) bool {
+			return p.sorted[i][0] < p.sorted[j][0]
+		})
+	})
+	if _, ok := p.has[n]; ok {
+		return true
+	}
+	for ls := p.sorted; len(ls) > 0; {
+		i := len(ls) / 2
+		switch r := ls[i]; {
+		case n < r[0]:
+			ls = ls[:i] // search lower
+		case n >= r[1]:
+			ls = ls[i+1:] // search higher
+		default:
+			return true
+		}
+	}
+	return false
+}
+func (p *FieldRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
+func (p *FieldRanges) ProtoInternal(pragma.DoNotImplement) {}
+
+type FieldNumbers struct {
+	List []pref.FieldNumber
+	once sync.Once
+	has  map[pref.FieldNumber]struct{} // protected by once
+}
+
+func (p *FieldNumbers) Len() int                   { return len(p.List) }
+func (p *FieldNumbers) Get(i int) pref.FieldNumber { return p.List[i] }
+func (p *FieldNumbers) Has(n pref.FieldNumber) bool {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.has = make(map[pref.FieldNumber]struct{}, len(p.List))
+			for _, n := range p.List {
+				p.has[n] = struct{}{}
+			}
+		}
+	})
+	_, ok := p.has[n]
+	return ok
+}
+func (p *FieldNumbers) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
+func (p *FieldNumbers) ProtoInternal(pragma.DoNotImplement) {}
+
+type OneofFields struct {
+	List   []pref.FieldDescriptor
+	once   sync.Once
+	byName map[pref.Name]pref.FieldDescriptor        // protected by once
+	byJSON map[string]pref.FieldDescriptor           // protected by once
+	byNum  map[pref.FieldNumber]pref.FieldDescriptor // protected by once
+}
+
+func (p *OneofFields) Len() int                                         { return len(p.List) }
+func (p *OneofFields) Get(i int) pref.FieldDescriptor                   { return p.List[i] }
+func (p *OneofFields) ByName(s pref.Name) pref.FieldDescriptor          { return p.lazyInit().byName[s] }
+func (p *OneofFields) ByJSONName(s string) pref.FieldDescriptor         { return p.lazyInit().byJSON[s] }
+func (p *OneofFields) ByNumber(n pref.FieldNumber) pref.FieldDescriptor { return p.lazyInit().byNum[n] }
+func (p *OneofFields) Format(s fmt.State, r rune)                       { descfmt.FormatList(s, r, p) }
+func (p *OneofFields) ProtoInternal(pragma.DoNotImplement)              {}
+
+func (p *OneofFields) lazyInit() *OneofFields {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[pref.Name]pref.FieldDescriptor, len(p.List))
+			p.byJSON = make(map[string]pref.FieldDescriptor, len(p.List))
+			p.byNum = make(map[pref.FieldNumber]pref.FieldDescriptor, len(p.List))
+			for _, f := range p.List {
+				// Field names and numbers are guaranteed to be unique.
+				p.byName[f.Name()] = f
+				p.byJSON[f.JSONName()] = f
+				p.byNum[f.Number()] = f
+			}
+		}
+	})
+	return p
+}
diff --git a/internal/filedesc/desc_list_gen.go b/internal/filedesc/desc_list_gen.go
new file mode 100644
index 0000000..d875920
--- /dev/null
+++ b/internal/filedesc/desc_list_gen.go
@@ -0,0 +1,345 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style.
+// license that can be found in the LICENSE file.
+
+// Code generated by generate-types. DO NOT EDIT.
+
+package filedesc
+
+import (
+	"fmt"
+	"sync"
+
+	"google.golang.org/protobuf/internal/descfmt"
+	"google.golang.org/protobuf/internal/pragma"
+	"google.golang.org/protobuf/reflect/protoreflect"
+)
+
+type Enums struct {
+	List   []Enum
+	once   sync.Once
+	byName map[protoreflect.Name]*Enum // protected by once
+}
+
+func (p *Enums) Len() int {
+	return len(p.List)
+}
+func (p *Enums) Get(i int) protoreflect.EnumDescriptor {
+	return &p.List[i]
+}
+func (p *Enums) ByName(s protoreflect.Name) protoreflect.EnumDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Enums) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *Enums) ProtoInternal(pragma.DoNotImplement) {}
+func (p *Enums) lazyInit() *Enums {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*Enum, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+			}
+		}
+	})
+	return p
+}
+
+type EnumValues struct {
+	List   []EnumValue
+	once   sync.Once
+	byName map[protoreflect.Name]*EnumValue       // protected by once
+	byNum  map[protoreflect.EnumNumber]*EnumValue // protected by once
+}
+
+func (p *EnumValues) Len() int {
+	return len(p.List)
+}
+func (p *EnumValues) Get(i int) protoreflect.EnumValueDescriptor {
+	return &p.List[i]
+}
+func (p *EnumValues) ByName(s protoreflect.Name) protoreflect.EnumValueDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *EnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor {
+	if d := p.lazyInit().byNum[n]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *EnumValues) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *EnumValues) ProtoInternal(pragma.DoNotImplement) {}
+func (p *EnumValues) lazyInit() *EnumValues {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*EnumValue, len(p.List))
+			p.byNum = make(map[protoreflect.EnumNumber]*EnumValue, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+				if _, ok := p.byNum[d.Number()]; !ok {
+					p.byNum[d.Number()] = d
+				}
+			}
+		}
+	})
+	return p
+}
+
+type Messages struct {
+	List   []Message
+	once   sync.Once
+	byName map[protoreflect.Name]*Message // protected by once
+}
+
+func (p *Messages) Len() int {
+	return len(p.List)
+}
+func (p *Messages) Get(i int) protoreflect.MessageDescriptor {
+	return &p.List[i]
+}
+func (p *Messages) ByName(s protoreflect.Name) protoreflect.MessageDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Messages) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *Messages) ProtoInternal(pragma.DoNotImplement) {}
+func (p *Messages) lazyInit() *Messages {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*Message, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+			}
+		}
+	})
+	return p
+}
+
+type Fields struct {
+	List   []Field
+	once   sync.Once
+	byName map[protoreflect.Name]*Field        // protected by once
+	byJSON map[string]*Field                   // protected by once
+	byNum  map[protoreflect.FieldNumber]*Field // protected by once
+}
+
+func (p *Fields) Len() int {
+	return len(p.List)
+}
+func (p *Fields) Get(i int) protoreflect.FieldDescriptor {
+	return &p.List[i]
+}
+func (p *Fields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Fields) ByJSONName(s string) protoreflect.FieldDescriptor {
+	if d := p.lazyInit().byJSON[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Fields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor {
+	if d := p.lazyInit().byNum[n]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Fields) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *Fields) ProtoInternal(pragma.DoNotImplement) {}
+func (p *Fields) lazyInit() *Fields {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*Field, len(p.List))
+			p.byJSON = make(map[string]*Field, len(p.List))
+			p.byNum = make(map[protoreflect.FieldNumber]*Field, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+				if _, ok := p.byJSON[d.JSONName()]; !ok {
+					p.byJSON[d.JSONName()] = d
+				}
+				if _, ok := p.byNum[d.Number()]; !ok {
+					p.byNum[d.Number()] = d
+				}
+			}
+		}
+	})
+	return p
+}
+
+type Oneofs struct {
+	List   []Oneof
+	once   sync.Once
+	byName map[protoreflect.Name]*Oneof // protected by once
+}
+
+func (p *Oneofs) Len() int {
+	return len(p.List)
+}
+func (p *Oneofs) Get(i int) protoreflect.OneofDescriptor {
+	return &p.List[i]
+}
+func (p *Oneofs) ByName(s protoreflect.Name) protoreflect.OneofDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Oneofs) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *Oneofs) ProtoInternal(pragma.DoNotImplement) {}
+func (p *Oneofs) lazyInit() *Oneofs {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*Oneof, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+			}
+		}
+	})
+	return p
+}
+
+type Extensions struct {
+	List   []Extension
+	once   sync.Once
+	byName map[protoreflect.Name]*Extension // protected by once
+}
+
+func (p *Extensions) Len() int {
+	return len(p.List)
+}
+func (p *Extensions) Get(i int) protoreflect.ExtensionDescriptor {
+	return &p.List[i]
+}
+func (p *Extensions) ByName(s protoreflect.Name) protoreflect.ExtensionDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Extensions) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *Extensions) ProtoInternal(pragma.DoNotImplement) {}
+func (p *Extensions) lazyInit() *Extensions {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*Extension, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+			}
+		}
+	})
+	return p
+}
+
+type Services struct {
+	List   []Service
+	once   sync.Once
+	byName map[protoreflect.Name]*Service // protected by once
+}
+
+func (p *Services) Len() int {
+	return len(p.List)
+}
+func (p *Services) Get(i int) protoreflect.ServiceDescriptor {
+	return &p.List[i]
+}
+func (p *Services) ByName(s protoreflect.Name) protoreflect.ServiceDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Services) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *Services) ProtoInternal(pragma.DoNotImplement) {}
+func (p *Services) lazyInit() *Services {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*Service, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+			}
+		}
+	})
+	return p
+}
+
+type Methods struct {
+	List   []Method
+	once   sync.Once
+	byName map[protoreflect.Name]*Method // protected by once
+}
+
+func (p *Methods) Len() int {
+	return len(p.List)
+}
+func (p *Methods) Get(i int) protoreflect.MethodDescriptor {
+	return &p.List[i]
+}
+func (p *Methods) ByName(s protoreflect.Name) protoreflect.MethodDescriptor {
+	if d := p.lazyInit().byName[s]; d != nil {
+		return d
+	}
+	return nil
+}
+func (p *Methods) Format(s fmt.State, r rune) {
+	descfmt.FormatList(s, r, p)
+}
+func (p *Methods) ProtoInternal(pragma.DoNotImplement) {}
+func (p *Methods) lazyInit() *Methods {
+	p.once.Do(func() {
+		if len(p.List) > 0 {
+			p.byName = make(map[protoreflect.Name]*Method, len(p.List))
+			for i := range p.List {
+				d := &p.List[i]
+				if _, ok := p.byName[d.Name()]; !ok {
+					p.byName[d.Name()] = d
+				}
+			}
+		}
+	})
+	return p
+}
diff --git a/internal/prototype/type_test.go b/internal/filedesc/desc_test.go
similarity index 80%
rename from internal/prototype/type_test.go
rename to internal/filedesc/desc_test.go
index fb7aed1..b6e0f7d 100644
--- a/internal/prototype/type_test.go
+++ b/internal/filedesc/desc_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package prototype_test
+package filedesc_test
 
 import (
 	"fmt"
@@ -12,11 +12,11 @@
 	"strings"
 	"testing"
 
-	protoV1 "github.com/golang/protobuf/proto"
 	"github.com/google/go-cmp/cmp"
 	detrand "google.golang.org/protobuf/internal/detrand"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/internal/filedesc"
 	scalar "google.golang.org/protobuf/internal/scalar"
+	"google.golang.org/protobuf/proto"
 	pdesc "google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 
@@ -31,158 +31,7 @@
 // TODO: Test protodesc.NewFile with imported files.
 
 func TestFile(t *testing.T) {
-	f1 := &ptype.File{
-		Syntax:  pref.Proto2,
-		Path:    "path/to/file.proto",
-		Package: "test",
-		Options: &descriptorpb.FileOptions{Deprecated: scalar.Bool(true)},
-		Messages: []ptype.Message{{
-			Name: "A", // "test.A"
-			Options: &descriptorpb.MessageOptions{
-				MapEntry:   scalar.Bool(true),
-				Deprecated: scalar.Bool(true),
-			},
-			IsMapEntry: true,
-			Fields: []ptype.Field{{
-				Name:        "key", // "test.A.key"
-				Number:      1,
-				Options:     &descriptorpb.FieldOptions{Deprecated: scalar.Bool(true)},
-				Cardinality: pref.Optional,
-				Kind:        pref.StringKind,
-			}, {
-				Name:        "value", // "test.A.value"
-				Number:      2,
-				Cardinality: pref.Optional,
-				Kind:        pref.MessageKind,
-				MessageType: ptype.PlaceholderMessage("test.B"),
-			}},
-		}, {
-			Name: "B", // "test.B"
-			Fields: []ptype.Field{{
-				Name:        "field_one", // "test.B.field_one"
-				Number:      1,
-				Cardinality: pref.Optional,
-				Kind:        pref.StringKind,
-				Default:     pref.ValueOf("hello, \"world!\"\n"),
-				OneofName:   "O1",
-			}, {
-				Name:        "field_two", // "test.B.field_two"
-				JSONName:    "Field2",
-				Number:      2,
-				Cardinality: pref.Optional,
-				Kind:        pref.EnumKind,
-				Default:     pref.ValueOf(pref.EnumNumber(1)),
-				EnumType:    ptype.PlaceholderEnum("test.E1"),
-				OneofName:   "O2",
-			}, {
-				Name:        "field_three", // "test.B.field_three"
-				Number:      3,
-				Cardinality: pref.Optional,
-				Kind:        pref.MessageKind,
-				MessageType: ptype.PlaceholderMessage("test.C"),
-				OneofName:   "O2",
-			}, {
-				Name:        "field_four", // "test.B.field_four"
-				JSONName:    "Field4",
-				Number:      4,
-				Cardinality: pref.Repeated,
-				Kind:        pref.MessageKind,
-				MessageType: ptype.PlaceholderMessage("test.A"),
-			}, {
-				Name:        "field_five", // "test.B.field_five"
-				Number:      5,
-				Cardinality: pref.Repeated,
-				Kind:        pref.Int32Kind,
-				Options:     &descriptorpb.FieldOptions{Packed: scalar.Bool(true)},
-				IsPacked:    ptype.True,
-			}, {
-				Name:        "field_six", // "test.B.field_six"
-				Number:      6,
-				Cardinality: pref.Required,
-				Kind:        pref.BytesKind,
-			}},
-			Oneofs: []ptype.Oneof{
-				{
-					Name: "O1", // "test.B.O1"
-					Options: &descriptorpb.OneofOptions{
-						UninterpretedOption: []*descriptorpb.UninterpretedOption{
-							{StringValue: []byte("option")},
-						},
-					},
-				},
-				{Name: "O2"}, // "test.B.O2"
-			},
-			ReservedNames:   []pref.Name{"fizz", "buzz"},
-			ReservedRanges:  [][2]pref.FieldNumber{{100, 200}, {300, 301}},
-			ExtensionRanges: [][2]pref.FieldNumber{{1000, 2000}, {3000, 3001}},
-			ExtensionRangeOptions: []pref.ProtoMessage{
-				0: (*descriptorpb.ExtensionRangeOptions)(nil),
-				1: new(descriptorpb.ExtensionRangeOptions),
-			},
-		}, {
-			Name: "C", // "test.C"
-			Messages: []ptype.Message{{
-				Name:   "A", // "test.C.A"
-				Fields: []ptype.Field{{Name: "F", Number: 1, Cardinality: pref.Required, Kind: pref.BytesKind, Default: pref.ValueOf([]byte("dead\xbe\xef"))}},
-			}},
-			Enums: []ptype.Enum{{
-				Name:   "E1", // "test.C.E1"
-				Values: []ptype.EnumValue{{Name: "FOO", Number: 0}, {Name: "BAR", Number: 1}},
-			}},
-			Extensions: []ptype.Extension{{
-				Name:         "X", // "test.C.X"
-				Number:       1000,
-				Cardinality:  pref.Repeated,
-				Kind:         pref.MessageKind,
-				Options:      &descriptorpb.FieldOptions{Packed: scalar.Bool(false)},
-				IsPacked:     ptype.False,
-				MessageType:  ptype.PlaceholderMessage("test.C"),
-				ExtendedType: ptype.PlaceholderMessage("test.B"),
-			}},
-		}},
-		Enums: []ptype.Enum{{
-			Name:    "E1", // "test.E1"
-			Options: &descriptorpb.EnumOptions{Deprecated: scalar.Bool(true)},
-			Values: []ptype.EnumValue{
-				{
-					Name:    "FOO",
-					Number:  0,
-					Options: &descriptorpb.EnumValueOptions{Deprecated: scalar.Bool(true)},
-				},
-				{Name: "BAR", Number: 1},
-			},
-			ReservedNames:  []pref.Name{"FIZZ", "BUZZ"},
-			ReservedRanges: [][2]pref.EnumNumber{{10, 19}, {30, 30}},
-		}},
-		Extensions: []ptype.Extension{{
-			Name:         "X", // "test.X"
-			Number:       1000,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.MessageKind,
-			Options:      &descriptorpb.FieldOptions{Packed: scalar.Bool(true)},
-			IsPacked:     ptype.True,
-			MessageType:  ptype.PlaceholderMessage("test.C"),
-			ExtendedType: ptype.PlaceholderMessage("test.B"),
-		}},
-		Services: []ptype.Service{{
-			Name:    "S", // "test.S"
-			Options: &descriptorpb.ServiceOptions{Deprecated: scalar.Bool(true)},
-			Methods: []ptype.Method{{
-				Name:              "M", // "test.S.M"
-				InputType:         ptype.PlaceholderMessage("test.A"),
-				OutputType:        ptype.PlaceholderMessage("test.C.A"),
-				IsStreamingClient: true,
-				IsStreamingServer: true,
-				Options:           &descriptorpb.MethodOptions{Deprecated: scalar.Bool(true)},
-			}},
-		}},
-	}
-	fd1, err := ptype.NewFile(f1)
-	if err != nil {
-		t.Fatalf("prototype.NewFile() error: %v", err)
-	}
-
-	f2 := &descriptorpb.FileDescriptorProto{
+	f1 := &descriptorpb.FileDescriptorProto{
 		Syntax:  scalar.String("proto2"),
 		Name:    scalar.String("path/to/file.proto"),
 		Package: scalar.String("test"),
@@ -337,17 +186,23 @@
 			}},
 		}},
 	}
-	fd2, err := pdesc.NewFile(f2, nil)
+	fd1, err := pdesc.NewFile(f1, nil)
 	if err != nil {
 		t.Fatalf("protodesc.NewFile() error: %v", err)
 	}
 
+	b, err := proto.Marshal(f1)
+	if err != nil {
+		t.Fatalf("proto.Marshal() error: %v", err)
+	}
+	fd2 := filedesc.DescBuilder{RawDescriptor: b}.Build().File
+
 	tests := []struct {
 		name string
 		desc pref.FileDescriptor
 	}{
-		{"prototype.NewFile", fd1},
-		{"protodesc.NewFile", fd2},
+		{"protodesc.NewFile", fd1},
+		{"filedesc.DescBuilder.Build", fd2},
 	}
 	for _, tt := range tests {
 		tt := tt
@@ -622,7 +477,7 @@
 				"Cardinality":       pref.Repeated,
 				"Kind":              pref.MessageKind,
 				"IsExtension":       true,
-				"IsPacked":          false,
+				"IsPacked":          true,
 				"IsList":            true,
 				"IsMap":             false,
 				"MapKey":            nil,
@@ -715,11 +570,18 @@
 		}
 
 		// Compare with proto.Equal if possible.
-		gotMsg, gotMsgOK := got.(protoV1.Message)
-		wantMsg, wantMsgOK := v.(protoV1.Message)
+		gotMsg, gotMsgOK := got.(proto.Message)
+		wantMsg, wantMsgOK := v.(proto.Message)
 		if gotMsgOK && wantMsgOK {
-			if !protoV1.Equal(gotMsg, wantMsg) {
-				t.Errorf("%v = %v, want %v", p, got, want)
+			gotNil := reflect.ValueOf(gotMsg).IsNil()
+			wantNil := reflect.ValueOf(wantMsg).IsNil()
+			switch {
+			case !gotNil && wantNil:
+				t.Errorf("%v = non-nil, want nil", p)
+			case gotNil && !wantNil:
+				t.Errorf("%v = nil, want non-nil", p)
+			case !proto.Equal(gotMsg, wantMsg):
+				t.Errorf("%v = %v, want %v", p, gotMsg, wantMsg)
 			}
 			continue
 		}
@@ -845,6 +707,7 @@
 			Number:      1000
 			Cardinality: repeated
 			Kind:        message
+			JSONName:    "X"
 			IsExtension: true
 			IsList:      true
 			Extendee:    test.B
@@ -865,6 +728,8 @@
 		Number:      1000
 		Cardinality: repeated
 		Kind:        message
+		JSONName:    "X"
+		IsPacked:    true
 		IsExtension: true
 		IsList:      true
 		Extendee:    test.B
diff --git a/internal/filedesc/name_pure.go b/internal/filedesc/name_pure.go
new file mode 100644
index 0000000..5626829
--- /dev/null
+++ b/internal/filedesc/name_pure.go
@@ -0,0 +1,34 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build purego appengine
+
+package filedesc
+
+import pref "google.golang.org/protobuf/reflect/protoreflect"
+
+func getNameBuilder() *nameBuilder { return nil }
+func putNameBuilder(*nameBuilder)  {}
+
+type nameBuilder struct{}
+
+// MakeFullName converts b to a protoreflect.FullName,
+// where b must start with a leading dot.
+func (*nameBuilder) MakeFullName(b []byte) pref.FullName {
+	if len(b) == 0 || b[0] != '.' {
+		panic("name reference must be fully qualified")
+	}
+	return pref.FullName(b[1:])
+}
+
+// AppendFullName is equivalent to protoreflect.FullName.Append.
+func (*nameBuilder) AppendFullName(prefix pref.FullName, name []byte) pref.FullName {
+	return prefix.Append(pref.Name(name))
+}
+
+// MakeString is equivalent to string(b), but optimized for large batches
+// with a shared lifetime.
+func (*nameBuilder) MakeString(b []byte) string {
+	return string(b)
+}
diff --git a/internal/prototype/name_unsafe.go b/internal/filedesc/name_unsafe.go
similarity index 62%
rename from internal/prototype/name_unsafe.go
rename to internal/filedesc/name_unsafe.go
index 588bdbc..317114f 100644
--- a/internal/prototype/name_unsafe.go
+++ b/internal/filedesc/name_unsafe.go
@@ -4,10 +4,9 @@
 
 // +build !purego,!appengine
 
-package prototype
+package filedesc
 
 import (
-	"strings"
 	"sync"
 	"unsafe"
 
@@ -29,22 +28,48 @@
 	sb stringBuilder
 }
 
-// Append is equivalent to protoreflect.FullName.Append, but is optimized for
-// large batches of operations where each name has a shared lifetime.
-func (b *nameBuilder) Append(prefix pref.FullName, name pref.Name) pref.FullName {
-	const batchSize = 1 << 12
+// MakeFullName converts b to a protoreflect.FullName,
+// where b must start with a leading dot.
+func (nb *nameBuilder) MakeFullName(b []byte) pref.FullName {
+	if len(b) == 0 || b[0] != '.' {
+		panic("name reference must be fully qualified")
+	}
+	return pref.FullName(nb.MakeString(b[1:]))
+}
+
+// AppendFullName is equivalent to protoreflect.FullName.Append,
+// but optimized for large batches where each name has a shared lifetime.
+func (nb *nameBuilder) AppendFullName(prefix pref.FullName, name []byte) pref.FullName {
 	n := len(prefix) + len(".") + len(name)
-	if b.sb.Cap()-b.sb.Len() < n {
-		b.sb.Reset()
-		b.sb.Grow(batchSize)
+	if len(prefix) == 0 {
+		n -= len(".")
 	}
-	if !strings.HasSuffix(b.sb.String(), string(prefix)) {
-		b.sb.WriteString(string(prefix))
+	nb.grow(n)
+	nb.sb.WriteString(string(prefix))
+	nb.sb.WriteByte('.')
+	nb.sb.Write(name)
+	return pref.FullName(nb.last(n))
+}
+
+// MakeString is equivalent to string(b), but optimized for large batches
+// with a shared lifetime.
+func (nb *nameBuilder) MakeString(b []byte) string {
+	nb.grow(len(b))
+	nb.sb.Write(b)
+	return nb.last(len(b))
+}
+
+func (nb *nameBuilder) last(n int) string {
+	s := nb.sb.String()
+	return s[len(s)-n:]
+}
+
+func (nb *nameBuilder) grow(n int) {
+	const batchSize = 1 << 16
+	if nb.sb.Cap()-nb.sb.Len() < n {
+		nb.sb.Reset()
+		nb.sb.Grow(batchSize)
 	}
-	b.sb.WriteByte('.')
-	b.sb.WriteString(string(name))
-	s := b.sb.String()
-	return pref.FullName(strings.TrimPrefix(s[len(s)-n:], "."))
 }
 
 // stringsBuilder is a simplified copy of the strings.Builder from Go1.12:
diff --git a/internal/filedesc/placeholder.go b/internal/filedesc/placeholder.go
new file mode 100644
index 0000000..be95831
--- /dev/null
+++ b/internal/filedesc/placeholder.go
@@ -0,0 +1,90 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package filedesc
+
+import (
+	"google.golang.org/protobuf/internal/descopts"
+	"google.golang.org/protobuf/internal/pragma"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+var (
+	emptyNames        = new(Names)
+	emptyEnumRanges   = new(EnumRanges)
+	emptyFieldRanges  = new(FieldRanges)
+	emptyFieldNumbers = new(FieldNumbers)
+
+	emptyFiles      = new(FileImports)
+	emptyMessages   = new(Messages)
+	emptyFields     = new(Fields)
+	emptyOneofs     = new(Oneofs)
+	emptyEnums      = new(Enums)
+	emptyEnumValues = new(EnumValues)
+	emptyExtensions = new(Extensions)
+	emptyServices   = new(Services)
+)
+
+// PlaceholderFile is a placeholder, representing only the file path.
+type PlaceholderFile string
+
+func (f PlaceholderFile) ParentFile() pref.FileDescriptor       { return f }
+func (f PlaceholderFile) Parent() pref.Descriptor               { return nil }
+func (f PlaceholderFile) Index() int                            { return 0 }
+func (f PlaceholderFile) Syntax() pref.Syntax                   { return 0 }
+func (f PlaceholderFile) Name() pref.Name                       { return "" }
+func (f PlaceholderFile) FullName() pref.FullName               { return "" }
+func (f PlaceholderFile) IsPlaceholder() bool                   { return true }
+func (f PlaceholderFile) Options() pref.ProtoMessage            { return descopts.File }
+func (f PlaceholderFile) Path() string                          { return string(f) }
+func (f PlaceholderFile) Package() pref.FullName                { return "" }
+func (f PlaceholderFile) Imports() pref.FileImports             { return emptyFiles }
+func (f PlaceholderFile) Messages() pref.MessageDescriptors     { return emptyMessages }
+func (f PlaceholderFile) Enums() pref.EnumDescriptors           { return emptyEnums }
+func (f PlaceholderFile) Extensions() pref.ExtensionDescriptors { return emptyExtensions }
+func (f PlaceholderFile) Services() pref.ServiceDescriptors     { return emptyServices }
+func (f PlaceholderFile) ProtoType(pref.FileDescriptor)         { return }
+func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement)   { return }
+
+// PlaceholderEnum is a placeholder, representing only the full name.
+type PlaceholderEnum pref.FullName
+
+func (e PlaceholderEnum) ParentFile() pref.FileDescriptor     { return nil }
+func (e PlaceholderEnum) Parent() pref.Descriptor             { return nil }
+func (e PlaceholderEnum) Index() int                          { return 0 }
+func (e PlaceholderEnum) Syntax() pref.Syntax                 { return 0 }
+func (e PlaceholderEnum) Name() pref.Name                     { return pref.FullName(e).Name() }
+func (e PlaceholderEnum) FullName() pref.FullName             { return pref.FullName(e) }
+func (e PlaceholderEnum) IsPlaceholder() bool                 { return true }
+func (e PlaceholderEnum) Options() pref.ProtoMessage          { return descopts.Enum }
+func (e PlaceholderEnum) Values() pref.EnumValueDescriptors   { return emptyEnumValues }
+func (e PlaceholderEnum) ReservedNames() pref.Names           { return emptyNames }
+func (e PlaceholderEnum) ReservedRanges() pref.EnumRanges     { return emptyEnumRanges }
+func (e PlaceholderEnum) ProtoType(pref.EnumDescriptor)       { return }
+func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return }
+
+// PlaceholderMessage is a placeholder, representing only the full name.
+type PlaceholderMessage pref.FullName
+
+func (m PlaceholderMessage) ParentFile() pref.FileDescriptor             { return nil }
+func (m PlaceholderMessage) Parent() pref.Descriptor                     { return nil }
+func (m PlaceholderMessage) Index() int                                  { return 0 }
+func (m PlaceholderMessage) Syntax() pref.Syntax                         { return 0 }
+func (m PlaceholderMessage) Name() pref.Name                             { return pref.FullName(m).Name() }
+func (m PlaceholderMessage) FullName() pref.FullName                     { return pref.FullName(m) }
+func (m PlaceholderMessage) IsPlaceholder() bool                         { return true }
+func (m PlaceholderMessage) Options() pref.ProtoMessage                  { return descopts.Message }
+func (m PlaceholderMessage) IsMapEntry() bool                            { return false }
+func (m PlaceholderMessage) Fields() pref.FieldDescriptors               { return emptyFields }
+func (m PlaceholderMessage) Oneofs() pref.OneofDescriptors               { return emptyOneofs }
+func (m PlaceholderMessage) ReservedNames() pref.Names                   { return emptyNames }
+func (m PlaceholderMessage) ReservedRanges() pref.FieldRanges            { return emptyFieldRanges }
+func (m PlaceholderMessage) RequiredNumbers() pref.FieldNumbers          { return emptyFieldNumbers }
+func (m PlaceholderMessage) ExtensionRanges() pref.FieldRanges           { return emptyFieldRanges }
+func (m PlaceholderMessage) ExtensionRangeOptions(int) pref.ProtoMessage { panic("index out of range") }
+func (m PlaceholderMessage) Messages() pref.MessageDescriptors           { return emptyMessages }
+func (m PlaceholderMessage) Enums() pref.EnumDescriptors                 { return emptyEnums }
+func (m PlaceholderMessage) Extensions() pref.ExtensionDescriptors       { return emptyExtensions }
+func (m PlaceholderMessage) ProtoType(pref.MessageDescriptor)            { return }
+func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement)         { return }
diff --git a/internal/fileinit/desc.go b/internal/fileinit/desc.go
index 938167b..21698b6 100644
--- a/internal/fileinit/desc.go
+++ b/internal/fileinit/desc.go
@@ -454,7 +454,7 @@
 	return fd.Message().Fields().ByNumber(2)
 }
 func (fd *fieldDesc) HasDefault() bool                           { return fd.defVal.has }
-func (fd *fieldDesc) Default() pref.Value                        { return fd.defVal.get() }
+func (fd *fieldDesc) Default() pref.Value                        { return fd.defVal.get(fd) }
 func (fd *fieldDesc) DefaultEnumValue() pref.EnumValueDescriptor { return fd.defVal.enum }
 func (fd *fieldDesc) ContainingOneof() pref.OneofDescriptor      { return fd.oneofType }
 func (fd *fieldDesc) ContainingMessage() pref.MessageDescriptor {
@@ -528,7 +528,7 @@
 func (xd *extensionDesc) MapKey() pref.FieldDescriptor               { return nil }
 func (xd *extensionDesc) MapValue() pref.FieldDescriptor             { return nil }
 func (xd *extensionDesc) HasDefault() bool                           { return xd.lazyInit().defVal.has }
-func (xd *extensionDesc) Default() pref.Value                        { return xd.lazyInit().defVal.get() }
+func (xd *extensionDesc) Default() pref.Value                        { return xd.lazyInit().defVal.get(xd) }
 func (xd *extensionDesc) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().defVal.enum }
 func (xd *extensionDesc) ContainingOneof() pref.OneofDescriptor      { return nil }
 func (xd *extensionDesc) ContainingMessage() pref.MessageDescriptor  { return xd.extendedType }
diff --git a/internal/fileinit/desc_lazy.go b/internal/fileinit/desc_lazy.go
index 0e26e17..673b100 100644
--- a/internal/fileinit/desc_lazy.go
+++ b/internal/fileinit/desc_lazy.go
@@ -12,8 +12,8 @@
 	defval "google.golang.org/protobuf/internal/encoding/defval"
 	wire "google.golang.org/protobuf/internal/encoding/wire"
 	fieldnum "google.golang.org/protobuf/internal/fieldnum"
+	fdesc "google.golang.org/protobuf/internal/filedesc"
 	pimpl "google.golang.org/protobuf/internal/impl"
-	ptype "google.golang.org/protobuf/internal/prototype"
 	pvalue "google.golang.org/protobuf/internal/value"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	preg "google.golang.org/protobuf/reflect/protoregistry"
@@ -95,7 +95,11 @@
 					fd.isPacked = true
 				}
 			}
-			fd.defVal.lazyInit(fd.kind, file.enumValuesOf(fd.enumType))
+
+			// Default is resolved here since it depends on Enum being resolved.
+			if v := fd.defVal.val; v.IsValid() {
+				fd.defVal = unmarshalDefault(v.Bytes(), fd.kind, file, fd.enumType)
+			}
 		}
 	}
 }
@@ -121,7 +125,7 @@
 				et := pimpl.Export{}.EnumTypeOf(reflect.Zero(typ).Interface())
 				xd.lazy.typ = typ
 				xd.lazy.new = func() pref.Value {
-					return xd.lazy.defVal.get()
+					return xd.lazy.defVal.get(xd)
 				}
 				xd.lazy.valueOf = func(v interface{}) pref.Value {
 					ev := v.(pref.Enum)
@@ -146,7 +150,7 @@
 			default:
 				xd.lazy.typ = goTypeForPBKind[xd.lazy.kind]
 				xd.lazy.new = func() pref.Value {
-					return xd.lazy.defVal.get()
+					return xd.lazy.defVal.get(xd)
 				}
 				xd.lazy.valueOf = func(v interface{}) pref.Value {
 					return pref.ValueOf(v)
@@ -179,7 +183,11 @@
 		case pref.MessageKind, pref.GroupKind:
 			xd.lazy.messageType = file.popMessageDependency()
 		}
-		xd.lazy.defVal.lazyInit(xd.lazy.kind, file.enumValuesOf(xd.lazy.enumType))
+
+		// Default is resolved here since it depends on Enum being resolved.
+		if v := xd.lazy.defVal.val; v.IsValid() {
+			xd.lazy.defVal = unmarshalDefault(v.Bytes(), xd.lazy.kind, file, xd.lazy.enumType)
+		}
 	}
 }
 
@@ -271,67 +279,84 @@
 	*fi = fileInit{} // clear fileInit for GC to reclaim resources
 }
 
+func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue {
+	dv := defaultValue{has: v.IsValid(), val: v, enum: ev}
+	if b, ok := v.Interface().([]byte); ok {
+		// Store a copy of the default bytes, so that we can detect
+		// accidental mutations of the original value.
+		dv.bytes = append([]byte(nil), b...)
+	}
+	return dv
+}
+
+func unmarshalDefault(b []byte, k pref.Kind, pf *fileDesc, ed pref.EnumDescriptor) defaultValue {
+	var evs pref.EnumValueDescriptors
+	if k == pref.EnumKind {
+		// If the enum is declared within the same file, be careful not to
+		// blindly call the Values method, lest we bind ourselves in a deadlock.
+		if ed, ok := ed.(*enumDesc); ok && ed.parentFile == pf {
+			evs = &ed.lazy.values
+		} else {
+			evs = ed.Values()
+		}
+	}
+
+	v, ev, err := defval.Unmarshal(string(b), k, evs, defval.Descriptor)
+	if err != nil {
+		panic(err)
+	}
+	dv := defaultValue{has: v.IsValid(), val: v, enum: ev}
+	if b, ok := v.Interface().([]byte); ok {
+		// Store a copy of the default bytes, so that we can detect
+		// accidental mutations of the original value.
+		dv.bytes = append([]byte(nil), b...)
+	}
+	return dv
+}
+
 type defaultValue struct {
 	has   bool
 	val   pref.Value
 	enum  pref.EnumValueDescriptor
-	check func() // only set for non-empty bytes
+	bytes []byte
 }
 
-func (dv *defaultValue) get() pref.Value {
-	if dv.check != nil {
-		dv.check()
+func (dv *defaultValue) get(fd pref.FieldDescriptor) pref.Value {
+	// Return the zero value as the default if unpopulated.
+	if !dv.has {
+		switch fd.Kind() {
+		case pref.BoolKind:
+			return pref.ValueOf(false)
+		case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
+			return pref.ValueOf(int32(0))
+		case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
+			return pref.ValueOf(int64(0))
+		case pref.Uint32Kind, pref.Fixed32Kind:
+			return pref.ValueOf(uint32(0))
+		case pref.Uint64Kind, pref.Fixed64Kind:
+			return pref.ValueOf(uint64(0))
+		case pref.FloatKind:
+			return pref.ValueOf(float32(0))
+		case pref.DoubleKind:
+			return pref.ValueOf(float64(0))
+		case pref.StringKind:
+			return pref.ValueOf(string(""))
+		case pref.BytesKind:
+			return pref.ValueOf([]byte(nil))
+		case pref.EnumKind:
+			return pref.ValueOf(fd.Enum().Values().Get(0).Number())
+		}
+	}
+
+	if len(dv.bytes) > 0 && !bytes.Equal(dv.bytes, dv.val.Bytes()) {
+		// TODO: Avoid panic if we're running with the race detector
+		// and instead spawn a goroutine that periodically resets
+		// this value back to the original to induce a race.
+		panic("detected mutation on the default bytes")
 	}
 	return dv.val
 }
 
-func (dv *defaultValue) lazyInit(k pref.Kind, eds pref.EnumValueDescriptors) {
-	if dv.has {
-		switch k {
-		case pref.EnumKind:
-			// File descriptors always store default enums by name.
-			dv.enum = eds.ByName(pref.Name(dv.val.String()))
-			dv.val = pref.ValueOf(dv.enum.Number())
-		case pref.BytesKind:
-			// Store a copy of the default bytes, so that we can detect
-			// accidental mutations of the original value.
-			b := append([]byte(nil), dv.val.Bytes()...)
-			dv.check = func() {
-				if !bytes.Equal(b, dv.val.Bytes()) {
-					// TODO: Avoid panic if we're running with the race detector
-					// and instead spawn a goroutine that periodically resets
-					// this value back to the original to induce a race.
-					panic("detected mutation on the default bytes")
-				}
-			}
-		}
-	} else {
-		switch k {
-		case pref.BoolKind:
-			dv.val = pref.ValueOf(false)
-		case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
-			dv.val = pref.ValueOf(int32(0))
-		case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
-			dv.val = pref.ValueOf(int64(0))
-		case pref.Uint32Kind, pref.Fixed32Kind:
-			dv.val = pref.ValueOf(uint32(0))
-		case pref.Uint64Kind, pref.Fixed64Kind:
-			dv.val = pref.ValueOf(uint64(0))
-		case pref.FloatKind:
-			dv.val = pref.ValueOf(float32(0))
-		case pref.DoubleKind:
-			dv.val = pref.ValueOf(float64(0))
-		case pref.StringKind:
-			dv.val = pref.ValueOf(string(""))
-		case pref.BytesKind:
-			dv.val = pref.ValueOf([]byte(nil))
-		case pref.EnumKind:
-			dv.enum = eds.Get(0)
-			dv.val = pref.ValueOf(dv.enum.Number())
-		}
-	}
-}
-
 func (fd *fileDesc) unmarshalFull(b []byte) {
 	nb := getNameBuilder()
 	defer putNameBuilder(nb)
@@ -368,7 +393,7 @@
 				}
 			case fieldnum.FileDescriptorProto_Dependency:
 				fd.lazy.imports = append(fd.lazy.imports, pref.FileImport{
-					FileDescriptor: ptype.PlaceholderFile(nb.MakeString(v), ""),
+					FileDescriptor: fdesc.PlaceholderFile(nb.MakeString(v)),
 				})
 			case fieldnum.FileDescriptorProto_EnumType:
 				fd.enums.list[enumIdx].unmarshalFull(v, nb)
@@ -627,7 +652,6 @@
 	fd.parent = pd
 	fd.index = i
 
-	var rawDefVal []byte
 	var rawTypeName []byte
 	for len(b) > 0 {
 		num, typ, n := wire.ConsumeTag(b)
@@ -664,8 +688,7 @@
 				fd.hasJSONName = true
 				fd.jsonName = nb.MakeString(v)
 			case fieldnum.FieldDescriptorProto_DefaultValue:
-				fd.defVal.has = true
-				rawDefVal = v
+				fd.defVal.val = pref.ValueOf(v) // temporarily store as bytes; later resolved in resolveMessages
 			case fieldnum.FieldDescriptorProto_TypeName:
 				rawTypeName = v
 			case fieldnum.FieldDescriptorProto_Options:
@@ -680,13 +703,6 @@
 	if !fd.hasJSONName {
 		fd.jsonName = nb.MakeJSONName(fd.Name())
 	}
-	if rawDefVal != nil {
-		var err error
-		fd.defVal.val, err = defval.Unmarshal(string(rawDefVal), fd.kind, defval.Descriptor)
-		if err != nil {
-			panic(err)
-		}
-	}
 	if fd.isWeak {
 		if len(rawTypeName) == 0 || rawTypeName[0] != '.' {
 			panic("weak target name must be fully qualified")
@@ -695,7 +711,7 @@
 		name := pref.FullName(rawTypeName[1:])
 		fd.messageType, _ = preg.GlobalFiles.FindMessageByName(name)
 		if fd.messageType == nil {
-			fd.messageType = ptype.PlaceholderMessage(pref.FullName(rawTypeName[1:]))
+			fd.messageType = fdesc.PlaceholderMessage(pref.FullName(rawTypeName[1:]))
 		}
 	}
 }
@@ -749,7 +765,6 @@
 }
 
 func (xd *extensionDesc) unmarshalFull(b []byte, nb *nameBuilder) {
-	var rawDefVal []byte
 	xd.lazy = new(extensionLazy)
 	for len(b) > 0 {
 		num, typ, n := wire.ConsumeTag(b)
@@ -772,8 +787,7 @@
 				xd.lazy.hasJSONName = true
 				xd.lazy.jsonName = nb.MakeString(v)
 			case fieldnum.FieldDescriptorProto_DefaultValue:
-				xd.lazy.defVal.has = true
-				rawDefVal = v
+				xd.lazy.defVal.val = pref.ValueOf(v) // temporarily store as bytes; later resolved in resolveExtensions
 			case fieldnum.FieldDescriptorProto_Options:
 				xd.unmarshalOptions(v)
 			}
@@ -782,14 +796,6 @@
 			b = b[m:]
 		}
 	}
-
-	if rawDefVal != nil {
-		var err error
-		xd.lazy.defVal.val, err = defval.Unmarshal(string(rawDefVal), xd.lazy.kind, defval.Descriptor)
-		if err != nil {
-			panic(err)
-		}
-	}
 }
 
 func (xd *extensionDesc) unmarshalOptions(b []byte) {
diff --git a/internal/filetype/build.go b/internal/filetype/build.go
new file mode 100644
index 0000000..635099b
--- /dev/null
+++ b/internal/filetype/build.go
@@ -0,0 +1,329 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package filetype provides functionality for wrapping descriptors
+// with Go type information.
+package filetype
+
+import (
+	"reflect"
+
+	"google.golang.org/protobuf/internal/descopts"
+	fdesc "google.golang.org/protobuf/internal/filedesc"
+	pimpl "google.golang.org/protobuf/internal/impl"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+	preg "google.golang.org/protobuf/reflect/protoregistry"
+	ptype "google.golang.org/protobuf/reflect/prototype"
+	piface "google.golang.org/protobuf/runtime/protoiface"
+)
+
+// TypeBuilder constructs type descriptors from a raw file descriptor
+// and associated Go types for each enum and message declaration.
+//
+//
+// Flattened Ordering
+//
+// The protobuf type system represents declarations as a tree. Certain nodes in
+// the tree require us to either associate it with a concrete Go type or to
+// resolve a dependency, which is information that must be provided separately
+// since it cannot be derived from the file descriptor alone.
+//
+// However, representing a tree as Go literals is difficult to simply do in a
+// space and time efficient way. Thus, we store them as a flattened list of
+// objects where the serialization order from the tree-based form is important.
+//
+// The "flattened ordering" is defined as a tree traversal of all enum, message,
+// extension, and service declarations using the following algorithm:
+//
+//	def VisitFileDecls(fd):
+//		for e in fd.Enums:      yield e
+//		for m in fd.Messages:   yield m
+//		for x in fd.Extensions: yield x
+//		for s in fd.Services:   yield s
+//		for m in fd.Messages:   yield from VisitMessageDecls(m)
+//
+//	def VisitMessageDecls(md):
+//		for e in md.Enums:      yield e
+//		for m in md.Messages:   yield m
+//		for x in md.Extensions: yield x
+//		for m in md.Messages:   yield from VisitMessageDecls(m)
+//
+// The traversal starts at the root file descriptor and yields each direct
+// declaration within each node before traversing into sub-declarations
+// that children themselves may have.
+type TypeBuilder struct {
+	// File is the underlying file descriptor builder.
+	File fdesc.DescBuilder
+
+	// GoTypes is a unique set of the Go types for all declarations and
+	// dependencies. Each type is represented as a zero value of the Go type.
+	//
+	// Declarations are Go types generated for enums and messages directly
+	// declared (not publicly imported) in the proto source file.
+	// Messages for map entries are accounted for, but represented by nil.
+	// Enum declarations in "flattened ordering" come first, followed by
+	// message declarations in "flattened ordering".
+	//
+	// Dependencies are Go types for enums or messages referenced by
+	// message fields (excluding weak fields), for parent extended messages of
+	// extension fields, for enums or messages referenced by extension fields,
+	// and for input and output messages referenced by service methods.
+	// Dependencies must come after declarations, but the ordering of
+	// dependencies themselves is unspecified.
+	GoTypes []interface{}
+
+	// DependencyIndexes is an ordered list of indexes into GoTypes for the
+	// dependencies of messages, extensions, or services.
+	//
+	// There are 5 sub-lists in "flattened ordering" concatenated back-to-back:
+	//	0. Message field dependencies: list of the enum or message type
+	//	referred to by every message field.
+	//	1. Extension field targets: list of the extended parent message of
+	//	every extension.
+	//	2. Extension field dependencies: list of the enum or message type
+	//	referred to by every extension field.
+	//	3. Service method inputs: list of the input message type
+	//	referred to by every service method.
+	//	4. Service method outputs: list of the output message type
+	//	referred to by every service method.
+	//
+	// The offset into DependencyIndexes for the start of each sub-list
+	// is appended to the end in reverse order.
+	DependencyIndexes []int32
+
+	// MessageInfos is a list of message infos in "flattened ordering".
+	// If provided, the GoType and PBType for each element is populated.
+	//
+	// Requirement: len(MessageInfos) == len(Build.Messages)
+	MessageInfos []pimpl.MessageInfo
+
+	// LegacyExtensions is a list of legacy extensions in "flattened ordering".
+	// If provided, the pointer to the v1 ExtensionDesc will be stored into the
+	// associated v2 ExtensionType and accessible via a pseudo-internal API.
+	// Also, the v2 ExtensionType will be stored into each v1 ExtensionDesc.
+	//
+	// Requirement: len(LegacyExtensions) == len(Build.Extensions)
+	LegacyExtensions []piface.ExtensionDescV1
+
+	// TypeRegistry is the registry to register each type descriptor.
+	// If nil, it uses protoregistry.GlobalTypes.
+	TypeRegistry interface {
+		Register(...preg.Type) error
+	}
+}
+
+func (tb TypeBuilder) Build() (out struct {
+	File pref.FileDescriptor
+
+	// Enums is all enum types in "flattened ordering".
+	Enums []Enum
+	// Messages is all message types in "flattened ordering".
+	// It includes a stub message type for map entries.
+	Messages []Message
+	// Extensions is all extension types in "flattened ordering".
+	Extensions []Extension
+}) {
+	// Replace the resolver with one that resolves dependencies by index,
+	// which is faster and more reliable than relying on the global registry.
+	if tb.File.FileRegistry == nil {
+		tb.File.FileRegistry = preg.GlobalFiles
+	}
+	tb.File.FileRegistry = &resolverByIndex{
+		goTypes:      tb.GoTypes,
+		depIdxs:      tb.DependencyIndexes,
+		fileRegistry: tb.File.FileRegistry,
+	}
+
+	// Initialize registry if unpopulated.
+	if tb.TypeRegistry == nil {
+		tb.TypeRegistry = preg.GlobalTypes
+	}
+
+	fbOut := tb.File.Build()
+	out.File = fbOut.File
+
+	// Process enums.
+	enumGoTypes := tb.GoTypes[:len(fbOut.Enums)]
+	if len(fbOut.Enums) > 0 {
+		out.Enums = make([]Enum, len(fbOut.Enums))
+		for i := range fbOut.Enums {
+			out.Enums[i] = Enum{
+				EnumDescriptor: &fbOut.Enums[i],
+				NewEnum:        enumMaker(reflect.TypeOf(enumGoTypes[i])),
+			}
+
+			// Register enum types.
+			if err := tb.TypeRegistry.Register(&out.Enums[i]); err != nil {
+				panic(err)
+			}
+		}
+	}
+
+	// Process messages.
+	messageGoTypes := tb.GoTypes[len(fbOut.Enums):][:len(fbOut.Messages)]
+	if tb.MessageInfos != nil && len(tb.MessageInfos) != len(fbOut.Messages) {
+		panic("mismatching message lengths")
+	}
+	if len(fbOut.Messages) > 0 {
+		out.Messages = make([]Message, len(fbOut.Messages))
+		for i := range fbOut.Messages {
+			if messageGoTypes[i] == nil {
+				continue // skip map entry
+			}
+			out.Messages[i] = Message{
+				MessageDescriptor: &fbOut.Messages[i],
+				NewMessage:        messageMaker(reflect.TypeOf(messageGoTypes[i])),
+			}
+
+			if tb.MessageInfos != nil {
+				tb.MessageInfos[i].GoType = reflect.TypeOf(messageGoTypes[i])
+				tb.MessageInfos[i].PBType = &out.Messages[i]
+			}
+
+			// Register message types.
+			if err := tb.TypeRegistry.Register(&out.Messages[i]); err != nil {
+				panic(err)
+			}
+		}
+
+		// As a special-case for descriptor.proto,
+		// locally register concrete message type for the options.
+		if out.File.Path() == "google/protobuf/descriptor.proto" && out.File.Package() == "google.protobuf" {
+			for i := range fbOut.Messages {
+				switch fbOut.Messages[i].Name() {
+				case "FileOptions":
+					descopts.File = messageGoTypes[i].(pref.ProtoMessage)
+				case "EnumOptions":
+					descopts.Enum = messageGoTypes[i].(pref.ProtoMessage)
+				case "EnumValueOptions":
+					descopts.EnumValue = messageGoTypes[i].(pref.ProtoMessage)
+				case "MessageOptions":
+					descopts.Message = messageGoTypes[i].(pref.ProtoMessage)
+				case "FieldOptions":
+					descopts.Field = messageGoTypes[i].(pref.ProtoMessage)
+				case "OneofOptions":
+					descopts.Oneof = messageGoTypes[i].(pref.ProtoMessage)
+				case "ExtensionRangeOptions":
+					descopts.ExtensionRange = messageGoTypes[i].(pref.ProtoMessage)
+				case "ServiceOptions":
+					descopts.Service = messageGoTypes[i].(pref.ProtoMessage)
+				case "MethodOptions":
+					descopts.Method = messageGoTypes[i].(pref.ProtoMessage)
+				}
+			}
+		}
+	}
+
+	// Process extensions.
+	if tb.LegacyExtensions != nil && len(tb.LegacyExtensions) != len(fbOut.Extensions) {
+		panic("mismatching extension lengths")
+	}
+	if len(fbOut.Extensions) > 0 {
+		var depIdx int32
+		out.Extensions = make([]Extension, len(fbOut.Extensions))
+		for i := range fbOut.Extensions {
+			out.Extensions[i] = Extension{Extension: ptype.Extension{
+				ExtensionDescriptor: &fbOut.Extensions[i],
+			}}
+
+			// For enum and message kinds, determine the referent Go type so
+			// that we can construct their constructors.
+			const listExtDeps = 2
+			switch fbOut.Extensions[i].L1.Kind {
+			case pref.EnumKind:
+				j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx)
+				goType := reflect.TypeOf(tb.GoTypes[j])
+				out.Extensions[i].NewEnum = enumMaker(goType)
+				depIdx++
+			case pref.MessageKind, pref.GroupKind:
+				j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx)
+				goType := reflect.TypeOf(tb.GoTypes[j])
+				out.Extensions[i].NewMessage = messageMaker(goType)
+				depIdx++
+			}
+
+			// Keep v1 and v2 extensions in sync.
+			if tb.LegacyExtensions != nil {
+				out.Extensions[i].legacyDesc = &tb.LegacyExtensions[i]
+				tb.LegacyExtensions[i].Type = &out.Extensions[i]
+			}
+
+			// Register extension types.
+			if err := tb.TypeRegistry.Register(&out.Extensions[i]); err != nil {
+				panic(err)
+			}
+		}
+	}
+
+	return out
+}
+
+type depIdxs []int32
+
+// Get retrieves the jth element of the ith sub-list.
+func (x depIdxs) Get(i, j int32) int32 {
+	return x[x[int32(len(x))-i-1]+j]
+}
+
+type (
+	resolverByIndex struct {
+		goTypes []interface{}
+		depIdxs depIdxs
+		fileRegistry
+	}
+	fileRegistry interface {
+		FindFileByPath(string) (pref.FileDescriptor, error)
+		FindEnumByName(pref.FullName) (pref.EnumDescriptor, error)
+		FindMessageByName(pref.FullName) (pref.MessageDescriptor, error)
+		Register(...pref.FileDescriptor) error
+	}
+)
+
+func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.EnumDescriptor {
+	if depIdx := int(r.depIdxs.Get(i, j)); int(depIdx) < len(es)+len(ms) {
+		return &es[depIdx]
+	} else {
+		return pimpl.Export{}.EnumDescriptorOf(r.goTypes[depIdx])
+	}
+}
+
+func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.MessageDescriptor {
+	if depIdx := int(r.depIdxs.Get(i, j)); depIdx < len(es)+len(ms) {
+		return &ms[depIdx-len(es)]
+	} else {
+		return pimpl.Export{}.MessageDescriptorOf(r.goTypes[depIdx])
+	}
+}
+
+func enumMaker(t reflect.Type) func(pref.EnumNumber) pref.Enum {
+	return func(n pref.EnumNumber) pref.Enum {
+		v := reflect.New(t).Elem()
+		v.SetInt(int64(n))
+		return v.Interface().(pref.Enum)
+	}
+}
+
+func messageMaker(t reflect.Type) func() pref.Message {
+	return func() pref.Message {
+		return reflect.New(t.Elem()).Interface().(pref.ProtoMessage).ProtoReflect()
+	}
+}
+
+type (
+	Enum      = ptype.Enum
+	Message   = ptype.Message
+	Extension struct {
+		ptype.Extension
+		legacyDesc *piface.ExtensionDescV1
+	}
+)
+
+// ProtoLegacyExtensionDesc is a pseudo-internal API for allowing the v1 code
+// to be able to retrieve a v1 ExtensionDesc.
+//
+// WARNING: This method is exempt from the compatibility promise and may be
+// removed in the future without warning.
+func (x *Extension) ProtoLegacyExtensionDesc() *piface.ExtensionDescV1 {
+	return x.legacyDesc
+}
diff --git a/internal/impl/legacy_enum.go b/internal/impl/legacy_enum.go
index 6758e74..7cd05bf 100644
--- a/internal/impl/legacy_enum.go
+++ b/internal/impl/legacy_enum.go
@@ -6,12 +6,11 @@
 
 import (
 	"fmt"
-	"math"
 	"reflect"
 	"sync"
 
-	ptype "google.golang.org/protobuf/internal/prototype"
 	pvalue "google.golang.org/protobuf/internal/value"
+	"google.golang.org/protobuf/reflect/protoreflect"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/prototype"
 )
@@ -94,78 +93,29 @@
 		return ed.(pref.EnumDescriptor)
 	}
 
-	// Slow-path: initialize EnumDescriptor from the proto descriptor.
-	if t.Kind() != reflect.Int32 || t.PkgPath() == "" {
-		panic(fmt.Sprintf("got %v, want named int32 kind", t))
-	}
-	if t == legacyEnumNumberType {
-		panic(fmt.Sprintf("cannot be %v", t))
-	}
-
-	// Derive the enum descriptor from the raw descriptor proto.
-	e := new(ptype.StandaloneEnum)
+	// Slow-path: initialize EnumDescriptor from the raw descriptor.
 	ev := reflect.Zero(t).Interface()
 	if _, ok := ev.(pref.Enum); ok {
 		panic(fmt.Sprintf("%v already implements proto.Enum", t))
 	}
-	if ed, ok := ev.(enumV1); ok {
-		b, idxs := ed.EnumDescriptor()
-		fd := legacyLoadFileDesc(b)
-
-		// Derive syntax.
-		switch fd.GetSyntax() {
-		case "proto2", "":
-			e.Syntax = pref.Proto2
-		case "proto3":
-			e.Syntax = pref.Proto3
-		}
-
-		// Derive the full name and correct enum descriptor.
-		var ed *legacyEnumDescriptorProto
-		e.FullName = pref.FullName(fd.GetPackage())
-		if len(idxs) == 1 {
-			ed = fd.EnumType[idxs[0]]
-			e.FullName = e.FullName.Append(pref.Name(ed.GetName()))
-		} else {
-			md := fd.MessageType[idxs[0]]
-			e.FullName = e.FullName.Append(pref.Name(md.GetName()))
-			for _, i := range idxs[1 : len(idxs)-1] {
-				md = md.NestedType[i]
-				e.FullName = e.FullName.Append(pref.Name(md.GetName()))
-			}
-			ed = md.EnumType[idxs[len(idxs)-1]]
-			e.FullName = e.FullName.Append(pref.Name(ed.GetName()))
-		}
-
-		// Derive the enum values.
-		for _, vd := range ed.Value {
-			e.Values = append(e.Values, ptype.EnumValue{
-				Name:   pref.Name(vd.GetName()),
-				Number: pref.EnumNumber(vd.GetNumber()),
-			})
-		}
-	} else {
-		// If the type does not implement enumV1, then there is no reliable
-		// way to derive the original protobuf type information.
-		// We are unable to use the global enum registry since it is
-		// unfortunately keyed by the full name, which we do not know.
-		// Furthermore, some generated enums register with a fork of
-		// golang/protobuf so the enum may not even be found in the registry.
-		//
-		// Instead, create a bogus enum descriptor to ensure that
-		// most operations continue to work. For example, prototext and protojson
-		// will be unable to parse a message with an enum value by name.
-		e.Syntax = pref.Proto2
-		e.FullName = legacyDeriveFullName(t)
-		e.Values = []ptype.EnumValue{{Name: "INVALID", Number: math.MinInt32}}
+	edV1, ok := ev.(enumV1)
+	if !ok {
+		panic(fmt.Sprintf("enum %v is no longer supported; please regenerate", t))
 	}
+	b, idxs := edV1.EnumDescriptor()
 
-	ed, err := ptype.NewEnum(e)
-	if err != nil {
-		panic(err)
+	var ed pref.EnumDescriptor
+	if len(idxs) == 1 {
+		ed = legacyLoadFileDesc(b).Enums().Get(idxs[0])
+	} else {
+		md := legacyLoadFileDesc(b).Messages().Get(idxs[0])
+		for _, i := range idxs[1 : len(idxs)-1] {
+			md = md.Messages().Get(i)
+		}
+		ed = md.Enums().Get(idxs[len(idxs)-1])
 	}
 	if ed, ok := legacyEnumDescCache.LoadOrStore(t, ed); ok {
-		return ed.(pref.EnumDescriptor)
+		return ed.(protoreflect.EnumDescriptor)
 	}
 	return ed
 }
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index 33ca82c..ca3475f 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -11,7 +11,7 @@
 
 	"google.golang.org/protobuf/internal/descfmt"
 	ptag "google.golang.org/protobuf/internal/encoding/tag"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/internal/filedesc"
 	pvalue "google.golang.org/protobuf/internal/value"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	preg "google.golang.org/protobuf/reflect/protoregistry"
@@ -112,7 +112,7 @@
 		}
 		if ed, ok := reflect.Zero(t).Interface().(enumV1); ok && protoPkg == "" {
 			b, _ := ed.EnumDescriptor()
-			protoPkg = legacyLoadFileDesc(b).GetPackage()
+			protoPkg = string(legacyLoadFileDesc(b).Package())
 		}
 
 		if protoPkg != "" {
@@ -159,46 +159,45 @@
 		return t.(pref.ExtensionType)
 	}
 
-	// Derive basic field information from the struct tag.
+	// Resolve enum or message dependencies.
+	var ed pref.EnumDescriptor
+	var md pref.MessageDescriptor
 	t := reflect.TypeOf(d.ExtensionType)
 	isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct
 	isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8
 	if isOptional || isRepeated {
 		t = t.Elem()
 	}
-	f := ptag.Unmarshal(d.Tag, t)
+	switch v := reflect.Zero(t).Interface().(type) {
+	case pref.Enum:
+		ed = v.Descriptor()
+	case enumV1:
+		ed = LegacyLoadEnumDesc(t)
+	case pref.ProtoMessage:
+		md = v.ProtoReflect().Descriptor()
+	case messageV1:
+		md = LegacyLoadMessageDesc(t)
+	}
+
+	// Derive basic field information from the struct tag.
+	var evs pref.EnumValueDescriptors
+	if ed != nil {
+		evs = ed.Values()
+	}
+	fd := ptag.Unmarshal(d.Tag, t, evs).(*filedesc.Field)
 
 	// Construct a v2 ExtensionType.
-	var ed pref.EnumDescriptor
-	var md pref.MessageDescriptor
-	switch f.Kind {
-	case pref.EnumKind:
-		if e, ok := reflect.Zero(t).Interface().(pref.Enum); ok {
-			ed = e.Descriptor()
-		} else {
-			ed = LegacyLoadEnumDesc(t)
-		}
-	case pref.MessageKind, pref.GroupKind:
-		if m, ok := reflect.Zero(t).Interface().(pref.ProtoMessage); ok {
-			md = m.ProtoReflect().Descriptor()
-		} else {
-			md = LegacyLoadMessageDesc(t)
-		}
-	}
-	xd, err := ptype.NewExtension(&ptype.StandaloneExtension{
-		FullName:     pref.FullName(d.Name),
-		Number:       pref.FieldNumber(d.Field),
-		Cardinality:  f.Cardinality,
-		Kind:         f.Kind,
-		Default:      f.Default,
-		Options:      f.Options,
-		EnumType:     ed,
-		MessageType:  md,
-		ExtendedType: Export{}.MessageDescriptorOf(d.ExtendedType),
-	})
-	if err != nil {
-		panic(err)
-	}
+	xd := &filedesc.Extension{L2: new(filedesc.ExtensionL2)}
+	xd.L0.ParentFile = filedesc.SurrogateProto2
+	xd.L0.FullName = pref.FullName(d.Name)
+	xd.L1.Number = pref.FieldNumber(d.Field)
+	xd.L2.Cardinality = fd.L1.Cardinality
+	xd.L1.Kind = fd.L1.Kind
+	xd.L2.IsPacked = fd.L1.IsPacked
+	xd.L2.Default = fd.L1.Default
+	xd.L1.Extendee = Export{}.MessageDescriptorOf(d.ExtendedType)
+	xd.L2.Enum = ed
+	xd.L2.Message = md
 	xt := LegacyExtensionTypeOf(xd, t)
 
 	// Cache the conversion for both directions.
diff --git a/internal/impl/legacy_extension_test.go b/internal/impl/legacy_extension_test.go
deleted file mode 100644
index 6ccfa40..0000000
--- a/internal/impl/legacy_extension_test.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package impl_test
-
-import (
-	"reflect"
-	"testing"
-
-	pimpl "google.golang.org/protobuf/internal/impl"
-	ptype "google.golang.org/protobuf/internal/prototype"
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-	piface "google.golang.org/protobuf/runtime/protoiface"
-
-	proto2_20180125 "google.golang.org/protobuf/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
-)
-
-type legacyExtendedMessage struct {
-	XXX_unrecognized       []byte
-	XXX_InternalExtensions map[int32]pimpl.ExtensionField
-}
-
-func (*legacyExtendedMessage) Reset()         {}
-func (*legacyExtendedMessage) String() string { return "" }
-func (*legacyExtendedMessage) ProtoMessage()  {}
-func (*legacyExtendedMessage) ExtensionRangeArray() []piface.ExtensionRangeV1 {
-	return []piface.ExtensionRangeV1{{Start: 10000, End: 20000}}
-}
-
-func mustMakeExtensionType(x *ptype.StandaloneExtension, v interface{}) pref.ExtensionType {
-	xd, err := ptype.NewExtension(x)
-	if err != nil {
-		panic(err)
-	}
-	return pimpl.LegacyExtensionTypeOf(xd, reflect.TypeOf(v))
-}
-
-var (
-	extParentDesc    = pimpl.Export{}.MessageDescriptorOf((*legacyExtendedMessage)(nil))
-	extMessageV1Desc = pimpl.Export{}.MessageDescriptorOf((*proto2_20180125.Message_ChildMessage)(nil))
-
-	wantType = mustMakeExtensionType(&ptype.StandaloneExtension{
-		FullName:     "fizz.buzz.optional_message_v1",
-		Number:       10007,
-		Cardinality:  pref.Optional,
-		Kind:         pref.MessageKind,
-		MessageType:  extMessageV1Desc,
-		ExtendedType: extParentDesc,
-	}, (*proto2_20180125.Message_ChildMessage)(nil))
-	wantDesc = &piface.ExtensionDescV1{
-		ExtendedType:  (*legacyExtendedMessage)(nil),
-		ExtensionType: (*proto2_20180125.Message_ChildMessage)(nil),
-		Field:         10007,
-		Name:          "fizz.buzz.optional_message_v1",
-		Tag:           "bytes,10007,opt,name=optional_message_v1",
-	}
-)
-
-func BenchmarkConvert(b *testing.B) {
-	b.ReportAllocs()
-	for i := 0; i < b.N; i++ {
-		xd := pimpl.Export{}.ExtensionDescFromType(wantType)
-		gotType := pimpl.Export{}.ExtensionTypeFromDesc(xd)
-		if gotType != wantType {
-			b.Fatalf("ExtensionType mismatch: got %p, want %p", gotType, wantType)
-		}
-
-		xt := pimpl.Export{}.ExtensionTypeFromDesc(wantDesc)
-		gotDesc := pimpl.Export{}.ExtensionDescFromType(xt)
-		if gotDesc != wantDesc {
-			b.Fatalf("ExtensionDesc mismatch: got %p, want %p", gotDesc, wantDesc)
-		}
-	}
-}
diff --git a/internal/impl/legacy_file.go b/internal/impl/legacy_file.go
index ddf33f7..b1293c6 100644
--- a/internal/impl/legacy_file.go
+++ b/internal/impl/legacy_file.go
@@ -9,6 +9,10 @@
 	"compress/gzip"
 	"io/ioutil"
 	"sync"
+
+	"google.golang.org/protobuf/internal/filedesc"
+	"google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/reflect/protoregistry"
 )
 
 // Every enum and message type generated by protoc-gen-go since commit 2fc053c5
@@ -28,7 +32,7 @@
 	}
 )
 
-var legacyFileDescCache sync.Map // map[*byte]*descriptorpb.FileDescriptorProto
+var legacyFileDescCache sync.Map // map[*byte]protoreflect.FileDescriptor
 
 // legacyLoadFileDesc unmarshals b as a compressed FileDescriptorProto message.
 //
@@ -36,10 +40,10 @@
 // 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 legacyLoadFileDesc(b []byte) *legacyFileDescriptorProto {
+func legacyLoadFileDesc(b []byte) protoreflect.FileDescriptor {
 	// Fast-path: check whether we already have a cached file descriptor.
 	if fd, ok := legacyFileDescCache.Load(&b[0]); ok {
-		return fd.(*legacyFileDescriptorProto)
+		return fd.(protoreflect.FileDescriptor)
 	}
 
 	// Slow-path: decompress and unmarshal the file descriptor proto.
@@ -47,13 +51,23 @@
 	if err != nil {
 		panic(err)
 	}
-	b, err = ioutil.ReadAll(zr)
+	b2, err := ioutil.ReadAll(zr)
 	if err != nil {
 		panic(err)
 	}
-	fd := legacyParseFileDescProto(b)
+
+	fd := filedesc.DescBuilder{
+		RawDescriptor: b2,
+		FileRegistry:  resolverOnly{protoregistry.GlobalFiles}, // do not register back to global registry
+	}.Build().File
 	if fd, ok := legacyFileDescCache.LoadOrStore(&b[0], fd); ok {
-		return fd.(*legacyFileDescriptorProto)
+		return fd.(protoreflect.FileDescriptor)
 	}
 	return fd
 }
+
+type resolverOnly struct {
+	*protoregistry.Files
+}
+
+func (resolverOnly) Register(...protoreflect.FileDescriptor) error { return nil }
diff --git a/internal/impl/legacy_message.go b/internal/impl/legacy_message.go
index c54cfc1..58bb07c 100644
--- a/internal/impl/legacy_message.go
+++ b/internal/impl/legacy_message.go
@@ -7,12 +7,9 @@
 import (
 	"fmt"
 	"reflect"
-	"strings"
 	"sync"
-	"unicode"
 
-	ptag "google.golang.org/protobuf/internal/encoding/tag"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/reflect/protoreflect"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/prototype"
 )
@@ -50,276 +47,35 @@
 	return mt
 }
 
-var (
-	legacyMessageDescLock  sync.Mutex
-	legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDescriptor
-)
+var legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDescriptor
 
 // LegacyLoadMessageDesc returns an MessageDescriptor derived from the Go type,
 // which must be a *struct kind and not implement the v2 API already.
 //
 // This is exported for testing purposes.
 func LegacyLoadMessageDesc(t reflect.Type) pref.MessageDescriptor {
-	return legacyMessageDescSet{}.Load(t)
-}
-
-type legacyMessageDescSet struct {
-	visited map[reflect.Type]*ptype.StandaloneMessage
-	descs   []*ptype.StandaloneMessage
-	types   []reflect.Type
-}
-
-func (ms legacyMessageDescSet) Load(t reflect.Type) pref.MessageDescriptor {
 	// Fast-path: check if a MessageDescriptor is cached for this concrete type.
 	if mi, ok := legacyMessageDescCache.Load(t); ok {
 		return mi.(pref.MessageDescriptor)
 	}
 
-	// Slow-path: initialize MessageDescriptor from the Go type.
-	//
-	// Hold a global lock during message creation to ensure that each Go type
-	// maps to exactly one MessageDescriptor. After obtaining the lock, we must
-	// check again whether the message has already been handled.
-	legacyMessageDescLock.Lock()
-	defer legacyMessageDescLock.Unlock()
-	if mi, ok := legacyMessageDescCache.Load(t); ok {
-		return mi.(pref.MessageDescriptor)
-	}
-
-	// Processing t recursively populates descs and types with all sub-messages.
-	// The descriptor for the first type is guaranteed to be at the front.
-	ms.processMessage(t)
-
-	// Within a proto file it is possible for cyclic dependencies to exist
-	// between multiple message types. When these cases arise, the set of
-	// message descriptors must be created together.
-	mds, err := ptype.NewMessages(ms.descs)
-	if err != nil {
-		panic(err)
-	}
-	for i, md := range mds {
-		// Protobuf semantics represents map entries under-the-hood as
-		// pseudo-messages (has a descriptor, but no generated Go type).
-		// Avoid caching these fake messages.
-		if t := ms.types[i]; t.Kind() != reflect.Map {
-			legacyMessageDescCache.Store(t, md)
-		}
-	}
-	return mds[0]
-}
-
-func (ms *legacyMessageDescSet) processMessage(t reflect.Type) pref.MessageDescriptor {
-	// Fast-path: Obtain a placeholder if the message is already processed.
-	if m, ok := ms.visited[t]; ok {
-		return ptype.PlaceholderMessage(m.FullName)
-	}
-
-	// Slow-path: Walk over the struct fields to derive the message descriptor.
-	if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct || t.Elem().PkgPath() == "" {
-		panic(fmt.Sprintf("got %v, want named *struct kind", t))
-	}
-
-	// Derive name and syntax from the raw descriptor.
-	m := new(ptype.StandaloneMessage)
+	// Slow-path: initialize MessageDescriptor from the raw descriptor.
 	mv := reflect.New(t.Elem()).Interface()
 	if _, ok := mv.(pref.ProtoMessage); ok {
 		panic(fmt.Sprintf("%v already implements proto.Message", t))
 	}
-	if md, ok := mv.(messageV1); ok {
-		b, idxs := md.Descriptor()
-		fd := legacyLoadFileDesc(b)
+	mdV1, ok := mv.(messageV1)
+	if !ok {
+		panic(fmt.Sprintf("message %v is no longer supported; please regenerate", t))
+	}
+	b, idxs := mdV1.Descriptor()
 
-		// Derive syntax.
-		switch fd.GetSyntax() {
-		case "proto2", "":
-			m.Syntax = pref.Proto2
-		case "proto3":
-			m.Syntax = pref.Proto3
-		}
-
-		// Derive full name.
-		md := fd.MessageType[idxs[0]]
-		m.FullName = pref.FullName(fd.GetPackage()).Append(pref.Name(md.GetName()))
-		for _, i := range idxs[1:] {
-			md = md.NestedType[i]
-			m.FullName = m.FullName.Append(pref.Name(md.GetName()))
-		}
-	} else {
-		// If the type does not implement messageV1, then the only way to
-		// obtain the full name is through the registry. However, this is
-		// unreliable as some generated messages register with a fork of
-		// golang/protobuf, so the registry may not have this information.
-		m.FullName = legacyDeriveFullName(t.Elem())
-		m.Syntax = pref.Proto2
-
-		// Try to determine if the message is using proto3 by checking scalars.
-		for i := 0; i < t.Elem().NumField(); i++ {
-			f := t.Elem().Field(i)
-			if tag := f.Tag.Get("protobuf"); tag != "" {
-				switch f.Type.Kind() {
-				case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
-					m.Syntax = pref.Proto3
-				}
-				for _, s := range strings.Split(tag, ",") {
-					if s == "proto3" {
-						m.Syntax = pref.Proto3
-					}
-				}
-			}
-		}
+	md := legacyLoadFileDesc(b).Messages().Get(idxs[0])
+	for _, i := range idxs[1:] {
+		md = md.Messages().Get(i)
 	}
-	ms.visit(m, t)
-
-	// Obtain a list of oneof wrapper types.
-	var oneofWrappers []reflect.Type
-	if fn, ok := t.MethodByName("XXX_OneofFuncs"); ok {
-		vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[3]
-		for _, v := range vs.Interface().([]interface{}) {
-			oneofWrappers = append(oneofWrappers, reflect.TypeOf(v))
-		}
+	if md, ok := legacyMessageDescCache.LoadOrStore(t, md); ok {
+		return md.(protoreflect.MessageDescriptor)
 	}
-	if fn, ok := t.MethodByName("XXX_OneofWrappers"); ok {
-		vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0]
-		for _, v := range vs.Interface().([]interface{}) {
-			oneofWrappers = append(oneofWrappers, reflect.TypeOf(v))
-		}
-	}
-
-	// Obtain a list of the extension ranges.
-	if fn, ok := t.MethodByName("ExtensionRangeArray"); ok {
-		vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0]
-		for i := 0; i < vs.Len(); i++ {
-			v := vs.Index(i)
-			m.ExtensionRanges = append(m.ExtensionRanges, [2]pref.FieldNumber{
-				pref.FieldNumber(v.FieldByName("Start").Int()),
-				pref.FieldNumber(v.FieldByName("End").Int() + 1),
-			})
-		}
-	}
-
-	// Derive the message fields by inspecting the struct fields.
-	for i := 0; i < t.Elem().NumField(); i++ {
-		f := t.Elem().Field(i)
-		if tag := f.Tag.Get("protobuf"); tag != "" {
-			tagKey := f.Tag.Get("protobuf_key")
-			tagVal := f.Tag.Get("protobuf_val")
-			m.Fields = append(m.Fields, ms.parseField(tag, tagKey, tagVal, f.Type, m))
-		}
-		if tag := f.Tag.Get("protobuf_oneof"); tag != "" {
-			name := pref.Name(tag)
-			m.Oneofs = append(m.Oneofs, ptype.Oneof{Name: name})
-			for _, t := range oneofWrappers {
-				if t.Implements(f.Type) {
-					f := t.Elem().Field(0)
-					if tag := f.Tag.Get("protobuf"); tag != "" {
-						ft := ms.parseField(tag, "", "", f.Type, m)
-						ft.OneofName = name
-						m.Fields = append(m.Fields, ft)
-					}
-				}
-			}
-		}
-	}
-
-	return ptype.PlaceholderMessage(m.FullName)
-}
-
-func (ms *legacyMessageDescSet) parseField(tag, tagKey, tagVal string, goType reflect.Type, parent *ptype.StandaloneMessage) ptype.Field {
-	t := goType
-	isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct
-	isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8
-	if isOptional || isRepeated {
-		t = t.Elem()
-	}
-	f := ptag.Unmarshal(tag, t)
-
-	// Populate EnumType and MessageType.
-	if f.EnumType == nil && f.Kind == pref.EnumKind {
-		if ev, ok := reflect.Zero(t).Interface().(pref.Enum); ok {
-			f.EnumType = ev.Descriptor()
-		} else {
-			f.EnumType = LegacyLoadEnumDesc(t)
-		}
-	}
-	if f.MessageType == nil && (f.Kind == pref.MessageKind || f.Kind == pref.GroupKind) {
-		if mv, ok := reflect.Zero(t).Interface().(pref.ProtoMessage); ok {
-			f.MessageType = mv.ProtoReflect().Descriptor()
-		} else if t.Kind() == reflect.Map {
-			m := &ptype.StandaloneMessage{
-				Syntax:     parent.Syntax,
-				FullName:   parent.FullName.Append(legacyMapEntryName(f.Name)),
-				IsMapEntry: true,
-				Fields: []ptype.Field{
-					ms.parseField(tagKey, "", "", t.Key(), nil),
-					ms.parseField(tagVal, "", "", t.Elem(), nil),
-				},
-			}
-			ms.visit(m, t)
-			f.MessageType = ptype.PlaceholderMessage(m.FullName)
-		} else if mv, ok := legacyMessageDescCache.Load(t); ok {
-			f.MessageType = mv.(pref.MessageDescriptor)
-		} else {
-			f.MessageType = ms.processMessage(t)
-		}
-	}
-	return f
-}
-
-func (ms *legacyMessageDescSet) visit(m *ptype.StandaloneMessage, t reflect.Type) {
-	if ms.visited == nil {
-		ms.visited = make(map[reflect.Type]*ptype.StandaloneMessage)
-	}
-	if t.Kind() != reflect.Map {
-		ms.visited[t] = m
-	}
-	ms.descs = append(ms.descs, m)
-	ms.types = append(ms.types, t)
-}
-
-// legacyDeriveFullName derives a fully qualified protobuf name for the given Go type
-// The provided name is not guaranteed to be stable nor universally unique.
-// It should be sufficiently unique within a program.
-func legacyDeriveFullName(t reflect.Type) pref.FullName {
-	sanitize := func(r rune) rune {
-		switch {
-		case r == '/':
-			return '.'
-		case 'a' <= r && r <= 'z', 'A' <= r && r <= 'Z', '0' <= r && r <= '9':
-			return r
-		default:
-			return '_'
-		}
-	}
-	prefix := strings.Map(sanitize, t.PkgPath())
-	suffix := strings.Map(sanitize, t.Name())
-	if suffix == "" {
-		suffix = fmt.Sprintf("UnknownX%X", reflect.ValueOf(t).Pointer())
-	}
-
-	ss := append(strings.Split(prefix, "."), suffix)
-	for i, s := range ss {
-		if s == "" || ('0' <= s[0] && s[0] <= '9') {
-			ss[i] = "x" + s
-		}
-	}
-	return pref.FullName(strings.Join(ss, "."))
-}
-
-// legacyMapEntryName derives the message name for a map field of a given name.
-// This is identical to MapEntryName from parser.cc in the protoc source.
-func legacyMapEntryName(s pref.Name) pref.Name {
-	var b []byte
-	nextUpper := true
-	for i := 0; i < len(s); i++ {
-		if c := s[i]; c == '_' {
-			nextUpper = true
-		} else {
-			if nextUpper {
-				c = byte(unicode.ToUpper(rune(c)))
-				nextUpper = false
-			}
-			b = append(b, c)
-		}
-	}
-	return pref.Name(append(b, "Entry"...))
+	return md
 }
diff --git a/internal/impl/legacy_parse.go b/internal/impl/legacy_parse.go
deleted file mode 100644
index 90ba1b7..0000000
--- a/internal/impl/legacy_parse.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package impl
-
-import (
-	"google.golang.org/protobuf/internal/encoding/wire"
-	"google.golang.org/protobuf/internal/fieldnum"
-)
-
-// To avoid a dependency from legacy to descriptor.proto, use a hand-written parser
-// for the bits of the descriptor we need.
-//
-// TODO: Consider unifying this with the parser in fileinit.
-
-type legacyFileDescriptorProto struct {
-	Syntax      string
-	Package     string
-	EnumType    []*legacyEnumDescriptorProto
-	MessageType []*legacyDescriptorProto
-}
-
-func (fd legacyFileDescriptorProto) GetSyntax() string  { return fd.Syntax }
-func (fd legacyFileDescriptorProto) GetPackage() string { return fd.Package }
-
-func legacyParseFileDescProto(b []byte) *legacyFileDescriptorProto {
-	fd := &legacyFileDescriptorProto{}
-	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
-		legacyParseCheck(n)
-		b = b[n:]
-		switch typ {
-		case wire.BytesType:
-			v, n := wire.ConsumeBytes(b)
-			b = b[n:]
-			switch num {
-			case fieldnum.FileDescriptorProto_Syntax:
-				fd.Syntax = string(v)
-			case fieldnum.FileDescriptorProto_Package:
-				fd.Package = string(v)
-			case fieldnum.FileDescriptorProto_EnumType:
-				fd.EnumType = append(fd.EnumType, legacyParseEnumDescProto(v))
-			case fieldnum.FileDescriptorProto_MessageType:
-				fd.MessageType = append(fd.MessageType, parseDescProto(v))
-			}
-		default:
-			n := wire.ConsumeFieldValue(num, typ, b)
-			legacyParseCheck(n)
-			b = b[n:]
-		}
-	}
-	return fd
-}
-
-type legacyDescriptorProto struct {
-	Name       string
-	NestedType []*legacyDescriptorProto
-	EnumType   []*legacyEnumDescriptorProto
-}
-
-func (md legacyDescriptorProto) GetName() string { return md.Name }
-
-func parseDescProto(b []byte) *legacyDescriptorProto {
-	md := &legacyDescriptorProto{}
-	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
-		legacyParseCheck(n)
-		b = b[n:]
-		switch typ {
-		case wire.BytesType:
-			v, n := wire.ConsumeBytes(b)
-			legacyParseCheck(n)
-			b = b[n:]
-			switch num {
-			case fieldnum.DescriptorProto_Name:
-				md.Name = string(v)
-			case fieldnum.DescriptorProto_NestedType:
-				md.NestedType = append(md.NestedType, parseDescProto(v))
-			case fieldnum.DescriptorProto_EnumType:
-				md.EnumType = append(md.EnumType, legacyParseEnumDescProto(v))
-			}
-		default:
-			n := wire.ConsumeFieldValue(num, typ, b)
-			legacyParseCheck(n)
-			b = b[n:]
-		}
-	}
-	return md
-}
-
-type legacyEnumDescriptorProto struct {
-	Name  string
-	Value []*legacyEnumValueDescriptorProto
-}
-
-func (ed legacyEnumDescriptorProto) GetName() string { return ed.Name }
-
-func legacyParseEnumDescProto(b []byte) *legacyEnumDescriptorProto {
-	ed := &legacyEnumDescriptorProto{}
-	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
-		legacyParseCheck(n)
-		b = b[n:]
-		switch typ {
-		case wire.BytesType:
-			v, n := wire.ConsumeBytes(b)
-			legacyParseCheck(n)
-			b = b[n:]
-			switch num {
-			case fieldnum.EnumDescriptorProto_Name:
-				ed.Name = string(v)
-			case fieldnum.EnumDescriptorProto_Value:
-				ed.Value = append(ed.Value, legacyParseEnumValueDescProto(v))
-			}
-		default:
-			n := wire.ConsumeFieldValue(num, typ, b)
-			legacyParseCheck(n)
-			b = b[n:]
-		}
-	}
-	return ed
-}
-
-type legacyEnumValueDescriptorProto struct {
-	Name   string
-	Number int32
-}
-
-func (ed legacyEnumValueDescriptorProto) GetName() string  { return ed.Name }
-func (ed legacyEnumValueDescriptorProto) GetNumber() int32 { return ed.Number }
-
-func legacyParseEnumValueDescProto(b []byte) *legacyEnumValueDescriptorProto {
-	vd := &legacyEnumValueDescriptorProto{}
-	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
-		legacyParseCheck(n)
-		b = b[n:]
-		switch typ {
-		case wire.VarintType:
-			v, n := wire.ConsumeVarint(b)
-			legacyParseCheck(n)
-			b = b[n:]
-			switch num {
-			case fieldnum.EnumValueDescriptorProto_Number:
-				vd.Number = int32(v)
-			}
-		case wire.BytesType:
-			v, n := wire.ConsumeBytes(b)
-			legacyParseCheck(n)
-			b = b[n:]
-			switch num {
-			case fieldnum.EnumDescriptorProto_Name:
-				vd.Name = string(v)
-			}
-		default:
-			n := wire.ConsumeFieldValue(num, typ, b)
-			legacyParseCheck(n)
-			b = b[n:]
-		}
-	}
-	return vd
-}
-
-func legacyParseCheck(n int) {
-	if n < 0 {
-		panic(wire.ParseError(n))
-	}
-}
diff --git a/internal/impl/legacy_test.go b/internal/impl/legacy_test.go
index fc29cdb..a51ae03 100644
--- a/internal/impl/legacy_test.go
+++ b/internal/impl/legacy_test.go
@@ -5,326 +5,333 @@
 package impl_test
 
 import (
+	"fmt"
 	"reflect"
 	"sync"
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
 	"github.com/google/go-cmp/cmp/cmpopts"
+	"google.golang.org/protobuf/encoding/prototext"
 	pimpl "google.golang.org/protobuf/internal/impl"
-	pragma "google.golang.org/protobuf/internal/pragma"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/internal/pragma"
 	"google.golang.org/protobuf/internal/scalar"
+	"google.golang.org/protobuf/proto"
+	pdesc "google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	preg "google.golang.org/protobuf/reflect/protoregistry"
 	piface "google.golang.org/protobuf/runtime/protoiface"
 
 	proto2_20180125 "google.golang.org/protobuf/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
+	"google.golang.org/protobuf/types/descriptorpb"
 )
 
-type legacyTestMessage struct {
+type LegacyTestMessage struct {
 	XXX_unrecognized       []byte
 	XXX_InternalExtensions map[int32]pimpl.ExtensionField
 }
 
-func (*legacyTestMessage) Reset()         {}
-func (*legacyTestMessage) String() string { return "" }
-func (*legacyTestMessage) ProtoMessage()  {}
-func (*legacyTestMessage) ExtensionRangeArray() []piface.ExtensionRangeV1 {
+func (*LegacyTestMessage) Reset()         {}
+func (*LegacyTestMessage) String() string { return "" }
+func (*LegacyTestMessage) ProtoMessage()  {}
+func (*LegacyTestMessage) ExtensionRangeArray() []piface.ExtensionRangeV1 {
 	return []piface.ExtensionRangeV1{{Start: 10, End: 20}, {Start: 40, End: 80}, {Start: 10000, End: 20000}}
 }
+func (*LegacyTestMessage) Descriptor() ([]byte, []int) { return legacyFD, []int{0} }
+
+var legacyFD = func() []byte {
+	b, _ := proto.Marshal(pdesc.ToFileDescriptorProto(mustMakeFileDesc(`
+		name:   "legacy.proto"
+		syntax: "proto2"
+		message_type: [{
+			name:            "LegacyTestMessage"
+			extension_range: [{start:10 end:20}, {start:40 end:80}, {start:10000 end:20000}]
+		}]
+	`, nil)))
+	return pimpl.Export{}.CompressGZIP(b)
+}()
 
 func init() {
-	mt := pimpl.Export{}.MessageTypeOf(&legacyTestMessage{})
+	mt := pimpl.Export{}.MessageTypeOf((*LegacyTestMessage)(nil))
+	preg.GlobalFiles.Register(mt.ParentFile())
 	preg.GlobalTypes.Register(mt)
 }
 
+func mustMakeExtensionType(fileDesc, extDesc string, t interface{}, r pdesc.Resolver) pref.ExtensionType {
+	s := fmt.Sprintf(`name:"test.proto" syntax:"proto2" %s extension:[{%s}]`, fileDesc, extDesc)
+	xd := mustMakeFileDesc(s, r).Extensions().Get(0)
+	return pimpl.LegacyExtensionTypeOf(xd, reflect.TypeOf(t))
+}
+
+func mustMakeFileDesc(s string, r pdesc.Resolver) pref.FileDescriptor {
+	pb := new(descriptorpb.FileDescriptorProto)
+	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
+		panic(err)
+	}
+	fd, err := pdesc.NewFile(pb, r)
+	if err != nil {
+		panic(err)
+	}
+	return fd
+}
+
 var (
-	testParentDesc    = pimpl.Export{}.MessageDescriptorOf((*legacyTestMessage)(nil))
+	testParentDesc    = pimpl.Export{}.MessageDescriptorOf((*LegacyTestMessage)(nil))
 	testEnumV1Desc    = pimpl.Export{}.EnumDescriptorOf(proto2_20180125.Message_ChildEnum(0))
 	testMessageV1Desc = pimpl.Export{}.MessageDescriptorOf((*proto2_20180125.Message_ChildMessage)(nil))
 	testEnumV2Desc    = enumProto2Type.Descriptor()
 	testMessageV2Desc = enumMessagesType.PBType.Descriptor()
 
+	depReg = preg.NewFiles(
+		testParentDesc.ParentFile(),
+		testEnumV1Desc.ParentFile(),
+		testMessageV1Desc.ParentFile(),
+		testEnumV2Desc.ParentFile(),
+		testMessageV2Desc.ParentFile(),
+	)
 	extensionTypes = []pref.ExtensionType{
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_bool",
-			Number:       10000,
-			Cardinality:  pref.Optional,
-			Kind:         pref.BoolKind,
-			Default:      pref.ValueOf(true),
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_int32",
-			Number:       10001,
-			Cardinality:  pref.Optional,
-			Kind:         pref.Int32Kind,
-			Default:      pref.ValueOf(int32(-12345)),
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_uint32",
-			Number:       10002,
-			Cardinality:  pref.Optional,
-			Kind:         pref.Uint32Kind,
-			Default:      pref.ValueOf(uint32(3200)),
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_float",
-			Number:       10003,
-			Cardinality:  pref.Optional,
-			Kind:         pref.FloatKind,
-			Default:      pref.ValueOf(float32(3.14159)),
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_string",
-			Number:       10004,
-			Cardinality:  pref.Optional,
-			Kind:         pref.StringKind,
-			Default:      pref.ValueOf(string("hello, \"world!\"\n")),
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_bytes",
-			Number:       10005,
-			Cardinality:  pref.Optional,
-			Kind:         pref.BytesKind,
-			Default:      pref.ValueOf([]byte("dead\xde\xad\xbe\xefbeef")),
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_enum_v1",
-			Number:       10006,
-			Cardinality:  pref.Optional,
-			Kind:         pref.EnumKind,
-			Default:      pref.ValueOf(pref.EnumNumber(0)),
-			EnumType:     testEnumV1Desc,
-			ExtendedType: testParentDesc,
-		}, proto2_20180125.Message_ChildEnum(0)),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_message_v1",
-			Number:       10007,
-			Cardinality:  pref.Optional,
-			Kind:         pref.MessageKind,
-			MessageType:  testMessageV1Desc,
-			ExtendedType: testParentDesc,
-		}, (*proto2_20180125.Message_ChildMessage)(nil)),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_enum_v2",
-			Number:       10008,
-			Cardinality:  pref.Optional,
-			Kind:         pref.EnumKind,
-			Default:      pref.ValueOf(pref.EnumNumber(57005)),
-			EnumType:     testEnumV2Desc,
-			ExtendedType: testParentDesc,
-		}, EnumProto2(0)),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.optional_message_v2",
-			Number:       10009,
-			Cardinality:  pref.Optional,
-			Kind:         pref.MessageKind,
-			MessageType:  testMessageV2Desc,
-			ExtendedType: testParentDesc,
-		}, (*EnumMessages)(nil)),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_bool",
-			Number:       10010,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.BoolKind,
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_int32",
-			Number:       10011,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.Int32Kind,
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_uint32",
-			Number:       10012,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.Uint32Kind,
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_float",
-			Number:       10013,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.FloatKind,
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_string",
-			Number:       10014,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.StringKind,
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_bytes",
-			Number:       10015,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.BytesKind,
-			ExtendedType: testParentDesc,
-		}, nil),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_enum_v1",
-			Number:       10016,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.EnumKind,
-			EnumType:     testEnumV1Desc,
-			ExtendedType: testParentDesc,
-		}, proto2_20180125.Message_ChildEnum(0)),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_message_v1",
-			Number:       10017,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.MessageKind,
-			MessageType:  testMessageV1Desc,
-			ExtendedType: testParentDesc,
-		}, (*proto2_20180125.Message_ChildMessage)(nil)),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_enum_v2",
-			Number:       10018,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.EnumKind,
-			EnumType:     testEnumV2Desc,
-			ExtendedType: testParentDesc,
-		}, EnumProto2(0)),
-		mustMakeExtensionType(&ptype.StandaloneExtension{
-			FullName:     "fizz.buzz.repeated_message_v2",
-			Number:       10019,
-			Cardinality:  pref.Repeated,
-			Kind:         pref.MessageKind,
-			MessageType:  testMessageV2Desc,
-			ExtendedType: testParentDesc,
-		}, (*EnumMessages)(nil)),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"optional_bool" number:10000 label:LABEL_OPTIONAL type:TYPE_BOOL default_value:"true" extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"optional_int32" number:10001 label:LABEL_OPTIONAL type:TYPE_INT32 default_value:"-12345" extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"optional_uint32" number:10002 label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"3200" extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"optional_float" number:10003 label:LABEL_OPTIONAL type:TYPE_FLOAT default_value:"3.14159" extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"optional_string" number:10004 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"hello, \"world!\"\n" extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"optional_bytes" number:10005 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"dead\\336\\255\\276\\357beef" extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "proto2.v1.0.0-20180125-92554152/test.proto"]`,
+			`name:"optional_enum_v1" number:10006 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".google.golang.org.proto2_20180125.Message.ChildEnum" default_value:"ALPHA" extendee:".LegacyTestMessage"`,
+			proto2_20180125.Message_ChildEnum(0), depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "proto2.v1.0.0-20180125-92554152/test.proto"]`,
+			`name:"optional_message_v1" number:10007 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".google.golang.org.proto2_20180125.Message.ChildMessage" extendee:".LegacyTestMessage"`,
+			(*proto2_20180125.Message_ChildMessage)(nil), depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "enum2.proto"]`,
+			`name:"optional_enum_v2" number:10008 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".EnumProto2" default_value:"DEAD" extendee:".LegacyTestMessage"`,
+			EnumProto2(0), depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "enum-messages.proto"]`,
+			`name:"optional_message_v2" number:10009 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".EnumMessages" extendee:".LegacyTestMessage"`,
+			(*EnumMessages)(nil), depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"repeated_bool" number:10010 label:LABEL_REPEATED type:TYPE_BOOL extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"repeated_int32" number:10011 label:LABEL_REPEATED type:TYPE_INT32 extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"repeated_uint32" number:10012 label:LABEL_REPEATED type:TYPE_UINT32 extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"repeated_float" number:10013 label:LABEL_REPEATED type:TYPE_FLOAT extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"repeated_string" number:10014 label:LABEL_REPEATED type:TYPE_STRING extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:"legacy.proto"`,
+			`name:"repeated_bytes" number:10015 label:LABEL_REPEATED type:TYPE_BYTES extendee:".LegacyTestMessage"`,
+			nil, depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "proto2.v1.0.0-20180125-92554152/test.proto"]`,
+			`name:"repeated_enum_v1" number:10016 label:LABEL_REPEATED type:TYPE_ENUM type_name:".google.golang.org.proto2_20180125.Message.ChildEnum" extendee:".LegacyTestMessage"`,
+			proto2_20180125.Message_ChildEnum(0), depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "proto2.v1.0.0-20180125-92554152/test.proto"]`,
+			`name:"repeated_message_v1" number:10017 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google.golang.org.proto2_20180125.Message.ChildMessage" extendee:".LegacyTestMessage"`,
+			(*proto2_20180125.Message_ChildMessage)(nil), depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "enum2.proto"]`,
+			`name:"repeated_enum_v2" number:10018 label:LABEL_REPEATED type:TYPE_ENUM type_name:".EnumProto2" extendee:".LegacyTestMessage"`,
+			EnumProto2(0), depReg,
+		),
+		mustMakeExtensionType(
+			`package:"fizz.buzz" dependency:["legacy.proto", "enum-messages.proto"]`,
+			`name:"repeated_message_v2" number:10019 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".EnumMessages" extendee:".LegacyTestMessage"`,
+			(*EnumMessages)(nil), depReg,
+		),
 	}
 
 	extensionDescs = []*piface.ExtensionDescV1{{
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*bool)(nil),
 		Field:         10000,
 		Name:          "fizz.buzz.optional_bool",
 		Tag:           "varint,10000,opt,name=optional_bool,def=1",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*int32)(nil),
 		Field:         10001,
 		Name:          "fizz.buzz.optional_int32",
 		Tag:           "varint,10001,opt,name=optional_int32,def=-12345",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*uint32)(nil),
 		Field:         10002,
 		Name:          "fizz.buzz.optional_uint32",
 		Tag:           "varint,10002,opt,name=optional_uint32,def=3200",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*float32)(nil),
 		Field:         10003,
 		Name:          "fizz.buzz.optional_float",
 		Tag:           "fixed32,10003,opt,name=optional_float,def=3.14159",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*string)(nil),
 		Field:         10004,
 		Name:          "fizz.buzz.optional_string",
 		Tag:           "bytes,10004,opt,name=optional_string,def=hello, \"world!\"\n",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]byte)(nil),
 		Field:         10005,
 		Name:          "fizz.buzz.optional_bytes",
 		Tag:           "bytes,10005,opt,name=optional_bytes,def=dead\\336\\255\\276\\357beef",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*proto2_20180125.Message_ChildEnum)(nil),
 		Field:         10006,
 		Name:          "fizz.buzz.optional_enum_v1",
 		Tag:           "varint,10006,opt,name=optional_enum_v1,enum=google.golang.org.proto2_20180125.Message_ChildEnum,def=0",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*proto2_20180125.Message_ChildMessage)(nil),
 		Field:         10007,
 		Name:          "fizz.buzz.optional_message_v1",
 		Tag:           "bytes,10007,opt,name=optional_message_v1",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*EnumProto2)(nil),
 		Field:         10008,
 		Name:          "fizz.buzz.optional_enum_v2",
 		Tag:           "varint,10008,opt,name=optional_enum_v2,enum=EnumProto2,def=57005",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: (*EnumMessages)(nil),
 		Field:         10009,
 		Name:          "fizz.buzz.optional_message_v2",
 		Tag:           "bytes,10009,opt,name=optional_message_v2",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]bool)(nil),
 		Field:         10010,
 		Name:          "fizz.buzz.repeated_bool",
 		Tag:           "varint,10010,rep,name=repeated_bool",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]int32)(nil),
 		Field:         10011,
 		Name:          "fizz.buzz.repeated_int32",
 		Tag:           "varint,10011,rep,name=repeated_int32",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]uint32)(nil),
 		Field:         10012,
 		Name:          "fizz.buzz.repeated_uint32",
 		Tag:           "varint,10012,rep,name=repeated_uint32",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]float32)(nil),
 		Field:         10013,
 		Name:          "fizz.buzz.repeated_float",
 		Tag:           "fixed32,10013,rep,name=repeated_float",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]string)(nil),
 		Field:         10014,
 		Name:          "fizz.buzz.repeated_string",
 		Tag:           "bytes,10014,rep,name=repeated_string",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([][]byte)(nil),
 		Field:         10015,
 		Name:          "fizz.buzz.repeated_bytes",
 		Tag:           "bytes,10015,rep,name=repeated_bytes",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]proto2_20180125.Message_ChildEnum)(nil),
 		Field:         10016,
 		Name:          "fizz.buzz.repeated_enum_v1",
 		Tag:           "varint,10016,rep,name=repeated_enum_v1,enum=google.golang.org.proto2_20180125.Message_ChildEnum",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]*proto2_20180125.Message_ChildMessage)(nil),
 		Field:         10017,
 		Name:          "fizz.buzz.repeated_message_v1",
 		Tag:           "bytes,10017,rep,name=repeated_message_v1",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]EnumProto2)(nil),
 		Field:         10018,
 		Name:          "fizz.buzz.repeated_enum_v2",
 		Tag:           "varint,10018,rep,name=repeated_enum_v2,enum=EnumProto2",
+		Filename:      "test.proto",
 	}, {
-		ExtendedType:  (*legacyTestMessage)(nil),
+		ExtendedType:  (*LegacyTestMessage)(nil),
 		ExtensionType: ([]*EnumMessages)(nil),
 		Field:         10019,
 		Name:          "fizz.buzz.repeated_message_v2",
 		Tag:           "bytes,10019,rep,name=repeated_message_v2",
+		Filename:      "test.proto",
 	}}
 )
 
@@ -333,7 +340,7 @@
 		return x == y // pointer compare messages for object identity
 	})}
 
-	m := pimpl.Export{}.MessageOf(new(legacyTestMessage))
+	m := pimpl.Export{}.MessageOf(new(LegacyTestMessage))
 
 	if n := m.Len(); n != 0 {
 		t.Errorf("KnownFields.Len() = %v, want 0", n)
@@ -490,13 +497,6 @@
 					}
 					return out
 				}),
-				// TODO: Add this when ExtensionType no longer implements
-				// ExtensionDescriptor.
-				/*
-					cmp.Transformer("", func(x pref.ExtensionType) pref.ExtensionDescriptor {
-						return x.Descriptor()
-					}),
-				*/
 				cmp.Transformer("", func(x pref.Descriptor) map[string]interface{} {
 					out := make(map[string]interface{})
 					v := reflect.ValueOf(x)
@@ -558,6 +558,38 @@
 	Enum int32
 )
 
+func (*MessageA) Descriptor() ([]byte, []int) { return concurrentFD, []int{0} }
+func (*MessageB) Descriptor() ([]byte, []int) { return concurrentFD, []int{1} }
+func (Enum) EnumDescriptor() ([]byte, []int)  { return concurrentFD, []int{0} }
+
+var concurrentFD = func() []byte {
+	b, _ := proto.Marshal(pdesc.ToFileDescriptorProto(mustMakeFileDesc(`
+		name:    "concurrent.proto"
+		syntax:  "proto2"
+		package: "legacy"
+		message_type: [{
+			name: "MessageA"
+			field: [
+				{name:"a1" number:1 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageA"},
+				{name:"a2" number:2 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageB"},
+				{name:"a3" number:3 label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".legacy.Enum"}
+			]
+		}, {
+			name: "MessageB"
+			field: [
+				{name:"a1" number:1 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageA"},
+				{name:"a2" number:2 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageB"},
+				{name:"a3" number:3 label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".legacy.Enum"}
+			]
+		}]
+		enum_type: [{
+			name:  "Enum"
+			value: [{name:"FOO" number:500}]
+		}]
+	`, nil)))
+	return pimpl.Export{}.CompressGZIP(b)
+}()
+
 // TestConcurrentInit tests that concurrent wrapping of multiple legacy types
 // results in the exact same descriptor being created.
 func TestConcurrentInit(t *testing.T) {
diff --git a/internal/impl/message.go b/internal/impl/message.go
index df2fcee..161f194 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -283,6 +283,9 @@
 	if fx.Type == extensionFieldsType {
 		fieldOffset := offsetOf(fx)
 		mi.extensionMap = func(p pointer) *extensionMap {
+			if p.IsNil() {
+				return (*extensionMap)(nil)
+			}
 			v := p.Apply(fieldOffset).AsValueOf(extensionFieldsType)
 			return (*extensionMap)(v.Interface().(*map[int32]ExtensionField))
 		}
diff --git a/internal/impl/message_test.go b/internal/impl/message_test.go
index 722d1c0..fb89a2d 100644
--- a/internal/impl/message_test.go
+++ b/internal/impl/message_test.go
@@ -11,13 +11,15 @@
 	"strings"
 	"testing"
 
-	protoV1 "github.com/golang/protobuf/proto"
 	cmp "github.com/google/go-cmp/cmp"
 	cmpopts "github.com/google/go-cmp/cmp/cmpopts"
+	"google.golang.org/protobuf/encoding/prototext"
 	pimpl "google.golang.org/protobuf/internal/impl"
-	ptype "google.golang.org/protobuf/internal/prototype"
 	scalar "google.golang.org/protobuf/internal/scalar"
+	"google.golang.org/protobuf/proto"
+	pdesc "google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/reflect/protoregistry"
 	"google.golang.org/protobuf/reflect/prototype"
 
 	proto2_20180125 "google.golang.org/protobuf/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
@@ -158,20 +160,30 @@
 	MyBytesA  *MyString  `protobuf:"22"`
 }
 
-func mustMakeEnumDesc(t ptype.StandaloneEnum) pref.EnumDescriptor {
-	ed, err := ptype.NewEnum(&t)
+func mustMakeEnumDesc(path string, syntax pref.Syntax, enumDesc string) pref.EnumDescriptor {
+	s := fmt.Sprintf(`name:%q syntax:%q enum_type:[{%s}]`, path, syntax, enumDesc)
+	pb := new(descriptorpb.FileDescriptorProto)
+	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
+		panic(err)
+	}
+	fd, err := pdesc.NewFile(pb, nil)
 	if err != nil {
 		panic(err)
 	}
-	return ed
+	return fd.Enums().Get(0)
 }
 
-func mustMakeMessageDesc(t ptype.StandaloneMessage) pref.MessageDescriptor {
-	md, err := ptype.NewMessage(&t)
+func mustMakeMessageDesc(path string, syntax pref.Syntax, fileDesc, msgDesc string, r pdesc.Resolver) pref.MessageDescriptor {
+	s := fmt.Sprintf(`name:%q syntax:%q %s message_type:[{%s}]`, path, syntax, fileDesc, msgDesc)
+	pb := new(descriptorpb.FileDescriptorProto)
+	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
+		panic(err)
+	}
+	fd, err := pdesc.NewFile(pb, r)
 	if err != nil {
 		panic(err)
 	}
-	return md
+	return fd.Messages().Get(0)
 }
 
 var V = pref.ValueOf
@@ -196,35 +208,34 @@
 )
 
 var scalarProto2Type = pimpl.MessageInfo{GoType: reflect.TypeOf(new(ScalarProto2)), PBType: &prototype.Message{
-	MessageDescriptor: mustMakeMessageDesc(ptype.StandaloneMessage{
-		Syntax:   pref.Proto2,
-		FullName: "ScalarProto2",
-		Fields: []ptype.Field{
-			{Name: "f1", Number: 1, Cardinality: pref.Optional, Kind: pref.BoolKind, Default: V(bool(true))},
-			{Name: "f2", Number: 2, Cardinality: pref.Optional, Kind: pref.Int32Kind, Default: V(int32(2))},
-			{Name: "f3", Number: 3, Cardinality: pref.Optional, Kind: pref.Int64Kind, Default: V(int64(3))},
-			{Name: "f4", Number: 4, Cardinality: pref.Optional, Kind: pref.Uint32Kind, Default: V(uint32(4))},
-			{Name: "f5", Number: 5, Cardinality: pref.Optional, Kind: pref.Uint64Kind, Default: V(uint64(5))},
-			{Name: "f6", Number: 6, Cardinality: pref.Optional, Kind: pref.FloatKind, Default: V(float32(6))},
-			{Name: "f7", Number: 7, Cardinality: pref.Optional, Kind: pref.DoubleKind, Default: V(float64(7))},
-			{Name: "f8", Number: 8, Cardinality: pref.Optional, Kind: pref.StringKind, Default: V(string("8"))},
-			{Name: "f9", Number: 9, Cardinality: pref.Optional, Kind: pref.StringKind, Default: V(string("9"))},
-			{Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.BytesKind, Default: V([]byte("10"))},
-			{Name: "f11", Number: 11, Cardinality: pref.Optional, Kind: pref.BytesKind, Default: V([]byte("11"))},
+	MessageDescriptor: mustMakeMessageDesc("scalar2.proto", pref.Proto2, "", `
+		name: "ScalarProto2"
+		field: [
+			{name:"f1"  number:1  label:LABEL_OPTIONAL type:TYPE_BOOL   default_value:"true"},
+			{name:"f2"  number:2  label:LABEL_OPTIONAL type:TYPE_INT32  default_value:"2"},
+			{name:"f3"  number:3  label:LABEL_OPTIONAL type:TYPE_INT64  default_value:"3"},
+			{name:"f4"  number:4  label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"4"},
+			{name:"f5"  number:5  label:LABEL_OPTIONAL type:TYPE_UINT64 default_value:"5"},
+			{name:"f6"  number:6  label:LABEL_OPTIONAL type:TYPE_FLOAT  default_value:"6"},
+			{name:"f7"  number:7  label:LABEL_OPTIONAL type:TYPE_DOUBLE default_value:"7"},
+			{name:"f8"  number:8  label:LABEL_OPTIONAL type:TYPE_STRING default_value:"8"},
+			{name:"f9"  number:9  label:LABEL_OPTIONAL type:TYPE_STRING default_value:"9"},
+			{name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_BYTES  default_value:"10"},
+			{name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_BYTES  default_value:"11"},
 
-			{Name: "f12", Number: 12, Cardinality: pref.Optional, Kind: pref.BoolKind, Default: V(bool(true))},
-			{Name: "f13", Number: 13, Cardinality: pref.Optional, Kind: pref.Int32Kind, Default: V(int32(13))},
-			{Name: "f14", Number: 14, Cardinality: pref.Optional, Kind: pref.Int64Kind, Default: V(int64(14))},
-			{Name: "f15", Number: 15, Cardinality: pref.Optional, Kind: pref.Uint32Kind, Default: V(uint32(15))},
-			{Name: "f16", Number: 16, Cardinality: pref.Optional, Kind: pref.Uint64Kind, Default: V(uint64(16))},
-			{Name: "f17", Number: 17, Cardinality: pref.Optional, Kind: pref.FloatKind, Default: V(float32(17))},
-			{Name: "f18", Number: 18, Cardinality: pref.Optional, Kind: pref.DoubleKind, Default: V(float64(18))},
-			{Name: "f19", Number: 19, Cardinality: pref.Optional, Kind: pref.StringKind, Default: V(string("19"))},
-			{Name: "f20", Number: 20, Cardinality: pref.Optional, Kind: pref.StringKind, Default: V(string("20"))},
-			{Name: "f21", Number: 21, Cardinality: pref.Optional, Kind: pref.BytesKind, Default: V([]byte("21"))},
-			{Name: "f22", Number: 22, Cardinality: pref.Optional, Kind: pref.BytesKind, Default: V([]byte("22"))},
-		},
-	}),
+			{name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BOOL   default_value:"true"},
+			{name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_INT32  default_value:"13"},
+			{name:"f14" number:14 label:LABEL_OPTIONAL type:TYPE_INT64  default_value:"14"},
+			{name:"f15" number:15 label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"15"},
+			{name:"f16" number:16 label:LABEL_OPTIONAL type:TYPE_UINT64 default_value:"16"},
+			{name:"f17" number:17 label:LABEL_OPTIONAL type:TYPE_FLOAT  default_value:"17"},
+			{name:"f18" number:18 label:LABEL_OPTIONAL type:TYPE_DOUBLE default_value:"18"},
+			{name:"f19" number:19 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"19"},
+			{name:"f20" number:20 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"20"},
+			{name:"f21" number:21 label:LABEL_OPTIONAL type:TYPE_BYTES  default_value:"21"},
+			{name:"f22" number:22 label:LABEL_OPTIONAL type:TYPE_BYTES  default_value:"22"}
+		]
+	`, nil),
 	NewMessage: func() pref.Message {
 		return pref.ProtoMessage(new(ScalarProto2)).ProtoReflect()
 	},
@@ -298,35 +309,34 @@
 }
 
 var scalarProto3Type = pimpl.MessageInfo{GoType: reflect.TypeOf(new(ScalarProto3)), PBType: &prototype.Message{
-	MessageDescriptor: mustMakeMessageDesc(ptype.StandaloneMessage{
-		Syntax:   pref.Proto3,
-		FullName: "ScalarProto3",
-		Fields: []ptype.Field{
-			{Name: "f1", Number: 1, Cardinality: pref.Optional, Kind: pref.BoolKind},
-			{Name: "f2", Number: 2, Cardinality: pref.Optional, Kind: pref.Int32Kind},
-			{Name: "f3", Number: 3, Cardinality: pref.Optional, Kind: pref.Int64Kind},
-			{Name: "f4", Number: 4, Cardinality: pref.Optional, Kind: pref.Uint32Kind},
-			{Name: "f5", Number: 5, Cardinality: pref.Optional, Kind: pref.Uint64Kind},
-			{Name: "f6", Number: 6, Cardinality: pref.Optional, Kind: pref.FloatKind},
-			{Name: "f7", Number: 7, Cardinality: pref.Optional, Kind: pref.DoubleKind},
-			{Name: "f8", Number: 8, Cardinality: pref.Optional, Kind: pref.StringKind},
-			{Name: "f9", Number: 9, Cardinality: pref.Optional, Kind: pref.StringKind},
-			{Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.BytesKind},
-			{Name: "f11", Number: 11, Cardinality: pref.Optional, Kind: pref.BytesKind},
+	MessageDescriptor: mustMakeMessageDesc("scalar3.proto", pref.Proto3, "", `
+		name: "ScalarProto3"
+		field: [
+			{name:"f1"  number:1  label:LABEL_OPTIONAL type:TYPE_BOOL},
+			{name:"f2"  number:2  label:LABEL_OPTIONAL type:TYPE_INT32},
+			{name:"f3"  number:3  label:LABEL_OPTIONAL type:TYPE_INT64},
+			{name:"f4"  number:4  label:LABEL_OPTIONAL type:TYPE_UINT32},
+			{name:"f5"  number:5  label:LABEL_OPTIONAL type:TYPE_UINT64},
+			{name:"f6"  number:6  label:LABEL_OPTIONAL type:TYPE_FLOAT},
+			{name:"f7"  number:7  label:LABEL_OPTIONAL type:TYPE_DOUBLE},
+			{name:"f8"  number:8  label:LABEL_OPTIONAL type:TYPE_STRING},
+			{name:"f9"  number:9  label:LABEL_OPTIONAL type:TYPE_STRING},
+			{name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_BYTES},
+			{name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_BYTES},
 
-			{Name: "f12", Number: 12, Cardinality: pref.Optional, Kind: pref.BoolKind},
-			{Name: "f13", Number: 13, Cardinality: pref.Optional, Kind: pref.Int32Kind},
-			{Name: "f14", Number: 14, Cardinality: pref.Optional, Kind: pref.Int64Kind},
-			{Name: "f15", Number: 15, Cardinality: pref.Optional, Kind: pref.Uint32Kind},
-			{Name: "f16", Number: 16, Cardinality: pref.Optional, Kind: pref.Uint64Kind},
-			{Name: "f17", Number: 17, Cardinality: pref.Optional, Kind: pref.FloatKind},
-			{Name: "f18", Number: 18, Cardinality: pref.Optional, Kind: pref.DoubleKind},
-			{Name: "f19", Number: 19, Cardinality: pref.Optional, Kind: pref.StringKind},
-			{Name: "f20", Number: 20, Cardinality: pref.Optional, Kind: pref.StringKind},
-			{Name: "f21", Number: 21, Cardinality: pref.Optional, Kind: pref.BytesKind},
-			{Name: "f22", Number: 22, Cardinality: pref.Optional, Kind: pref.BytesKind},
-		},
-	}),
+			{name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BOOL},
+			{name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_INT32},
+			{name:"f14" number:14 label:LABEL_OPTIONAL type:TYPE_INT64},
+			{name:"f15" number:15 label:LABEL_OPTIONAL type:TYPE_UINT32},
+			{name:"f16" number:16 label:LABEL_OPTIONAL type:TYPE_UINT64},
+			{name:"f17" number:17 label:LABEL_OPTIONAL type:TYPE_FLOAT},
+			{name:"f18" number:18 label:LABEL_OPTIONAL type:TYPE_DOUBLE},
+			{name:"f19" number:19 label:LABEL_OPTIONAL type:TYPE_STRING},
+			{name:"f20" number:20 label:LABEL_OPTIONAL type:TYPE_STRING},
+			{name:"f21" number:21 label:LABEL_OPTIONAL type:TYPE_BYTES},
+			{name:"f22" number:22 label:LABEL_OPTIONAL type:TYPE_BYTES}
+		]
+	`, nil),
 	NewMessage: func() pref.Message {
 		return pref.ProtoMessage(new(ScalarProto3)).ProtoReflect()
 	},
@@ -418,33 +428,32 @@
 }
 
 var listScalarsType = pimpl.MessageInfo{GoType: reflect.TypeOf(new(ListScalars)), PBType: &prototype.Message{
-	MessageDescriptor: mustMakeMessageDesc(ptype.StandaloneMessage{
-		Syntax:   pref.Proto2,
-		FullName: "ListScalars",
-		Fields: []ptype.Field{
-			{Name: "f1", Number: 1, Cardinality: pref.Repeated, Kind: pref.BoolKind},
-			{Name: "f2", Number: 2, Cardinality: pref.Repeated, Kind: pref.Int32Kind},
-			{Name: "f3", Number: 3, Cardinality: pref.Repeated, Kind: pref.Int64Kind},
-			{Name: "f4", Number: 4, Cardinality: pref.Repeated, Kind: pref.Uint32Kind},
-			{Name: "f5", Number: 5, Cardinality: pref.Repeated, Kind: pref.Uint64Kind},
-			{Name: "f6", Number: 6, Cardinality: pref.Repeated, Kind: pref.FloatKind},
-			{Name: "f7", Number: 7, Cardinality: pref.Repeated, Kind: pref.DoubleKind},
-			{Name: "f8", Number: 8, Cardinality: pref.Repeated, Kind: pref.StringKind},
-			{Name: "f9", Number: 9, Cardinality: pref.Repeated, Kind: pref.StringKind},
-			{Name: "f10", Number: 10, Cardinality: pref.Repeated, Kind: pref.BytesKind},
-			{Name: "f11", Number: 11, Cardinality: pref.Repeated, Kind: pref.BytesKind},
+	MessageDescriptor: mustMakeMessageDesc("list-scalars.proto", pref.Proto2, "", `
+		name: "ListScalars"
+		field: [
+			{name:"f1"  number:1  label:LABEL_REPEATED type:TYPE_BOOL},
+			{name:"f2"  number:2  label:LABEL_REPEATED type:TYPE_INT32},
+			{name:"f3"  number:3  label:LABEL_REPEATED type:TYPE_INT64},
+			{name:"f4"  number:4  label:LABEL_REPEATED type:TYPE_UINT32},
+			{name:"f5"  number:5  label:LABEL_REPEATED type:TYPE_UINT64},
+			{name:"f6"  number:6  label:LABEL_REPEATED type:TYPE_FLOAT},
+			{name:"f7"  number:7  label:LABEL_REPEATED type:TYPE_DOUBLE},
+			{name:"f8"  number:8  label:LABEL_REPEATED type:TYPE_STRING},
+			{name:"f9"  number:9  label:LABEL_REPEATED type:TYPE_STRING},
+			{name:"f10" number:10 label:LABEL_REPEATED type:TYPE_BYTES},
+			{name:"f11" number:11 label:LABEL_REPEATED type:TYPE_BYTES},
 
-			{Name: "f12", Number: 12, Cardinality: pref.Repeated, Kind: pref.StringKind},
-			{Name: "f13", Number: 13, Cardinality: pref.Repeated, Kind: pref.StringKind},
-			{Name: "f14", Number: 14, Cardinality: pref.Repeated, Kind: pref.BytesKind},
-			{Name: "f15", Number: 15, Cardinality: pref.Repeated, Kind: pref.BytesKind},
+			{name:"f12" number:12 label:LABEL_REPEATED type:TYPE_STRING},
+			{name:"f13" number:13 label:LABEL_REPEATED type:TYPE_STRING},
+			{name:"f14" number:14 label:LABEL_REPEATED type:TYPE_BYTES},
+			{name:"f15" number:15 label:LABEL_REPEATED type:TYPE_BYTES},
 
-			{Name: "f16", Number: 16, Cardinality: pref.Repeated, Kind: pref.StringKind},
-			{Name: "f17", Number: 17, Cardinality: pref.Repeated, Kind: pref.StringKind},
-			{Name: "f18", Number: 18, Cardinality: pref.Repeated, Kind: pref.BytesKind},
-			{Name: "f19", Number: 19, Cardinality: pref.Repeated, Kind: pref.BytesKind},
-		},
-	}),
+			{name:"f16" number:16 label:LABEL_REPEATED type:TYPE_STRING},
+			{name:"f17" number:17 label:LABEL_REPEATED type:TYPE_STRING},
+			{name:"f18" number:18 label:LABEL_REPEATED type:TYPE_BYTES},
+			{name:"f19" number:19 label:LABEL_REPEATED type:TYPE_BYTES}
+		]
+	`, nil),
 	NewMessage: func() pref.Message {
 		return pref.ProtoMessage(new(ListScalars)).ProtoReflect()
 	},
@@ -575,60 +584,70 @@
 	MyBytes4   MapStrings `protobuf:"25"`
 }
 
-func mustMakeMapEntry(n pref.FieldNumber, keyKind, valKind pref.Kind) ptype.Field {
-	return ptype.Field{
-		Name:        pref.Name(fmt.Sprintf("f%d", n)),
-		Number:      n,
-		Cardinality: pref.Repeated,
-		Kind:        pref.MessageKind,
-		MessageType: mustMakeMessageDesc(ptype.StandaloneMessage{
-			Syntax:   pref.Proto2,
-			FullName: pref.FullName(fmt.Sprintf("MapScalars.F%dEntry", n)),
-			Fields: []ptype.Field{
-				{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: keyKind},
-				{Name: "value", Number: 2, Cardinality: pref.Optional, Kind: valKind},
-			},
-			Options:    &descriptorpb.MessageOptions{MapEntry: scalar.Bool(true)},
-			IsMapEntry: true,
-		}),
-	}
-}
-
 var mapScalarsType = pimpl.MessageInfo{GoType: reflect.TypeOf(new(MapScalars)), PBType: &prototype.Message{
-	MessageDescriptor: mustMakeMessageDesc(ptype.StandaloneMessage{
-		Syntax:   pref.Proto2,
-		FullName: "MapScalars",
-		Fields: []ptype.Field{
-			mustMakeMapEntry(1, pref.BoolKind, pref.StringKind),
-			mustMakeMapEntry(2, pref.Int32Kind, pref.StringKind),
-			mustMakeMapEntry(3, pref.Int64Kind, pref.StringKind),
-			mustMakeMapEntry(4, pref.Uint32Kind, pref.StringKind),
-			mustMakeMapEntry(5, pref.Uint64Kind, pref.StringKind),
-			mustMakeMapEntry(6, pref.StringKind, pref.StringKind),
+	MessageDescriptor: mustMakeMessageDesc("map-scalars.proto", pref.Proto2, "", `
+		name: "MapScalars"
+		field: [
+			{name:"f1"  number:1  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F1Entry"},
+			{name:"f2"  number:2  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F2Entry"},
+			{name:"f3"  number:3  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F3Entry"},
+			{name:"f4"  number:4  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F4Entry"},
+			{name:"f5"  number:5  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F5Entry"},
+			{name:"f6"  number:6  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F6Entry"},
 
-			mustMakeMapEntry(7, pref.StringKind, pref.BoolKind),
-			mustMakeMapEntry(8, pref.StringKind, pref.Int32Kind),
-			mustMakeMapEntry(9, pref.StringKind, pref.Int64Kind),
-			mustMakeMapEntry(10, pref.StringKind, pref.Uint32Kind),
-			mustMakeMapEntry(11, pref.StringKind, pref.Uint64Kind),
-			mustMakeMapEntry(12, pref.StringKind, pref.FloatKind),
-			mustMakeMapEntry(13, pref.StringKind, pref.DoubleKind),
-			mustMakeMapEntry(14, pref.StringKind, pref.StringKind),
-			mustMakeMapEntry(15, pref.StringKind, pref.StringKind),
-			mustMakeMapEntry(16, pref.StringKind, pref.BytesKind),
-			mustMakeMapEntry(17, pref.StringKind, pref.BytesKind),
+			{name:"f7"  number:7  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F7Entry"},
+			{name:"f8"  number:8  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F8Entry"},
+			{name:"f9"  number:9  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F9Entry"},
+			{name:"f10" number:10 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F10Entry"},
+			{name:"f11" number:11 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F11Entry"},
+			{name:"f12" number:12 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F12Entry"},
+			{name:"f13" number:13 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F13Entry"},
+			{name:"f14" number:14 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F14Entry"},
+			{name:"f15" number:15 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F15Entry"},
+			{name:"f16" number:16 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F16Entry"},
+			{name:"f17" number:17 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F17Entry"},
 
-			mustMakeMapEntry(18, pref.StringKind, pref.StringKind),
-			mustMakeMapEntry(19, pref.StringKind, pref.StringKind),
-			mustMakeMapEntry(20, pref.StringKind, pref.BytesKind),
-			mustMakeMapEntry(21, pref.StringKind, pref.BytesKind),
+			{name:"f18" number:18 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F18Entry"},
+			{name:"f19" number:19 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F19Entry"},
+			{name:"f20" number:20 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F20Entry"},
+			{name:"f21" number:21 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F21Entry"},
 
-			mustMakeMapEntry(22, pref.StringKind, pref.StringKind),
-			mustMakeMapEntry(23, pref.StringKind, pref.StringKind),
-			mustMakeMapEntry(24, pref.StringKind, pref.BytesKind),
-			mustMakeMapEntry(25, pref.StringKind, pref.BytesKind),
-		},
-	}),
+			{name:"f22" number:22 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F22Entry"},
+			{name:"f23" number:23 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F23Entry"},
+			{name:"f24" number:24 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F24Entry"},
+			{name:"f25" number:25 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F25Entry"}
+		]
+		nested_type: [
+			{name:"F1Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL},   {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F2Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_INT32},  {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F3Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_INT64},  {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F4Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F5Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_UINT64}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F6Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+
+			{name:"F7Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BOOL}]   options:{map_entry:true}},
+			{name:"F8Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_INT32}]  options:{map_entry:true}},
+			{name:"F9Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_INT64}]  options:{map_entry:true}},
+			{name:"F10Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_UINT32}] options:{map_entry:true}},
+			{name:"F11Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_UINT64}] options:{map_entry:true}},
+			{name:"F12Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_FLOAT}]  options:{map_entry:true}},
+			{name:"F13Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_DOUBLE}] options:{map_entry:true}},
+			{name:"F14Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F15Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F16Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}]  options:{map_entry:true}},
+			{name:"F17Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}]  options:{map_entry:true}},
+
+			{name:"F18Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F19Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F20Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}]  options:{map_entry:true}},
+			{name:"F21Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}]  options:{map_entry:true}},
+
+			{name:"F22Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F23Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}},
+			{name:"F24Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}]  options:{map_entry:true}},
+			{name:"F25Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}]  options:{map_entry:true}}
+		]
+	`, nil),
 	NewMessage: func() pref.Message {
 		return pref.ProtoMessage(new(MapScalars)).ProtoReflect()
 	},
@@ -760,26 +779,25 @@
 }
 
 var oneofScalarsType = pimpl.MessageInfo{GoType: reflect.TypeOf(new(OneofScalars)), PBType: &prototype.Message{
-	MessageDescriptor: mustMakeMessageDesc(ptype.StandaloneMessage{
-		Syntax:   pref.Proto2,
-		FullName: "OneofScalars",
-		Fields: []ptype.Field{
-			{Name: "f1", Number: 1, Cardinality: pref.Optional, Kind: pref.BoolKind, Default: V(bool(true)), OneofName: "union"},
-			{Name: "f2", Number: 2, Cardinality: pref.Optional, Kind: pref.Int32Kind, Default: V(int32(2)), OneofName: "union"},
-			{Name: "f3", Number: 3, Cardinality: pref.Optional, Kind: pref.Int64Kind, Default: V(int64(3)), OneofName: "union"},
-			{Name: "f4", Number: 4, Cardinality: pref.Optional, Kind: pref.Uint32Kind, Default: V(uint32(4)), OneofName: "union"},
-			{Name: "f5", Number: 5, Cardinality: pref.Optional, Kind: pref.Uint64Kind, Default: V(uint64(5)), OneofName: "union"},
-			{Name: "f6", Number: 6, Cardinality: pref.Optional, Kind: pref.FloatKind, Default: V(float32(6)), OneofName: "union"},
-			{Name: "f7", Number: 7, Cardinality: pref.Optional, Kind: pref.DoubleKind, Default: V(float64(7)), OneofName: "union"},
-			{Name: "f8", Number: 8, Cardinality: pref.Optional, Kind: pref.StringKind, Default: V(string("8")), OneofName: "union"},
-			{Name: "f9", Number: 9, Cardinality: pref.Optional, Kind: pref.StringKind, Default: V(string("9")), OneofName: "union"},
-			{Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.StringKind, Default: V(string("10")), OneofName: "union"},
-			{Name: "f11", Number: 11, Cardinality: pref.Optional, Kind: pref.BytesKind, Default: V([]byte("11")), OneofName: "union"},
-			{Name: "f12", Number: 12, Cardinality: pref.Optional, Kind: pref.BytesKind, Default: V([]byte("12")), OneofName: "union"},
-			{Name: "f13", Number: 13, Cardinality: pref.Optional, Kind: pref.BytesKind, Default: V([]byte("13")), OneofName: "union"},
-		},
-		Oneofs: []ptype.Oneof{{Name: "union"}},
-	}),
+	MessageDescriptor: mustMakeMessageDesc("oneof-scalars.proto", pref.Proto2, "", `
+		name: "OneofScalars"
+		field: [
+			{name:"f1"  number:1  label:LABEL_OPTIONAL type:TYPE_BOOL   default_value:"true" oneof_index:0},
+			{name:"f2"  number:2  label:LABEL_OPTIONAL type:TYPE_INT32  default_value:"2"    oneof_index:0},
+			{name:"f3"  number:3  label:LABEL_OPTIONAL type:TYPE_INT64  default_value:"3"    oneof_index:0},
+			{name:"f4"  number:4  label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"4"    oneof_index:0},
+			{name:"f5"  number:5  label:LABEL_OPTIONAL type:TYPE_UINT64 default_value:"5"    oneof_index:0},
+			{name:"f6"  number:6  label:LABEL_OPTIONAL type:TYPE_FLOAT  default_value:"6"    oneof_index:0},
+			{name:"f7"  number:7  label:LABEL_OPTIONAL type:TYPE_DOUBLE default_value:"7"    oneof_index:0},
+			{name:"f8"  number:8  label:LABEL_OPTIONAL type:TYPE_STRING default_value:"8"    oneof_index:0},
+			{name:"f9"  number:9  label:LABEL_OPTIONAL type:TYPE_STRING default_value:"9"    oneof_index:0},
+			{name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"10"   oneof_index:0},
+			{name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_BYTES  default_value:"11"   oneof_index:0},
+			{name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BYTES  default_value:"12"   oneof_index:0},
+			{name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_BYTES  default_value:"13"   oneof_index:0}
+		]
+		oneof_decl: [{name:"union"}]
+	`, nil),
 	NewMessage: func() pref.Message {
 		return pref.ProtoMessage(new(OneofScalars)).ProtoReflect()
 	},
@@ -923,11 +941,10 @@
 type EnumProto2 int32
 
 var enumProto2Type = &prototype.Enum{
-	EnumDescriptor: mustMakeEnumDesc(ptype.StandaloneEnum{
-		Syntax:   pref.Proto2,
-		FullName: "EnumProto2",
-		Values:   []ptype.EnumValue{{Name: "DEAD", Number: 0xdead}, {Name: "BEEF", Number: 0xbeef}},
-	}),
+	EnumDescriptor: mustMakeEnumDesc("enum2.proto", pref.Proto2, `
+		name:  "EnumProto2"
+		value: [{name:"DEAD" number:0xdead}, {name:"BEEF" number:0xbeef}]
+	`),
 	NewEnum: func(n pref.EnumNumber) pref.Enum {
 		return EnumProto2(n)
 	},
@@ -940,11 +957,10 @@
 type EnumProto3 int32
 
 var enumProto3Type = &prototype.Enum{
-	EnumDescriptor: mustMakeEnumDesc(ptype.StandaloneEnum{
-		Syntax:   pref.Proto3,
-		FullName: "EnumProto3",
-		Values:   []ptype.EnumValue{{Name: "ALPHA", Number: 0}, {Name: "BRAVO", Number: 1}},
-	}),
+	EnumDescriptor: mustMakeEnumDesc("enum3.proto", pref.Proto3, `
+		name:  "EnumProto3",
+		value: [{name:"ALPHA" number:0}, {name:"BRAVO" number:1}]
+	`),
 	NewEnum: func(n pref.EnumNumber) pref.Enum {
 		return EnumProto3(n)
 	},
@@ -967,52 +983,41 @@
 }
 
 var enumMessagesType = pimpl.MessageInfo{GoType: reflect.TypeOf(new(EnumMessages)), PBType: &prototype.Message{
-	MessageDescriptor: mustMakeMessageDesc(ptype.StandaloneMessage{
-		Syntax:   pref.Proto2,
-		FullName: "EnumMessages",
-		Fields: []ptype.Field{
-			{Name: "f1", Number: 1, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BEEF"), EnumType: enumProto2Type.Descriptor()},
-			{Name: "f2", Number: 2, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BRAVO"), EnumType: enumProto3Type.Descriptor()},
-			{Name: "f3", Number: 3, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: pimpl.Export{}.MessageDescriptorOf(new(proto2_20180125.Message))},
-			{Name: "f4", Number: 4, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("EnumMessages")},
-			{Name: "f5", Number: 5, Cardinality: pref.Repeated, Kind: pref.EnumKind, EnumType: enumProto2Type.Descriptor()},
-			{Name: "f6", Number: 6, Cardinality: pref.Repeated, Kind: pref.MessageKind, MessageType: scalarProto2Type.PBType.Descriptor()},
-			{Name: "f7", Number: 7, Cardinality: pref.Repeated, Kind: pref.MessageKind, MessageType: enumMapDesc},
-			{Name: "f8", Number: 8, Cardinality: pref.Repeated, Kind: pref.MessageKind, MessageType: messageMapDesc},
-			{Name: "f9", Number: 9, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BEEF"), OneofName: "union", EnumType: enumProto2Type.Descriptor()},
-			{Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.EnumKind, Default: V("BRAVO"), OneofName: "union", EnumType: enumProto3Type.Descriptor()},
-			{Name: "f11", Number: 11, Cardinality: pref.Optional, Kind: pref.MessageKind, OneofName: "union", MessageType: scalarProto2Type.PBType.Descriptor()},
-			{Name: "f12", Number: 12, Cardinality: pref.Optional, Kind: pref.MessageKind, OneofName: "union", MessageType: scalarProto3Type.PBType.Descriptor()},
-		},
-		Oneofs: []ptype.Oneof{{Name: "union"}},
-	}),
+	MessageDescriptor: mustMakeMessageDesc("enum-messages.proto", pref.Proto2, `
+		dependency: ["enum2.proto", "enum3.proto", "scalar2.proto", "scalar3.proto", "proto2.v1.0.0-20180125-92554152/test.proto"]
+	`, `
+		name: "EnumMessages"
+		field: [
+			{name:"f1"  number:1  label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".EnumProto2" default_value:"BEEF"},
+			{name:"f2"  number:2  label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".EnumProto3" default_value:"BRAVO"},
+			{name:"f3"  number:3  label:LABEL_OPTIONAL type:TYPE_MESSAGE type_Name:".google.golang.org.proto2_20180125.Message"},
+			{name:"f4"  number:4  label:LABEL_OPTIONAL type:TYPE_MESSAGE type_Name:".EnumMessages"},
+			{name:"f5"  number:5  label:LABEL_REPEATED type:TYPE_ENUM    type_name:".EnumProto2"},
+			{name:"f6"  number:6  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".ScalarProto2"},
+			{name:"f7"  number:7  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".EnumMessages.F7Entry"},
+			{name:"f8"  number:8  label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".EnumMessages.F8Entry"},
+			{name:"f9"  number:9  label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".EnumProto2"   oneof_index:0 default_value:"BEEF"},
+			{name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".EnumProto3"   oneof_index:0 default_value:"BRAVO"},
+			{name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".ScalarProto2" oneof_index:0},
+			{name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".ScalarProto3" oneof_index:0}
+		]
+		oneof_decl: [{name:"union"}]
+		nested_type: [
+			{name:"F7Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".EnumProto3"}]   options:{map_entry:true}},
+			{name:"F8Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".ScalarProto3"}] options:{map_entry:true}}
+		]
+	`, protoregistry.NewFiles(
+		EnumProto2(0).Descriptor().ParentFile(),
+		EnumProto3(0).Descriptor().ParentFile(),
+		((*ScalarProto2)(nil)).ProtoReflect().Descriptor().ParentFile(),
+		((*ScalarProto3)(nil)).ProtoReflect().Descriptor().ParentFile(),
+		pimpl.Export{}.MessageDescriptorOf((*proto2_20180125.Message)(nil)).ParentFile(),
+	)),
 	NewMessage: func() pref.Message {
 		return pref.ProtoMessage(new(EnumMessages)).ProtoReflect()
 	},
 }}
 
-var enumMapDesc = mustMakeMessageDesc(ptype.StandaloneMessage{
-	Syntax:   pref.Proto2,
-	FullName: "EnumMessages.F7Entry",
-	Fields: []ptype.Field{
-		{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: pref.StringKind},
-		{Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.EnumKind, EnumType: enumProto3Type.Descriptor()},
-	},
-	Options:    &descriptorpb.MessageOptions{MapEntry: scalar.Bool(true)},
-	IsMapEntry: true,
-})
-
-var messageMapDesc = mustMakeMessageDesc(ptype.StandaloneMessage{
-	Syntax:   pref.Proto2,
-	FullName: "EnumMessages.F8Entry",
-	Fields: []ptype.Field{
-		{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: pref.StringKind},
-		{Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: scalarProto3Type.PBType.Descriptor()},
-	},
-	Options:    &descriptorpb.MessageOptions{MapEntry: scalar.Bool(true)},
-	IsMapEntry: true,
-})
-
 func (m *EnumMessages) ProtoReflect() pref.Message { return enumMessagesType.MessageOf(m) }
 
 func (*EnumMessages) XXX_OneofWrappers() []interface{} {
@@ -1161,7 +1166,9 @@
 
 var cmpOpts = cmp.Options{
 	cmp.Comparer(func(x, y *proto2_20180125.Message) bool {
-		return protoV1.Equal(x, y)
+		mx := pimpl.Export{}.MessageOf(x).Interface()
+		my := pimpl.Export{}.MessageOf(y).Interface()
+		return proto.Equal(mx, my)
 	}),
 	cmp.Transformer("UnwrapValue", func(pv pref.Value) interface{} {
 		switch v := pv.Interface().(type) {
diff --git a/internal/prototype/desc_test.go b/internal/prototype/desc_test.go
deleted file mode 100644
index 05b2e1d..0000000
--- a/internal/prototype/desc_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	"reflect"
-	"testing"
-
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-)
-
-// TestDescriptors tests that the implementations do not declare additional
-// methods that do not exist on the interface types.
-func TestDescriptors(t *testing.T) {
-	tests := []interface{}{
-		[]pref.FileDescriptor{placeholderFile{}, fileDesc{}},
-		[]pref.MessageDescriptor{placeholderMessage{}, standaloneMessage{}, messageDesc{}},
-		[]pref.FieldDescriptor{standaloneExtension{}, fieldDesc{}, extensionDesc{}},
-		[]pref.OneofDescriptor{oneofDesc{}},
-		[]pref.EnumDescriptor{placeholderEnum{}, standaloneEnum{}, enumDesc{}},
-		[]pref.EnumValueDescriptor{enumValueDesc{}},
-		[]pref.ServiceDescriptor{serviceDesc{}},
-		[]pref.MethodDescriptor{methodDesc{}},
-
-		[]pref.FileImports{(*fileImports)(nil)},
-		[]pref.MessageDescriptors{(*messages)(nil)},
-		[]pref.Names{(*names)(nil)},
-		[]pref.FieldNumbers{(*numbers)(nil)},
-		[]pref.FieldRanges{(*fieldRanges)(nil)},
-		[]pref.FieldDescriptors{(*fields)(nil), (*oneofFields)(nil)},
-		[]pref.OneofDescriptors{(*oneofs)(nil)},
-		[]pref.ExtensionDescriptors{(*extensions)(nil)},
-		[]pref.EnumRanges{(*enumRanges)(nil)},
-		[]pref.EnumDescriptors{(*enums)(nil)},
-		[]pref.EnumValueDescriptors{(*enumValues)(nil)},
-		[]pref.ServiceDescriptors{(*services)(nil)},
-		[]pref.MethodDescriptors{(*methods)(nil)},
-	}
-
-	for _, tt := range tests {
-		v := reflect.ValueOf(tt) // []T where T is an interface
-		ifaceType := v.Type().Elem()
-		for i := 0; i < v.Len(); i++ {
-			implType := v.Index(i).Elem().Type()
-
-			var hasName bool
-			for j := 0; j < implType.NumMethod(); j++ {
-				if name := implType.Method(j).Name; name == "Format" {
-					hasName = true
-				} else if _, ok := ifaceType.MethodByName(name); !ok {
-					t.Errorf("spurious method: %v.%v", implType, name)
-				}
-			}
-			if !hasName {
-				t.Errorf("missing method: %v.Format", implType)
-			}
-		}
-	}
-}
diff --git a/internal/prototype/name_pure.go b/internal/prototype/name_pure.go
deleted file mode 100644
index 3ec33e5..0000000
--- a/internal/prototype/name_pure.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build purego appengine
-
-package prototype
-
-import pref "google.golang.org/protobuf/reflect/protoreflect"
-
-func getNameBuilder() *nameBuilder { return nil }
-func putNameBuilder(*nameBuilder)  {}
-
-type nameBuilder struct{}
-
-// Append is equivalent to protoreflect.FullName.Append.
-func (*nameBuilder) Append(prefix pref.FullName, name pref.Name) pref.FullName {
-	return prefix.Append(name)
-}
diff --git a/internal/prototype/placeholder.go b/internal/prototype/placeholder.go
deleted file mode 100644
index 87ebb30..0000000
--- a/internal/prototype/placeholder.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import "google.golang.org/protobuf/reflect/protoreflect"
-
-// PlaceholderFile returns a placeholder protoreflect.FileType where
-// only the Path and Package accessors are valid.
-func PlaceholderFile(path string, pkg protoreflect.FullName) protoreflect.FileDescriptor {
-	// TODO: Is Package needed for placeholders?
-	return placeholderFile{path, placeholderName(pkg)}
-}
-
-// PlaceholderMessage returns a placeholder protoreflect.MessageType
-// where only the Name and FullName accessors are valid.
-//
-// A placeholder can be used within File literals when referencing a message
-// that is declared within that file.
-func PlaceholderMessage(name protoreflect.FullName) protoreflect.MessageDescriptor {
-	return placeholderMessage{placeholderName(name)}
-}
-
-// PlaceholderEnum returns a placeholder protoreflect.EnumType
-// where only the Name and FullName accessors are valid.
-//
-// A placeholder can be used within File literals when referencing an enum
-// that is declared within that file.
-func PlaceholderEnum(name protoreflect.FullName) protoreflect.EnumDescriptor {
-	return placeholderEnum{placeholderName(name)}
-}
diff --git a/internal/prototype/placeholder_type.go b/internal/prototype/placeholder_type.go
deleted file mode 100644
index e4e7742..0000000
--- a/internal/prototype/placeholder_type.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	"fmt"
-
-	descfmt "google.golang.org/protobuf/internal/descfmt"
-	"google.golang.org/protobuf/internal/descopts"
-	"google.golang.org/protobuf/internal/pragma"
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-)
-
-var (
-	emptyFiles       fileImports
-	emptyMessages    messages
-	emptyFields      fields
-	emptyOneofs      oneofs
-	emptyNames       names
-	emptyNumbers     numbers
-	emptyFieldRanges fieldRanges
-	emptyEnums       enums
-	emptyEnumValues  enumValues
-	emptyEnumRanges  enumRanges
-	emptyExtensions  extensions
-	emptyServices    services
-)
-
-type placeholderName pref.FullName
-
-func (t placeholderName) ParentFile() pref.FileDescriptor     { return nil }
-func (t placeholderName) Parent() pref.Descriptor             { return nil }
-func (t placeholderName) Index() int                          { return 0 }
-func (t placeholderName) Syntax() pref.Syntax                 { return 0 }
-func (t placeholderName) Name() pref.Name                     { return pref.FullName(t).Name() }
-func (t placeholderName) FullName() pref.FullName             { return pref.FullName(t) }
-func (t placeholderName) IsPlaceholder() bool                 { return true }
-func (t placeholderName) ProtoInternal(pragma.DoNotImplement) {}
-
-type placeholderFile struct {
-	path string
-	placeholderName
-}
-
-func (t placeholderFile) ParentFile() pref.FileDescriptor       { return t }
-func (t placeholderFile) Options() pref.ProtoMessage            { return descopts.File }
-func (t placeholderFile) Path() string                          { return t.path }
-func (t placeholderFile) Package() pref.FullName                { return t.FullName() }
-func (t placeholderFile) Imports() pref.FileImports             { return &emptyFiles }
-func (t placeholderFile) Enums() pref.EnumDescriptors           { return &emptyEnums }
-func (t placeholderFile) Messages() pref.MessageDescriptors     { return &emptyMessages }
-func (t placeholderFile) Extensions() pref.ExtensionDescriptors { return &emptyExtensions }
-func (t placeholderFile) Services() pref.ServiceDescriptors     { return &emptyServices }
-func (t placeholderFile) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, t) }
-func (t placeholderFile) ProtoType(pref.FileDescriptor)         {}
-
-type placeholderMessage struct {
-	placeholderName
-}
-
-func (t placeholderMessage) Options() pref.ProtoMessage                  { return descopts.Message }
-func (t placeholderMessage) IsMapEntry() bool                            { return false }
-func (t placeholderMessage) Fields() pref.FieldDescriptors               { return &emptyFields }
-func (t placeholderMessage) Oneofs() pref.OneofDescriptors               { return &emptyOneofs }
-func (t placeholderMessage) ReservedNames() pref.Names                   { return &emptyNames }
-func (t placeholderMessage) ReservedRanges() pref.FieldRanges            { return &emptyFieldRanges }
-func (t placeholderMessage) RequiredNumbers() pref.FieldNumbers          { return &emptyNumbers }
-func (t placeholderMessage) ExtensionRanges() pref.FieldRanges           { return &emptyFieldRanges }
-func (t placeholderMessage) ExtensionRangeOptions(int) pref.ProtoMessage { panic("out of bounds") }
-func (t placeholderMessage) Enums() pref.EnumDescriptors                 { return &emptyEnums }
-func (t placeholderMessage) Messages() pref.MessageDescriptors           { return &emptyMessages }
-func (t placeholderMessage) Extensions() pref.ExtensionDescriptors       { return &emptyExtensions }
-func (t placeholderMessage) Format(s fmt.State, r rune)                  { descfmt.FormatDesc(s, r, t) }
-func (t placeholderMessage) ProtoType(pref.MessageDescriptor)            {}
-
-type placeholderEnum struct {
-	placeholderName
-}
-
-func (t placeholderEnum) Options() pref.ProtoMessage        { return descopts.Enum }
-func (t placeholderEnum) Values() pref.EnumValueDescriptors { return &emptyEnumValues }
-func (t placeholderEnum) ReservedNames() pref.Names         { return &emptyNames }
-func (t placeholderEnum) ReservedRanges() pref.EnumRanges   { return &emptyEnumRanges }
-func (t placeholderEnum) Format(s fmt.State, r rune)        { descfmt.FormatDesc(s, r, t) }
-func (t placeholderEnum) ProtoType(pref.EnumDescriptor)     {}
diff --git a/internal/prototype/protofile.go b/internal/prototype/protofile.go
deleted file mode 100644
index 48ba9ee..0000000
--- a/internal/prototype/protofile.go
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TODO: Delete this package and re-write functionality to depend on
-// reflect/protodesc and internal/fileinit.
-
-// Package prototype provides builders to construct protobuf types that
-// implement the interfaces defined in the protoreflect package.
-//
-// Protobuf types can either be constructed as standalone types
-// (e.g., StandaloneMessage), or together as a batch of types in a single
-// proto file (e.g., File). When creating standalone types, additional
-// information must be provided such as the full type name and the proto syntax.
-// When creating an entire file, the syntax and full name is derived from
-// the parent type.
-//
-// Most types contain options, defined as messages in descriptor.proto.
-// To avoid cyclic dependencies, the prototype package treats these options
-// as opaque protoreflect.ProtoMessage values. In some cases where the option
-// contains semantically important information (e.g.,
-// google.protobuf.MessageOptions.map_entry), this information must be provided
-// as a field of the corresponding type (e.g., prototype.Message.MapEntry).
-package prototype
-
-import "google.golang.org/protobuf/reflect/protoreflect"
-
-// Every struct has a "meta" struct embedded within it as a pointer.
-// The meta type provides additional data structures for efficient lookup on
-// certain methods (e.g., ByName) or derived information that can be
-// derived from the parent (e.g., FullName). The meta type is lazily allocated
-// and initialized. This architectural approach keeps the literal representation
-// smaller, which then keeps the generated code size smaller.
-
-// TODO: Instead of a top-down construction approach where internal references
-// to message types use placeholder types, we could add a Reference method
-// on Message and Enum that creates a MessageDescriptor or EnumDescriptor
-// reference that only becomes valid after NewFile.
-// However, that API approach is more error prone, as it causes more memory
-// aliasing and provides more opportunity for misuse.
-// Also, it requires that NewFile at least eagerly initialize all
-// messages and enums list types. We can always add that API in the future.
-
-// File is a constructor for protoreflect.FileDescriptor.
-type File struct {
-	Syntax  protoreflect.Syntax
-	Path    string
-	Package protoreflect.FullName
-	Imports []protoreflect.FileImport
-	Options protoreflect.ProtoMessage
-
-	Enums      []Enum
-	Messages   []Message
-	Extensions []Extension
-	Services   []Service
-
-	*fileMeta
-}
-
-// NewFile creates a new protoreflect.FileDescriptor from the provided value.
-// The file must represent a valid proto file according to protobuf semantics.
-//
-// Fields that reference an enum or message that is being declared within the
-// same File can be represented using a placeholder descriptor. NewFile will
-// automatically resolve the placeholder to point to a concrete descriptor.
-// Alternatively, a reference descriptor obtained via Enum.Reference or
-// Message.Reference can be used instead. The placeholder approach makes it
-// possible to declare the file descriptor as a single File literal and
-// is generally easier to use. The reference approach is more performant,
-// but also more error prone.
-//
-// The caller must relinquish full ownership of the input t and must not
-// access or mutate any fields. The input must not contain slices that are
-// sub-slices of each other.
-func NewFile(t *File) (protoreflect.FileDescriptor, error) {
-	// TODO: Provide an unverified make that avoids validating the file.
-	// This is useful for generated code since we know that protoc-gen-go
-	// already validated the protobuf types.
-	ft := newFile(t)
-	if err := validateFile(ft); err != nil {
-		return nil, err
-	}
-
-	// TODO: When using reference descriptors, it is vital that all enums and
-	// messages are touched so that they are initialized before returning.
-	// Otherwise, reference descriptors may still be invalid.
-	//
-	// We can remove this once validateFile is implemented, since it will
-	// inherently touch all the necessary messages and enums.
-	visitMessages(ft)
-
-	return ft, nil
-}
-
-func visitMessages(d interface {
-	Enums() protoreflect.EnumDescriptors
-	Messages() protoreflect.MessageDescriptors
-}) {
-	d.Enums()
-	ms := d.Messages()
-	for i := 0; i < ms.Len(); i++ {
-		visitMessages(ms.Get(i))
-	}
-}
-
-// Message is a constructor for protoreflect.MessageDescriptor.
-type Message struct {
-	Name                  protoreflect.Name
-	Fields                []Field
-	Oneofs                []Oneof
-	ReservedNames         []protoreflect.Name
-	ReservedRanges        [][2]protoreflect.FieldNumber
-	ExtensionRanges       [][2]protoreflect.FieldNumber
-	ExtensionRangeOptions []protoreflect.ProtoMessage
-	Options               protoreflect.ProtoMessage
-	IsMapEntry            bool
-
-	Enums      []Enum
-	Messages   []Message
-	Extensions []Extension
-
-	*messageMeta
-}
-
-// Reference returns m as a reference protoreflect.MessageDescriptor,
-// which can be used to satisfy internal dependencies within a proto file.
-// Methods on the returned descriptor are not valid until the file that this
-// message belongs to has been constructed via NewFile.
-func (m *Message) Reference() protoreflect.MessageDescriptor {
-	return messageDesc{m}
-}
-
-// Field is a constructor for protoreflect.FieldDescriptor.
-type Field struct {
-	Name        protoreflect.Name
-	Number      protoreflect.FieldNumber
-	Cardinality protoreflect.Cardinality
-	Kind        protoreflect.Kind
-	JSONName    string
-	Default     protoreflect.Value
-	OneofName   protoreflect.Name
-	MessageType protoreflect.MessageDescriptor
-	EnumType    protoreflect.EnumDescriptor
-	Options     protoreflect.ProtoMessage
-	IsPacked    OptionalBool
-	IsWeak      bool
-
-	*fieldMeta
-}
-
-// Oneof is a constructor for protoreflect.OneofDescriptor.
-type Oneof struct {
-	Name    protoreflect.Name
-	Options protoreflect.ProtoMessage
-
-	*oneofMeta
-}
-
-// Extension is a constructor for protoreflect.ExtensionDescriptor.
-type Extension struct {
-	Name         protoreflect.Name
-	Number       protoreflect.FieldNumber
-	Cardinality  protoreflect.Cardinality
-	Kind         protoreflect.Kind
-	Default      protoreflect.Value
-	MessageType  protoreflect.MessageDescriptor
-	EnumType     protoreflect.EnumDescriptor
-	ExtendedType protoreflect.MessageDescriptor
-	Options      protoreflect.ProtoMessage
-	IsPacked     OptionalBool
-
-	*extensionMeta
-}
-
-// Enum is a constructor for protoreflect.EnumDescriptor.
-type Enum struct {
-	Name           protoreflect.Name
-	Values         []EnumValue
-	ReservedNames  []protoreflect.Name
-	ReservedRanges [][2]protoreflect.EnumNumber
-	Options        protoreflect.ProtoMessage
-
-	*enumMeta
-}
-
-// Reference returns e as a reference protoreflect.EnumDescriptor,
-// which can be used to satisfy internal dependencies within a proto file.
-// Methods on the returned descriptor are not valid until the file that this
-// enum belongs to has been constructed via NewFile.
-func (e *Enum) Reference() protoreflect.EnumDescriptor {
-	return enumDesc{e}
-}
-
-// EnumValue is a constructor for protoreflect.EnumValueDescriptor.
-type EnumValue struct {
-	Name    protoreflect.Name
-	Number  protoreflect.EnumNumber
-	Options protoreflect.ProtoMessage
-
-	*enumValueMeta
-}
-
-// Service is a constructor for protoreflect.ServiceDescriptor.
-type Service struct {
-	Name    protoreflect.Name
-	Methods []Method
-	Options protoreflect.ProtoMessage
-
-	*serviceMeta
-}
-
-// Method is a constructor for protoreflect.MethodDescriptor.
-type Method struct {
-	Name              protoreflect.Name
-	InputType         protoreflect.MessageDescriptor
-	OutputType        protoreflect.MessageDescriptor
-	IsStreamingClient bool
-	IsStreamingServer bool
-	Options           protoreflect.ProtoMessage
-
-	*methodMeta
-}
-
-// OptionalBool is a tristate boolean.
-type OptionalBool uint8
-
-// Tristate boolean values.
-const (
-	DefaultBool OptionalBool = iota
-	True
-	False
-)
diff --git a/internal/prototype/protofile_list.go b/internal/prototype/protofile_list.go
deleted file mode 100644
index 139c0a1..0000000
--- a/internal/prototype/protofile_list.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	"fmt"
-	"sync"
-
-	"google.golang.org/protobuf/internal/descfmt"
-	"google.golang.org/protobuf/internal/pragma"
-	"google.golang.org/protobuf/internal/set"
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-)
-
-type names []pref.Name
-
-func (p *names) Len() int            { return len(*p) }
-func (p *names) Get(i int) pref.Name { return (*p)[i] }
-func (p *names) Has(s pref.Name) bool {
-	for _, n := range *p {
-		if s == n {
-			return true
-		}
-	}
-	return false
-}
-func (p *names) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *names) ProtoInternal(pragma.DoNotImplement) {}
-
-// Names returns a Names list from a slice of names.
-func Names(s []pref.Name) pref.Names { return (*names)(&s) }
-
-type numbersMeta struct {
-	once sync.Once
-	ns   []pref.FieldNumber
-	nss  set.Ints
-}
-type numbers numbersMeta
-
-func (p *numbersMeta) lazyInit(fs []Field) *numbers {
-	p.once.Do(func() {
-		for i := range fs {
-			if f := &fs[i]; f.Cardinality == pref.Required {
-				p.ns = append(p.ns, f.Number)
-				p.nss.Set(uint64(f.Number))
-			}
-		}
-	})
-	return (*numbers)(p)
-}
-func (p *numbers) Len() int                            { return len(p.ns) }
-func (p *numbers) Get(i int) pref.FieldNumber          { return p.ns[i] }
-func (p *numbers) Has(n pref.FieldNumber) bool         { return p.nss.Has(uint64(n)) }
-func (p *numbers) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *numbers) ProtoInternal(pragma.DoNotImplement) {}
-
-type fieldRanges [][2]pref.FieldNumber
-
-func (p *fieldRanges) Len() int                      { return len(*p) }
-func (p *fieldRanges) Get(i int) [2]pref.FieldNumber { return (*p)[i] }
-func (p *fieldRanges) Has(n pref.FieldNumber) bool {
-	for _, r := range *p {
-		if r[0] <= n && n < r[1] {
-			return true
-		}
-	}
-	return false
-}
-func (p *fieldRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *fieldRanges) ProtoInternal(pragma.DoNotImplement) {}
-
-// FieldRanges returns a FieldRanges list from a slice of ranges.
-func FieldRanges(s [][2]pref.FieldNumber) pref.FieldRanges { return (*fieldRanges)(&s) }
-
-type enumRanges [][2]pref.EnumNumber
-
-func (p *enumRanges) Len() int                     { return len(*p) }
-func (p *enumRanges) Get(i int) [2]pref.EnumNumber { return (*p)[i] }
-func (p *enumRanges) Has(n pref.EnumNumber) bool {
-	for _, r := range *p {
-		if r[0] <= n && n <= r[1] {
-			return true
-		}
-	}
-	return false
-}
-func (p *enumRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *enumRanges) ProtoInternal(pragma.DoNotImplement) {}
-
-// EnumRanges returns an EnumRanges list from a slice of ranges.
-func EnumRanges(s [][2]pref.EnumNumber) pref.EnumRanges { return (*enumRanges)(&s) }
-
-type fileImports []pref.FileImport
-
-func (p *fileImports) Len() int                            { return len(*p) }
-func (p *fileImports) Get(i int) pref.FileImport           { return (*p)[i] }
-func (p *fileImports) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *fileImports) ProtoInternal(pragma.DoNotImplement) {}
-
-type oneofFieldsMeta struct {
-	once   sync.Once
-	typs   []pref.FieldDescriptor
-	byName map[pref.Name]pref.FieldDescriptor
-	byJSON map[string]pref.FieldDescriptor
-	byNum  map[pref.FieldNumber]pref.FieldDescriptor
-}
-type oneofFields oneofFieldsMeta
-
-func (p *oneofFieldsMeta) lazyInit(parent pref.Descriptor) *oneofFields {
-	p.once.Do(func() {
-		od := parent.(pref.OneofDescriptor)
-		fs := parent.Parent().(pref.MessageDescriptor).Fields()
-		for i := 0; i < fs.Len(); i++ {
-			if f := fs.Get(i); od == f.ContainingOneof() {
-				p.typs = append(p.typs, f)
-			}
-		}
-		if len(p.typs) > 0 {
-			p.byName = make(map[pref.Name]pref.FieldDescriptor, len(p.typs))
-			p.byJSON = make(map[string]pref.FieldDescriptor, len(p.typs))
-			p.byNum = make(map[pref.FieldNumber]pref.FieldDescriptor, len(p.typs))
-			for _, f := range p.typs {
-				p.byName[f.Name()] = f
-				p.byJSON[f.JSONName()] = f
-				p.byNum[f.Number()] = f
-			}
-		}
-	})
-	return (*oneofFields)(p)
-}
-func (p *oneofFields) Len() int                                         { return len(p.typs) }
-func (p *oneofFields) Get(i int) pref.FieldDescriptor                   { return p.typs[i] }
-func (p *oneofFields) ByName(s pref.Name) pref.FieldDescriptor          { return p.byName[s] }
-func (p *oneofFields) ByJSONName(s string) pref.FieldDescriptor         { return p.byJSON[s] }
-func (p *oneofFields) ByNumber(n pref.FieldNumber) pref.FieldDescriptor { return p.byNum[n] }
-func (p *oneofFields) Format(s fmt.State, r rune)                       { descfmt.FormatList(s, r, p) }
-func (p *oneofFields) ProtoInternal(pragma.DoNotImplement)              {}
diff --git a/internal/prototype/protofile_list_gen.go b/internal/prototype/protofile_list_gen.go
deleted file mode 100644
index 695b66e..0000000
--- a/internal/prototype/protofile_list_gen.go
+++ /dev/null
@@ -1,445 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style.
-// license that can be found in the LICENSE file.
-
-// Code generated by generate-types. DO NOT EDIT.
-
-package prototype
-
-import (
-	"fmt"
-	"sync"
-
-	"google.golang.org/protobuf/internal/descfmt"
-	"google.golang.org/protobuf/internal/pragma"
-	"google.golang.org/protobuf/reflect/protoreflect"
-)
-
-type messagesMeta struct {
-	once     sync.Once
-	typs     []Message
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*Message
-}
-type messages messagesMeta
-
-func (p *messagesMeta) lazyInit(parent protoreflect.Descriptor, ts []Message) *messages {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]messageMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.messageMeta != nil {
-				panic("already initialized")
-			}
-			t.messageMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, false)
-		}
-		p.typs = ts
-	})
-	return (*messages)(p)
-}
-func (p *messages) Len() int                                 { return len(p.typs) }
-func (p *messages) Get(i int) protoreflect.MessageDescriptor { return messageDesc{&p.typs[i]} }
-func (p *messages) ByName(s protoreflect.Name) protoreflect.MessageDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*Message, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return messageDesc{t}
-}
-func (p *messages) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *messages) ProtoInternal(pragma.DoNotImplement) {}
-
-type fieldsMeta struct {
-	once     sync.Once
-	typs     []Field
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*Field
-	jsonOnce sync.Once
-	byJSON   map[string]*Field
-	numOnce  sync.Once
-	byNum    map[protoreflect.FieldNumber]*Field
-}
-type fields fieldsMeta
-
-func (p *fieldsMeta) lazyInit(parent protoreflect.Descriptor, ts []Field) *fields {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]fieldMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.fieldMeta != nil {
-				panic("already initialized")
-			}
-			t.fieldMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, false)
-		}
-		p.typs = ts
-	})
-	return (*fields)(p)
-}
-func (p *fields) Len() int                               { return len(p.typs) }
-func (p *fields) Get(i int) protoreflect.FieldDescriptor { return fieldDesc{&p.typs[i]} }
-func (p *fields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*Field, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return fieldDesc{t}
-}
-func (p *fields) ByJSONName(s string) protoreflect.FieldDescriptor {
-	p.jsonOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byJSON = make(map[string]*Field, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				s := fieldDesc{t}.JSONName()
-				if _, ok := p.byJSON[s]; !ok {
-					p.byJSON[s] = t
-				}
-			}
-		}
-	})
-	t := p.byJSON[s]
-	if t == nil {
-		return nil
-	}
-	return fieldDesc{t}
-}
-func (p *fields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor {
-	p.numOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byNum = make(map[protoreflect.FieldNumber]*Field, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				if _, ok := p.byNum[t.Number]; !ok {
-					p.byNum[t.Number] = t
-				}
-			}
-		}
-	})
-	t := p.byNum[n]
-	if t == nil {
-		return nil
-	}
-	return fieldDesc{t}
-}
-func (p *fields) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *fields) ProtoInternal(pragma.DoNotImplement) {}
-
-type oneofsMeta struct {
-	once     sync.Once
-	typs     []Oneof
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*Oneof
-}
-type oneofs oneofsMeta
-
-func (p *oneofsMeta) lazyInit(parent protoreflect.Descriptor, ts []Oneof) *oneofs {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]oneofMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.oneofMeta != nil {
-				panic("already initialized")
-			}
-			t.oneofMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, false)
-		}
-		p.typs = ts
-	})
-	return (*oneofs)(p)
-}
-func (p *oneofs) Len() int                               { return len(p.typs) }
-func (p *oneofs) Get(i int) protoreflect.OneofDescriptor { return oneofDesc{&p.typs[i]} }
-func (p *oneofs) ByName(s protoreflect.Name) protoreflect.OneofDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*Oneof, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return oneofDesc{t}
-}
-func (p *oneofs) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *oneofs) ProtoInternal(pragma.DoNotImplement) {}
-
-type extensionsMeta struct {
-	once     sync.Once
-	typs     []Extension
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*Extension
-}
-type extensions extensionsMeta
-
-func (p *extensionsMeta) lazyInit(parent protoreflect.Descriptor, ts []Extension) *extensions {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]extensionMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.extensionMeta != nil {
-				panic("already initialized")
-			}
-			t.extensionMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, false)
-		}
-		p.typs = ts
-	})
-	return (*extensions)(p)
-}
-func (p *extensions) Len() int                                   { return len(p.typs) }
-func (p *extensions) Get(i int) protoreflect.ExtensionDescriptor { return extensionDesc{&p.typs[i]} }
-func (p *extensions) ByName(s protoreflect.Name) protoreflect.ExtensionDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*Extension, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return extensionDesc{t}
-}
-func (p *extensions) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *extensions) ProtoInternal(pragma.DoNotImplement) {}
-
-type enumsMeta struct {
-	once     sync.Once
-	typs     []Enum
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*Enum
-}
-type enums enumsMeta
-
-func (p *enumsMeta) lazyInit(parent protoreflect.Descriptor, ts []Enum) *enums {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]enumMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.enumMeta != nil {
-				panic("already initialized")
-			}
-			t.enumMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, false)
-		}
-		p.typs = ts
-	})
-	return (*enums)(p)
-}
-func (p *enums) Len() int                              { return len(p.typs) }
-func (p *enums) Get(i int) protoreflect.EnumDescriptor { return enumDesc{&p.typs[i]} }
-func (p *enums) ByName(s protoreflect.Name) protoreflect.EnumDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*Enum, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return enumDesc{t}
-}
-func (p *enums) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *enums) ProtoInternal(pragma.DoNotImplement) {}
-
-type enumValuesMeta struct {
-	once     sync.Once
-	typs     []EnumValue
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*EnumValue
-	numOnce  sync.Once
-	byNum    map[protoreflect.EnumNumber]*EnumValue
-}
-type enumValues enumValuesMeta
-
-func (p *enumValuesMeta) lazyInit(parent protoreflect.Descriptor, ts []EnumValue) *enumValues {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]enumValueMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.enumValueMeta != nil {
-				panic("already initialized")
-			}
-			t.enumValueMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, true)
-		}
-		p.typs = ts
-	})
-	return (*enumValues)(p)
-}
-func (p *enumValues) Len() int                                   { return len(p.typs) }
-func (p *enumValues) Get(i int) protoreflect.EnumValueDescriptor { return enumValueDesc{&p.typs[i]} }
-func (p *enumValues) ByName(s protoreflect.Name) protoreflect.EnumValueDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*EnumValue, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return enumValueDesc{t}
-}
-func (p *enumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor {
-	p.numOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byNum = make(map[protoreflect.EnumNumber]*EnumValue, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				if _, ok := p.byNum[t.Number]; !ok {
-					p.byNum[t.Number] = t
-				}
-			}
-		}
-	})
-	t := p.byNum[n]
-	if t == nil {
-		return nil
-	}
-	return enumValueDesc{t}
-}
-func (p *enumValues) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *enumValues) ProtoInternal(pragma.DoNotImplement) {}
-
-type servicesMeta struct {
-	once     sync.Once
-	typs     []Service
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*Service
-}
-type services servicesMeta
-
-func (p *servicesMeta) lazyInit(parent protoreflect.Descriptor, ts []Service) *services {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]serviceMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.serviceMeta != nil {
-				panic("already initialized")
-			}
-			t.serviceMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, false)
-		}
-		p.typs = ts
-	})
-	return (*services)(p)
-}
-func (p *services) Len() int                                 { return len(p.typs) }
-func (p *services) Get(i int) protoreflect.ServiceDescriptor { return serviceDesc{&p.typs[i]} }
-func (p *services) ByName(s protoreflect.Name) protoreflect.ServiceDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*Service, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return serviceDesc{t}
-}
-func (p *services) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *services) ProtoInternal(pragma.DoNotImplement) {}
-
-type methodsMeta struct {
-	once     sync.Once
-	typs     []Method
-	nameOnce sync.Once
-	byName   map[protoreflect.Name]*Method
-}
-type methods methodsMeta
-
-func (p *methodsMeta) lazyInit(parent protoreflect.Descriptor, ts []Method) *methods {
-	p.once.Do(func() {
-		nb := getNameBuilder()
-		defer putNameBuilder(nb)
-		metas := make([]methodMeta, len(ts))
-		for i := range ts {
-			t := &ts[i]
-			if t.methodMeta != nil {
-				panic("already initialized")
-			}
-			t.methodMeta = &metas[i]
-			t.inheritedMeta.init(nb, parent, i, t.Name, false)
-		}
-		p.typs = ts
-	})
-	return (*methods)(p)
-}
-func (p *methods) Len() int                                { return len(p.typs) }
-func (p *methods) Get(i int) protoreflect.MethodDescriptor { return methodDesc{&p.typs[i]} }
-func (p *methods) ByName(s protoreflect.Name) protoreflect.MethodDescriptor {
-	p.nameOnce.Do(func() {
-		if len(p.typs) > 0 {
-			p.byName = make(map[protoreflect.Name]*Method, len(p.typs))
-			for i := range p.typs {
-				t := &p.typs[i]
-				p.byName[t.Name] = t
-			}
-		}
-	})
-	t := p.byName[s]
-	if t == nil {
-		return nil
-	}
-	return methodDesc{t}
-}
-func (p *methods) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) }
-func (p *methods) ProtoInternal(pragma.DoNotImplement) {}
diff --git a/internal/prototype/protofile_type.go b/internal/prototype/protofile_type.go
deleted file mode 100644
index a00e36b..0000000
--- a/internal/prototype/protofile_type.go
+++ /dev/null
@@ -1,601 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	"bytes"
-	"fmt"
-	"strings"
-	"sync"
-
-	"google.golang.org/protobuf/internal/descfmt"
-	"google.golang.org/protobuf/internal/descopts"
-	"google.golang.org/protobuf/internal/pragma"
-	"google.golang.org/protobuf/reflect/protoreflect"
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-)
-
-// inheritedMeta is information inherited from the parent.
-type inheritedMeta struct {
-	parent   pref.Descriptor
-	index    int
-	syntax   pref.Syntax
-	fullName pref.FullName
-}
-
-func (m *inheritedMeta) init(nb *nameBuilder, parent pref.Descriptor, index int, name pref.Name, child bool) {
-	// Most descriptors are namespaced as a child of their parent.
-	// However, EnumValues are the exception in that they are namespaced
-	// as a sibling of the parent Enum type.
-	prefix := parent.FullName()
-	if child {
-		prefix = prefix.Parent()
-	}
-
-	m.parent = parent
-	m.index = index
-	m.syntax = parent.Syntax()
-	m.fullName = nb.Append(prefix, name)
-}
-
-type fileMeta struct {
-	ms messagesMeta
-	es enumsMeta
-	xs extensionsMeta
-	ss servicesMeta
-}
-type fileDesc struct{ f *File }
-
-// altOptions returns m as is if it is non-nil. Otherwise, it returns alt.
-func altOptions(m, alt pref.ProtoMessage) pref.ProtoMessage {
-	if m != nil {
-		return m
-	}
-	return alt
-}
-
-func newFile(f *File) fileDesc {
-	if f.fileMeta != nil {
-		panic("already initialized")
-	}
-	f.fileMeta = new(fileMeta)
-	return fileDesc{f}
-}
-func (t fileDesc) ParentFile() pref.FileDescriptor       { return t }
-func (t fileDesc) Parent() pref.Descriptor               { return nil }
-func (t fileDesc) Index() int                            { return 0 }
-func (t fileDesc) Syntax() pref.Syntax                   { return t.f.Syntax }
-func (t fileDesc) Name() pref.Name                       { return t.f.Package.Name() }
-func (t fileDesc) FullName() pref.FullName               { return t.f.Package }
-func (t fileDesc) IsPlaceholder() bool                   { return false }
-func (t fileDesc) Options() pref.ProtoMessage            { return altOptions(t.f.Options, descopts.File) }
-func (t fileDesc) Path() string                          { return t.f.Path }
-func (t fileDesc) Package() pref.FullName                { return t.f.Package }
-func (t fileDesc) Imports() pref.FileImports             { return (*fileImports)(&t.f.Imports) }
-func (t fileDesc) Enums() pref.EnumDescriptors           { return t.f.es.lazyInit(t, t.f.Enums) }
-func (t fileDesc) Messages() pref.MessageDescriptors     { return t.f.ms.lazyInit(t, t.f.Messages) }
-func (t fileDesc) Extensions() pref.ExtensionDescriptors { return t.f.xs.lazyInit(t, t.f.Extensions) }
-func (t fileDesc) Services() pref.ServiceDescriptors     { return t.f.ss.lazyInit(t, t.f.Services) }
-func (t fileDesc) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, t) }
-func (t fileDesc) ProtoType(pref.FileDescriptor)         {}
-func (t fileDesc) ProtoInternal(pragma.DoNotImplement)   {}
-
-func parentFile(d protoreflect.Descriptor) protoreflect.FileDescriptor {
-	for ; d != nil; d = d.Parent() {
-		if fd, ok := d.(protoreflect.FileDescriptor); ok {
-			return fd
-		}
-	}
-	return nil
-}
-
-type messageMeta struct {
-	inheritedMeta
-
-	fs fieldsMeta
-	os oneofsMeta
-	ns numbersMeta
-	ms messagesMeta
-	es enumsMeta
-	xs extensionsMeta
-}
-type messageDesc struct{ m *Message }
-
-func (t messageDesc) ParentFile() pref.FileDescriptor { return parentFile(t) }
-func (t messageDesc) Parent() pref.Descriptor         { return t.m.parent }
-func (t messageDesc) Index() int                      { return t.m.index }
-func (t messageDesc) Syntax() pref.Syntax             { return t.m.syntax }
-func (t messageDesc) Name() pref.Name                 { return t.m.Name }
-func (t messageDesc) FullName() pref.FullName         { return t.m.fullName }
-func (t messageDesc) IsPlaceholder() bool             { return false }
-func (t messageDesc) Options() pref.ProtoMessage {
-	return altOptions(t.m.Options, descopts.Message)
-}
-func (t messageDesc) IsMapEntry() bool                   { return t.m.IsMapEntry }
-func (t messageDesc) Fields() pref.FieldDescriptors      { return t.m.fs.lazyInit(t, t.m.Fields) }
-func (t messageDesc) Oneofs() pref.OneofDescriptors      { return t.m.os.lazyInit(t, t.m.Oneofs) }
-func (t messageDesc) ReservedNames() pref.Names          { return (*names)(&t.m.ReservedNames) }
-func (t messageDesc) ReservedRanges() pref.FieldRanges   { return (*fieldRanges)(&t.m.ReservedRanges) }
-func (t messageDesc) RequiredNumbers() pref.FieldNumbers { return t.m.ns.lazyInit(t.m.Fields) }
-func (t messageDesc) ExtensionRanges() pref.FieldRanges  { return (*fieldRanges)(&t.m.ExtensionRanges) }
-func (t messageDesc) ExtensionRangeOptions(i int) pref.ProtoMessage {
-	return extensionRangeOptions(i, len(t.m.ExtensionRanges), t.m.ExtensionRangeOptions)
-}
-func (t messageDesc) Enums() pref.EnumDescriptors           { return t.m.es.lazyInit(t, t.m.Enums) }
-func (t messageDesc) Messages() pref.MessageDescriptors     { return t.m.ms.lazyInit(t, t.m.Messages) }
-func (t messageDesc) Extensions() pref.ExtensionDescriptors { return t.m.xs.lazyInit(t, t.m.Extensions) }
-func (t messageDesc) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, t) }
-func (t messageDesc) ProtoType(pref.MessageDescriptor)      {}
-func (t messageDesc) ProtoInternal(pragma.DoNotImplement)   {}
-
-func extensionRangeOptions(i, n int, ms []pref.ProtoMessage) pref.ProtoMessage {
-	if i < 0 || i >= n {
-		panic("out of bounds")
-	}
-	var m pref.ProtoMessage
-	if i < len(ms) {
-		m = ms[i]
-	}
-	if m == nil {
-		m = descopts.ExtensionRange
-	}
-	return m
-}
-
-type fieldMeta struct {
-	inheritedMeta
-
-	js jsonName
-	dv defaultValue
-	ot oneofReference
-	mt messageReference
-	et enumReference
-}
-type fieldDesc struct{ f *Field }
-
-func (t fieldDesc) ParentFile() pref.FileDescriptor { return parentFile(t) }
-func (t fieldDesc) Parent() pref.Descriptor         { return t.f.parent }
-func (t fieldDesc) Index() int                      { return t.f.index }
-func (t fieldDesc) Syntax() pref.Syntax             { return t.f.syntax }
-func (t fieldDesc) Name() pref.Name                 { return t.f.Name }
-func (t fieldDesc) FullName() pref.FullName         { return t.f.fullName }
-func (t fieldDesc) IsPlaceholder() bool             { return false }
-func (t fieldDesc) Options() pref.ProtoMessage      { return altOptions(t.f.Options, descopts.Field) }
-func (t fieldDesc) Number() pref.FieldNumber        { return t.f.Number }
-func (t fieldDesc) Cardinality() pref.Cardinality   { return t.f.Cardinality }
-func (t fieldDesc) Kind() pref.Kind                 { return t.f.Kind }
-func (t fieldDesc) HasJSONName() bool               { return t.f.JSONName != "" }
-func (t fieldDesc) JSONName() string                { return t.f.js.lazyInit(t.f) }
-func (t fieldDesc) IsPacked() bool {
-	return isPacked(t.f.IsPacked, t.f.syntax, t.f.Cardinality, t.f.Kind)
-}
-func (t fieldDesc) IsExtension() bool { return false }
-func (t fieldDesc) IsWeak() bool      { return t.f.IsWeak }
-func (t fieldDesc) IsList() bool {
-	return t.f.Cardinality == pref.Repeated && !t.IsMap()
-}
-func (t fieldDesc) IsMap() bool {
-	mt := t.Message()
-	return mt != nil && mt.IsMapEntry()
-}
-func (t fieldDesc) MapKey() pref.FieldDescriptor {
-	if !t.IsMap() {
-		return nil
-	}
-	return t.Message().Fields().ByNumber(1)
-}
-func (t fieldDesc) MapValue() pref.FieldDescriptor {
-	if !t.IsMap() {
-		return nil
-	}
-	return t.Message().Fields().ByNumber(2)
-}
-func (t fieldDesc) HasDefault() bool                           { return t.f.Default.IsValid() }
-func (t fieldDesc) Default() pref.Value                        { return t.f.dv.value(t, t.f.Default) }
-func (t fieldDesc) DefaultEnumValue() pref.EnumValueDescriptor { return t.f.dv.enum(t, t.f.Default) }
-func (t fieldDesc) ContainingOneof() pref.OneofDescriptor      { return t.f.ot.lazyInit(t, t.f.OneofName) }
-func (t fieldDesc) ContainingMessage() pref.MessageDescriptor {
-	return t.f.parent.(pref.MessageDescriptor)
-}
-func (t fieldDesc) Enum() pref.EnumDescriptor           { return t.f.et.lazyInit(t, &t.f.EnumType) }
-func (t fieldDesc) Message() pref.MessageDescriptor     { return t.f.mt.lazyInit(t, &t.f.MessageType) }
-func (t fieldDesc) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t fieldDesc) ProtoType(pref.FieldDescriptor)      {}
-func (t fieldDesc) ProtoInternal(pragma.DoNotImplement) {}
-
-func isPacked(packed OptionalBool, s pref.Syntax, c pref.Cardinality, k pref.Kind) bool {
-	if packed == False || (packed == DefaultBool && s == pref.Proto2) {
-		return false
-	}
-	if c != pref.Repeated {
-		return false
-	}
-	switch k {
-	case pref.StringKind, pref.BytesKind, pref.MessageKind, pref.GroupKind:
-		return false
-	}
-	return true
-}
-
-type jsonName struct {
-	once sync.Once
-	name string
-}
-
-func (p *jsonName) lazyInit(f *Field) string {
-	p.once.Do(func() {
-		// TODO: We may need to share this logic with protojson for implementation
-		// of the FieldMask well-known type.
-		if f.JSONName != "" {
-			p.name = f.JSONName
-			return
-		}
-		var b []byte
-		var wasUnderscore bool
-		for i := 0; i < len(f.Name); i++ { // proto identifiers are always ASCII
-			c := f.Name[i]
-			if c != '_' {
-				isLower := 'a' <= c && c <= 'z'
-				if wasUnderscore && isLower {
-					c -= 'a' - 'A'
-				}
-				b = append(b, c)
-			}
-			wasUnderscore = c == '_'
-		}
-		p.name = string(b)
-	})
-	return p.name
-}
-
-// oneofReference resolves the name of a oneof by searching the parent
-// message for the matching OneofDescriptor declaration.
-type oneofReference struct {
-	once sync.Once
-	otyp pref.OneofDescriptor
-}
-
-func (p *oneofReference) lazyInit(parent pref.Descriptor, name pref.Name) pref.OneofDescriptor {
-	p.once.Do(func() {
-		if name != "" {
-			p.otyp = parent.Parent().(pref.MessageDescriptor).Oneofs().ByName(name)
-			// TODO: We need validate to detect this mismatch.
-		}
-	})
-	return p.otyp
-}
-
-type oneofMeta struct {
-	inheritedMeta
-
-	fs oneofFieldsMeta
-}
-type oneofDesc struct{ o *Oneof }
-
-func (t oneofDesc) ParentFile() pref.FileDescriptor     { return parentFile(t) }
-func (t oneofDesc) Parent() pref.Descriptor             { return t.o.parent }
-func (t oneofDesc) Index() int                          { return t.o.index }
-func (t oneofDesc) Syntax() pref.Syntax                 { return t.o.syntax }
-func (t oneofDesc) Name() pref.Name                     { return t.o.Name }
-func (t oneofDesc) FullName() pref.FullName             { return t.o.fullName }
-func (t oneofDesc) IsPlaceholder() bool                 { return false }
-func (t oneofDesc) Options() pref.ProtoMessage          { return altOptions(t.o.Options, descopts.Oneof) }
-func (t oneofDesc) Fields() pref.FieldDescriptors       { return t.o.fs.lazyInit(t) }
-func (t oneofDesc) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t oneofDesc) ProtoType(pref.OneofDescriptor)      {}
-func (t oneofDesc) ProtoInternal(pragma.DoNotImplement) {}
-
-type extensionMeta struct {
-	inheritedMeta
-
-	dv defaultValue
-	xt messageReference
-	mt messageReference
-	et enumReference
-}
-type extensionDesc struct{ x *Extension }
-
-func (t extensionDesc) ParentFile() pref.FileDescriptor { return parentFile(t) }
-func (t extensionDesc) Parent() pref.Descriptor         { return t.x.parent }
-func (t extensionDesc) Syntax() pref.Syntax             { return t.x.syntax }
-func (t extensionDesc) Index() int                      { return t.x.index }
-func (t extensionDesc) Name() pref.Name                 { return t.x.Name }
-func (t extensionDesc) FullName() pref.FullName         { return t.x.fullName }
-func (t extensionDesc) IsPlaceholder() bool             { return false }
-func (t extensionDesc) Options() pref.ProtoMessage {
-	return altOptions(t.x.Options, descopts.Field)
-}
-func (t extensionDesc) Number() pref.FieldNumber      { return t.x.Number }
-func (t extensionDesc) Cardinality() pref.Cardinality { return t.x.Cardinality }
-func (t extensionDesc) Kind() pref.Kind               { return t.x.Kind }
-func (t extensionDesc) HasJSONName() bool             { return false }
-func (t extensionDesc) JSONName() string              { return "" }
-func (t extensionDesc) IsPacked() bool {
-	// Extensions always use proto2 defaults for packing.
-	return isPacked(t.x.IsPacked, pref.Proto2, t.x.Cardinality, t.x.Kind)
-}
-func (t extensionDesc) IsExtension() bool                          { return true }
-func (t extensionDesc) IsWeak() bool                               { return false }
-func (t extensionDesc) IsList() bool                               { return t.x.Cardinality == pref.Repeated }
-func (t extensionDesc) IsMap() bool                                { return false }
-func (t extensionDesc) MapKey() pref.FieldDescriptor               { return nil }
-func (t extensionDesc) MapValue() pref.FieldDescriptor             { return nil }
-func (t extensionDesc) HasDefault() bool                           { return t.x.Default.IsValid() }
-func (t extensionDesc) Default() pref.Value                        { return t.x.dv.value(t, t.x.Default) }
-func (t extensionDesc) DefaultEnumValue() pref.EnumValueDescriptor { return t.x.dv.enum(t, t.x.Default) }
-func (t extensionDesc) ContainingOneof() pref.OneofDescriptor      { return nil }
-func (t extensionDesc) ContainingMessage() pref.MessageDescriptor {
-	return t.x.xt.lazyInit(t, &t.x.ExtendedType)
-}
-func (t extensionDesc) Enum() pref.EnumDescriptor           { return t.x.et.lazyInit(t, &t.x.EnumType) }
-func (t extensionDesc) Message() pref.MessageDescriptor     { return t.x.mt.lazyInit(t, &t.x.MessageType) }
-func (t extensionDesc) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t extensionDesc) ProtoType(pref.FieldDescriptor)      {}
-func (t extensionDesc) ProtoInternal(pragma.DoNotImplement) {}
-
-type enumMeta struct {
-	inheritedMeta
-
-	vs enumValuesMeta
-}
-type enumDesc struct{ e *Enum }
-
-func (t enumDesc) ParentFile() pref.FileDescriptor     { return parentFile(t) }
-func (t enumDesc) Parent() pref.Descriptor             { return t.e.parent }
-func (t enumDesc) Index() int                          { return t.e.index }
-func (t enumDesc) Syntax() pref.Syntax                 { return t.e.syntax }
-func (t enumDesc) Name() pref.Name                     { return t.e.Name }
-func (t enumDesc) FullName() pref.FullName             { return t.e.fullName }
-func (t enumDesc) IsPlaceholder() bool                 { return false }
-func (t enumDesc) Options() pref.ProtoMessage          { return altOptions(t.e.Options, descopts.Enum) }
-func (t enumDesc) Values() pref.EnumValueDescriptors   { return t.e.vs.lazyInit(t, t.e.Values) }
-func (t enumDesc) ReservedNames() pref.Names           { return (*names)(&t.e.ReservedNames) }
-func (t enumDesc) ReservedRanges() pref.EnumRanges     { return (*enumRanges)(&t.e.ReservedRanges) }
-func (t enumDesc) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t enumDesc) ProtoType(pref.EnumDescriptor)       {}
-func (t enumDesc) ProtoInternal(pragma.DoNotImplement) {}
-
-type enumValueMeta struct {
-	inheritedMeta
-}
-type enumValueDesc struct{ v *EnumValue }
-
-func (t enumValueDesc) ParentFile() pref.FileDescriptor { return parentFile(t) }
-func (t enumValueDesc) Parent() pref.Descriptor         { return t.v.parent }
-func (t enumValueDesc) Index() int                      { return t.v.index }
-func (t enumValueDesc) Syntax() pref.Syntax             { return t.v.syntax }
-func (t enumValueDesc) Name() pref.Name                 { return t.v.Name }
-func (t enumValueDesc) FullName() pref.FullName         { return t.v.fullName }
-func (t enumValueDesc) IsPlaceholder() bool             { return false }
-func (t enumValueDesc) Options() pref.ProtoMessage {
-	return altOptions(t.v.Options, descopts.EnumValue)
-}
-func (t enumValueDesc) Number() pref.EnumNumber             { return t.v.Number }
-func (t enumValueDesc) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t enumValueDesc) ProtoType(pref.EnumValueDescriptor)  {}
-func (t enumValueDesc) ProtoInternal(pragma.DoNotImplement) {}
-
-type serviceMeta struct {
-	inheritedMeta
-
-	ms methodsMeta
-}
-type serviceDesc struct{ s *Service }
-
-func (t serviceDesc) ParentFile() pref.FileDescriptor { return parentFile(t) }
-func (t serviceDesc) Parent() pref.Descriptor         { return t.s.parent }
-func (t serviceDesc) Index() int                      { return t.s.index }
-func (t serviceDesc) Syntax() pref.Syntax             { return t.s.syntax }
-func (t serviceDesc) Name() pref.Name                 { return t.s.Name }
-func (t serviceDesc) FullName() pref.FullName         { return t.s.fullName }
-func (t serviceDesc) IsPlaceholder() bool             { return false }
-func (t serviceDesc) Options() pref.ProtoMessage {
-	return altOptions(t.s.Options, descopts.Service)
-}
-func (t serviceDesc) Methods() pref.MethodDescriptors     { return t.s.ms.lazyInit(t, t.s.Methods) }
-func (t serviceDesc) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t serviceDesc) ProtoType(pref.ServiceDescriptor)    {}
-func (t serviceDesc) ProtoInternal(pragma.DoNotImplement) {}
-
-type methodMeta struct {
-	inheritedMeta
-
-	mit messageReference
-	mot messageReference
-}
-type methodDesc struct{ m *Method }
-
-func (t methodDesc) ParentFile() pref.FileDescriptor     { return parentFile(t) }
-func (t methodDesc) Parent() pref.Descriptor             { return t.m.parent }
-func (t methodDesc) Index() int                          { return t.m.index }
-func (t methodDesc) Syntax() pref.Syntax                 { return t.m.syntax }
-func (t methodDesc) Name() pref.Name                     { return t.m.Name }
-func (t methodDesc) FullName() pref.FullName             { return t.m.fullName }
-func (t methodDesc) IsPlaceholder() bool                 { return false }
-func (t methodDesc) Options() pref.ProtoMessage          { return altOptions(t.m.Options, descopts.Method) }
-func (t methodDesc) Input() pref.MessageDescriptor       { return t.m.mit.lazyInit(t, &t.m.InputType) }
-func (t methodDesc) Output() pref.MessageDescriptor      { return t.m.mot.lazyInit(t, &t.m.OutputType) }
-func (t methodDesc) IsStreamingClient() bool             { return t.m.IsStreamingClient }
-func (t methodDesc) IsStreamingServer() bool             { return t.m.IsStreamingServer }
-func (t methodDesc) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t methodDesc) ProtoType(pref.MethodDescriptor)     {}
-func (t methodDesc) ProtoInternal(pragma.DoNotImplement) {}
-
-type defaultValue struct {
-	once sync.Once
-	val  pref.Value
-	eval pref.EnumValueDescriptor
-	buf  []byte
-}
-
-var (
-	zeroBool    = pref.ValueOf(false)
-	zeroInt32   = pref.ValueOf(int32(0))
-	zeroInt64   = pref.ValueOf(int64(0))
-	zeroUint32  = pref.ValueOf(uint32(0))
-	zeroUint64  = pref.ValueOf(uint64(0))
-	zeroFloat32 = pref.ValueOf(float32(0))
-	zeroFloat64 = pref.ValueOf(float64(0))
-	zeroString  = pref.ValueOf(string(""))
-	zeroBytes   = pref.ValueOf([]byte(nil))
-	zeroEnum    = pref.ValueOf(pref.EnumNumber(0))
-)
-
-func (p *defaultValue) lazyInit(t pref.FieldDescriptor, v pref.Value) {
-	p.once.Do(func() {
-		p.val = v
-		if v.IsValid() {
-			switch t.Kind() {
-			case pref.EnumKind:
-				// Treat a string value as an identifier referencing some enum
-				// value by name and extract the enum number.
-				// If this fails, validateMessage will later detect that the
-				// default value for an enum value is the wrong type.
-				switch v := v.Interface().(type) {
-				case string:
-					if ev := t.Enum().Values().ByName(pref.Name(v)); ev != nil {
-						p.eval = ev
-						p.val = pref.ValueOf(p.eval.Number())
-					}
-				case pref.EnumNumber:
-					p.eval = t.Enum().Values().ByNumber(v)
-				}
-			case pref.BytesKind:
-				// Store a copy of the default bytes, so that we can detect
-				// accidental mutations of the original value.
-				if b, ok := v.Interface().([]byte); ok && len(b) > 0 {
-					p.buf = append([]byte(nil), b...)
-				}
-			}
-			return
-		}
-		switch t.Kind() {
-		case pref.BoolKind:
-			p.val = zeroBool
-		case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
-			p.val = zeroInt32
-		case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
-			p.val = zeroInt64
-		case pref.Uint32Kind, pref.Fixed32Kind:
-			p.val = zeroUint32
-		case pref.Uint64Kind, pref.Fixed64Kind:
-			p.val = zeroUint64
-		case pref.FloatKind:
-			p.val = zeroFloat32
-		case pref.DoubleKind:
-			p.val = zeroFloat64
-		case pref.StringKind:
-			p.val = zeroString
-		case pref.BytesKind:
-			p.val = zeroBytes
-		case pref.EnumKind:
-			p.val = zeroEnum
-			if t.Syntax() == pref.Proto2 {
-				if ed := t.Enum(); ed != nil {
-					if vs := ed.Values(); vs.Len() > 0 {
-						p.val = pref.ValueOf(vs.Get(0).Number())
-					}
-				}
-			}
-		}
-	})
-	if len(p.buf) > 0 && !bytes.Equal(p.buf, p.val.Bytes()) {
-		// TODO: Avoid panic if we're running with the race detector and instead
-		// spawn a goroutine that periodically resets this value back to the
-		// original to induce a race that can be detected by the detector.
-		panic(fmt.Sprintf("proto: detected mutation on the default bytes for %v", t.FullName()))
-	}
-}
-
-func (p *defaultValue) value(t pref.FieldDescriptor, v pref.Value) pref.Value {
-	p.lazyInit(t, v)
-	return p.val
-}
-
-func (p *defaultValue) enum(t pref.FieldDescriptor, v pref.Value) pref.EnumValueDescriptor {
-	p.lazyInit(t, v)
-	return p.eval
-}
-
-// messageReference resolves PlaceholderMessages that reference declarations
-// within the FileDescriptor tree that parent is a member of.
-type messageReference struct{ once sync.Once }
-
-func (p *messageReference) lazyInit(parent pref.Descriptor, pt *pref.MessageDescriptor) pref.MessageDescriptor {
-	p.once.Do(func() {
-		if t := *pt; t != nil && t.IsPlaceholder() {
-			if d, ok := resolveReference(parent, t.FullName()).(pref.MessageDescriptor); ok {
-				*pt = d
-			}
-		}
-	})
-	return *pt
-}
-
-// enumReference resolves PlaceholderEnums that reference declarations
-// within the FileDescriptor tree that parent is a member of.
-type enumReference struct{ once sync.Once }
-
-func (p *enumReference) lazyInit(parent pref.Descriptor, pt *pref.EnumDescriptor) pref.EnumDescriptor {
-	p.once.Do(func() {
-		if t := *pt; t != nil && t.IsPlaceholder() {
-			if d, ok := resolveReference(parent, t.FullName()).(pref.EnumDescriptor); ok {
-				*pt = d
-			}
-		}
-	})
-	return *pt
-}
-
-// resolveReference searches parent for the MessageDescriptor or EnumDescriptor
-// declaration identified by refName. This returns nil if not found.
-func resolveReference(parent pref.Descriptor, refName pref.FullName) pref.Descriptor {
-	// Ascend upwards until a prefix match is found.
-	cur := parent
-	for cur != nil {
-		curName := cur.FullName()
-		if strings.HasPrefix(string(refName), string(curName)) {
-			if len(refName) == len(curName) {
-				refName = refName[len(curName):]
-				break // e.g., refName: foo.firetruck, curName: foo.firetruck
-			} else if refName[len(curName)] == '.' {
-				refName = refName[len(curName)+len("."):]
-				break // e.g., refName: foo.firetruck.driver, curName: foo.firetruck
-			} else if len(curName) == 0 {
-				break // FileDescriptor has no package name
-			}
-			// No match. (e.g., refName: foo.firetruck, curName: foo.fire)
-		}
-		cur = cur.Parent() // nil after ascending above FileDescriptor
-	}
-
-	// Descend downwards to resolve all relative names.
-	for cur != nil && len(refName) > 0 {
-		var head pref.Name
-		head, refName = pref.Name(refName), ""
-		if i := strings.IndexByte(string(head), '.'); i >= 0 {
-			head, refName = head[:i], pref.FullName(head[i+len("."):])
-		}
-
-		// Search the current descriptor for the nested declaration.
-		var next pref.Descriptor
-		if t, ok := cur.(interface {
-			Messages() pref.MessageDescriptors
-		}); ok && next == nil {
-			if d := t.Messages().ByName(head); d != nil {
-				next = d
-			}
-		}
-		if t, ok := cur.(interface {
-			Enums() pref.EnumDescriptors
-		}); ok && next == nil {
-			if d := t.Enums().ByName(head); d != nil {
-				next = d
-			}
-		}
-		cur = next // nil if not found
-	}
-	return cur
-}
diff --git a/internal/prototype/resolve_test.go b/internal/prototype/resolve_test.go
deleted file mode 100644
index 09fb195..0000000
--- a/internal/prototype/resolve_test.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	"testing"
-
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-)
-
-func TestResolve(t *testing.T) {
-	f := &File{
-		Syntax:  pref.Proto2,
-		Package: "test",
-		Messages: []Message{{
-			Name:   "FooMessage",
-			Fields: []Field{{Name: "F", Number: 1, Cardinality: pref.Optional, Kind: pref.BytesKind}},
-			Messages: []Message{{
-				Name:   "FooMessage",
-				Fields: []Field{{Name: "F", Number: 1, Cardinality: pref.Optional, Kind: pref.BytesKind}},
-			}, {
-				Name:   "BarMessage",
-				Fields: []Field{{Name: "F", Number: 1, Cardinality: pref.Optional, Kind: pref.BytesKind}},
-			}},
-			Enums: []Enum{{
-				Name:   "FooEnum",
-				Values: []EnumValue{{Name: "E", Number: 0}},
-			}, {
-				Name:   "BarEnum",
-				Values: []EnumValue{{Name: "E", Number: 0}},
-			}},
-		}, {
-			Name:   "BarMessage",
-			Fields: []Field{{Name: "F", Number: 1, Cardinality: pref.Optional, Kind: pref.BytesKind}},
-		}},
-		Enums: []Enum{{
-			Name:   "FooEnum",
-			Values: []EnumValue{{Name: "E", Number: 0}},
-		}, {
-			Name:   "BarEnum",
-			Values: []EnumValue{{Name: "E", Number: 0}},
-		}},
-	}
-
-	fd, err := NewFile(f)
-	if err != nil {
-		t.Fatalf("NewFile() error: %v", err)
-	}
-
-	tests := []struct {
-		parent pref.Descriptor
-		name   pref.FullName
-		want   pref.Descriptor
-	}{{
-		parent: fd.Enums().Get(0),
-		name:   "test.Foo",
-		want:   nil,
-	}, {
-		parent: fd.Enums().Get(0),
-		name:   "test.FooEnum",
-		want:   fd.Enums().Get(0),
-	}, {
-		parent: fd.Enums().Get(0),
-		name:   "test.BarEnum",
-		want:   fd.Enums().Get(1),
-	}, {
-		parent: fd.Enums().Get(0),
-		name:   "test.BarMessage",
-		want:   fd.Messages().Get(1),
-	}, {
-		parent: fd.Enums().Get(0),
-		name:   "test.FooMessage.BarMessage",
-		want:   fd.Messages().Get(0).Messages().Get(1),
-	}, {
-		parent: fd.Enums().Get(0),
-		name:   "test.FooMessage.Bar",
-		want:   nil,
-	}, {
-		parent: fd.Messages().Get(1),
-		name:   "test.FooMessage.BarEnum",
-		want:   fd.Messages().Get(0).Enums().Get(1),
-	}, {
-		parent: fd.Messages().Get(1),
-		name:   "test.FooEnum",
-		want:   fd.Enums().Get(0),
-	}, {
-		parent: fd.Messages().Get(0),
-		name:   "test.FooEnum",
-		want:   fd.Enums().Get(0),
-	}, {
-		parent: fd.Messages().Get(0),
-		name:   "test.FooEnum.NonExistent",
-		want:   nil,
-	}, {
-		parent: fd.Messages().Get(0),
-		name:   "test.FooMessage.FooEnum",
-		want:   fd.Messages().Get(0).Enums().Get(0),
-	}, {
-		parent: fd.Messages().Get(0),
-		name:   "test.FooMessage",
-		want:   fd.Messages().Get(0),
-	}, {
-		parent: fd.Messages().Get(0),
-		name:   "test.FooMessage.Fizz",
-		want:   nil,
-	}, {
-		parent: fd.Messages().Get(0).Messages().Get(0),
-		name:   "test.FooMessage.FooMessage",
-		want:   fd.Messages().Get(0).Messages().Get(0),
-	}, {
-		parent: fd.Messages().Get(0).Messages().Get(0),
-		name:   "test.FooMessage.BarMessage",
-		want:   fd.Messages().Get(0).Messages().Get(1),
-	}, {
-		parent: fd.Messages().Get(0).Messages().Get(0),
-		name:   "test.BarMessage.FooMessage",
-		want:   nil,
-	}, {
-		parent: fd.Messages().Get(0).Messages().Get(0),
-		name:   "test.BarMessage",
-		want:   fd.Messages().Get(1),
-	}, {
-		parent: fd.Messages().Get(0).Messages().Get(0),
-		name:   "test.BarMessageExtra",
-		want:   nil,
-	}, {
-		parent: fd.Messages().Get(0).Messages().Get(0),
-		name:   "taste.BarMessage",
-		want:   nil,
-	}}
-
-	for _, tt := range tests {
-		got := resolveReference(tt.parent, tt.name)
-		if got != tt.want {
-			fullName := func(d pref.Descriptor) string {
-				if d == nil {
-					return "<nil>"
-				}
-				return string(d.FullName())
-			}
-			t.Errorf("resolveReference(%v, %v) = %v, want %v", fullName(tt.parent), tt.name, fullName(got), fullName(tt.want))
-		}
-	}
-}
diff --git a/internal/prototype/standalone.go b/internal/prototype/standalone.go
deleted file mode 100644
index 05b123e..0000000
--- a/internal/prototype/standalone.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	"google.golang.org/protobuf/internal/errors"
-	"google.golang.org/protobuf/reflect/protoreflect"
-)
-
-// TODO: Should the constructors take in a value rather than a pointer?
-// TODO: Support initializing StandaloneMessage from a google.protobuf.Type?
-
-// StandaloneMessage is a constructor for a protoreflect.MessageDescriptor
-// that does not have a parent and has no child declarations.
-type StandaloneMessage struct {
-	Syntax                protoreflect.Syntax
-	FullName              protoreflect.FullName
-	Fields                []Field
-	Oneofs                []Oneof
-	ReservedNames         []protoreflect.Name
-	ReservedRanges        [][2]protoreflect.FieldNumber
-	ExtensionRanges       [][2]protoreflect.FieldNumber
-	ExtensionRangeOptions []protoreflect.ProtoMessage
-	Options               protoreflect.ProtoMessage
-	IsMapEntry            bool
-
-	fields fieldsMeta
-	oneofs oneofsMeta
-	nums   numbersMeta
-}
-
-// NewMessage creates a new protoreflect.MessageDescriptor.
-// The caller must relinquish full ownership of the input t and must not
-// access or mutate any fields.
-func NewMessage(t *StandaloneMessage) (protoreflect.MessageDescriptor, error) {
-	mt := standaloneMessage{t}
-	if err := validateMessage(mt); err != nil {
-		return nil, err
-	}
-	return mt, nil
-}
-
-// NewMessages creates a set of new protoreflect.MessageDescriptors.
-//
-// This constructor permits the creation of cyclic message types that depend
-// on each other. For example, message A may have a field of type message B,
-// where message B may have a field of type message A. In such a case,
-// a placeholder message is used for these cyclic references.
-//
-// The caller must relinquish full ownership of the input ts and must not
-// access or mutate any fields.
-func NewMessages(ts []*StandaloneMessage) ([]protoreflect.MessageDescriptor, error) {
-	// TODO: Should this be []*T or []T?
-	// TODO: NewMessages is a superset of NewMessage. Do we need NewMessage?
-	ms := map[protoreflect.FullName]protoreflect.MessageDescriptor{}
-	for _, t := range ts {
-		if _, ok := ms[t.FullName]; ok {
-			return nil, errors.New("duplicate message %v", t.FullName)
-		}
-		ms[t.FullName] = standaloneMessage{t}
-	}
-
-	var mts []protoreflect.MessageDescriptor
-	for _, t := range ts {
-		for i, f := range t.Fields {
-			// Resolve placeholder messages with a concrete standalone message.
-			// If this fails, validateMessage will complain about it later.
-			if f.MessageType != nil && f.MessageType.IsPlaceholder() && !f.IsWeak {
-				if m, ok := ms[f.MessageType.FullName()]; ok {
-					t.Fields[i].MessageType = m
-				}
-			}
-		}
-		mt := standaloneMessage{t}
-		if err := validateMessage(mt); err != nil {
-			return nil, err
-		}
-		mts = append(mts, mt)
-	}
-	return mts, nil
-}
-
-// StandaloneEnum is a constructor for a protoreflect.EnumDescriptor
-// that does not have a parent.
-type StandaloneEnum struct {
-	Syntax         protoreflect.Syntax
-	FullName       protoreflect.FullName
-	Values         []EnumValue
-	ReservedNames  []protoreflect.Name
-	ReservedRanges [][2]protoreflect.EnumNumber
-	Options        protoreflect.ProtoMessage
-
-	vals enumValuesMeta
-}
-
-// NewEnum creates a new protoreflect.EnumDescriptor.
-// The caller must relinquish full ownership of the input t and must not
-// access or mutate any fields.
-func NewEnum(t *StandaloneEnum) (protoreflect.EnumDescriptor, error) {
-	et := standaloneEnum{t}
-	if err := validateEnum(et); err != nil {
-		return nil, err
-	}
-	return et, nil
-}
-
-// StandaloneExtension is a constructor for a protoreflect.ExtensionDescriptor
-// that does not have a parent.
-type StandaloneExtension struct {
-	FullName     protoreflect.FullName
-	Number       protoreflect.FieldNumber
-	Cardinality  protoreflect.Cardinality
-	Kind         protoreflect.Kind
-	Default      protoreflect.Value
-	MessageType  protoreflect.MessageDescriptor
-	EnumType     protoreflect.EnumDescriptor
-	ExtendedType protoreflect.MessageDescriptor
-	Options      protoreflect.ProtoMessage
-	IsPacked     OptionalBool
-
-	dv defaultValue
-}
-
-// NewExtension creates a new protoreflect.ExtensionDescriptor.
-// The caller must relinquish full ownership of the input t and must not
-// access or mutate any fields.
-func NewExtension(t *StandaloneExtension) (protoreflect.ExtensionDescriptor, error) {
-	xt := standaloneExtension{t}
-	if err := validateExtension(xt); err != nil {
-		return nil, err
-	}
-	return xt, nil
-}
diff --git a/internal/prototype/standalone_type.go b/internal/prototype/standalone_type.go
deleted file mode 100644
index e7da649..0000000
--- a/internal/prototype/standalone_type.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	"fmt"
-
-	"google.golang.org/protobuf/internal/descfmt"
-	"google.golang.org/protobuf/internal/descopts"
-	"google.golang.org/protobuf/internal/pragma"
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-)
-
-type standaloneMessage struct{ m *StandaloneMessage }
-
-func (t standaloneMessage) ParentFile() pref.FileDescriptor { return nil }
-func (t standaloneMessage) Parent() pref.Descriptor         { return nil }
-func (t standaloneMessage) Index() int                      { return 0 }
-func (t standaloneMessage) Syntax() pref.Syntax             { return t.m.Syntax }
-func (t standaloneMessage) Name() pref.Name                 { return t.m.FullName.Name() }
-func (t standaloneMessage) FullName() pref.FullName         { return t.m.FullName }
-func (t standaloneMessage) IsPlaceholder() bool             { return false }
-func (t standaloneMessage) Options() pref.ProtoMessage {
-	return altOptions(t.m.Options, descopts.Message)
-}
-func (t standaloneMessage) IsMapEntry() bool              { return t.m.IsMapEntry }
-func (t standaloneMessage) Fields() pref.FieldDescriptors { return t.m.fields.lazyInit(t, t.m.Fields) }
-func (t standaloneMessage) Oneofs() pref.OneofDescriptors { return t.m.oneofs.lazyInit(t, t.m.Oneofs) }
-func (t standaloneMessage) ReservedNames() pref.Names     { return (*names)(&t.m.ReservedNames) }
-func (t standaloneMessage) ReservedRanges() pref.FieldRanges {
-	return (*fieldRanges)(&t.m.ReservedRanges)
-}
-func (t standaloneMessage) RequiredNumbers() pref.FieldNumbers { return t.m.nums.lazyInit(t.m.Fields) }
-func (t standaloneMessage) ExtensionRanges() pref.FieldRanges {
-	return (*fieldRanges)(&t.m.ExtensionRanges)
-}
-func (t standaloneMessage) ExtensionRangeOptions(i int) pref.ProtoMessage {
-	return extensionRangeOptions(i, len(t.m.ExtensionRanges), t.m.ExtensionRangeOptions)
-}
-func (t standaloneMessage) Enums() pref.EnumDescriptors           { return &emptyEnums }
-func (t standaloneMessage) Messages() pref.MessageDescriptors     { return &emptyMessages }
-func (t standaloneMessage) Extensions() pref.ExtensionDescriptors { return &emptyExtensions }
-func (t standaloneMessage) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, t) }
-func (t standaloneMessage) ProtoType(pref.MessageDescriptor)      {}
-func (t standaloneMessage) ProtoInternal(pragma.DoNotImplement)   {}
-
-type standaloneEnum struct{ e *StandaloneEnum }
-
-func (t standaloneEnum) ParentFile() pref.FileDescriptor { return nil }
-func (t standaloneEnum) Parent() pref.Descriptor         { return nil }
-func (t standaloneEnum) Index() int                      { return 0 }
-func (t standaloneEnum) Syntax() pref.Syntax             { return t.e.Syntax }
-func (t standaloneEnum) Name() pref.Name                 { return t.e.FullName.Name() }
-func (t standaloneEnum) FullName() pref.FullName         { return t.e.FullName }
-func (t standaloneEnum) IsPlaceholder() bool             { return false }
-func (t standaloneEnum) Options() pref.ProtoMessage {
-	return altOptions(t.e.Options, descopts.Enum)
-}
-func (t standaloneEnum) Values() pref.EnumValueDescriptors   { return t.e.vals.lazyInit(t, t.e.Values) }
-func (t standaloneEnum) ReservedNames() pref.Names           { return (*names)(&t.e.ReservedNames) }
-func (t standaloneEnum) ReservedRanges() pref.EnumRanges     { return (*enumRanges)(&t.e.ReservedRanges) }
-func (t standaloneEnum) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, t) }
-func (t standaloneEnum) ProtoType(pref.EnumDescriptor)       {}
-func (t standaloneEnum) ProtoInternal(pragma.DoNotImplement) {}
-
-type standaloneExtension struct{ x *StandaloneExtension }
-
-func (t standaloneExtension) ParentFile() pref.FileDescriptor { return nil }
-func (t standaloneExtension) Parent() pref.Descriptor         { return nil }
-func (t standaloneExtension) Index() int                      { return 0 }
-func (t standaloneExtension) Syntax() pref.Syntax             { return pref.Proto2 }
-func (t standaloneExtension) Name() pref.Name                 { return t.x.FullName.Name() }
-func (t standaloneExtension) FullName() pref.FullName         { return t.x.FullName }
-func (t standaloneExtension) IsPlaceholder() bool             { return false }
-func (t standaloneExtension) Options() pref.ProtoMessage {
-	return altOptions(t.x.Options, descopts.Field)
-}
-func (t standaloneExtension) Number() pref.FieldNumber      { return t.x.Number }
-func (t standaloneExtension) Cardinality() pref.Cardinality { return t.x.Cardinality }
-func (t standaloneExtension) Kind() pref.Kind               { return t.x.Kind }
-func (t standaloneExtension) HasJSONName() bool             { return false }
-func (t standaloneExtension) JSONName() string              { return "" }
-func (t standaloneExtension) IsPacked() bool {
-	return isPacked(t.x.IsPacked, pref.Proto2, t.x.Cardinality, t.x.Kind)
-}
-func (t standaloneExtension) IsExtension() bool              { return true }
-func (t standaloneExtension) IsWeak() bool                   { return false }
-func (t standaloneExtension) IsList() bool                   { return t.x.Cardinality == pref.Repeated }
-func (t standaloneExtension) IsMap() bool                    { return false }
-func (t standaloneExtension) MapKey() pref.FieldDescriptor   { return nil }
-func (t standaloneExtension) MapValue() pref.FieldDescriptor { return nil }
-func (t standaloneExtension) HasDefault() bool               { return t.x.Default.IsValid() }
-func (t standaloneExtension) Default() pref.Value            { return t.x.dv.value(t, t.x.Default) }
-func (t standaloneExtension) DefaultEnumValue() pref.EnumValueDescriptor {
-	return t.x.dv.enum(t, t.x.Default)
-}
-func (t standaloneExtension) ContainingOneof() pref.OneofDescriptor     { return nil }
-func (t standaloneExtension) ContainingMessage() pref.MessageDescriptor { return t.x.ExtendedType }
-func (t standaloneExtension) Enum() pref.EnumDescriptor                 { return t.x.EnumType }
-func (t standaloneExtension) Message() pref.MessageDescriptor           { return t.x.MessageType }
-func (t standaloneExtension) Format(s fmt.State, r rune)                { descfmt.FormatDesc(s, r, t) }
-func (t standaloneExtension) ProtoType(pref.FieldDescriptor)            {}
-func (t standaloneExtension) ProtoInternal(pragma.DoNotImplement)       {}
diff --git a/internal/prototype/validate.go b/internal/prototype/validate.go
deleted file mode 100644
index 406d5e0..0000000
--- a/internal/prototype/validate.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package prototype
-
-import (
-	pref "google.golang.org/protobuf/reflect/protoreflect"
-)
-
-// TODO: This is important to prevent users from creating invalid types,
-// but is not functionality needed now.
-//
-// Things to verify:
-//	* Weak fields are only used if flags.Proto1Legacy is set
-//	* Weak fields can only reference singular messages
-//	(check if this the case for oneof fields)
-//	* FieldDescriptor.MessageType cannot reference a remote type when the
-//	remote name is a type within the local file.
-//	* Default enum identifiers resolve to a declared number.
-//	* Default values are only allowed in proto2.
-//	* Default strings are valid UTF-8? Note that protoc does not check this.
-//	* Field extensions are only valid in proto2, except when extending the
-//	descriptor options.
-//	* Remote enum and message types are actually found in imported files.
-//	* Placeholder messages and types may only be for weak fields.
-//	* Placeholder full names must be valid.
-//	* The name of each descriptor must be valid.
-//	* Options are of the correct Go type (e.g. *descriptorpb.MessageOptions).
-// 	* len(ExtensionRangeOptions) <= len(ExtensionRanges)
-
-func validateFile(t pref.FileDescriptor) error {
-	return nil
-}
-
-func validateMessage(t pref.MessageDescriptor) error {
-	return nil
-}
-
-func validateExtension(t pref.ExtensionDescriptor) error {
-	return nil
-}
-
-func validateEnum(t pref.EnumDescriptor) error {
-	return nil
-}
diff --git a/internal/testprotos/conformance/conformance.pb.go b/internal/testprotos/conformance/conformance.pb.go
index b2e21e2..ccdb64c 100644
--- a/internal/testprotos/conformance/conformance.pb.go
+++ b/internal/testprotos/conformance/conformance.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -57,7 +57,7 @@
 }
 
 func (WireFormat) Descriptor() protoreflect.EnumDescriptor {
-	return file_conformance_conformance_proto_enumTypes[0].Descriptor()
+	return file_conformance_conformance_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x WireFormat) Number() protoreflect.EnumNumber {
@@ -119,7 +119,7 @@
 }
 
 func (TestCategory) Descriptor() protoreflect.EnumDescriptor {
-	return file_conformance_conformance_proto_enumTypes[1].Descriptor()
+	return file_conformance_conformance_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x TestCategory) Number() protoreflect.EnumNumber {
@@ -661,7 +661,7 @@
 	return file_conformance_conformance_proto_rawDescData
 }
 
-var file_conformance_conformance_proto_enumTypes = make([]protoreflect.EnumType, 2)
+var file_conformance_conformance_proto_enumTypes = make([]prototype.Enum, 2)
 var file_conformance_conformance_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
 var file_conformance_conformance_proto_goTypes = []interface{}{
 	(WireFormat)(0),             // 0: conformance.WireFormat
@@ -675,6 +675,11 @@
 	0, // conformance.ConformanceRequest.requested_output_format:type_name -> conformance.WireFormat
 	1, // conformance.ConformanceRequest.test_category:type_name -> conformance.TestCategory
 	5, // conformance.ConformanceRequest.jspb_encoding_options:type_name -> conformance.JspbEncodingConfig
+	3, // starting offset of method output_type sub-list
+	3, // starting offset of method input_type sub-list
+	3, // starting offset of extension type_name sub-list
+	3, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_conformance_conformance_proto_init() }
@@ -682,15 +687,20 @@
 	if File_conformance_conformance_proto != nil {
 		return
 	}
-	File_conformance_conformance_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_conformance_conformance_proto_rawDesc,
-		GoTypes:            file_conformance_conformance_proto_goTypes,
-		DependencyIndexes:  file_conformance_conformance_proto_depIdxs,
-		EnumOutputTypes:    file_conformance_conformance_proto_enumTypes,
-		MessageOutputTypes: file_conformance_conformance_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_conformance_conformance_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_conformance_conformance_proto_goTypes,
+		DependencyIndexes: file_conformance_conformance_proto_depIdxs,
+		MessageInfos:      file_conformance_conformance_proto_msgTypes,
+	}.Build()
+	File_conformance_conformance_proto = out.File
+	file_conformance_conformance_proto_enumTypes = out.Enums
 	file_conformance_conformance_proto_rawDesc = nil
 	file_conformance_conformance_proto_goTypes = nil
 	file_conformance_conformance_proto_depIdxs = nil
diff --git a/internal/testprotos/conformance/test_messages_proto2.pb.go b/internal/testprotos/conformance/test_messages_proto2.pb.go
index 50f5d17..df72bef 100644
--- a/internal/testprotos/conformance/test_messages_proto2.pb.go
+++ b/internal/testprotos/conformance/test_messages_proto2.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -51,7 +51,7 @@
 }
 
 func (ForeignEnumProto2) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_test_messages_proto2_proto_enumTypes[0].Descriptor()
+	return file_google_protobuf_test_messages_proto2_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x ForeignEnumProto2) Number() protoreflect.EnumNumber {
@@ -109,7 +109,7 @@
 }
 
 func (TestAllTypesProto2_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_test_messages_proto2_proto_enumTypes[1].Descriptor()
+	return file_google_protobuf_test_messages_proto2_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x TestAllTypesProto2_NestedEnum) Number() protoreflect.EnumNumber {
@@ -1820,7 +1820,7 @@
 	return file_google_protobuf_test_messages_proto2_proto_rawDescData
 }
 
-var file_google_protobuf_test_messages_proto2_proto_enumTypes = make([]protoreflect.EnumType, 2)
+var file_google_protobuf_test_messages_proto2_proto_enumTypes = make([]prototype.Enum, 2)
 var file_google_protobuf_test_messages_proto2_proto_msgTypes = make([]protoimpl.MessageInfo, 26)
 var file_google_protobuf_test_messages_proto2_proto_goTypes = []interface{}{
 	(ForeignEnumProto2)(0),                   // 0: protobuf_test_messages.proto2.ForeignEnumProto2
@@ -1853,9 +1853,6 @@
 	(*TestAllTypesProto2_MessageSetCorrectExtension2)(nil), // 27: protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension2
 }
 var file_google_protobuf_test_messages_proto2_proto_depIdxs = []int32{
-	2,  // protobuf_test_messages.proto2.extension_int32:extendee -> protobuf_test_messages.proto2.TestAllTypesProto2
-	25, // protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension1.message_set_extension:extendee -> protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrect
-	25, // protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension2.message_set_extension:extendee -> protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrect
 	4,  // protobuf_test_messages.proto2.TestAllTypesProto2.optional_nested_message:type_name -> protobuf_test_messages.proto2.TestAllTypesProto2.NestedMessage
 	3,  // protobuf_test_messages.proto2.TestAllTypesProto2.optional_foreign_message:type_name -> protobuf_test_messages.proto2.ForeignMessageProto2
 	1,  // protobuf_test_messages.proto2.TestAllTypesProto2.optional_nested_enum:type_name -> protobuf_test_messages.proto2.TestAllTypesProto2.NestedEnum
@@ -1892,8 +1889,16 @@
 	3,  // protobuf_test_messages.proto2.TestAllTypesProto2.MapStringForeignMessageEntry.value:type_name -> protobuf_test_messages.proto2.ForeignMessageProto2
 	1,  // protobuf_test_messages.proto2.TestAllTypesProto2.MapStringNestedEnumEntry.value:type_name -> protobuf_test_messages.proto2.TestAllTypesProto2.NestedEnum
 	0,  // protobuf_test_messages.proto2.TestAllTypesProto2.MapStringForeignEnumEntry.value:type_name -> protobuf_test_messages.proto2.ForeignEnumProto2
+	2,  // protobuf_test_messages.proto2.extension_int32:extendee -> protobuf_test_messages.proto2.TestAllTypesProto2
+	25, // protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension1.message_set_extension:extendee -> protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrect
+	25, // protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension2.message_set_extension:extendee -> protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrect
 	26, // protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension1.message_set_extension:type_name -> protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension1
 	27, // protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension2.message_set_extension:type_name -> protobuf_test_messages.proto2.TestAllTypesProto2.MessageSetCorrectExtension2
+	41, // starting offset of method output_type sub-list
+	41, // starting offset of method input_type sub-list
+	39, // starting offset of extension type_name sub-list
+	36, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_google_protobuf_test_messages_proto2_proto_init() }
@@ -1901,18 +1906,21 @@
 	if File_google_protobuf_test_messages_proto2_proto != nil {
 		return
 	}
-	extensionTypes := make([]protoreflect.ExtensionType, 3)
-	File_google_protobuf_test_messages_proto2_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_google_protobuf_test_messages_proto2_proto_rawDesc,
-		GoTypes:              file_google_protobuf_test_messages_proto2_proto_goTypes,
-		DependencyIndexes:    file_google_protobuf_test_messages_proto2_proto_depIdxs,
-		LegacyExtensions:     file_google_protobuf_test_messages_proto2_proto_extDescs,
-		EnumOutputTypes:      file_google_protobuf_test_messages_proto2_proto_enumTypes,
-		MessageOutputTypes:   file_google_protobuf_test_messages_proto2_proto_msgTypes,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_test_messages_proto2_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   26,
+			NumExtensions: 3,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_test_messages_proto2_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_test_messages_proto2_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_test_messages_proto2_proto_msgTypes,
+		LegacyExtensions:  file_google_protobuf_test_messages_proto2_proto_extDescs,
+	}.Build()
+	File_google_protobuf_test_messages_proto2_proto = out.File
+	file_google_protobuf_test_messages_proto2_proto_enumTypes = out.Enums
 	file_google_protobuf_test_messages_proto2_proto_rawDesc = nil
 	file_google_protobuf_test_messages_proto2_proto_goTypes = nil
 	file_google_protobuf_test_messages_proto2_proto_depIdxs = nil
diff --git a/internal/testprotos/conformance/test_messages_proto3.pb.go b/internal/testprotos/conformance/test_messages_proto3.pb.go
index 75ffa5b..97e5fef 100644
--- a/internal/testprotos/conformance/test_messages_proto3.pb.go
+++ b/internal/testprotos/conformance/test_messages_proto3.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	anypb "google.golang.org/protobuf/types/known/anypb"
@@ -57,7 +57,7 @@
 }
 
 func (ForeignEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_test_messages_proto3_proto_enumTypes[0].Descriptor()
+	return file_google_protobuf_test_messages_proto3_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
@@ -105,7 +105,7 @@
 }
 
 func (TestAllTypesProto3_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_test_messages_proto3_proto_enumTypes[1].Descriptor()
+	return file_google_protobuf_test_messages_proto3_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x TestAllTypesProto3_NestedEnum) Number() protoreflect.EnumNumber {
@@ -159,7 +159,7 @@
 }
 
 func (TestAllTypesProto3_AliasedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_test_messages_proto3_proto_enumTypes[2].Descriptor()
+	return file_google_protobuf_test_messages_proto3_proto_enumTypes[2].EnumDescriptor
 }
 
 func (x TestAllTypesProto3_AliasedEnum) Number() protoreflect.EnumNumber {
@@ -2029,7 +2029,7 @@
 	return file_google_protobuf_test_messages_proto3_proto_rawDescData
 }
 
-var file_google_protobuf_test_messages_proto3_proto_enumTypes = make([]protoreflect.EnumType, 3)
+var file_google_protobuf_test_messages_proto3_proto_enumTypes = make([]prototype.Enum, 3)
 var file_google_protobuf_test_messages_proto3_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
 var file_google_protobuf_test_messages_proto3_proto_goTypes = []interface{}{
 	(ForeignEnum)(0),                         // 0: protobuf_test_messages.proto3.ForeignEnum
@@ -2142,6 +2142,11 @@
 	4,  // protobuf_test_messages.proto3.TestAllTypesProto3.MapStringForeignMessageEntry.value:type_name -> protobuf_test_messages.proto3.ForeignMessage
 	1,  // protobuf_test_messages.proto3.TestAllTypesProto3.MapStringNestedEnumEntry.value:type_name -> protobuf_test_messages.proto3.TestAllTypesProto3.NestedEnum
 	0,  // protobuf_test_messages.proto3.TestAllTypesProto3.MapStringForeignEnumEntry.value:type_name -> protobuf_test_messages.proto3.ForeignEnum
+	67, // starting offset of method output_type sub-list
+	67, // starting offset of method input_type sub-list
+	67, // starting offset of extension type_name sub-list
+	67, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_google_protobuf_test_messages_proto3_proto_init() }
@@ -2149,15 +2154,20 @@
 	if File_google_protobuf_test_messages_proto3_proto != nil {
 		return
 	}
-	File_google_protobuf_test_messages_proto3_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_test_messages_proto3_proto_rawDesc,
-		GoTypes:            file_google_protobuf_test_messages_proto3_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_test_messages_proto3_proto_depIdxs,
-		EnumOutputTypes:    file_google_protobuf_test_messages_proto3_proto_enumTypes,
-		MessageOutputTypes: file_google_protobuf_test_messages_proto3_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_test_messages_proto3_proto_rawDesc,
+			NumEnums:      3,
+			NumMessages:   22,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_test_messages_proto3_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_test_messages_proto3_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_test_messages_proto3_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_test_messages_proto3_proto = out.File
+	file_google_protobuf_test_messages_proto3_proto_enumTypes = out.Enums
 	file_google_protobuf_test_messages_proto3_proto_rawDesc = nil
 	file_google_protobuf_test_messages_proto3_proto_goTypes = nil
 	file_google_protobuf_test_messages_proto3_proto_depIdxs = nil
diff --git a/internal/testprotos/irregular/test.pb.go b/internal/testprotos/irregular/test.pb.go
index fa6aafd..93092dc 100644
--- a/internal/testprotos/irregular/test.pb.go
+++ b/internal/testprotos/irregular/test.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -186,6 +185,11 @@
 	1, // goproto.proto.irregular.Message.map_message:type_name -> goproto.proto.irregular.Message.MapMessageEntry
 	2, // goproto.proto.irregular.Message.oneof_message:type_name -> goproto.proto.irregular.IrregularMessage
 	2, // goproto.proto.irregular.Message.MapMessageEntry.value:type_name -> goproto.proto.irregular.IrregularMessage
+	6, // starting offset of method output_type sub-list
+	6, // starting offset of method input_type sub-list
+	6, // starting offset of extension type_name sub-list
+	6, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_irregular_test_proto_init() }
@@ -194,14 +198,19 @@
 		return
 	}
 	file_irregular_irregular_proto_init()
-	File_irregular_test_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_irregular_test_proto_rawDesc,
-		GoTypes:            file_irregular_test_proto_goTypes,
-		DependencyIndexes:  file_irregular_test_proto_depIdxs,
-		MessageOutputTypes: file_irregular_test_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_irregular_test_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_irregular_test_proto_goTypes,
+		DependencyIndexes: file_irregular_test_proto_depIdxs,
+		MessageInfos:      file_irregular_test_proto_msgTypes,
+	}.Build()
+	File_irregular_test_proto = out.File
 	file_irregular_test_proto_rawDesc = nil
 	file_irregular_test_proto_goTypes = nil
 	file_irregular_test_proto_depIdxs = nil
diff --git a/internal/testprotos/legacy/legacy.pb.go b/internal/testprotos/legacy/legacy.pb.go
index f867906..86793a1 100644
--- a/internal/testprotos/legacy/legacy.pb.go
+++ b/internal/testprotos/legacy/legacy.pb.go
@@ -17,7 +17,6 @@
 	proto3_v1_2 "google.golang.org/protobuf/internal/testprotos/legacy/proto3.v1.2.0-20180814-aa810b61"
 	proto3_v1_21 "google.golang.org/protobuf/internal/testprotos/legacy/proto3.v1.2.1-20181126-8d0c54c1"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -292,6 +291,11 @@
 	10, // google.golang.org.Legacy.f10:type_name -> google.golang.org.proto3_20180814.Message
 	11, // google.golang.org.Legacy.f11:type_name -> google.golang.org.proto2_20181126.Message
 	12, // google.golang.org.Legacy.f12:type_name -> google.golang.org.proto3_20181126.Message
+	12, // starting offset of method output_type sub-list
+	12, // starting offset of method input_type sub-list
+	12, // starting offset of extension type_name sub-list
+	12, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_legacy_legacy_proto_init() }
@@ -299,14 +303,19 @@
 	if File_legacy_legacy_proto != nil {
 		return
 	}
-	File_legacy_legacy_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_legacy_legacy_proto_rawDesc,
-		GoTypes:            file_legacy_legacy_proto_goTypes,
-		DependencyIndexes:  file_legacy_legacy_proto_depIdxs,
-		MessageOutputTypes: file_legacy_legacy_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_legacy_legacy_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_legacy_legacy_proto_goTypes,
+		DependencyIndexes: file_legacy_legacy_proto_depIdxs,
+		MessageInfos:      file_legacy_legacy_proto_msgTypes,
+	}.Build()
+	File_legacy_legacy_proto = out.File
 	file_legacy_legacy_proto_rawDesc = nil
 	file_legacy_legacy_proto_goTypes = nil
 	file_legacy_legacy_proto_depIdxs = nil
diff --git a/internal/testprotos/test/ext.pb.go b/internal/testprotos/test/ext.pb.go
index 58cb656..7a3363c 100644
--- a/internal/testprotos/test/ext.pb.go
+++ b/internal/testprotos/test/ext.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -67,6 +66,11 @@
 }
 var file_test_ext_proto_depIdxs = []int32{
 	0, // goproto.proto.test.foreign_int32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	1, // starting offset of method output_type sub-list
+	1, // starting offset of method input_type sub-list
+	1, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_test_ext_proto_init() }
@@ -75,16 +79,19 @@
 		return
 	}
 	file_test_test_proto_init()
-	extensionTypes := make([]protoreflect.ExtensionType, 1)
-	File_test_ext_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_test_ext_proto_rawDesc,
-		GoTypes:              file_test_ext_proto_goTypes,
-		DependencyIndexes:    file_test_ext_proto_depIdxs,
-		LegacyExtensions:     file_test_ext_proto_extDescs,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test_ext_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 1,
+			NumServices:   0,
+		},
+		GoTypes:           file_test_ext_proto_goTypes,
+		DependencyIndexes: file_test_ext_proto_depIdxs,
+		LegacyExtensions:  file_test_ext_proto_extDescs,
+	}.Build()
+	File_test_ext_proto = out.File
 	file_test_ext_proto_rawDesc = nil
 	file_test_ext_proto_goTypes = nil
 	file_test_ext_proto_depIdxs = nil
diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go
index 225870f..809a20c 100644
--- a/internal/testprotos/test/test.pb.go
+++ b/internal/testprotos/test/test.pb.go
@@ -6,7 +6,7 @@
 import (
 	weak "google.golang.org/protobuf/internal/testprotos/test/weak"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -52,7 +52,7 @@
 }
 
 func (ForeignEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_test_proto_enumTypes[0].Descriptor()
+	return file_test_test_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
@@ -101,7 +101,7 @@
 }
 
 func (TestReservedEnumFields) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_test_proto_enumTypes[1].Descriptor()
+	return file_test_test_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x TestReservedEnumFields) Number() protoreflect.EnumNumber {
@@ -159,7 +159,7 @@
 }
 
 func (TestAllTypes_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_test_proto_enumTypes[2].Descriptor()
+	return file_test_test_proto_enumTypes[2].EnumDescriptor
 }
 
 func (x TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
@@ -207,7 +207,7 @@
 }
 
 func (TestDeprecatedMessage_DeprecatedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_test_proto_enumTypes[3].Descriptor()
+	return file_test_test_proto_enumTypes[3].EnumDescriptor
 }
 
 func (x TestDeprecatedMessage_DeprecatedEnum) Number() protoreflect.EnumNumber {
@@ -3298,7 +3298,7 @@
 	return file_test_test_proto_rawDescData
 }
 
-var file_test_test_proto_enumTypes = make([]protoreflect.EnumType, 4)
+var file_test_test_proto_enumTypes = make([]prototype.Enum, 4)
 var file_test_test_proto_msgTypes = make([]protoimpl.MessageInfo, 37)
 var file_test_test_proto_goTypes = []interface{}{
 	(ForeignEnum)(0),                          // 0: goproto.proto.test.ForeignEnum
@@ -3346,118 +3346,123 @@
 	(ImportEnum)(0),                               // 42: goproto.proto.test.ImportEnum
 }
 var file_test_test_proto_depIdxs = []int32{
-	8,  // goproto.proto.test.optional_int32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_int64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_uint32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_uint64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_sint32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_sint64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_fixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_fixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_sfixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_sfixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_float_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_double_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_bool_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_string_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_bytes_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optionalgroup_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_nested_message_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.optional_nested_enum_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_int32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_int64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_uint32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_uint64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_sint32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_sint64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_fixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_fixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_sfixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_sfixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_float_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_double_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_bool_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_string_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_bytes_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeatedgroup_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_nested_message_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.repeated_nested_enum_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_int32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_int64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_uint32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_uint64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_sint32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_sint64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_fixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_fixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_sfixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_sfixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_float_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_double_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_bool_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_string_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.default_bytes_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.TestNestedExtension.nested_string_extension:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.TestRequired.single:extendee -> goproto.proto.test.TestAllExtensions
-	8,  // goproto.proto.test.TestRequired.multi:extendee -> goproto.proto.test.TestAllExtensions
-	19, // goproto.proto.test.TestAllTypes.optionalgroup:type_name -> goproto.proto.test.TestAllTypes.OptionalGroup
-	18, // goproto.proto.test.TestAllTypes.optional_nested_message:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
-	6,  // goproto.proto.test.TestAllTypes.optional_foreign_message:type_name -> goproto.proto.test.ForeignMessage
-	41, // goproto.proto.test.TestAllTypes.optional_import_message:type_name -> goproto.proto.test.ImportMessage
-	2,  // goproto.proto.test.TestAllTypes.optional_nested_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
-	0,  // goproto.proto.test.TestAllTypes.optional_foreign_enum:type_name -> goproto.proto.test.ForeignEnum
-	42, // goproto.proto.test.TestAllTypes.optional_import_enum:type_name -> goproto.proto.test.ImportEnum
-	20, // goproto.proto.test.TestAllTypes.repeatedgroup:type_name -> goproto.proto.test.TestAllTypes.RepeatedGroup
-	18, // goproto.proto.test.TestAllTypes.repeated_nested_message:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
-	6,  // goproto.proto.test.TestAllTypes.repeated_foreign_message:type_name -> goproto.proto.test.ForeignMessage
-	41, // goproto.proto.test.TestAllTypes.repeated_importmessage:type_name -> goproto.proto.test.ImportMessage
-	2,  // goproto.proto.test.TestAllTypes.repeated_nested_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
-	0,  // goproto.proto.test.TestAllTypes.repeated_foreign_enum:type_name -> goproto.proto.test.ForeignEnum
-	42, // goproto.proto.test.TestAllTypes.repeated_importenum:type_name -> goproto.proto.test.ImportEnum
-	21, // goproto.proto.test.TestAllTypes.map_int32_int32:type_name -> goproto.proto.test.TestAllTypes.MapInt32Int32Entry
-	22, // goproto.proto.test.TestAllTypes.map_int64_int64:type_name -> goproto.proto.test.TestAllTypes.MapInt64Int64Entry
-	23, // goproto.proto.test.TestAllTypes.map_uint32_uint32:type_name -> goproto.proto.test.TestAllTypes.MapUint32Uint32Entry
-	24, // goproto.proto.test.TestAllTypes.map_uint64_uint64:type_name -> goproto.proto.test.TestAllTypes.MapUint64Uint64Entry
-	25, // goproto.proto.test.TestAllTypes.map_sint32_sint32:type_name -> goproto.proto.test.TestAllTypes.MapSint32Sint32Entry
-	26, // goproto.proto.test.TestAllTypes.map_sint64_sint64:type_name -> goproto.proto.test.TestAllTypes.MapSint64Sint64Entry
-	27, // goproto.proto.test.TestAllTypes.map_fixed32_fixed32:type_name -> goproto.proto.test.TestAllTypes.MapFixed32Fixed32Entry
-	28, // goproto.proto.test.TestAllTypes.map_fixed64_fixed64:type_name -> goproto.proto.test.TestAllTypes.MapFixed64Fixed64Entry
-	29, // goproto.proto.test.TestAllTypes.map_sfixed32_sfixed32:type_name -> goproto.proto.test.TestAllTypes.MapSfixed32Sfixed32Entry
-	30, // goproto.proto.test.TestAllTypes.map_sfixed64_sfixed64:type_name -> goproto.proto.test.TestAllTypes.MapSfixed64Sfixed64Entry
-	31, // goproto.proto.test.TestAllTypes.map_int32_float:type_name -> goproto.proto.test.TestAllTypes.MapInt32FloatEntry
-	32, // goproto.proto.test.TestAllTypes.map_int32_double:type_name -> goproto.proto.test.TestAllTypes.MapInt32DoubleEntry
-	33, // goproto.proto.test.TestAllTypes.map_bool_bool:type_name -> goproto.proto.test.TestAllTypes.MapBoolBoolEntry
-	34, // goproto.proto.test.TestAllTypes.map_string_string:type_name -> goproto.proto.test.TestAllTypes.MapStringStringEntry
-	35, // goproto.proto.test.TestAllTypes.map_string_bytes:type_name -> goproto.proto.test.TestAllTypes.MapStringBytesEntry
-	36, // goproto.proto.test.TestAllTypes.map_string_nested_message:type_name -> goproto.proto.test.TestAllTypes.MapStringNestedMessageEntry
-	37, // goproto.proto.test.TestAllTypes.map_string_nested_enum:type_name -> goproto.proto.test.TestAllTypes.MapStringNestedEnumEntry
-	2,  // goproto.proto.test.TestAllTypes.default_nested_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
-	0,  // goproto.proto.test.TestAllTypes.default_foreign_enum:type_name -> goproto.proto.test.ForeignEnum
-	18, // goproto.proto.test.TestAllTypes.oneof_nested_message:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
-	2,  // goproto.proto.test.TestAllTypes.oneof_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
-	12, // goproto.proto.test.TestRequiredForeign.optional_message:type_name -> goproto.proto.test.TestRequired
-	12, // goproto.proto.test.TestRequiredForeign.repeated_message:type_name -> goproto.proto.test.TestRequired
-	38, // goproto.proto.test.TestRequiredForeign.map_message:type_name -> goproto.proto.test.TestRequiredForeign.MapMessageEntry
-	39, // goproto.proto.test.TestRequiredGroupFields.optionalgroup:type_name -> goproto.proto.test.TestRequiredGroupFields.OptionalGroup
-	40, // goproto.proto.test.TestRequiredGroupFields.repeatedgroup:type_name -> goproto.proto.test.TestRequiredGroupFields.RepeatedGroup
-	4,  // goproto.proto.test.TestAllTypes.NestedMessage.corecursive:type_name -> goproto.proto.test.TestAllTypes
-	18, // goproto.proto.test.TestAllTypes.MapStringNestedMessageEntry.value:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
-	2,  // goproto.proto.test.TestAllTypes.MapStringNestedEnumEntry.value:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
-	12, // goproto.proto.test.TestRequiredForeign.MapMessageEntry.value:type_name -> goproto.proto.test.TestRequired
-	9,  // goproto.proto.test.optionalgroup_extension:type_name -> goproto.proto.test.OptionalGroup_extension
-	18, // goproto.proto.test.optional_nested_message_extension:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
-	2,  // goproto.proto.test.optional_nested_enum_extension:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
-	10, // goproto.proto.test.repeatedgroup_extension:type_name -> goproto.proto.test.RepeatedGroup_extension
-	18, // goproto.proto.test.repeated_nested_message_extension:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
-	2,  // goproto.proto.test.repeated_nested_enum_extension:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
-	12, // goproto.proto.test.TestRequired.single:type_name -> goproto.proto.test.TestRequired
-	12, // goproto.proto.test.TestRequired.multi:type_name -> goproto.proto.test.TestRequired
-	16, // goproto.proto.test.TestService.Foo:input_type -> goproto.proto.test.FooRequest
-	17, // goproto.proto.test.TestService.Foo:output_type -> goproto.proto.test.FooResponse
-	16, // goproto.proto.test.TestService.TestStream:input_type -> goproto.proto.test.FooRequest
-	17, // goproto.proto.test.TestService.TestStream:output_type -> goproto.proto.test.FooResponse
-	5,  // goproto.proto.test.TestDeprecatedService.Deprecated:input_type -> goproto.proto.test.TestDeprecatedMessage
-	5,  // goproto.proto.test.TestDeprecatedService.Deprecated:output_type -> goproto.proto.test.TestDeprecatedMessage
+	19,  // goproto.proto.test.TestAllTypes.optionalgroup:type_name -> goproto.proto.test.TestAllTypes.OptionalGroup
+	18,  // goproto.proto.test.TestAllTypes.optional_nested_message:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
+	6,   // goproto.proto.test.TestAllTypes.optional_foreign_message:type_name -> goproto.proto.test.ForeignMessage
+	41,  // goproto.proto.test.TestAllTypes.optional_import_message:type_name -> goproto.proto.test.ImportMessage
+	2,   // goproto.proto.test.TestAllTypes.optional_nested_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
+	0,   // goproto.proto.test.TestAllTypes.optional_foreign_enum:type_name -> goproto.proto.test.ForeignEnum
+	42,  // goproto.proto.test.TestAllTypes.optional_import_enum:type_name -> goproto.proto.test.ImportEnum
+	20,  // goproto.proto.test.TestAllTypes.repeatedgroup:type_name -> goproto.proto.test.TestAllTypes.RepeatedGroup
+	18,  // goproto.proto.test.TestAllTypes.repeated_nested_message:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
+	6,   // goproto.proto.test.TestAllTypes.repeated_foreign_message:type_name -> goproto.proto.test.ForeignMessage
+	41,  // goproto.proto.test.TestAllTypes.repeated_importmessage:type_name -> goproto.proto.test.ImportMessage
+	2,   // goproto.proto.test.TestAllTypes.repeated_nested_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
+	0,   // goproto.proto.test.TestAllTypes.repeated_foreign_enum:type_name -> goproto.proto.test.ForeignEnum
+	42,  // goproto.proto.test.TestAllTypes.repeated_importenum:type_name -> goproto.proto.test.ImportEnum
+	21,  // goproto.proto.test.TestAllTypes.map_int32_int32:type_name -> goproto.proto.test.TestAllTypes.MapInt32Int32Entry
+	22,  // goproto.proto.test.TestAllTypes.map_int64_int64:type_name -> goproto.proto.test.TestAllTypes.MapInt64Int64Entry
+	23,  // goproto.proto.test.TestAllTypes.map_uint32_uint32:type_name -> goproto.proto.test.TestAllTypes.MapUint32Uint32Entry
+	24,  // goproto.proto.test.TestAllTypes.map_uint64_uint64:type_name -> goproto.proto.test.TestAllTypes.MapUint64Uint64Entry
+	25,  // goproto.proto.test.TestAllTypes.map_sint32_sint32:type_name -> goproto.proto.test.TestAllTypes.MapSint32Sint32Entry
+	26,  // goproto.proto.test.TestAllTypes.map_sint64_sint64:type_name -> goproto.proto.test.TestAllTypes.MapSint64Sint64Entry
+	27,  // goproto.proto.test.TestAllTypes.map_fixed32_fixed32:type_name -> goproto.proto.test.TestAllTypes.MapFixed32Fixed32Entry
+	28,  // goproto.proto.test.TestAllTypes.map_fixed64_fixed64:type_name -> goproto.proto.test.TestAllTypes.MapFixed64Fixed64Entry
+	29,  // goproto.proto.test.TestAllTypes.map_sfixed32_sfixed32:type_name -> goproto.proto.test.TestAllTypes.MapSfixed32Sfixed32Entry
+	30,  // goproto.proto.test.TestAllTypes.map_sfixed64_sfixed64:type_name -> goproto.proto.test.TestAllTypes.MapSfixed64Sfixed64Entry
+	31,  // goproto.proto.test.TestAllTypes.map_int32_float:type_name -> goproto.proto.test.TestAllTypes.MapInt32FloatEntry
+	32,  // goproto.proto.test.TestAllTypes.map_int32_double:type_name -> goproto.proto.test.TestAllTypes.MapInt32DoubleEntry
+	33,  // goproto.proto.test.TestAllTypes.map_bool_bool:type_name -> goproto.proto.test.TestAllTypes.MapBoolBoolEntry
+	34,  // goproto.proto.test.TestAllTypes.map_string_string:type_name -> goproto.proto.test.TestAllTypes.MapStringStringEntry
+	35,  // goproto.proto.test.TestAllTypes.map_string_bytes:type_name -> goproto.proto.test.TestAllTypes.MapStringBytesEntry
+	36,  // goproto.proto.test.TestAllTypes.map_string_nested_message:type_name -> goproto.proto.test.TestAllTypes.MapStringNestedMessageEntry
+	37,  // goproto.proto.test.TestAllTypes.map_string_nested_enum:type_name -> goproto.proto.test.TestAllTypes.MapStringNestedEnumEntry
+	2,   // goproto.proto.test.TestAllTypes.default_nested_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
+	0,   // goproto.proto.test.TestAllTypes.default_foreign_enum:type_name -> goproto.proto.test.ForeignEnum
+	18,  // goproto.proto.test.TestAllTypes.oneof_nested_message:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
+	2,   // goproto.proto.test.TestAllTypes.oneof_enum:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
+	12,  // goproto.proto.test.TestRequiredForeign.optional_message:type_name -> goproto.proto.test.TestRequired
+	12,  // goproto.proto.test.TestRequiredForeign.repeated_message:type_name -> goproto.proto.test.TestRequired
+	38,  // goproto.proto.test.TestRequiredForeign.map_message:type_name -> goproto.proto.test.TestRequiredForeign.MapMessageEntry
+	39,  // goproto.proto.test.TestRequiredGroupFields.optionalgroup:type_name -> goproto.proto.test.TestRequiredGroupFields.OptionalGroup
+	40,  // goproto.proto.test.TestRequiredGroupFields.repeatedgroup:type_name -> goproto.proto.test.TestRequiredGroupFields.RepeatedGroup
+	4,   // goproto.proto.test.TestAllTypes.NestedMessage.corecursive:type_name -> goproto.proto.test.TestAllTypes
+	18,  // goproto.proto.test.TestAllTypes.MapStringNestedMessageEntry.value:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
+	2,   // goproto.proto.test.TestAllTypes.MapStringNestedEnumEntry.value:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
+	12,  // goproto.proto.test.TestRequiredForeign.MapMessageEntry.value:type_name -> goproto.proto.test.TestRequired
+	8,   // goproto.proto.test.optional_int32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_int64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_uint32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_uint64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_sint32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_sint64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_fixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_fixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_sfixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_sfixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_float_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_double_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_bool_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_string_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_bytes_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optionalgroup_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_nested_message_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.optional_nested_enum_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_int32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_int64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_uint32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_uint64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_sint32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_sint64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_fixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_fixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_sfixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_sfixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_float_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_double_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_bool_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_string_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_bytes_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeatedgroup_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_nested_message_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.repeated_nested_enum_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_int32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_int64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_uint32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_uint64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_sint32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_sint64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_fixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_fixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_sfixed32_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_sfixed64_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_float_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_double_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_bool_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_string_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.default_bytes_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.TestNestedExtension.nested_string_extension:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.TestRequired.single:extendee -> goproto.proto.test.TestAllExtensions
+	8,   // goproto.proto.test.TestRequired.multi:extendee -> goproto.proto.test.TestAllExtensions
+	9,   // goproto.proto.test.optionalgroup_extension:type_name -> goproto.proto.test.OptionalGroup_extension
+	18,  // goproto.proto.test.optional_nested_message_extension:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
+	2,   // goproto.proto.test.optional_nested_enum_extension:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
+	10,  // goproto.proto.test.repeatedgroup_extension:type_name -> goproto.proto.test.RepeatedGroup_extension
+	18,  // goproto.proto.test.repeated_nested_message_extension:type_name -> goproto.proto.test.TestAllTypes.NestedMessage
+	2,   // goproto.proto.test.repeated_nested_enum_extension:type_name -> goproto.proto.test.TestAllTypes.NestedEnum
+	12,  // goproto.proto.test.TestRequired.single:type_name -> goproto.proto.test.TestRequired
+	12,  // goproto.proto.test.TestRequired.multi:type_name -> goproto.proto.test.TestRequired
+	16,  // goproto.proto.test.TestService.Foo:input_type -> goproto.proto.test.FooRequest
+	16,  // goproto.proto.test.TestService.TestStream:input_type -> goproto.proto.test.FooRequest
+	5,   // goproto.proto.test.TestDeprecatedService.Deprecated:input_type -> goproto.proto.test.TestDeprecatedMessage
+	17,  // goproto.proto.test.TestService.Foo:output_type -> goproto.proto.test.FooResponse
+	17,  // goproto.proto.test.TestService.TestStream:output_type -> goproto.proto.test.FooResponse
+	5,   // goproto.proto.test.TestDeprecatedService.Deprecated:output_type -> goproto.proto.test.TestDeprecatedMessage
+	109, // starting offset of method output_type sub-list
+	106, // starting offset of method input_type sub-list
+	98,  // starting offset of extension type_name sub-list
+	44,  // starting offset of extension extendee sub-list
+	0,   // starting offset of field type_name sub-list
 }
 
 func init() { file_test_test_proto_init() }
@@ -3467,18 +3472,21 @@
 	}
 	file_test_test_import_proto_init()
 	file_test_test_public_proto_init()
-	extensionTypes := make([]protoreflect.ExtensionType, 54)
-	File_test_test_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_test_test_proto_rawDesc,
-		GoTypes:              file_test_test_proto_goTypes,
-		DependencyIndexes:    file_test_test_proto_depIdxs,
-		LegacyExtensions:     file_test_test_proto_extDescs,
-		EnumOutputTypes:      file_test_test_proto_enumTypes,
-		MessageOutputTypes:   file_test_test_proto_msgTypes,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test_test_proto_rawDesc,
+			NumEnums:      4,
+			NumMessages:   37,
+			NumExtensions: 54,
+			NumServices:   2,
+		},
+		GoTypes:           file_test_test_proto_goTypes,
+		DependencyIndexes: file_test_test_proto_depIdxs,
+		MessageInfos:      file_test_test_proto_msgTypes,
+		LegacyExtensions:  file_test_test_proto_extDescs,
+	}.Build()
+	File_test_test_proto = out.File
+	file_test_test_proto_enumTypes = out.Enums
 	file_test_test_proto_rawDesc = nil
 	file_test_test_proto_goTypes = nil
 	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 6ec7c37..408b5a4 100644
--- a/internal/testprotos/test/test_import.pb.go
+++ b/internal/testprotos/test/test_import.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -45,7 +45,7 @@
 }
 
 func (ImportEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_test_import_proto_enumTypes[0].Descriptor()
+	return file_test_test_import_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x ImportEnum) Number() protoreflect.EnumNumber {
@@ -123,28 +123,39 @@
 	return file_test_test_import_proto_rawDescData
 }
 
-var file_test_test_import_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_test_test_import_proto_enumTypes = make([]prototype.Enum, 1)
 var file_test_test_import_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 var file_test_test_import_proto_goTypes = []interface{}{
 	(ImportEnum)(0),       // 0: goproto.proto.test.ImportEnum
 	(*ImportMessage)(nil), // 1: goproto.proto.test.ImportMessage
 }
-var file_test_test_import_proto_depIdxs = []int32{}
+var file_test_test_import_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_test_test_import_proto_init() }
 func file_test_test_import_proto_init() {
 	if File_test_test_import_proto != nil {
 		return
 	}
-	File_test_test_import_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_test_test_import_proto_rawDesc,
-		GoTypes:            file_test_test_import_proto_goTypes,
-		DependencyIndexes:  file_test_test_import_proto_depIdxs,
-		EnumOutputTypes:    file_test_test_import_proto_enumTypes,
-		MessageOutputTypes: file_test_test_import_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test_test_import_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_test_test_import_proto_goTypes,
+		DependencyIndexes: file_test_test_import_proto_depIdxs,
+		MessageInfos:      file_test_test_import_proto_msgTypes,
+	}.Build()
+	File_test_test_import_proto = out.File
+	file_test_test_import_proto_enumTypes = out.Enums
 	file_test_test_import_proto_rawDesc = nil
 	file_test_test_import_proto_goTypes = nil
 	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 832e324..be20ac9 100644
--- a/internal/testprotos/test/test_public.pb.go
+++ b/internal/testprotos/test/test_public.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -76,21 +75,32 @@
 var file_test_test_public_proto_goTypes = []interface{}{
 	(*PublicImportMessage)(nil), // 0: goproto.proto.test.PublicImportMessage
 }
-var file_test_test_public_proto_depIdxs = []int32{}
+var file_test_test_public_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_test_test_public_proto_init() }
 func file_test_test_public_proto_init() {
 	if File_test_test_public_proto != nil {
 		return
 	}
-	File_test_test_public_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_test_test_public_proto_rawDesc,
-		GoTypes:            file_test_test_public_proto_goTypes,
-		DependencyIndexes:  file_test_test_public_proto_depIdxs,
-		MessageOutputTypes: file_test_test_public_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test_test_public_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_test_test_public_proto_goTypes,
+		DependencyIndexes: file_test_test_public_proto_depIdxs,
+		MessageInfos:      file_test_test_public_proto_msgTypes,
+	}.Build()
+	File_test_test_public_proto = out.File
 	file_test_test_public_proto_rawDesc = nil
 	file_test_test_public_proto_goTypes = nil
 	file_test_test_public_proto_depIdxs = nil
diff --git a/internal/testprotos/test/weak/test_weak.pb.go b/internal/testprotos/test/weak/test_weak.pb.go
index ba5b8df..f661776 100644
--- a/internal/testprotos/test/weak/test_weak.pb.go
+++ b/internal/testprotos/test/weak/test_weak.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -86,21 +85,32 @@
 var file_test_weak_test_weak_proto_goTypes = []interface{}{
 	(*WeakImportMessage)(nil), // 0: goproto.proto.test.weak.WeakImportMessage
 }
-var file_test_weak_test_weak_proto_depIdxs = []int32{}
+var file_test_weak_test_weak_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_test_weak_test_weak_proto_init() }
 func file_test_weak_test_weak_proto_init() {
 	if File_test_weak_test_weak_proto != nil {
 		return
 	}
-	File_test_weak_test_weak_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_test_weak_test_weak_proto_rawDesc,
-		GoTypes:            file_test_weak_test_weak_proto_goTypes,
-		DependencyIndexes:  file_test_weak_test_weak_proto_depIdxs,
-		MessageOutputTypes: file_test_weak_test_weak_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test_weak_test_weak_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_test_weak_test_weak_proto_goTypes,
+		DependencyIndexes: file_test_weak_test_weak_proto_depIdxs,
+		MessageInfos:      file_test_weak_test_weak_proto_msgTypes,
+	}.Build()
+	File_test_weak_test_weak_proto = out.File
 	file_test_weak_test_weak_proto_rawDesc = nil
 	file_test_weak_test_weak_proto_goTypes = nil
 	file_test_weak_test_weak_proto_depIdxs = nil
diff --git a/internal/testprotos/test3/test.pb.go b/internal/testprotos/test3/test.pb.go
index 129d836..471ca03 100644
--- a/internal/testprotos/test3/test.pb.go
+++ b/internal/testprotos/test3/test.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -54,7 +54,7 @@
 }
 
 func (ForeignEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_test3_test_proto_enumTypes[0].Descriptor()
+	return file_test3_test_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
@@ -102,7 +102,7 @@
 }
 
 func (TestAllTypes_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_test3_test_proto_enumTypes[1].Descriptor()
+	return file_test3_test_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
@@ -1265,7 +1265,7 @@
 	return file_test3_test_proto_rawDescData
 }
 
-var file_test3_test_proto_enumTypes = make([]protoreflect.EnumType, 2)
+var file_test3_test_proto_enumTypes = make([]prototype.Enum, 2)
 var file_test3_test_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
 var file_test3_test_proto_goTypes = []interface{}{
 	(ForeignEnum)(0),                   // 0: goproto.proto.test3.ForeignEnum
@@ -1328,6 +1328,11 @@
 	2,  // goproto.proto.test3.TestAllTypes.NestedMessage.corecursive:type_name -> goproto.proto.test3.TestAllTypes
 	4,  // goproto.proto.test3.TestAllTypes.MapStringNestedMessageEntry.value:type_name -> goproto.proto.test3.TestAllTypes.NestedMessage
 	1,  // goproto.proto.test3.TestAllTypes.MapStringNestedEnumEntry.value:type_name -> goproto.proto.test3.TestAllTypes.NestedEnum
+	34, // starting offset of method output_type sub-list
+	34, // starting offset of method input_type sub-list
+	34, // starting offset of extension type_name sub-list
+	34, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_test3_test_proto_init() }
@@ -1336,15 +1341,20 @@
 		return
 	}
 	file_test3_test_import_proto_init()
-	File_test3_test_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_test3_test_proto_rawDesc,
-		GoTypes:            file_test3_test_proto_goTypes,
-		DependencyIndexes:  file_test3_test_proto_depIdxs,
-		EnumOutputTypes:    file_test3_test_proto_enumTypes,
-		MessageOutputTypes: file_test3_test_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test3_test_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   20,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_test3_test_proto_goTypes,
+		DependencyIndexes: file_test3_test_proto_depIdxs,
+		MessageInfos:      file_test3_test_proto_msgTypes,
+	}.Build()
+	File_test3_test_proto = out.File
+	file_test3_test_proto_enumTypes = out.Enums
 	file_test3_test_proto_rawDesc = nil
 	file_test3_test_proto_goTypes = nil
 	file_test3_test_proto_depIdxs = nil
diff --git a/internal/testprotos/test3/test_import.pb.go b/internal/testprotos/test3/test_import.pb.go
index e5ad6b9..5b34c48 100644
--- a/internal/testprotos/test3/test_import.pb.go
+++ b/internal/testprotos/test3/test_import.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -45,7 +45,7 @@
 }
 
 func (ImportEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_test3_test_import_proto_enumTypes[0].Descriptor()
+	return file_test3_test_import_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x ImportEnum) Number() protoreflect.EnumNumber {
@@ -113,28 +113,39 @@
 	return file_test3_test_import_proto_rawDescData
 }
 
-var file_test3_test_import_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_test3_test_import_proto_enumTypes = make([]prototype.Enum, 1)
 var file_test3_test_import_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 var file_test3_test_import_proto_goTypes = []interface{}{
 	(ImportEnum)(0),       // 0: goproto.proto.test3.ImportEnum
 	(*ImportMessage)(nil), // 1: goproto.proto.test3.ImportMessage
 }
-var file_test3_test_import_proto_depIdxs = []int32{}
+var file_test3_test_import_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_test3_test_import_proto_init() }
 func file_test3_test_import_proto_init() {
 	if File_test3_test_import_proto != nil {
 		return
 	}
-	File_test3_test_import_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_test3_test_import_proto_rawDesc,
-		GoTypes:            file_test3_test_import_proto_goTypes,
-		DependencyIndexes:  file_test3_test_import_proto_depIdxs,
-		EnumOutputTypes:    file_test3_test_import_proto_enumTypes,
-		MessageOutputTypes: file_test3_test_import_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test3_test_import_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_test3_test_import_proto_goTypes,
+		DependencyIndexes: file_test3_test_import_proto_depIdxs,
+		MessageInfos:      file_test3_test_import_proto_msgTypes,
+	}.Build()
+	File_test3_test_import_proto = out.File
+	file_test3_test_import_proto_enumTypes = out.Enums
 	file_test3_test_import_proto_rawDesc = nil
 	file_test3_test_import_proto_goTypes = nil
 	file_test3_test_import_proto_depIdxs = nil
diff --git a/reflect/protodesc/protodesc.go b/reflect/protodesc/protodesc.go
index f660908..7868bb2 100644
--- a/reflect/protodesc/protodesc.go
+++ b/reflect/protodesc/protodesc.go
@@ -11,7 +11,7 @@
 
 	"google.golang.org/protobuf/internal/encoding/defval"
 	"google.golang.org/protobuf/internal/errors"
-	"google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/internal/filedesc"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
 
@@ -42,6 +42,27 @@
 // However, this will complicate future work for validation since File may now
 // diverge from the stored descriptor proto (see above TODO).
 
+// TODO: This is important to prevent users from creating invalid types,
+// but is not functionality needed now.
+//
+// Things to verify:
+//	* Weak fields are only used if flags.Proto1Legacy is set
+//	* Weak fields can only reference singular messages
+//	(check if this the case for oneof fields)
+//	* FieldDescriptor.MessageType cannot reference a remote type when the
+//	remote name is a type within the local file.
+//	* Default enum identifiers resolve to a declared number.
+//	* Default values are only allowed in proto2.
+//	* Default strings are valid UTF-8? Note that protoc does not check this.
+//	* Field extensions are only valid in proto2, except when extending the
+//	descriptor options.
+//	* Remote enum and message types are actually found in imported files.
+//	* Placeholder messages and types may only be for weak fields.
+//	* Placeholder full names must be valid.
+//	* The name of each descriptor must be valid.
+//	* Options are of the correct Go type (e.g. *descriptorpb.MessageOptions).
+// 	* len(ExtensionRangeOptions) <= len(ExtensionRanges)
+
 // NewFile creates a new protoreflect.FileDescriptor from the provided
 // file descriptor message. The file must represent a valid proto file according
 // to protobuf semantics.
@@ -57,306 +78,431 @@
 	if r == nil {
 		r = (*protoregistry.Files)(nil) // empty resolver
 	}
-	var f prototype.File
+	f := &filedesc.File{L2: &filedesc.FileL2{}}
 	switch fd.GetSyntax() {
 	case "proto2", "":
-		f.Syntax = protoreflect.Proto2
+		f.L1.Syntax = protoreflect.Proto2
 	case "proto3":
-		f.Syntax = protoreflect.Proto3
+		f.L1.Syntax = protoreflect.Proto3
 	default:
 		return nil, errors.New("invalid syntax: %v", fd.GetSyntax())
 	}
-	f.Path = fd.GetName()
-	f.Package = protoreflect.FullName(fd.GetPackage())
-	f.Options = fd.GetOptions()
+	f.L1.Path = fd.GetName()
+	f.L1.Package = protoreflect.FullName(fd.GetPackage())
+	if opts := fd.GetOptions(); opts != nil {
+		f.L2.Options = func() protoreflect.ProtoMessage { return opts }
+	}
 
-	f.Imports = make([]protoreflect.FileImport, len(fd.GetDependency()))
+	f.L2.Imports = make(filedesc.FileImports, len(fd.GetDependency()))
 	for _, i := range fd.GetPublicDependency() {
-		if int(i) >= len(f.Imports) || f.Imports[i].IsPublic {
+		if int(i) >= len(f.L2.Imports) || f.L2.Imports[i].IsPublic {
 			return nil, errors.New("invalid or duplicate public import index: %d", i)
 		}
-		f.Imports[i].IsPublic = true
+		f.L2.Imports[i].IsPublic = true
 	}
 	for _, i := range fd.GetWeakDependency() {
-		if int(i) >= len(f.Imports) || f.Imports[i].IsWeak {
+		if int(i) >= len(f.L2.Imports) || f.L2.Imports[i].IsWeak {
 			return nil, errors.New("invalid or duplicate weak import index: %d", i)
 		}
-		f.Imports[i].IsWeak = true
+		f.L2.Imports[i].IsWeak = true
 	}
 	for i, path := range fd.GetDependency() {
-		imp := &f.Imports[i]
-		fd, err := r.FindFileByPath(path)
+		imp := &f.L2.Imports[i]
+		f, err := r.FindFileByPath(path)
 		if err != nil {
-			fd = prototype.PlaceholderFile(path, "")
+			// TODO: This should be an error.
+			f = filedesc.PlaceholderFile(path)
 		}
-		imp.FileDescriptor = fd
+		imp.FileDescriptor = f
 	}
 
-	imps := importedFiles(f.Imports)
+	// Step 1: Pre-initialize all declared enums and messages.
+	// This enables step 2 to properly resolve references to locally defined
+	// enums and messages.
+	rl := make(descsByName)
+	f.L1.Enums.List = rl.initEnumsFromDescriptorProto(fd.GetEnumType(), f)
+	f.L1.Messages.List = rl.initMessagesFromDescriptorProto(fd.GetMessageType(), f)
+	f.L1.Extensions.List = rl.initExtensionsFromDescriptorProto(fd.GetExtension(), f)
+	f.L1.Services.List = rl.initServicesFromDescriptorProto(fd.GetService(), f)
 
-	var err error
-	f.Messages, err = messagesFromDescriptorProto(fd.GetMessageType(), imps, r)
-	if err != nil {
+	// Step 2: Handle every enum, message, extension, or service declaration.
+	r = resolver{local: rl, remote: r} // wrap remote resolver with local declarations
+	imps := importSet{f.L1.Path: true}
+	imps.importFiles(f.L2.Imports)
+	if err := enumsFromDescriptorProto(f.L1.Enums.List, fd.GetEnumType(), imps, r); err != nil {
 		return nil, err
 	}
-	f.Enums, err = enumsFromDescriptorProto(fd.GetEnumType(), r)
-	if err != nil {
+	if err := messagesFromDescriptorProto(f.L1.Messages.List, fd.GetMessageType(), imps, r); err != nil {
 		return nil, err
 	}
-	f.Extensions, err = extensionsFromDescriptorProto(fd.GetExtension(), imps, r)
-	if err != nil {
+	if err := extensionsFromDescriptorProto(f.L1.Extensions.List, fd.GetExtension(), imps, r); err != nil {
 		return nil, err
 	}
-	f.Services, err = servicesFromDescriptorProto(fd.GetService(), imps, r)
-	if err != nil {
+	if err := servicesFromDescriptorProto(f.L1.Services.List, fd.GetService(), imps, r); err != nil {
 		return nil, err
 	}
 
-	return prototype.NewFile(&f)
+	return f, nil
 }
 
-type importSet map[string]bool
+type descsByName map[protoreflect.FullName]protoreflect.Descriptor
 
-func importedFiles(imps []protoreflect.FileImport) importSet {
-	ret := make(importSet)
-	for _, imp := range imps {
-		ret[imp.Path()] = true
-		addPublicImports(imp, ret)
+func (r descsByName) initEnumsFromDescriptorProto(eds []*descriptorpb.EnumDescriptorProto, parent protoreflect.Descriptor) []filedesc.Enum {
+	es := make([]filedesc.Enum, len(eds)) // allocate up-front to ensure stable pointers
+	for i, ed := range eds {
+		e := &es[i]
+		e.L0 = makeBase(parent, ed.GetName(), i)
+		r[e.FullName()] = e
 	}
-	return ret
+	return es
 }
 
-func addPublicImports(fd protoreflect.FileDescriptor, out importSet) {
-	imps := fd.Imports()
-	for i := 0; i < imps.Len(); i++ {
-		imp := imps.Get(i)
-		if imp.IsPublic {
-			out[imp.Path()] = true
-			addPublicImports(imp, out)
+func (r descsByName) initMessagesFromDescriptorProto(mds []*descriptorpb.DescriptorProto, parent protoreflect.Descriptor) []filedesc.Message {
+	ms := make([]filedesc.Message, len(mds)) // allocate up-front to ensure stable pointers
+	for i, md := range mds {
+		m := &ms[i]
+		m.L0 = makeBase(parent, md.GetName(), i)
+		m.L1.Enums.List = r.initEnumsFromDescriptorProto(md.GetEnumType(), m)
+		m.L1.Messages.List = r.initMessagesFromDescriptorProto(md.GetNestedType(), m)
+		m.L1.Extensions.List = r.initExtensionsFromDescriptorProto(md.GetExtension(), m)
+		r[m.FullName()] = m
+	}
+	return ms
+}
+
+func (r descsByName) initExtensionsFromDescriptorProto(xds []*descriptorpb.FieldDescriptorProto, parent protoreflect.Descriptor) []filedesc.Extension {
+	xs := make([]filedesc.Extension, len(xds)) // allocate up-front to ensure stable pointers
+	for i, xd := range xds {
+		x := &xs[i]
+		x.L0 = makeBase(parent, xd.GetName(), i)
+		r[x.FullName()] = x
+	}
+	return xs
+}
+
+func (r descsByName) initServicesFromDescriptorProto(sds []*descriptorpb.ServiceDescriptorProto, parent protoreflect.Descriptor) []filedesc.Service {
+	ss := make([]filedesc.Service, len(sds)) // allocate up-front to ensure stable pointers
+	for i, sd := range sds {
+		s := &ss[i]
+		s.L0 = makeBase(parent, sd.GetName(), i)
+		r[s.FullName()] = s
+	}
+	return ss
+}
+
+func makeBase(parent protoreflect.Descriptor, name string, idx int) filedesc.BaseL0 {
+	return filedesc.BaseL0{
+		FullName:   parent.FullName().Append(protoreflect.Name(name)),
+		ParentFile: parent.ParentFile().(*filedesc.File),
+		Parent:     parent,
+		Index:      idx,
+	}
+}
+
+func enumsFromDescriptorProto(es []filedesc.Enum, eds []*descriptorpb.EnumDescriptorProto, imps importSet, r Resolver) error {
+	for i, ed := range eds {
+		e := &es[i]
+		e.L2 = new(filedesc.EnumL2)
+		if opts := ed.GetOptions(); opts != nil {
+			e.L2.Options = func() protoreflect.ProtoMessage { return opts }
+		}
+		for _, s := range ed.GetReservedName() {
+			e.L2.ReservedNames.List = append(e.L2.ReservedNames.List, protoreflect.Name(s))
+		}
+		for _, rr := range ed.GetReservedRange() {
+			e.L2.ReservedRanges.List = append(e.L2.ReservedRanges.List, [2]protoreflect.EnumNumber{
+				protoreflect.EnumNumber(rr.GetStart()),
+				protoreflect.EnumNumber(rr.GetEnd()),
+			})
+		}
+		e.L2.Values.List = make([]filedesc.EnumValue, len(ed.GetValue()))
+		for j, vd := range ed.GetValue() {
+			v := &e.L2.Values.List[j]
+			v.L0 = makeBase(e, vd.GetName(), j)
+			v.L0.FullName = e.L0.Parent.FullName().Append(protoreflect.Name(vd.GetName())) // enum values are in the same scope as the enum itself
+			if opts := vd.GetOptions(); opts != nil {
+				v.L1.Options = func() protoreflect.ProtoMessage { return opts }
+			}
+			v.L1.Number = protoreflect.EnumNumber(vd.GetNumber())
+			if e.L2.ReservedNames.Has(v.Name()) {
+				return errors.New("enum %v contains value with reserved name %q", e.Name(), v.Name())
+			}
+			if e.L2.ReservedRanges.Has(v.Number()) {
+				return errors.New("enum %v contains value with reserved number %d", e.Name(), v.Number())
+			}
 		}
 	}
+	return nil
 }
 
-func messagesFromDescriptorProto(mds []*descriptorpb.DescriptorProto, imps importSet, r Resolver) (ms []prototype.Message, err error) {
-	for _, md := range mds {
-		var m prototype.Message
-		m.Name = protoreflect.Name(md.GetName())
-		m.Options = md.GetOptions()
-		m.IsMapEntry = md.GetOptions().GetMapEntry()
+func messagesFromDescriptorProto(ms []filedesc.Message, mds []*descriptorpb.DescriptorProto, imps importSet, r Resolver) error {
+	for i, md := range mds {
+		m := &ms[i]
 
+		// Handle nested declarations. All enums must be handled before handling
+		// any messages since an enum field may have a default value that is
+		// specified in the same file being constructed.
+		if err := enumsFromDescriptorProto(m.L1.Enums.List, md.GetEnumType(), imps, r); err != nil {
+			return err
+		}
+		if err := messagesFromDescriptorProto(m.L1.Messages.List, md.GetNestedType(), imps, r); err != nil {
+			return err
+		}
+		if err := extensionsFromDescriptorProto(m.L1.Extensions.List, md.GetExtension(), imps, r); err != nil {
+			return err
+		}
+
+		// Handle the message descriptor itself.
+		m.L2 = new(filedesc.MessageL2)
+		if opts := md.GetOptions(); opts != nil {
+			m.L2.Options = func() protoreflect.ProtoMessage { return opts }
+			m.L2.IsMapEntry = opts.GetMapEntry()
+			m.L2.IsMessageSet = opts.GetMessageSetWireFormat()
+		}
 		for _, s := range md.GetReservedName() {
-			m.ReservedNames = append(m.ReservedNames, protoreflect.Name(s))
+			m.L2.ReservedNames.List = append(m.L2.ReservedNames.List, protoreflect.Name(s))
 		}
 		for _, rr := range md.GetReservedRange() {
-			m.ReservedRanges = append(m.ReservedRanges, [2]protoreflect.FieldNumber{
+			m.L2.ReservedRanges.List = append(m.L2.ReservedRanges.List, [2]protoreflect.FieldNumber{
 				protoreflect.FieldNumber(rr.GetStart()),
 				protoreflect.FieldNumber(rr.GetEnd()),
 			})
 		}
 		for _, xr := range md.GetExtensionRange() {
-			m.ExtensionRanges = append(m.ExtensionRanges, [2]protoreflect.FieldNumber{
+			m.L2.ExtensionRanges.List = append(m.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{
 				protoreflect.FieldNumber(xr.GetStart()),
 				protoreflect.FieldNumber(xr.GetEnd()),
 			})
-			m.ExtensionRangeOptions = append(m.ExtensionRangeOptions, xr.GetOptions())
+			var optsFunc func() protoreflect.ProtoMessage
+			if opts := xr.GetOptions(); opts != nil {
+				optsFunc = func() protoreflect.ProtoMessage { return opts }
+			}
+			m.L2.ExtensionRangeOptions = append(m.L2.ExtensionRangeOptions, optsFunc)
 		}
-		resNames := prototype.Names(m.ReservedNames)
-		resRanges := prototype.FieldRanges(m.ReservedRanges)
-		extRanges := prototype.FieldRanges(m.ExtensionRanges)
-
-		for _, fd := range md.GetField() {
-			if fd.GetExtendee() != "" {
-				return nil, errors.New("message field may not have extendee")
+		m.L2.Fields.List = make([]filedesc.Field, len(md.GetField()))
+		m.L2.Oneofs.List = make([]filedesc.Oneof, len(md.GetOneofDecl()))
+		for j, fd := range md.GetField() {
+			f := &m.L2.Fields.List[j]
+			f.L0 = makeBase(m, fd.GetName(), j)
+			if opts := fd.GetOptions(); opts != nil {
+				f.L1.Options = func() protoreflect.ProtoMessage { return opts }
+				f.L1.IsWeak = opts.GetWeak()
+				f.L1.HasPacked = opts.Packed != nil
+				f.L1.IsPacked = opts.GetPacked()
 			}
-			var f prototype.Field
-			f.Name = protoreflect.Name(fd.GetName())
-			if resNames.Has(f.Name) {
-				return nil, errors.New("%v contains field with reserved name %q", m.Name, f.Name)
+			if m.L2.ReservedNames.Has(f.Name()) {
+				return errors.New("%v contains field with reserved name %q", m.Name(), f.Name())
 			}
-			f.Number = protoreflect.FieldNumber(fd.GetNumber())
-			if resRanges.Has(f.Number) {
-				return nil, errors.New("%v contains field with reserved number %d", m.Name, f.Number)
+			f.L1.Number = protoreflect.FieldNumber(fd.GetNumber())
+			if m.L2.ReservedRanges.Has(f.Number()) {
+				return errors.New("%v contains field with reserved number %d", m.Name(), f.Number())
 			}
-			if extRanges.Has(f.Number) {
-				return nil, errors.New("%v contains field with number %d in extension range", m.Name, f.Number)
+			if m.L2.ExtensionRanges.Has(f.Number()) {
+				return errors.New("%v contains field with number %d in extension range", m.Name(), f.Number())
 			}
-			f.Cardinality = protoreflect.Cardinality(fd.GetLabel())
-			f.Kind = protoreflect.Kind(fd.GetType())
-			opts := fd.GetOptions()
-			f.Options = opts
-			if opts != nil && opts.Packed != nil {
-				if *opts.Packed {
-					f.IsPacked = prototype.True
-				} else {
-					f.IsPacked = prototype.False
-				}
+			f.L1.Cardinality = protoreflect.Cardinality(fd.GetLabel())
+			if f.L1.Cardinality == protoreflect.Required {
+				m.L2.RequiredNumbers.List = append(m.L2.RequiredNumbers.List, f.L1.Number)
 			}
-			f.IsWeak = opts.GetWeak()
-			f.JSONName = fd.GetJsonName()
-			if fd.DefaultValue != nil {
-				f.Default, err = defval.Unmarshal(fd.GetDefaultValue(), f.Kind, defval.Descriptor)
-				if err != nil {
-					return nil, err
-				}
+			f.L1.Kind = protoreflect.Kind(fd.GetType())
+			if fd.JsonName != nil {
+				f.L1.JSONName = filedesc.JSONName(fd.GetJsonName())
 			}
 			if fd.OneofIndex != nil {
-				i := int(fd.GetOneofIndex())
-				if i >= len(md.GetOneofDecl()) {
-					return nil, errors.New("invalid oneof index: %d", i)
+				k := int(fd.GetOneofIndex())
+				if k >= len(md.GetOneofDecl()) {
+					return errors.New("invalid oneof index: %d", k)
 				}
-				f.OneofName = protoreflect.Name(md.GetOneofDecl()[i].GetName())
+				o := &m.L2.Oneofs.List[k]
+				f.L1.ContainingOneof = o
+				o.L1.Fields.List = append(o.L1.Fields.List, f)
 			}
-			switch f.Kind {
+			if fd.GetExtendee() != "" {
+				return errors.New("message field may not have extendee")
+			}
+			switch f.L1.Kind {
 			case protoreflect.EnumKind:
-				f.EnumType, err = findEnumDescriptor(fd.GetTypeName(), imps, r)
+				ed, err := findEnumDescriptor(fd.GetTypeName(), f.L1.IsWeak, imps, r)
 				if err != nil {
-					return nil, err
+					return err
 				}
-				if opts.GetWeak() && !f.EnumType.IsPlaceholder() {
-					f.EnumType = prototype.PlaceholderEnum(f.EnumType.FullName())
-				}
+				f.L1.Enum = ed
 			case protoreflect.MessageKind, protoreflect.GroupKind:
-				f.MessageType, err = findMessageDescriptor(fd.GetTypeName(), imps, r)
+				md, err := findMessageDescriptor(fd.GetTypeName(), f.L1.IsWeak, imps, r)
 				if err != nil {
-					return nil, err
+					return err
 				}
-				if opts.GetWeak() && !f.MessageType.IsPlaceholder() {
-					f.MessageType = prototype.PlaceholderMessage(f.MessageType.FullName())
-				}
+				f.L1.Message = md
 			default:
 				if fd.GetTypeName() != "" {
-					return nil, errors.New("field of kind %v has type_name set", f.Kind)
+					return errors.New("field of kind %v has type_name set", f.L1.Kind)
 				}
 			}
-			m.Fields = append(m.Fields, f)
+			if fd.DefaultValue != nil {
+				// Handle default value after resolving the enum since the
+				// list of enum values is needed to resolve enums by name.
+				var evs protoreflect.EnumValueDescriptors
+				if f.L1.Kind == protoreflect.EnumKind {
+					evs = f.L1.Enum.Values()
+				}
+				v, ev, err := defval.Unmarshal(fd.GetDefaultValue(), f.L1.Kind, evs, defval.Descriptor)
+				if err != nil {
+					return err
+				}
+				f.L1.Default = filedesc.DefaultValue(v, ev)
+			}
 		}
-		for _, od := range md.GetOneofDecl() {
-			m.Oneofs = append(m.Oneofs, prototype.Oneof{
-				Name:    protoreflect.Name(od.GetName()),
-				Options: od.Options,
-			})
+		for j, od := range md.GetOneofDecl() {
+			o := &m.L2.Oneofs.List[j]
+			o.L0 = makeBase(m, od.GetName(), j)
+			if opts := od.GetOptions(); opts != nil {
+				o.L1.Options = func() protoreflect.ProtoMessage { return opts }
+			}
 		}
-
-		m.Messages, err = messagesFromDescriptorProto(md.GetNestedType(), imps, r)
-		if err != nil {
-			return nil, err
-		}
-		m.Enums, err = enumsFromDescriptorProto(md.GetEnumType(), r)
-		if err != nil {
-			return nil, err
-		}
-		m.Extensions, err = extensionsFromDescriptorProto(md.GetExtension(), imps, r)
-		if err != nil {
-			return nil, err
-		}
-
-		ms = append(ms, m)
 	}
-	return ms, nil
+	return nil
 }
 
-func enumsFromDescriptorProto(eds []*descriptorpb.EnumDescriptorProto, r Resolver) (es []prototype.Enum, err error) {
-	for _, ed := range eds {
-		var e prototype.Enum
-		e.Name = protoreflect.Name(ed.GetName())
-		e.Options = ed.GetOptions()
-		for _, s := range ed.GetReservedName() {
-			e.ReservedNames = append(e.ReservedNames, protoreflect.Name(s))
+func extensionsFromDescriptorProto(xs []filedesc.Extension, xds []*descriptorpb.FieldDescriptorProto, imps importSet, r Resolver) error {
+	for i, xd := range xds {
+		x := &xs[i]
+		x.L2 = new(filedesc.ExtensionL2)
+		if opts := xd.GetOptions(); opts != nil {
+			x.L2.Options = func() protoreflect.ProtoMessage { return opts }
+			x.L2.IsPacked = opts.GetPacked()
 		}
-		for _, rr := range ed.GetReservedRange() {
-			e.ReservedRanges = append(e.ReservedRanges, [2]protoreflect.EnumNumber{
-				protoreflect.EnumNumber(rr.GetStart()),
-				protoreflect.EnumNumber(rr.GetEnd()),
-			})
+		x.L1.Number = protoreflect.FieldNumber(xd.GetNumber())
+		x.L2.Cardinality = protoreflect.Cardinality(xd.GetLabel())
+		x.L1.Kind = protoreflect.Kind(xd.GetType())
+		if xd.JsonName != nil {
+			x.L2.JSONName = filedesc.JSONName(xd.GetJsonName())
 		}
-		resNames := prototype.Names(e.ReservedNames)
-		resRanges := prototype.EnumRanges(e.ReservedRanges)
-
-		for _, vd := range ed.GetValue() {
-			v := prototype.EnumValue{
-				Name:    protoreflect.Name(vd.GetName()),
-				Number:  protoreflect.EnumNumber(vd.GetNumber()),
-				Options: vd.Options,
-			}
-			if resNames.Has(v.Name) {
-				return nil, errors.New("enum %v contains value with reserved name %q", e.Name, v.Name)
-			}
-			if resRanges.Has(v.Number) {
-				return nil, errors.New("enum %v contains value with reserved number %d", e.Name, v.Number)
-			}
-			e.Values = append(e.Values, v)
-		}
-		es = append(es, e)
-	}
-	return es, nil
-}
-
-func extensionsFromDescriptorProto(xds []*descriptorpb.FieldDescriptorProto, imps importSet, r Resolver) (xs []prototype.Extension, err error) {
-	for _, xd := range xds {
 		if xd.OneofIndex != nil {
-			return nil, errors.New("extension may not have oneof_index")
+			return errors.New("extension may not have oneof_index")
 		}
-		var x prototype.Extension
-		x.Name = protoreflect.Name(xd.GetName())
-		x.Number = protoreflect.FieldNumber(xd.GetNumber())
-		x.Cardinality = protoreflect.Cardinality(xd.GetLabel())
-		x.Kind = protoreflect.Kind(xd.GetType())
-		x.Options = xd.GetOptions()
-		if xd.DefaultValue != nil {
-			x.Default, err = defval.Unmarshal(xd.GetDefaultValue(), x.Kind, defval.Descriptor)
-			if err != nil {
-				return nil, err
-			}
+		md, err := findMessageDescriptor(xd.GetExtendee(), false, imps, r)
+		if err != nil {
+			return err
 		}
-		switch x.Kind {
+		x.L1.Extendee = md
+		switch x.L1.Kind {
 		case protoreflect.EnumKind:
-			x.EnumType, err = findEnumDescriptor(xd.GetTypeName(), imps, r)
+			ed, err := findEnumDescriptor(xd.GetTypeName(), false, imps, r)
 			if err != nil {
-				return nil, err
+				return err
 			}
+			x.L2.Enum = ed
 		case protoreflect.MessageKind, protoreflect.GroupKind:
-			x.MessageType, err = findMessageDescriptor(xd.GetTypeName(), imps, r)
+			md, err := findMessageDescriptor(xd.GetTypeName(), false, imps, r)
 			if err != nil {
-				return nil, err
+				return err
 			}
+			x.L2.Message = md
 		default:
 			if xd.GetTypeName() != "" {
-				return nil, errors.New("extension of kind %v has type_name set", x.Kind)
+				return errors.New("field of kind %v has type_name set", x.L1.Kind)
 			}
 		}
-		x.ExtendedType, err = findMessageDescriptor(xd.GetExtendee(), imps, r)
-		if err != nil {
-			return nil, err
+		if xd.DefaultValue != nil {
+			// Handle default value after resolving the enum since the
+			// list of enum values is needed to resolve enums by name.
+			var evs protoreflect.EnumValueDescriptors
+			if x.L1.Kind == protoreflect.EnumKind {
+				evs = x.L2.Enum.Values()
+			}
+			v, ev, err := defval.Unmarshal(xd.GetDefaultValue(), x.L1.Kind, evs, defval.Descriptor)
+			if err != nil {
+				return err
+			}
+			x.L2.Default = filedesc.DefaultValue(v, ev)
 		}
-		xs = append(xs, x)
 	}
-	return xs, nil
+	return nil
 }
 
-func servicesFromDescriptorProto(sds []*descriptorpb.ServiceDescriptorProto, imps importSet, r Resolver) (ss []prototype.Service, err error) {
-	for _, sd := range sds {
-		var s prototype.Service
-		s.Name = protoreflect.Name(sd.GetName())
-		s.Options = sd.GetOptions()
-		for _, md := range sd.GetMethod() {
-			var m prototype.Method
-			m.Name = protoreflect.Name(md.GetName())
-			m.Options = md.GetOptions()
-			m.InputType, err = findMessageDescriptor(md.GetInputType(), imps, r)
-			if err != nil {
-				return nil, err
-			}
-			m.OutputType, err = findMessageDescriptor(md.GetOutputType(), imps, r)
-			if err != nil {
-				return nil, err
-			}
-			m.IsStreamingClient = md.GetClientStreaming()
-			m.IsStreamingServer = md.GetServerStreaming()
-			s.Methods = append(s.Methods, m)
+func servicesFromDescriptorProto(ss []filedesc.Service, sds []*descriptorpb.ServiceDescriptorProto, imps importSet, r Resolver) (err error) {
+	for i, sd := range sds {
+		s := &ss[i]
+		s.L2 = new(filedesc.ServiceL2)
+		if opts := sd.GetOptions(); opts != nil {
+			s.L2.Options = func() protoreflect.ProtoMessage { return opts }
 		}
-		ss = append(ss, s)
+		s.L2.Methods.List = make([]filedesc.Method, len(sd.GetMethod()))
+		for j, md := range sd.GetMethod() {
+			m := &s.L2.Methods.List[j]
+			m.L0 = makeBase(s, md.GetName(), j)
+			if opts := md.GetOptions(); opts != nil {
+				m.L1.Options = func() protoreflect.ProtoMessage { return opts }
+			}
+			m.L1.Input, err = findMessageDescriptor(md.GetInputType(), false, imps, r)
+			if err != nil {
+				return err
+			}
+			m.L1.Output, err = findMessageDescriptor(md.GetOutputType(), false, imps, r)
+			if err != nil {
+				return err
+			}
+			m.L1.IsStreamingClient = md.GetClientStreaming()
+			m.L1.IsStreamingServer = md.GetServerStreaming()
+		}
 	}
-	return ss, nil
+	return nil
+}
+
+type resolver struct {
+	local  descsByName
+	remote Resolver
+}
+
+func (r resolver) FindFileByPath(s string) (protoreflect.FileDescriptor, error) {
+	return r.remote.FindFileByPath(s)
+}
+
+func (r resolver) FindEnumByName(s protoreflect.FullName) (protoreflect.EnumDescriptor, error) {
+	if d, ok := r.local[s]; ok {
+		if ed, ok := d.(protoreflect.EnumDescriptor); ok {
+			return ed, nil
+		}
+		return nil, errors.New("found wrong type")
+	}
+	return r.remote.FindEnumByName(s)
+}
+
+func (r resolver) FindMessageByName(s protoreflect.FullName) (protoreflect.MessageDescriptor, error) {
+	if d, ok := r.local[s]; ok {
+		if md, ok := d.(protoreflect.MessageDescriptor); ok {
+			return md, nil
+		}
+		return nil, errors.New("found wrong type")
+	}
+	return r.remote.FindMessageByName(s)
+}
+
+type importSet map[string]bool
+
+func (is importSet) importFiles(files []protoreflect.FileImport) {
+	for _, imp := range files {
+		is[imp.Path()] = true
+		is.importPublic(imp)
+	}
+}
+
+func (is importSet) importPublic(fd protoreflect.FileDescriptor) {
+	imps := fd.Imports()
+	for i := 0; i < imps.Len(); i++ {
+		if imp := imps.Get(i); imp.IsPublic {
+			is[imp.Path()] = true
+			is.importPublic(imp)
+		}
+	}
+}
+
+// check returns an error if d does not belong to a currently imported file.
+func (is importSet) check(d protoreflect.Descriptor) error {
+	if !is[d.ParentFile().Path()] {
+		return errors.New("reference to type %v without import of %v", d.FullName(), d.ParentFile().Path())
+	}
+	return nil
 }
 
 // TODO: Should we allow relative names? The protoc compiler has emitted
@@ -364,43 +510,48 @@
 // simplifies our implementation as we won't need to implement C++'s namespace
 // scoping rules.
 
-func findMessageDescriptor(s string, imps importSet, r Resolver) (protoreflect.MessageDescriptor, error) {
-	if !strings.HasPrefix(s, ".") {
-		return nil, errors.New("identifier name must be fully qualified with a leading dot: %v", s)
-	}
-	name := protoreflect.FullName(strings.TrimPrefix(s, "."))
-	md, err := r.FindMessageByName(name)
-	if err != nil {
-		return prototype.PlaceholderMessage(name), nil
-	}
-	if err := validateFileInImports(md, imps); err != nil {
-		return nil, err
-	}
-	return md, nil
-}
-
-func findEnumDescriptor(s string, imps importSet, r Resolver) (protoreflect.EnumDescriptor, error) {
+func findEnumDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.EnumDescriptor, error) {
 	if !strings.HasPrefix(s, ".") {
 		return nil, errors.New("identifier name must be fully qualified with a leading dot: %v", s)
 	}
 	name := protoreflect.FullName(strings.TrimPrefix(s, "."))
 	ed, err := r.FindEnumByName(name)
 	if err != nil {
-		return prototype.PlaceholderEnum(name), nil
+		if err == protoregistry.NotFound {
+			if isWeak {
+				return filedesc.PlaceholderEnum(name), nil
+			}
+			// TODO: This should be an error.
+			return filedesc.PlaceholderEnum(name), nil
+			// return nil, errors.New("could not resolve enum: %v", name)
+		}
+		return nil, err
 	}
-	if err := validateFileInImports(ed, imps); err != nil {
+	if err := imps.check(ed); err != nil {
 		return nil, err
 	}
 	return ed, nil
 }
 
-func validateFileInImports(d protoreflect.Descriptor, imps importSet) error {
-	fd := d.ParentFile()
-	if fd == nil {
-		return errors.New("%v has no parent FileDescriptor", d.FullName())
+func findMessageDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.MessageDescriptor, error) {
+	if !strings.HasPrefix(s, ".") {
+		return nil, errors.New("identifier name must be fully qualified with a leading dot: %v", s)
 	}
-	if !imps[fd.Path()] {
-		return errors.New("reference to type %v without import of %v", d.FullName(), fd.Path())
+	name := protoreflect.FullName(strings.TrimPrefix(s, "."))
+	md, err := r.FindMessageByName(name)
+	if err != nil {
+		if err == protoregistry.NotFound {
+			if isWeak {
+				return filedesc.PlaceholderMessage(name), nil
+			}
+			// TODO: This should be an error.
+			return filedesc.PlaceholderMessage(name), nil
+			// return nil, errors.New("could not resolve message: %v", name)
+		}
+		return nil, err
 	}
-	return nil
+	if err := imps.check(md); err != nil {
+		return nil, err
+	}
+	return md, nil
 }
diff --git a/reflect/protodesc/protodesc_test.go b/reflect/protodesc/protodesc_test.go
index 19c3ab3..1ef9c43 100644
--- a/reflect/protodesc/protodesc_test.go
+++ b/reflect/protodesc/protodesc_test.go
@@ -1,3 +1,7 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 package protodesc
 
 import (
@@ -439,7 +443,7 @@
 					Name:     scalar.String("nested_message"),
 					Number:   scalar.Int32(4),
 					Label:    descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum(),
-					Type:     descriptorpb.FieldDescriptorProto_TYPE_ENUM.Enum(),
+					Type:     descriptorpb.FieldDescriptorProto_TYPE_MESSAGE.Enum(),
 					TypeName: scalar.String(".foo.TopLevelMessage.NestedMessage"),
 				}},
 			}},
@@ -596,14 +600,14 @@
 			for _, dep := range tc.deps {
 				f, err := NewFile(dep, r)
 				if err != nil {
-					t.Fatalf("Error creating dependency: %v", err)
+					t.Fatalf("error creating dependency: %v", err)
 				}
 				if err := r.Register(f); err != nil {
-					t.Fatalf("Error adding dependency: %v", err)
+					t.Fatalf("error adding dependency: %v", err)
 				}
 			}
 			if _, err := NewFile(tc.fd, r); err != nil {
-				t.Errorf("NewFile: got err = %v", err)
+				t.Errorf("unexpected NewFile error: %v", err)
 			}
 		})
 	}
diff --git a/reflect/protodesc/toproto.go b/reflect/protodesc/toproto.go
index 772b65a..26b4f1d 100644
--- a/reflect/protodesc/toproto.go
+++ b/reflect/protodesc/toproto.go
@@ -117,17 +117,11 @@
 		p.JsonName = scalar.String(field.JSONName())
 	}
 	if field.HasDefault() {
-		if field.Kind() == protoreflect.EnumKind {
-			// TODO: defval.Marshal should probably take a FieldDescriptor
-			// instead of a Kind and do this itself.
-			p.DefaultValue = scalar.String(string(field.DefaultEnumValue().Name()))
-		} else {
-			def, err := defval.Marshal(field.Default(), field.Kind(), defval.Descriptor)
-			if err != nil {
-				panic(fmt.Sprintf("%v: %v", field.FullName(), err))
-			}
-			p.DefaultValue = scalar.String(def)
+		def, err := defval.Marshal(field.Default(), field.DefaultEnumValue(), field.Kind(), defval.Descriptor)
+		if err != nil {
+			panic(fmt.Sprintf("%v: %v", field.FullName(), err))
 		}
+		p.DefaultValue = scalar.String(def)
 	}
 	if oneof := field.ContainingOneof(); oneof != nil {
 		p.OneofIndex = scalar.Int32(int32(oneof.Index()))
diff --git a/reflect/protoreflect/type.go b/reflect/protoreflect/type.go
index f406ed3..1aabd05 100644
--- a/reflect/protoreflect/type.go
+++ b/reflect/protoreflect/type.go
@@ -85,6 +85,8 @@
 	// For FileDescriptor, the Path and Package are also valid.
 	IsPlaceholder() bool
 
+	// TODO: Decide memory ownership of Options.
+
 	// Options returns the descriptor options. The caller must not modify
 	// the returned value.
 	//
diff --git a/reflect/protoregistry/registry_test.go b/reflect/protoregistry/registry_test.go
index de0c4a6..29c87e7 100644
--- a/reflect/protoregistry/registry_test.go
+++ b/reflect/protoregistry/registry_test.go
@@ -12,15 +12,29 @@
 	"github.com/google/go-cmp/cmp"
 	"github.com/google/go-cmp/cmp/cmpopts"
 
+	"google.golang.org/protobuf/encoding/prototext"
 	pimpl "google.golang.org/protobuf/internal/impl"
-	ptype "google.golang.org/protobuf/internal/prototype"
+	pdesc "google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	preg "google.golang.org/protobuf/reflect/protoregistry"
 
 	test2pb "google.golang.org/protobuf/internal/testprotos/test"
 	testpb "google.golang.org/protobuf/reflect/protoregistry/testprotos"
+	"google.golang.org/protobuf/types/descriptorpb"
 )
 
+func mustMakeFile(s string) pref.FileDescriptor {
+	pb := new(descriptorpb.FileDescriptorProto)
+	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
+		panic(err)
+	}
+	fd, err := pdesc.NewFile(pb, nil)
+	if err != nil {
+		panic(err)
+	}
+	return fd
+}
+
 func TestFiles(t *testing.T) {
 	type (
 		file struct {
@@ -28,7 +42,7 @@
 			Pkg  pref.FullName
 		}
 		testFile struct {
-			inFile  *ptype.File
+			inFile  pref.FileDescriptor
 			wantErr string
 		}
 		testRangePkg struct {
@@ -48,12 +62,12 @@
 	}{{
 		// Test that overlapping packages and files are permitted.
 		files: []testFile{
-			{inFile: &ptype.File{Syntax: pref.Proto2, Path: "test1.proto", Package: "foo.bar"}},
-			{inFile: &ptype.File{Syntax: pref.Proto2, Path: "foo/bar/test.proto", Package: "my.test"}},
-			{inFile: &ptype.File{Syntax: pref.Proto2, Path: "foo/bar/test.proto", Package: "foo.bar.baz"}, wantErr: "already registered"},
-			{inFile: &ptype.File{Syntax: pref.Proto2, Path: "test2.proto", Package: "my.test.package"}},
-			{inFile: &ptype.File{Syntax: pref.Proto2, Package: "foo.bar"}},
-			{inFile: &ptype.File{Syntax: pref.Proto2, Path: "foo/bar/baz/../test.proto", Package: "my.test"}},
+			{inFile: mustMakeFile(`syntax:"proto2" name:"test1.proto" package:"foo.bar"`)},
+			{inFile: mustMakeFile(`syntax:"proto2" name:"foo/bar/test.proto" package:"my.test"`)},
+			{inFile: mustMakeFile(`syntax:"proto2" name:"foo/bar/test.proto" package:"foo.bar.baz"`), wantErr: "already registered"},
+			{inFile: mustMakeFile(`syntax:"proto2" name:"test2.proto" package:"my.test.package"`)},
+			{inFile: mustMakeFile(`syntax:"proto2" name:"" package:"foo.bar"`)},
+			{inFile: mustMakeFile(`syntax:"proto2" name:"foo/bar/baz/../test.proto" package:"my.test"`)},
 		},
 
 		rangePkgs: []testRangePkg{{
@@ -100,104 +114,96 @@
 	}, {
 		// Test when new enum conflicts with existing package.
 		files: []testFile{{
-			inFile: &ptype.File{Syntax: pref.Proto2, Path: "test1a.proto", Package: "foo.bar.baz"},
+			inFile: mustMakeFile(`syntax:"proto2" name:"test1a.proto" package:"foo.bar.baz"`),
 		}, {
-			inFile:  &ptype.File{Syntax: pref.Proto2, Path: "test1b.proto", Enums: []ptype.Enum{{Name: "foo"}}},
+			inFile:  mustMakeFile(`syntax:"proto2" name:"test1b.proto" enum_type:[{name:"foo"}]`),
 			wantErr: `file "test1b.proto" has a name conflict over foo`,
 		}},
 	}, {
 		// Test when new package conflicts with existing enum.
 		files: []testFile{{
-			inFile: &ptype.File{Syntax: pref.Proto2, Path: "test2a.proto", Enums: []ptype.Enum{{Name: "foo"}}},
+			inFile: mustMakeFile(`syntax:"proto2" name:"test2a.proto" enum_type:[{name:"foo"}]`),
 		}, {
-			inFile:  &ptype.File{Syntax: pref.Proto2, Path: "test2b.proto", Package: "foo.bar.baz"},
+			inFile:  mustMakeFile(`syntax:"proto2" name:"test2b.proto" package:"foo.bar.baz"`),
 			wantErr: `file "test2b.proto" has a name conflict over foo`,
 		}},
 	}, {
 		// Test when new enum conflicts with existing enum in same package.
 		files: []testFile{{
-			inFile: &ptype.File{Syntax: pref.Proto2, Path: "test3a.proto", Package: "foo", Enums: []ptype.Enum{{Name: "BAR"}}},
+			inFile: mustMakeFile(`syntax:"proto2" name:"test3a.proto" package:"foo" enum_type:[{name:"BAR"}]`),
 		}, {
-			inFile:  &ptype.File{Syntax: pref.Proto2, Path: "test3b.proto", Package: "foo", Enums: []ptype.Enum{{Name: "BAR"}}},
+			inFile:  mustMakeFile(`syntax:"proto2" name:"test3b.proto" package:"foo" enum_type:[{name:"BAR"}]`),
 			wantErr: `file "test3b.proto" has a name conflict over foo.BAR`,
 		}},
 	}, {
 		files: []testFile{{
-			inFile: &ptype.File{
-				Syntax:  pref.Proto2,
-				Path:    "test1.proto",
-				Package: "fizz.buzz",
-				Messages: []ptype.Message{{
-					Name: "Message",
-					Fields: []ptype.Field{{
-						Name:        "Field",
-						Number:      1,
-						Cardinality: pref.Optional,
-						Kind:        pref.StringKind,
-						OneofName:   "Oneof",
-					}},
-					Oneofs:          []ptype.Oneof{{Name: "Oneof"}},
-					ExtensionRanges: [][2]pref.FieldNumber{{1000, 2000}},
-				}},
-				Enums: []ptype.Enum{{
-					Name:   "Enum",
-					Values: []ptype.EnumValue{{Name: "EnumValue", Number: 0}},
-				}},
-				Extensions: []ptype.Extension{{
-					Name:         "Extension",
-					Number:       1000,
-					Cardinality:  pref.Optional,
-					Kind:         pref.StringKind,
-					ExtendedType: ptype.PlaceholderMessage("fizz.buzz.Message"),
-				}},
-				Services: []ptype.Service{{
-					Name: "Service",
-					Methods: []ptype.Method{{
-						Name:              "Method",
-						InputType:         ptype.PlaceholderMessage("fizz.buzz.Message"),
-						OutputType:        ptype.PlaceholderMessage("fizz.buzz.Message"),
-						IsStreamingClient: true,
-						IsStreamingServer: true,
-					}},
-				}},
-			},
+			inFile: mustMakeFile(`
+				syntax:  "proto2"
+				name:    "test1.proto"
+				package: "fizz.buzz"
+				message_type: [{
+					name: "Message"
+					field: [
+						{name:"Field" number:1 label:LABEL_OPTIONAL type:TYPE_STRING oneof_index:0}
+					]
+					oneof_decl:      [{name:"Oneof"}]
+					extension_range: [{start:1000 end:2000}]
+				}]
+				enum_type: [{
+					name:  "Enum"
+					Value: [{name:"EnumValue" number:0}]
+				}]
+				extension: [
+					{name:"Extension" number:1000 label:LABEL_OPTIONAL type:TYPE_STRING extendee:".fizz.buzz.Message"}
+				]
+				service: [{
+					name: "Service"
+					method: [{
+						name:             "Method"
+						input_type:       ".fizz.buzz.Message"
+						output_type:      ".fizz.buzz.Message"
+						client_streaming: true
+						server_streaming: true
+					}]
+				}]
+			`),
 		}, {
-			inFile: &ptype.File{
-				Syntax:  pref.Proto2,
-				Path:    "test2.proto",
-				Package: "fizz.buzz.gazz",
-				Enums: []ptype.Enum{{
-					Name:   "Enum",
-					Values: []ptype.EnumValue{{Name: "EnumValue", Number: 0}},
-				}},
-			},
+			inFile: mustMakeFile(`
+				syntax:  "proto2"
+				name:    "test2.proto"
+				package: "fizz.buzz.gazz"
+				enum_type: [{
+					name:  "Enum"
+					value: [{name:"EnumValue" number:0}]
+				}]
+			`),
 		}, {
-			inFile: &ptype.File{
-				Syntax:  pref.Proto2,
-				Path:    "test3.proto",
-				Package: "fizz.buzz",
-				Enums: []ptype.Enum{{
-					Name:   "Enum1",
-					Values: []ptype.EnumValue{{Name: "EnumValue1", Number: 0}},
+			inFile: mustMakeFile(`
+				syntax:  "proto2"
+				name:    "test3.proto"
+				package: "fizz.buzz"
+				enum_type: [{
+					name:  "Enum1"
+					value: [{name:"EnumValue1" number:0}]
 				}, {
-					Name:   "Enum2",
-					Values: []ptype.EnumValue{{Name: "EnumValue2", Number: 0}},
-				}},
-			},
+					name:  "Enum2"
+					value: [{name:"EnumValue2" number:0}]
+				}]
+			`),
 		}, {
 			// Make sure we can register without package name.
-			inFile: &ptype.File{
-				Syntax: pref.Proto2,
-				Messages: []ptype.Message{{
-					Name: "Message",
-					Messages: []ptype.Message{{
-						Name: "Message",
-						Messages: []ptype.Message{{
-							Name: "Message",
-						}},
-					}},
-				}},
-			},
+			inFile: mustMakeFile(`
+				syntax: "proto2"
+				message_type: [{
+					name: "Message"
+					nested_type: [{
+						name: "Message"
+						nested_type: [{
+							name: "Message"
+						}]
+					}]
+				}]
+			`),
 		}},
 	}}
 
@@ -208,11 +214,7 @@
 		t.Run("", func(t *testing.T) {
 			var files preg.Files
 			for i, tc := range tt.files {
-				fd, err := ptype.NewFile(tc.inFile)
-				if err != nil {
-					t.Fatalf("file %d, prototype.NewFile() error: %v", i, err)
-				}
-				gotErr := files.Register(fd)
+				gotErr := files.Register(tc.inFile)
 				if ((gotErr == nil) != (tc.wantErr == "")) || !strings.Contains(fmt.Sprint(gotErr), tc.wantErr) {
 					t.Errorf("file %d, Register() = %v, want %v", i, gotErr, tc.wantErr)
 				}
diff --git a/reflect/protoregistry/testprotos/test.pb.go b/reflect/protoregistry/testprotos/test.pb.go
index b6d70e4..4ed4811 100644
--- a/reflect/protoregistry/testprotos/test.pb.go
+++ b/reflect/protoregistry/testprotos/test.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -45,7 +45,7 @@
 }
 
 func (Enum1) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_proto_enumTypes[0].Descriptor()
+	return file_test_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Enum1) Number() protoreflect.EnumNumber {
@@ -94,7 +94,7 @@
 }
 
 func (Enum2) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_proto_enumTypes[1].Descriptor()
+	return file_test_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x Enum2) Number() protoreflect.EnumNumber {
@@ -143,7 +143,7 @@
 }
 
 func (Enum3) Descriptor() protoreflect.EnumDescriptor {
-	return file_test_proto_enumTypes[2].Descriptor()
+	return file_test_proto_enumTypes[2].EnumDescriptor
 }
 
 func (x Enum3) Number() protoreflect.EnumNumber {
@@ -426,7 +426,7 @@
 	return file_test_proto_rawDescData
 }
 
-var file_test_proto_enumTypes = make([]protoreflect.EnumType, 3)
+var file_test_proto_enumTypes = make([]prototype.Enum, 3)
 var file_test_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
 var file_test_proto_goTypes = []interface{}{
 	(Enum1)(0),       // 0: testprotos.Enum1
@@ -438,16 +438,21 @@
 	(*Message4)(nil), // 6: testprotos.Message4
 }
 var file_test_proto_depIdxs = []int32{
-	3, // testprotos.string_field:extendee -> testprotos.Message1
-	3, // testprotos.enum_field:extendee -> testprotos.Message1
-	3, // testprotos.message_field:extendee -> testprotos.Message1
-	3, // testprotos.Message4.message_field:extendee -> testprotos.Message1
-	3, // testprotos.Message4.enum_field:extendee -> testprotos.Message1
-	3, // testprotos.Message4.string_field:extendee -> testprotos.Message1
-	0, // testprotos.enum_field:type_name -> testprotos.Enum1
-	4, // testprotos.message_field:type_name -> testprotos.Message2
-	4, // testprotos.Message4.message_field:type_name -> testprotos.Message2
-	0, // testprotos.Message4.enum_field:type_name -> testprotos.Enum1
+	3,  // testprotos.string_field:extendee -> testprotos.Message1
+	3,  // testprotos.enum_field:extendee -> testprotos.Message1
+	3,  // testprotos.message_field:extendee -> testprotos.Message1
+	3,  // testprotos.Message4.message_field:extendee -> testprotos.Message1
+	3,  // testprotos.Message4.enum_field:extendee -> testprotos.Message1
+	3,  // testprotos.Message4.string_field:extendee -> testprotos.Message1
+	0,  // testprotos.enum_field:type_name -> testprotos.Enum1
+	4,  // testprotos.message_field:type_name -> testprotos.Message2
+	4,  // testprotos.Message4.message_field:type_name -> testprotos.Message2
+	0,  // testprotos.Message4.enum_field:type_name -> testprotos.Enum1
+	10, // starting offset of method output_type sub-list
+	10, // starting offset of method input_type sub-list
+	6,  // starting offset of extension type_name sub-list
+	0,  // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_test_proto_init() }
@@ -455,18 +460,21 @@
 	if File_test_proto != nil {
 		return
 	}
-	extensionTypes := make([]protoreflect.ExtensionType, 6)
-	File_test_proto = protoimpl.FileBuilder{
-		RawDescriptor:        file_test_proto_rawDesc,
-		GoTypes:              file_test_proto_goTypes,
-		DependencyIndexes:    file_test_proto_depIdxs,
-		LegacyExtensions:     file_test_proto_extDescs,
-		EnumOutputTypes:      file_test_proto_enumTypes,
-		MessageOutputTypes:   file_test_proto_msgTypes,
-		ExtensionOutputTypes: extensionTypes,
-		FilesRegistry:        protoregistry.GlobalFiles,
-		TypesRegistry:        protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_test_proto_rawDesc,
+			NumEnums:      3,
+			NumMessages:   4,
+			NumExtensions: 6,
+			NumServices:   0,
+		},
+		GoTypes:           file_test_proto_goTypes,
+		DependencyIndexes: file_test_proto_depIdxs,
+		MessageInfos:      file_test_proto_msgTypes,
+		LegacyExtensions:  file_test_proto_extDescs,
+	}.Build()
+	File_test_proto = out.File
+	file_test_proto_enumTypes = out.Enums
 	file_test_proto_rawDesc = nil
 	file_test_proto_goTypes = nil
 	file_test_proto_depIdxs = nil
diff --git a/runtime/protoimpl/impl.go b/runtime/protoimpl/impl.go
index 59198a6..8470dbe 100644
--- a/runtime/protoimpl/impl.go
+++ b/runtime/protoimpl/impl.go
@@ -12,7 +12,9 @@
 package protoimpl
 
 import (
+	"google.golang.org/protobuf/internal/filedesc"
 	"google.golang.org/protobuf/internal/fileinit"
+	"google.golang.org/protobuf/internal/filetype"
 	"google.golang.org/protobuf/internal/impl"
 )
 
@@ -58,7 +60,9 @@
 	// being a compilation failure (guaranteed by the Go specification).
 	EnforceVersion uint
 
-	FileBuilder      = fileinit.FileBuilder
+	FileBuilder      = fileinit.FileBuilder // TODO: Remove this.
+	DescBuilder      = filedesc.DescBuilder
+	TypeBuilder      = filetype.TypeBuilder
 	MessageInfo      = impl.MessageInfo
 	SizeCache        = impl.SizeCache
 	UnknownFields    = impl.UnknownFields
diff --git a/types/descriptorpb/descriptor.pb.go b/types/descriptorpb/descriptor.pb.go
index 0dd8234..d2019e5 100644
--- a/types/descriptorpb/descriptor.pb.go
+++ b/types/descriptorpb/descriptor.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -107,7 +107,7 @@
 }
 
 func (FieldDescriptorProto_Type) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor()
+	return file_google_protobuf_descriptor_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
@@ -163,7 +163,7 @@
 }
 
 func (FieldDescriptorProto_Label) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor()
+	return file_google_protobuf_descriptor_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
@@ -220,7 +220,7 @@
 }
 
 func (FileOptions_OptimizeMode) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor()
+	return file_google_protobuf_descriptor_proto_enumTypes[2].EnumDescriptor
 }
 
 func (x FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
@@ -276,7 +276,7 @@
 }
 
 func (FieldOptions_CType) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor()
+	return file_google_protobuf_descriptor_proto_enumTypes[3].EnumDescriptor
 }
 
 func (x FieldOptions_CType) Number() protoreflect.EnumNumber {
@@ -334,7 +334,7 @@
 }
 
 func (FieldOptions_JSType) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor()
+	return file_google_protobuf_descriptor_proto_enumTypes[4].EnumDescriptor
 }
 
 func (x FieldOptions_JSType) Number() protoreflect.EnumNumber {
@@ -392,7 +392,7 @@
 }
 
 func (MethodOptions_IdempotencyLevel) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor()
+	return file_google_protobuf_descriptor_proto_enumTypes[5].EnumDescriptor
 }
 
 func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
@@ -3197,7 +3197,7 @@
 	return file_google_protobuf_descriptor_proto_rawDescData
 }
 
-var file_google_protobuf_descriptor_proto_enumTypes = make([]protoreflect.EnumType, 6)
+var file_google_protobuf_descriptor_proto_enumTypes = make([]prototype.Enum, 6)
 var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 27)
 var file_google_protobuf_descriptor_proto_goTypes = []interface{}{
 	(FieldDescriptorProto_Type)(0),                // 0: google.protobuf.FieldDescriptorProto.Type
@@ -3278,6 +3278,11 @@
 	31, // google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location
 	32, // google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation
 	9,  // google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions
+	43, // starting offset of method output_type sub-list
+	43, // starting offset of method input_type sub-list
+	43, // starting offset of extension type_name sub-list
+	43, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_google_protobuf_descriptor_proto_init() }
@@ -3285,15 +3290,20 @@
 	if File_google_protobuf_descriptor_proto != nil {
 		return
 	}
-	File_google_protobuf_descriptor_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_descriptor_proto_rawDesc,
-		GoTypes:            file_google_protobuf_descriptor_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_descriptor_proto_depIdxs,
-		EnumOutputTypes:    file_google_protobuf_descriptor_proto_enumTypes,
-		MessageOutputTypes: file_google_protobuf_descriptor_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_descriptor_proto_rawDesc,
+			NumEnums:      6,
+			NumMessages:   27,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_descriptor_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_descriptor_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_descriptor_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_descriptor_proto = out.File
+	file_google_protobuf_descriptor_proto_enumTypes = out.Enums
 	file_google_protobuf_descriptor_proto_rawDesc = nil
 	file_google_protobuf_descriptor_proto_goTypes = nil
 	file_google_protobuf_descriptor_proto_depIdxs = nil
diff --git a/types/known/anypb/any.pb.go b/types/known/anypb/any.pb.go
index 6bdb337..368fd75 100644
--- a/types/known/anypb/any.pb.go
+++ b/types/known/anypb/any.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -210,21 +209,32 @@
 var file_google_protobuf_any_proto_goTypes = []interface{}{
 	(*Any)(nil), // 0: google.protobuf.Any
 }
-var file_google_protobuf_any_proto_depIdxs = []int32{}
+var file_google_protobuf_any_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_google_protobuf_any_proto_init() }
 func file_google_protobuf_any_proto_init() {
 	if File_google_protobuf_any_proto != nil {
 		return
 	}
-	File_google_protobuf_any_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_any_proto_rawDesc,
-		GoTypes:            file_google_protobuf_any_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_any_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_any_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_any_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_any_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_any_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_any_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_any_proto = out.File
 	file_google_protobuf_any_proto_rawDesc = nil
 	file_google_protobuf_any_proto_goTypes = nil
 	file_google_protobuf_any_proto_depIdxs = nil
diff --git a/types/known/apipb/api.pb.go b/types/known/apipb/api.pb.go
index dd9ca1d..af46a90 100644
--- a/types/known/apipb/api.pb.go
+++ b/types/known/apipb/api.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sourcecontextpb "google.golang.org/protobuf/types/known/sourcecontextpb"
@@ -454,6 +453,11 @@
 	5, // google.protobuf.Api.syntax:type_name -> google.protobuf.Syntax
 	3, // google.protobuf.Method.options:type_name -> google.protobuf.Option
 	5, // google.protobuf.Method.syntax:type_name -> google.protobuf.Syntax
+	7, // starting offset of method output_type sub-list
+	7, // starting offset of method input_type sub-list
+	7, // starting offset of extension type_name sub-list
+	7, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_google_protobuf_api_proto_init() }
@@ -461,14 +465,19 @@
 	if File_google_protobuf_api_proto != nil {
 		return
 	}
-	File_google_protobuf_api_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_api_proto_rawDesc,
-		GoTypes:            file_google_protobuf_api_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_api_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_api_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_api_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_api_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_api_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_api_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_api_proto = out.File
 	file_google_protobuf_api_proto_rawDesc = nil
 	file_google_protobuf_api_proto_goTypes = nil
 	file_google_protobuf_api_proto_depIdxs = nil
diff --git a/types/known/durationpb/duration.pb.go b/types/known/durationpb/duration.pb.go
index 7f889c3..788e57b 100644
--- a/types/known/durationpb/duration.pb.go
+++ b/types/known/durationpb/duration.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -171,21 +170,32 @@
 var file_google_protobuf_duration_proto_goTypes = []interface{}{
 	(*Duration)(nil), // 0: google.protobuf.Duration
 }
-var file_google_protobuf_duration_proto_depIdxs = []int32{}
+var file_google_protobuf_duration_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_google_protobuf_duration_proto_init() }
 func file_google_protobuf_duration_proto_init() {
 	if File_google_protobuf_duration_proto != nil {
 		return
 	}
-	File_google_protobuf_duration_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_duration_proto_rawDesc,
-		GoTypes:            file_google_protobuf_duration_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_duration_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_duration_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_duration_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_duration_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_duration_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_duration_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_duration_proto = out.File
 	file_google_protobuf_duration_proto_rawDesc = nil
 	file_google_protobuf_duration_proto_goTypes = nil
 	file_google_protobuf_duration_proto_depIdxs = nil
diff --git a/types/known/emptypb/empty.pb.go b/types/known/emptypb/empty.pb.go
index b3920f3..72952b4 100644
--- a/types/known/emptypb/empty.pb.go
+++ b/types/known/emptypb/empty.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -91,21 +90,32 @@
 var file_google_protobuf_empty_proto_goTypes = []interface{}{
 	(*Empty)(nil), // 0: google.protobuf.Empty
 }
-var file_google_protobuf_empty_proto_depIdxs = []int32{}
+var file_google_protobuf_empty_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_google_protobuf_empty_proto_init() }
 func file_google_protobuf_empty_proto_init() {
 	if File_google_protobuf_empty_proto != nil {
 		return
 	}
-	File_google_protobuf_empty_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_empty_proto_rawDesc,
-		GoTypes:            file_google_protobuf_empty_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_empty_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_empty_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_empty_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_empty_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_empty_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_empty_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_empty_proto = out.File
 	file_google_protobuf_empty_proto_rawDesc = nil
 	file_google_protobuf_empty_proto_goTypes = nil
 	file_google_protobuf_empty_proto_depIdxs = nil
diff --git a/types/known/fieldmaskpb/field_mask.pb.go b/types/known/fieldmaskpb/field_mask.pb.go
index d69e284..b131163 100644
--- a/types/known/fieldmaskpb/field_mask.pb.go
+++ b/types/known/fieldmaskpb/field_mask.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -291,21 +290,32 @@
 var file_google_protobuf_field_mask_proto_goTypes = []interface{}{
 	(*FieldMask)(nil), // 0: google.protobuf.FieldMask
 }
-var file_google_protobuf_field_mask_proto_depIdxs = []int32{}
+var file_google_protobuf_field_mask_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_google_protobuf_field_mask_proto_init() }
 func file_google_protobuf_field_mask_proto_init() {
 	if File_google_protobuf_field_mask_proto != nil {
 		return
 	}
-	File_google_protobuf_field_mask_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_field_mask_proto_rawDesc,
-		GoTypes:            file_google_protobuf_field_mask_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_field_mask_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_field_mask_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_field_mask_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_field_mask_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_field_mask_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_field_mask_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_field_mask_proto = out.File
 	file_google_protobuf_field_mask_proto_rawDesc = nil
 	file_google_protobuf_field_mask_proto_goTypes = nil
 	file_google_protobuf_field_mask_proto_depIdxs = nil
diff --git a/types/known/sourcecontextpb/source_context.pb.go b/types/known/sourcecontextpb/source_context.pb.go
index 3327aef..533b37c 100644
--- a/types/known/sourcecontextpb/source_context.pb.go
+++ b/types/known/sourcecontextpb/source_context.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -96,21 +95,32 @@
 var file_google_protobuf_source_context_proto_goTypes = []interface{}{
 	(*SourceContext)(nil), // 0: google.protobuf.SourceContext
 }
-var file_google_protobuf_source_context_proto_depIdxs = []int32{}
+var file_google_protobuf_source_context_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_google_protobuf_source_context_proto_init() }
 func file_google_protobuf_source_context_proto_init() {
 	if File_google_protobuf_source_context_proto != nil {
 		return
 	}
-	File_google_protobuf_source_context_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_source_context_proto_rawDesc,
-		GoTypes:            file_google_protobuf_source_context_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_source_context_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_source_context_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_source_context_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_source_context_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_source_context_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_source_context_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_source_context_proto = out.File
 	file_google_protobuf_source_context_proto_rawDesc = nil
 	file_google_protobuf_source_context_proto_goTypes = nil
 	file_google_protobuf_source_context_proto_depIdxs = nil
diff --git a/types/known/structpb/struct.pb.go b/types/known/structpb/struct.pb.go
index 47c693f..261a9f5 100644
--- a/types/known/structpb/struct.pb.go
+++ b/types/known/structpb/struct.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -50,7 +50,7 @@
 }
 
 func (NullValue) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_struct_proto_enumTypes[0].Descriptor()
+	return file_google_protobuf_struct_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x NullValue) Number() protoreflect.EnumNumber {
@@ -373,7 +373,7 @@
 	return file_google_protobuf_struct_proto_rawDescData
 }
 
-var file_google_protobuf_struct_proto_enumTypes = make([]protoreflect.EnumType, 1)
+var file_google_protobuf_struct_proto_enumTypes = make([]prototype.Enum, 1)
 var file_google_protobuf_struct_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
 var file_google_protobuf_struct_proto_goTypes = []interface{}{
 	(NullValue)(0),    // 0: google.protobuf.NullValue
@@ -389,6 +389,11 @@
 	3, // google.protobuf.Value.list_value:type_name -> google.protobuf.ListValue
 	2, // google.protobuf.ListValue.values:type_name -> google.protobuf.Value
 	2, // google.protobuf.Struct.FieldsEntry.value:type_name -> google.protobuf.Value
+	6, // starting offset of method output_type sub-list
+	6, // starting offset of method input_type sub-list
+	6, // starting offset of extension type_name sub-list
+	6, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_google_protobuf_struct_proto_init() }
@@ -396,15 +401,20 @@
 	if File_google_protobuf_struct_proto != nil {
 		return
 	}
-	File_google_protobuf_struct_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_struct_proto_rawDesc,
-		GoTypes:            file_google_protobuf_struct_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_struct_proto_depIdxs,
-		EnumOutputTypes:    file_google_protobuf_struct_proto_enumTypes,
-		MessageOutputTypes: file_google_protobuf_struct_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_struct_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_struct_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_struct_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_struct_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_struct_proto = out.File
+	file_google_protobuf_struct_proto_enumTypes = out.Enums
 	file_google_protobuf_struct_proto_rawDesc = nil
 	file_google_protobuf_struct_proto_goTypes = nil
 	file_google_protobuf_struct_proto_depIdxs = nil
diff --git a/types/known/timestamppb/timestamp.pb.go b/types/known/timestamppb/timestamp.pb.go
index d0fd90c..aee1cf1 100644
--- a/types/known/timestamppb/timestamp.pb.go
+++ b/types/known/timestamppb/timestamp.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -191,21 +190,32 @@
 var file_google_protobuf_timestamp_proto_goTypes = []interface{}{
 	(*Timestamp)(nil), // 0: google.protobuf.Timestamp
 }
-var file_google_protobuf_timestamp_proto_depIdxs = []int32{}
+var file_google_protobuf_timestamp_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_google_protobuf_timestamp_proto_init() }
 func file_google_protobuf_timestamp_proto_init() {
 	if File_google_protobuf_timestamp_proto != nil {
 		return
 	}
-	File_google_protobuf_timestamp_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_timestamp_proto_rawDesc,
-		GoTypes:            file_google_protobuf_timestamp_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_timestamp_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_timestamp_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_timestamp_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_timestamp_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_timestamp_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_timestamp_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_timestamp_proto = out.File
 	file_google_protobuf_timestamp_proto_rawDesc = nil
 	file_google_protobuf_timestamp_proto_goTypes = nil
 	file_google_protobuf_timestamp_proto_depIdxs = nil
diff --git a/types/known/typepb/type.pb.go b/types/known/typepb/type.pb.go
index aae8ab5..dc183e2 100644
--- a/types/known/typepb/type.pb.go
+++ b/types/known/typepb/type.pb.go
@@ -5,7 +5,7 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
+	prototype "google.golang.org/protobuf/reflect/prototype"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	anypb "google.golang.org/protobuf/types/known/anypb"
@@ -53,7 +53,7 @@
 }
 
 func (Syntax) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_type_proto_enumTypes[0].Descriptor()
+	return file_google_protobuf_type_proto_enumTypes[0].EnumDescriptor
 }
 
 func (x Syntax) Number() protoreflect.EnumNumber {
@@ -166,7 +166,7 @@
 }
 
 func (Field_Kind) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_type_proto_enumTypes[1].Descriptor()
+	return file_google_protobuf_type_proto_enumTypes[1].EnumDescriptor
 }
 
 func (x Field_Kind) Number() protoreflect.EnumNumber {
@@ -219,7 +219,7 @@
 }
 
 func (Field_Cardinality) Descriptor() protoreflect.EnumDescriptor {
-	return file_google_protobuf_type_proto_enumTypes[2].Descriptor()
+	return file_google_protobuf_type_proto_enumTypes[2].EnumDescriptor
 }
 
 func (x Field_Cardinality) Number() protoreflect.EnumNumber {
@@ -756,7 +756,7 @@
 	return file_google_protobuf_type_proto_rawDescData
 }
 
-var file_google_protobuf_type_proto_enumTypes = make([]protoreflect.EnumType, 3)
+var file_google_protobuf_type_proto_enumTypes = make([]prototype.Enum, 3)
 var file_google_protobuf_type_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
 var file_google_protobuf_type_proto_goTypes = []interface{}{
 	(Syntax)(0),                           // 0: google.protobuf.Syntax
@@ -771,19 +771,24 @@
 	(*anypb.Any)(nil),                     // 9: google.protobuf.Any
 }
 var file_google_protobuf_type_proto_depIdxs = []int32{
-	4, // google.protobuf.Type.fields:type_name -> google.protobuf.Field
-	7, // google.protobuf.Type.options:type_name -> google.protobuf.Option
-	8, // google.protobuf.Type.source_context:type_name -> google.protobuf.SourceContext
-	0, // google.protobuf.Type.syntax:type_name -> google.protobuf.Syntax
-	1, // google.protobuf.Field.kind:type_name -> google.protobuf.Field.Kind
-	2, // google.protobuf.Field.cardinality:type_name -> google.protobuf.Field.Cardinality
-	7, // google.protobuf.Field.options:type_name -> google.protobuf.Option
-	6, // google.protobuf.Enum.enumvalue:type_name -> google.protobuf.EnumValue
-	7, // google.protobuf.Enum.options:type_name -> google.protobuf.Option
-	8, // google.protobuf.Enum.source_context:type_name -> google.protobuf.SourceContext
-	0, // google.protobuf.Enum.syntax:type_name -> google.protobuf.Syntax
-	7, // google.protobuf.EnumValue.options:type_name -> google.protobuf.Option
-	9, // google.protobuf.Option.value:type_name -> google.protobuf.Any
+	4,  // google.protobuf.Type.fields:type_name -> google.protobuf.Field
+	7,  // google.protobuf.Type.options:type_name -> google.protobuf.Option
+	8,  // google.protobuf.Type.source_context:type_name -> google.protobuf.SourceContext
+	0,  // google.protobuf.Type.syntax:type_name -> google.protobuf.Syntax
+	1,  // google.protobuf.Field.kind:type_name -> google.protobuf.Field.Kind
+	2,  // google.protobuf.Field.cardinality:type_name -> google.protobuf.Field.Cardinality
+	7,  // google.protobuf.Field.options:type_name -> google.protobuf.Option
+	6,  // google.protobuf.Enum.enumvalue:type_name -> google.protobuf.EnumValue
+	7,  // google.protobuf.Enum.options:type_name -> google.protobuf.Option
+	8,  // google.protobuf.Enum.source_context:type_name -> google.protobuf.SourceContext
+	0,  // google.protobuf.Enum.syntax:type_name -> google.protobuf.Syntax
+	7,  // google.protobuf.EnumValue.options:type_name -> google.protobuf.Option
+	9,  // google.protobuf.Option.value:type_name -> google.protobuf.Any
+	13, // starting offset of method output_type sub-list
+	13, // starting offset of method input_type sub-list
+	13, // starting offset of extension type_name sub-list
+	13, // starting offset of extension extendee sub-list
+	0,  // starting offset of field type_name sub-list
 }
 
 func init() { file_google_protobuf_type_proto_init() }
@@ -791,15 +796,20 @@
 	if File_google_protobuf_type_proto != nil {
 		return
 	}
-	File_google_protobuf_type_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_type_proto_rawDesc,
-		GoTypes:            file_google_protobuf_type_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_type_proto_depIdxs,
-		EnumOutputTypes:    file_google_protobuf_type_proto_enumTypes,
-		MessageOutputTypes: file_google_protobuf_type_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_type_proto_rawDesc,
+			NumEnums:      3,
+			NumMessages:   5,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_type_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_type_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_type_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_type_proto = out.File
+	file_google_protobuf_type_proto_enumTypes = out.Enums
 	file_google_protobuf_type_proto_rawDesc = nil
 	file_google_protobuf_type_proto_goTypes = nil
 	file_google_protobuf_type_proto_depIdxs = nil
diff --git a/types/known/wrapperspb/wrappers.pb.go b/types/known/wrapperspb/wrappers.pb.go
index 9558926..a12b986 100644
--- a/types/known/wrapperspb/wrappers.pb.go
+++ b/types/known/wrapperspb/wrappers.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	sync "sync"
@@ -467,21 +466,32 @@
 	(*StringValue)(nil), // 7: google.protobuf.StringValue
 	(*BytesValue)(nil),  // 8: google.protobuf.BytesValue
 }
-var file_google_protobuf_wrappers_proto_depIdxs = []int32{}
+var file_google_protobuf_wrappers_proto_depIdxs = []int32{
+	0, // starting offset of method output_type sub-list
+	0, // starting offset of method input_type sub-list
+	0, // starting offset of extension type_name sub-list
+	0, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
+}
 
 func init() { file_google_protobuf_wrappers_proto_init() }
 func file_google_protobuf_wrappers_proto_init() {
 	if File_google_protobuf_wrappers_proto != nil {
 		return
 	}
-	File_google_protobuf_wrappers_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_wrappers_proto_rawDesc,
-		GoTypes:            file_google_protobuf_wrappers_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_wrappers_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_wrappers_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_wrappers_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_wrappers_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_wrappers_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_wrappers_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_wrappers_proto = out.File
 	file_google_protobuf_wrappers_proto_rawDesc = nil
 	file_google_protobuf_wrappers_proto_goTypes = nil
 	file_google_protobuf_wrappers_proto_depIdxs = nil
diff --git a/types/pluginpb/plugin.pb.go b/types/pluginpb/plugin.pb.go
index 1126c26..2f994f6 100644
--- a/types/pluginpb/plugin.pb.go
+++ b/types/pluginpb/plugin.pb.go
@@ -5,7 +5,6 @@
 
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
 	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	descriptorpb "google.golang.org/protobuf/types/descriptorpb"
@@ -397,6 +396,11 @@
 	4, // google.protobuf.compiler.CodeGeneratorRequest.proto_file:type_name -> google.protobuf.FileDescriptorProto
 	0, // google.protobuf.compiler.CodeGeneratorRequest.compiler_version:type_name -> google.protobuf.compiler.Version
 	3, // google.protobuf.compiler.CodeGeneratorResponse.file:type_name -> google.protobuf.compiler.CodeGeneratorResponse.File
+	3, // starting offset of method output_type sub-list
+	3, // starting offset of method input_type sub-list
+	3, // starting offset of extension type_name sub-list
+	3, // starting offset of extension extendee sub-list
+	0, // starting offset of field type_name sub-list
 }
 
 func init() { file_google_protobuf_compiler_plugin_proto_init() }
@@ -404,14 +408,19 @@
 	if File_google_protobuf_compiler_plugin_proto != nil {
 		return
 	}
-	File_google_protobuf_compiler_plugin_proto = protoimpl.FileBuilder{
-		RawDescriptor:      file_google_protobuf_compiler_plugin_proto_rawDesc,
-		GoTypes:            file_google_protobuf_compiler_plugin_proto_goTypes,
-		DependencyIndexes:  file_google_protobuf_compiler_plugin_proto_depIdxs,
-		MessageOutputTypes: file_google_protobuf_compiler_plugin_proto_msgTypes,
-		FilesRegistry:      protoregistry.GlobalFiles,
-		TypesRegistry:      protoregistry.GlobalTypes,
-	}.Init()
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			RawDescriptor: file_google_protobuf_compiler_plugin_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_protobuf_compiler_plugin_proto_goTypes,
+		DependencyIndexes: file_google_protobuf_compiler_plugin_proto_depIdxs,
+		MessageInfos:      file_google_protobuf_compiler_plugin_proto_msgTypes,
+	}.Build()
+	File_google_protobuf_compiler_plugin_proto = out.File
 	file_google_protobuf_compiler_plugin_proto_rawDesc = nil
 	file_google_protobuf_compiler_plugin_proto_goTypes = nil
 	file_google_protobuf_compiler_plugin_proto_depIdxs = nil
