diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index 5357224..63598aa 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -6,8 +6,6 @@
 package internal_gengo
 
 import (
-	"crypto/sha256"
-	"encoding/hex"
 	"fmt"
 	"go/ast"
 	"go/parser"
@@ -107,11 +105,8 @@
 		}
 	}
 
-	// Determine the name of the var holding the file descriptor:
-	//
-	//     fileDescriptor_<hash of filename>
-	filenameHash := sha256.Sum256([]byte(f.Desc.Path()))
-	f.descriptorRawVar = fmt.Sprintf("fileDescriptor_%s", hex.EncodeToString(filenameHash[:8]))
+	// Determine the name of the var holding the file descriptor.
+	f.descriptorRawVar = "xxx_" + f.GoDescriptorIdent.GoName + "_rawdesc"
 	f.descriptorGzipVar = f.descriptorRawVar + "_gzipped"
 
 	g.P("// Code generated by protoc-gen-go. DO NOT EDIT.")
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
index 4044ee7..fe40d90 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
@@ -24,7 +24,7 @@
 )
 
 func (e AnnotationsTestEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_annotations_annotations_enumTypes[0]
+	return xxx_File_annotations_annotations_proto_enumTypes[0]
 }
 func (e AnnotationsTestEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -58,7 +58,7 @@
 }
 
 func (AnnotationsTestEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_21dfaf6fd39fa3b7_gzipped, []int{0}
+	return xxx_File_annotations_annotations_proto_rawdesc_gzipped, []int{0}
 }
 
 type AnnotationsTestMessage struct {
@@ -69,13 +69,13 @@
 }
 
 func (m *AnnotationsTestMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_annotations_annotations_messageTypes[0].MessageOf(m)
+	return xxx_File_annotations_annotations_proto_messageTypes[0].MessageOf(m)
 }
 func (m *AnnotationsTestMessage) Reset()         { *m = AnnotationsTestMessage{} }
 func (m *AnnotationsTestMessage) String() string { return proto.CompactTextString(m) }
 func (*AnnotationsTestMessage) ProtoMessage()    {}
 func (*AnnotationsTestMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_21dfaf6fd39fa3b7_gzipped, []int{0}
+	return xxx_File_annotations_annotations_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *AnnotationsTestMessage) XXX_Unmarshal(b []byte) error {
@@ -104,12 +104,12 @@
 }
 
 func init() {
-	proto.RegisterFile("annotations/annotations.proto", fileDescriptor_21dfaf6fd39fa3b7_gzipped)
+	proto.RegisterFile("annotations/annotations.proto", xxx_File_annotations_annotations_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.annotations.AnnotationsTestEnum", AnnotationsTestEnum_name, AnnotationsTestEnum_value)
 	proto.RegisterType((*AnnotationsTestMessage)(nil), "goproto.protoc.annotations.AnnotationsTestMessage")
 }
 
-var fileDescriptor_21dfaf6fd39fa3b7 = []byte{
+var xxx_File_annotations_annotations_proto_rawdesc = []byte{
 	// 265 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1d, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e,
 	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
@@ -130,34 +130,34 @@
 	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
 }
 
-var fileDescriptor_21dfaf6fd39fa3b7_gzipped = protoapi.CompressGZIP(fileDescriptor_21dfaf6fd39fa3b7)
+var xxx_File_annotations_annotations_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_annotations_annotations_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_annotations_annotations protoreflect.FileDescriptor
+var File_annotations_annotations_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_annotations_annotations_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_annotations_annotations_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_annotations_annotations_goTypes = []interface{}{
+var xxx_File_annotations_annotations_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_annotations_annotations_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_annotations_annotations_proto_goTypes = []interface{}{
 	(AnnotationsTestEnum)(0),       // 0: goproto.protoc.annotations.AnnotationsTestEnum
 	(*AnnotationsTestMessage)(nil), // 1: goproto.protoc.annotations.AnnotationsTestMessage
 }
-var xxx_ProtoFile_annotations_annotations_depIdxs = []int32{}
+var xxx_File_annotations_annotations_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_annotations_annotations = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_21dfaf6fd39fa3b7,
-		GoTypes:            xxx_ProtoFile_annotations_annotations_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_annotations_annotations_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_annotations_annotations_enumTypes[:],
+	File_annotations_annotations_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_annotations_annotations_proto_rawdesc,
+		GoTypes:            xxx_File_annotations_annotations_proto_goTypes,
+		DependencyIndexes:  xxx_File_annotations_annotations_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_annotations_annotations_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_annotations_annotations_goTypes[1:][:1]
+	messageGoTypes := xxx_File_annotations_annotations_proto_goTypes[1:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_annotations_annotations_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_annotations_annotations_messageTypes[i].PBType = mt
+		xxx_File_annotations_annotations_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_annotations_annotations_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_annotations_annotations_goTypes = nil
-	xxx_ProtoFile_annotations_annotations_depIdxs = nil
+	xxx_File_annotations_annotations_proto_goTypes = nil
+	xxx_File_annotations_annotations_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/comments/comments.pb.go b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
index 164fa39..dfa715a 100644
--- a/cmd/protoc-gen-go/testdata/comments/comments.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
@@ -35,13 +35,13 @@
 }
 
 func (m *Message1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_comments_comments_messageTypes[0].MessageOf(m)
+	return xxx_File_comments_comments_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message1) Reset()         { *m = Message1{} }
 func (m *Message1) String() string { return proto.CompactTextString(m) }
 func (*Message1) ProtoMessage()    {}
 func (*Message1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_885e8293f1fab554_gzipped, []int{0}
+	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Message1) XXX_Unmarshal(b []byte) error {
@@ -108,13 +108,13 @@
 }
 
 func (m *Message2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_comments_comments_messageTypes[1].MessageOf(m)
+	return xxx_File_comments_comments_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Message2) Reset()         { *m = Message2{} }
 func (m *Message2) String() string { return proto.CompactTextString(m) }
 func (*Message2) ProtoMessage()    {}
 func (*Message2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_885e8293f1fab554_gzipped, []int{1}
+	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *Message2) XXX_Unmarshal(b []byte) error {
@@ -143,13 +143,13 @@
 }
 
 func (m *Message1_Message1A) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_comments_comments_messageTypes[2].MessageOf(m)
+	return xxx_File_comments_comments_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Message1_Message1A) Reset()         { *m = Message1_Message1A{} }
 func (m *Message1_Message1A) String() string { return proto.CompactTextString(m) }
 func (*Message1_Message1A) ProtoMessage()    {}
 func (*Message1_Message1A) Descriptor() ([]byte, []int) {
-	return fileDescriptor_885e8293f1fab554_gzipped, []int{0, 0}
+	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *Message1_Message1A) XXX_Unmarshal(b []byte) error {
@@ -178,13 +178,13 @@
 }
 
 func (m *Message1_Message1B) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_comments_comments_messageTypes[3].MessageOf(m)
+	return xxx_File_comments_comments_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Message1_Message1B) Reset()         { *m = Message1_Message1B{} }
 func (m *Message1_Message1B) String() string { return proto.CompactTextString(m) }
 func (*Message1_Message1B) ProtoMessage()    {}
 func (*Message1_Message1B) Descriptor() ([]byte, []int) {
-	return fileDescriptor_885e8293f1fab554_gzipped, []int{0, 1}
+	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{0, 1}
 }
 
 func (m *Message1_Message1B) XXX_Unmarshal(b []byte) error {
@@ -213,13 +213,13 @@
 }
 
 func (m *Message2_Message2A) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_comments_comments_messageTypes[4].MessageOf(m)
+	return xxx_File_comments_comments_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Message2_Message2A) Reset()         { *m = Message2_Message2A{} }
 func (m *Message2_Message2A) String() string { return proto.CompactTextString(m) }
 func (*Message2_Message2A) ProtoMessage()    {}
 func (*Message2_Message2A) Descriptor() ([]byte, []int) {
-	return fileDescriptor_885e8293f1fab554_gzipped, []int{1, 0}
+	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{1, 0}
 }
 
 func (m *Message2_Message2A) XXX_Unmarshal(b []byte) error {
@@ -248,13 +248,13 @@
 }
 
 func (m *Message2_Message2B) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_comments_comments_messageTypes[5].MessageOf(m)
+	return xxx_File_comments_comments_proto_messageTypes[5].MessageOf(m)
 }
 func (m *Message2_Message2B) Reset()         { *m = Message2_Message2B{} }
 func (m *Message2_Message2B) String() string { return proto.CompactTextString(m) }
 func (*Message2_Message2B) ProtoMessage()    {}
 func (*Message2_Message2B) Descriptor() ([]byte, []int) {
-	return fileDescriptor_885e8293f1fab554_gzipped, []int{1, 1}
+	return xxx_File_comments_comments_proto_rawdesc_gzipped, []int{1, 1}
 }
 
 func (m *Message2_Message2B) XXX_Unmarshal(b []byte) error {
@@ -276,7 +276,7 @@
 var xxx_messageInfo_Message2_Message2B proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("comments/comments.proto", fileDescriptor_885e8293f1fab554_gzipped)
+	proto.RegisterFile("comments/comments.proto", xxx_File_comments_comments_proto_rawdesc_gzipped)
 	proto.RegisterType((*Message1)(nil), "goproto.protoc.comments.Message1")
 	proto.RegisterType((*Message2)(nil), "goproto.protoc.comments.Message2")
 	proto.RegisterType((*Message1_Message1A)(nil), "goproto.protoc.comments.Message1.Message1A")
@@ -285,7 +285,7 @@
 	proto.RegisterType((*Message2_Message2B)(nil), "goproto.protoc.comments.Message2.Message2B")
 }
 
-var fileDescriptor_885e8293f1fab554 = []byte{
+var xxx_File_comments_comments_proto_rawdesc = []byte{
 	// 272 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65,
 	0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x67, 0x6f, 0x70, 0x72, 0x6f,
@@ -306,14 +306,14 @@
 	0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73,
 }
 
-var fileDescriptor_885e8293f1fab554_gzipped = protoapi.CompressGZIP(fileDescriptor_885e8293f1fab554)
+var xxx_File_comments_comments_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_comments_comments_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_comments_comments protoreflect.FileDescriptor
+var File_comments_comments_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_comments_comments_messageTypes [6]protoimpl.MessageType
-var xxx_ProtoFile_comments_comments_goTypes = []interface{}{
+var xxx_File_comments_comments_proto_messageTypes [6]protoimpl.MessageType
+var xxx_File_comments_comments_proto_goTypes = []interface{}{
 	(*Message1)(nil),           // 0: goproto.protoc.comments.Message1
 	(*Message2)(nil),           // 1: goproto.protoc.comments.Message2
 	(*Message1_Message1A)(nil), // 2: goproto.protoc.comments.Message1.Message1A
@@ -321,21 +321,21 @@
 	(*Message2_Message2A)(nil), // 4: goproto.protoc.comments.Message2.Message2A
 	(*Message2_Message2B)(nil), // 5: goproto.protoc.comments.Message2.Message2B
 }
-var xxx_ProtoFile_comments_comments_depIdxs = []int32{}
+var xxx_File_comments_comments_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [6]protoreflect.MessageType
-	ProtoFile_comments_comments = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_885e8293f1fab554,
-		GoTypes:            xxx_ProtoFile_comments_comments_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_comments_comments_depIdxs,
+	File_comments_comments_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_comments_comments_proto_rawdesc,
+		GoTypes:            xxx_File_comments_comments_proto_goTypes,
+		DependencyIndexes:  xxx_File_comments_comments_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_comments_comments_goTypes[0:][:6]
+	messageGoTypes := xxx_File_comments_comments_proto_goTypes[0:][:6]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_comments_comments_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_comments_comments_messageTypes[i].PBType = mt
+		xxx_File_comments_comments_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_comments_comments_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_comments_comments_goTypes = nil
-	xxx_ProtoFile_comments_comments_depIdxs = nil
+	xxx_File_comments_comments_proto_goTypes = nil
+	xxx_File_comments_comments_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
index 6a662d9..1f74a58 100644
--- a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
@@ -23,7 +23,7 @@
 )
 
 func (e DeprecatedEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_comments_deprecated_enumTypes[0]
+	return xxx_File_comments_deprecated_proto_enumTypes[0]
 }
 func (e DeprecatedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -42,7 +42,7 @@
 }
 
 func (DeprecatedEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_0336e614ee2de5f7_gzipped, []int{0}
+	return xxx_File_comments_deprecated_proto_rawdesc_gzipped, []int{0}
 }
 
 // Deprecated: Do not use.
@@ -54,13 +54,13 @@
 }
 
 func (m *DeprecatedMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_comments_deprecated_messageTypes[0].MessageOf(m)
+	return xxx_File_comments_deprecated_proto_messageTypes[0].MessageOf(m)
 }
 func (m *DeprecatedMessage) Reset()         { *m = DeprecatedMessage{} }
 func (m *DeprecatedMessage) String() string { return proto.CompactTextString(m) }
 func (*DeprecatedMessage) ProtoMessage()    {}
 func (*DeprecatedMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0336e614ee2de5f7_gzipped, []int{0}
+	return xxx_File_comments_deprecated_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *DeprecatedMessage) XXX_Unmarshal(b []byte) error {
@@ -90,12 +90,12 @@
 }
 
 func init() {
-	proto.RegisterFile("comments/deprecated.proto", fileDescriptor_0336e614ee2de5f7_gzipped)
+	proto.RegisterFile("comments/deprecated.proto", xxx_File_comments_deprecated_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.comments.DeprecatedEnum", DeprecatedEnum_name, DeprecatedEnum_value)
 	proto.RegisterType((*DeprecatedMessage)(nil), "goproto.protoc.comments.DeprecatedMessage")
 }
 
-var fileDescriptor_0336e614ee2de5f7 = []byte{
+var xxx_File_comments_deprecated_proto_rawdesc = []byte{
 	// 246 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x70, 0x72, 0x65,
 	0x63, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x67, 0x6f, 0x70,
@@ -115,34 +115,34 @@
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_0336e614ee2de5f7_gzipped = protoapi.CompressGZIP(fileDescriptor_0336e614ee2de5f7)
+var xxx_File_comments_deprecated_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_comments_deprecated_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_comments_deprecated protoreflect.FileDescriptor
+var File_comments_deprecated_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_comments_deprecated_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_comments_deprecated_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_comments_deprecated_goTypes = []interface{}{
+var xxx_File_comments_deprecated_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_comments_deprecated_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_comments_deprecated_proto_goTypes = []interface{}{
 	(DeprecatedEnum)(0),       // 0: goproto.protoc.comments.DeprecatedEnum
 	(*DeprecatedMessage)(nil), // 1: goproto.protoc.comments.DeprecatedMessage
 }
-var xxx_ProtoFile_comments_deprecated_depIdxs = []int32{}
+var xxx_File_comments_deprecated_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_comments_deprecated = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_0336e614ee2de5f7,
-		GoTypes:            xxx_ProtoFile_comments_deprecated_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_comments_deprecated_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_comments_deprecated_enumTypes[:],
+	File_comments_deprecated_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_comments_deprecated_proto_rawdesc,
+		GoTypes:            xxx_File_comments_deprecated_proto_goTypes,
+		DependencyIndexes:  xxx_File_comments_deprecated_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_comments_deprecated_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_comments_deprecated_goTypes[1:][:1]
+	messageGoTypes := xxx_File_comments_deprecated_proto_goTypes[1:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_comments_deprecated_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_comments_deprecated_messageTypes[i].PBType = mt
+		xxx_File_comments_deprecated_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_comments_deprecated_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_comments_deprecated_goTypes = nil
-	xxx_ProtoFile_comments_deprecated_depIdxs = nil
+	xxx_File_comments_deprecated_proto_goTypes = nil
+	xxx_File_comments_deprecated_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
index 2fa4f03..6d3a2c3 100644
--- a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
@@ -26,13 +26,13 @@
 }
 
 func (m *BaseMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_base_base_messageTypes[0].MessageOf(m)
+	return xxx_File_extensions_base_base_proto_messageTypes[0].MessageOf(m)
 }
 func (m *BaseMessage) Reset()         { *m = BaseMessage{} }
 func (m *BaseMessage) String() string { return proto.CompactTextString(m) }
 func (*BaseMessage) ProtoMessage()    {}
 func (*BaseMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_aebb28f8d5a04466_gzipped, []int{0}
+	return xxx_File_extensions_base_base_proto_rawdesc_gzipped, []int{0}
 }
 
 var extRange_BaseMessage = []proto.ExtensionRange{
@@ -77,13 +77,13 @@
 }
 
 func (m *MessageSetWireFormatMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_base_base_messageTypes[1].MessageOf(m)
+	return xxx_File_extensions_base_base_proto_messageTypes[1].MessageOf(m)
 }
 func (m *MessageSetWireFormatMessage) Reset()         { *m = MessageSetWireFormatMessage{} }
 func (m *MessageSetWireFormatMessage) String() string { return proto.CompactTextString(m) }
 func (*MessageSetWireFormatMessage) ProtoMessage()    {}
 func (*MessageSetWireFormatMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_aebb28f8d5a04466_gzipped, []int{1}
+	return xxx_File_extensions_base_base_proto_rawdesc_gzipped, []int{1}
 }
 
 var extRange_MessageSetWireFormatMessage = []proto.ExtensionRange{
@@ -113,12 +113,12 @@
 var xxx_messageInfo_MessageSetWireFormatMessage proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("extensions/base/base.proto", fileDescriptor_aebb28f8d5a04466_gzipped)
+	proto.RegisterFile("extensions/base/base.proto", xxx_File_extensions_base_base_proto_rawdesc_gzipped)
 	proto.RegisterType((*BaseMessage)(nil), "goproto.protoc.extension.base.BaseMessage")
 	proto.RegisterType((*MessageSetWireFormatMessage)(nil), "goproto.protoc.extension.base.MessageSetWireFormatMessage")
 }
 
-var fileDescriptor_aebb28f8d5a04466 = []byte{
+var xxx_File_extensions_base_base_proto_rawdesc = []byte{
 	// 233 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x62, 0x61, 0x73,
 	0x65, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f,
@@ -137,32 +137,32 @@
 	0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65,
 }
 
-var fileDescriptor_aebb28f8d5a04466_gzipped = protoapi.CompressGZIP(fileDescriptor_aebb28f8d5a04466)
+var xxx_File_extensions_base_base_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_extensions_base_base_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_extensions_base_base protoreflect.FileDescriptor
+var File_extensions_base_base_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_extensions_base_base_messageTypes [2]protoimpl.MessageType
-var xxx_ProtoFile_extensions_base_base_goTypes = []interface{}{
+var xxx_File_extensions_base_base_proto_messageTypes [2]protoimpl.MessageType
+var xxx_File_extensions_base_base_proto_goTypes = []interface{}{
 	(*BaseMessage)(nil),                 // 0: goproto.protoc.extension.base.BaseMessage
 	(*MessageSetWireFormatMessage)(nil), // 1: goproto.protoc.extension.base.MessageSetWireFormatMessage
 }
-var xxx_ProtoFile_extensions_base_base_depIdxs = []int32{}
+var xxx_File_extensions_base_base_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [2]protoreflect.MessageType
-	ProtoFile_extensions_base_base = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_aebb28f8d5a04466,
-		GoTypes:            xxx_ProtoFile_extensions_base_base_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_extensions_base_base_depIdxs,
+	File_extensions_base_base_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_extensions_base_base_proto_rawdesc,
+		GoTypes:            xxx_File_extensions_base_base_proto_goTypes,
+		DependencyIndexes:  xxx_File_extensions_base_base_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_extensions_base_base_goTypes[0:][:2]
+	messageGoTypes := xxx_File_extensions_base_base_proto_goTypes[0:][:2]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_extensions_base_base_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_extensions_base_base_messageTypes[i].PBType = mt
+		xxx_File_extensions_base_base_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_extensions_base_base_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_extensions_base_base_goTypes = nil
-	xxx_ProtoFile_extensions_base_base_depIdxs = nil
+	xxx_File_extensions_base_base_proto_goTypes = nil
+	xxx_File_extensions_base_base_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
index a8f9c0d..97141c6 100644
--- a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
@@ -26,7 +26,7 @@
 )
 
 func (e Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_extensions_ext_ext_enumTypes[0]
+	return xxx_File_extensions_ext_ext_proto_enumTypes[0]
 }
 func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -60,7 +60,7 @@
 }
 
 func (Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{0}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{0}
 }
 
 type Message struct {
@@ -71,13 +71,13 @@
 }
 
 func (m *Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[0].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
 func (*Message) ProtoMessage()    {}
 func (*Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{0}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Message) XXX_Unmarshal(b []byte) error {
@@ -113,13 +113,13 @@
 }
 
 func (m *ExtensionGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[1].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[1].MessageOf(m)
 }
 func (m *ExtensionGroup) Reset()         { *m = ExtensionGroup{} }
 func (m *ExtensionGroup) String() string { return proto.CompactTextString(m) }
 func (*ExtensionGroup) ProtoMessage()    {}
 func (*ExtensionGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{1}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *ExtensionGroup) XXX_Unmarshal(b []byte) error {
@@ -155,13 +155,13 @@
 }
 
 func (m *ExtendingMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[2].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[2].MessageOf(m)
 }
 func (m *ExtendingMessage) Reset()         { *m = ExtendingMessage{} }
 func (m *ExtendingMessage) String() string { return proto.CompactTextString(m) }
 func (*ExtendingMessage) ProtoMessage()    {}
 func (*ExtendingMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{2}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{2}
 }
 
 func (m *ExtendingMessage) XXX_Unmarshal(b []byte) error {
@@ -190,13 +190,13 @@
 }
 
 func (m *RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[3].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[3].MessageOf(m)
 }
 func (m *RepeatedGroup) Reset()         { *m = RepeatedGroup{} }
 func (m *RepeatedGroup) String() string { return proto.CompactTextString(m) }
 func (*RepeatedGroup) ProtoMessage()    {}
 func (*RepeatedGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{3}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{3}
 }
 
 func (m *RepeatedGroup) XXX_Unmarshal(b []byte) error {
@@ -233,13 +233,13 @@
 }
 
 func (m *Extendable) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[4].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Extendable) Reset()         { *m = Extendable{} }
 func (m *Extendable) String() string { return proto.CompactTextString(m) }
 func (*Extendable) ProtoMessage()    {}
 func (*Extendable) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{4}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{4}
 }
 
 var extRange_Extendable = []proto.ExtensionRange{
@@ -276,13 +276,13 @@
 }
 
 func (m *MessageSetWireFormatExtension) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[5].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[5].MessageOf(m)
 }
 func (m *MessageSetWireFormatExtension) Reset()         { *m = MessageSetWireFormatExtension{} }
 func (m *MessageSetWireFormatExtension) String() string { return proto.CompactTextString(m) }
 func (*MessageSetWireFormatExtension) ProtoMessage()    {}
 func (*MessageSetWireFormatExtension) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{5}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{5}
 }
 
 func (m *MessageSetWireFormatExtension) XXX_Unmarshal(b []byte) error {
@@ -310,13 +310,13 @@
 }
 
 func (m *Message_M) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[6].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[6].MessageOf(m)
 }
 func (m *Message_M) Reset()         { *m = Message_M{} }
 func (m *Message_M) String() string { return proto.CompactTextString(m) }
 func (*Message_M) ProtoMessage()    {}
 func (*Message_M) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{0, 0}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *Message_M) XXX_Unmarshal(b []byte) error {
@@ -344,7 +344,7 @@
 }
 
 func (m *ExtendingMessage_ExtendingMessageSubmessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_ext_ext_messageTypes[7].MessageOf(m)
+	return xxx_File_extensions_ext_ext_proto_messageTypes[7].MessageOf(m)
 }
 func (m *ExtendingMessage_ExtendingMessageSubmessage) Reset() {
 	*m = ExtendingMessage_ExtendingMessageSubmessage{}
@@ -354,7 +354,7 @@
 }
 func (*ExtendingMessage_ExtendingMessageSubmessage) ProtoMessage() {}
 func (*ExtendingMessage_ExtendingMessageSubmessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bf470ef4907b23cb_gzipped, []int{2, 0}
+	return xxx_File_extensions_ext_ext_proto_rawdesc_gzipped, []int{2, 0}
 }
 
 func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Unmarshal(b []byte) error {
@@ -772,7 +772,7 @@
 }
 
 func init() {
-	proto.RegisterFile("extensions/ext/ext.proto", fileDescriptor_bf470ef4907b23cb_gzipped)
+	proto.RegisterFile("extensions/ext/ext.proto", xxx_File_extensions_ext_ext_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.extension.ext.Enum", Enum_name, Enum_value)
 	proto.RegisterType((*Message)(nil), "goproto.protoc.extension.ext.Message")
 	proto.RegisterType((*ExtensionGroup)(nil), "goproto.protoc.extension.ext.ExtensionGroup")
@@ -828,7 +828,7 @@
 	proto.RegisterExtension(E_MessageSetWireFormatExtension_MessageSetExtension)
 }
 
-var fileDescriptor_bf470ef4907b23cb = []byte{
+var xxx_File_extensions_ext_ext_proto_rawdesc = []byte{
 	// 4996 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x18, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x65, 0x78, 0x74,
 	0x2f, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x67, 0x6f, 0x70, 0x72,
@@ -1145,15 +1145,15 @@
 	0x2f, 0x65, 0x78, 0x74,
 }
 
-var fileDescriptor_bf470ef4907b23cb_gzipped = protoapi.CompressGZIP(fileDescriptor_bf470ef4907b23cb)
+var xxx_File_extensions_ext_ext_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_extensions_ext_ext_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_extensions_ext_ext protoreflect.FileDescriptor
+var File_extensions_ext_ext_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_extensions_ext_ext_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_extensions_ext_ext_messageTypes [8]protoimpl.MessageType
-var xxx_ProtoFile_extensions_ext_ext_goTypes = []interface{}{
+var xxx_File_extensions_ext_ext_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_extensions_ext_ext_proto_messageTypes [8]protoimpl.MessageType
+var xxx_File_extensions_ext_ext_proto_goTypes = []interface{}{
 	(Enum)(0),                             // 0: goproto.protoc.extension.ext.Enum
 	(*Message)(nil),                       // 1: goproto.protoc.extension.ext.Message
 	(*ExtensionGroup)(nil),                // 2: goproto.protoc.extension.ext.ExtensionGroup
@@ -1167,7 +1167,7 @@
 	(*base.MessageSetWireFormatMessage)(nil),            // 10: goproto.protoc.extension.base.MessageSetWireFormatMessage
 	(*extra.ExtraMessage)(nil),                          // 11: goproto.protoc.extension.extra.ExtraMessage
 }
-var xxx_ProtoFile_extensions_ext_ext_depIdxs = []int32{
+var xxx_File_extensions_ext_ext_proto_depIdxs = []int32{
 	9,  // goproto.protoc.extension.ext.extension_bool:extendee -> goproto.protoc.extension.base.BaseMessage
 	9,  // goproto.protoc.extension.ext.extension_enum:extendee -> goproto.protoc.extension.base.BaseMessage
 	9,  // goproto.protoc.extension.ext.extension_int32:extendee -> goproto.protoc.extension.base.BaseMessage
@@ -1229,18 +1229,18 @@
 func init() {
 	var messageTypes [8]protoreflect.MessageType
 	var extensionTypes [44]protoreflect.ExtensionType
-	ProtoFile_extensions_ext_ext = protoimpl.FileBuilder{
-		RawDescriptor:        fileDescriptor_bf470ef4907b23cb,
-		GoTypes:              xxx_ProtoFile_extensions_ext_ext_goTypes,
-		DependencyIndexes:    xxx_ProtoFile_extensions_ext_ext_depIdxs,
-		EnumOutputTypes:      xxx_ProtoFile_extensions_ext_ext_enumTypes[:],
+	File_extensions_ext_ext_proto = protoimpl.FileBuilder{
+		RawDescriptor:        xxx_File_extensions_ext_ext_proto_rawdesc,
+		GoTypes:              xxx_File_extensions_ext_ext_proto_goTypes,
+		DependencyIndexes:    xxx_File_extensions_ext_ext_proto_depIdxs,
+		EnumOutputTypes:      xxx_File_extensions_ext_ext_proto_enumTypes[:],
 		MessageOutputTypes:   messageTypes[:],
 		ExtensionOutputTypes: extensionTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_extensions_ext_ext_goTypes[1:][:8]
+	messageGoTypes := xxx_File_extensions_ext_ext_proto_goTypes[1:][:8]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_extensions_ext_ext_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_extensions_ext_ext_messageTypes[i].PBType = mt
+		xxx_File_extensions_ext_ext_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_extensions_ext_ext_proto_messageTypes[i].PBType = mt
 	}
 	E_ExtensionBool.Type = extensionTypes[0]
 	E_ExtensionEnum.Type = extensionTypes[1]
@@ -1286,6 +1286,6 @@
 	E_ExtendingMessage_ExtendingMessageString.Type = extensionTypes[41]
 	E_ExtendingMessage_ExtendingMessageSubmessage.Type = extensionTypes[42]
 	E_MessageSetWireFormatExtension_MessageSetExtension.Type = extensionTypes[43]
-	xxx_ProtoFile_extensions_ext_ext_goTypes = nil
-	xxx_ProtoFile_extensions_ext_ext_depIdxs = nil
+	xxx_File_extensions_ext_ext_proto_goTypes = nil
+	xxx_File_extensions_ext_ext_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
index 8394cc6..4f88fdf 100644
--- a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
@@ -25,13 +25,13 @@
 }
 
 func (m *ExtraMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_extra_extra_messageTypes[0].MessageOf(m)
+	return xxx_File_extensions_extra_extra_proto_messageTypes[0].MessageOf(m)
 }
 func (m *ExtraMessage) Reset()         { *m = ExtraMessage{} }
 func (m *ExtraMessage) String() string { return proto.CompactTextString(m) }
 func (*ExtraMessage) ProtoMessage()    {}
 func (*ExtraMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_496c2a5e9c1e8739_gzipped, []int{0}
+	return xxx_File_extensions_extra_extra_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *ExtraMessage) XXX_Unmarshal(b []byte) error {
@@ -60,11 +60,11 @@
 }
 
 func init() {
-	proto.RegisterFile("extensions/extra/extra.proto", fileDescriptor_496c2a5e9c1e8739_gzipped)
+	proto.RegisterFile("extensions/extra/extra.proto", xxx_File_extensions_extra_extra_proto_rawdesc_gzipped)
 	proto.RegisterType((*ExtraMessage)(nil), "goproto.protoc.extension.extra.ExtraMessage")
 }
 
-var fileDescriptor_496c2a5e9c1e8739 = []byte{
+var xxx_File_extensions_extra_extra_proto_rawdesc = []byte{
 	// 175 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1c, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x65, 0x78, 0x74,
 	0x72, 0x61, 0x2f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e,
@@ -79,31 +79,31 @@
 	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x65, 0x78, 0x74, 0x72, 0x61,
 }
 
-var fileDescriptor_496c2a5e9c1e8739_gzipped = protoapi.CompressGZIP(fileDescriptor_496c2a5e9c1e8739)
+var xxx_File_extensions_extra_extra_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_extensions_extra_extra_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_extensions_extra_extra protoreflect.FileDescriptor
+var File_extensions_extra_extra_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_extensions_extra_extra_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_extensions_extra_extra_goTypes = []interface{}{
+var xxx_File_extensions_extra_extra_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_extensions_extra_extra_proto_goTypes = []interface{}{
 	(*ExtraMessage)(nil), // 0: goproto.protoc.extension.extra.ExtraMessage
 }
-var xxx_ProtoFile_extensions_extra_extra_depIdxs = []int32{}
+var xxx_File_extensions_extra_extra_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_extensions_extra_extra = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_496c2a5e9c1e8739,
-		GoTypes:            xxx_ProtoFile_extensions_extra_extra_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_extensions_extra_extra_depIdxs,
+	File_extensions_extra_extra_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_extensions_extra_extra_proto_rawdesc,
+		GoTypes:            xxx_File_extensions_extra_extra_proto_goTypes,
+		DependencyIndexes:  xxx_File_extensions_extra_extra_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_extensions_extra_extra_goTypes[0:][:1]
+	messageGoTypes := xxx_File_extensions_extra_extra_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_extensions_extra_extra_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_extensions_extra_extra_messageTypes[i].PBType = mt
+		xxx_File_extensions_extra_extra_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_extensions_extra_extra_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_extensions_extra_extra_goTypes = nil
-	xxx_ProtoFile_extensions_extra_extra_depIdxs = nil
+	xxx_File_extensions_extra_extra_proto_goTypes = nil
+	xxx_File_extensions_extra_extra_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
index 8a66c05..c9bc7bc 100644
--- a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
@@ -25,7 +25,7 @@
 )
 
 func (e Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_extensions_proto3_ext3_enumTypes[0]
+	return xxx_File_extensions_proto3_ext3_proto_enumTypes[0]
 }
 func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -44,7 +44,7 @@
 }
 
 func (Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_3db31bb248c8865e_gzipped, []int{0}
+	return xxx_File_extensions_proto3_ext3_proto_rawdesc_gzipped, []int{0}
 }
 
 type Message struct {
@@ -54,13 +54,13 @@
 }
 
 func (m *Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_extensions_proto3_ext3_messageTypes[0].MessageOf(m)
+	return xxx_File_extensions_proto3_ext3_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
 func (*Message) ProtoMessage()    {}
 func (*Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3db31bb248c8865e_gzipped, []int{0}
+	return xxx_File_extensions_proto3_ext3_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Message) XXX_Unmarshal(b []byte) error {
@@ -388,7 +388,7 @@
 }
 
 func init() {
-	proto.RegisterFile("extensions/proto3/ext3.proto", fileDescriptor_3db31bb248c8865e_gzipped)
+	proto.RegisterFile("extensions/proto3/ext3.proto", xxx_File_extensions_proto3_ext3_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.extension.proto3.Enum", Enum_name, Enum_value)
 	proto.RegisterType((*Message)(nil), "goproto.protoc.extension.proto3.Message")
 	proto.RegisterExtension(E_ExtensionBool)
@@ -427,7 +427,7 @@
 	proto.RegisterExtension(E_RepeatedExtension_Message)
 }
 
-var fileDescriptor_3db31bb248c8865e = []byte{
+var xxx_File_extensions_proto3_ext3_proto_rawdesc = []byte{
 	// 3278 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1c, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x33, 0x2f, 0x65, 0x78, 0x74, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f,
@@ -636,20 +636,20 @@
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_3db31bb248c8865e_gzipped = protoapi.CompressGZIP(fileDescriptor_3db31bb248c8865e)
+var xxx_File_extensions_proto3_ext3_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_extensions_proto3_ext3_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_extensions_proto3_ext3 protoreflect.FileDescriptor
+var File_extensions_proto3_ext3_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_extensions_proto3_ext3_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_extensions_proto3_ext3_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_extensions_proto3_ext3_goTypes = []interface{}{
+var xxx_File_extensions_proto3_ext3_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_extensions_proto3_ext3_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_extensions_proto3_ext3_proto_goTypes = []interface{}{
 	(Enum)(0),                         // 0: goproto.protoc.extension.proto3.Enum
 	(*Message)(nil),                   // 1: goproto.protoc.extension.proto3.Message
 	(*descriptor.MessageOptions)(nil), // 2: google.protobuf.MessageOptions
 }
-var xxx_ProtoFile_extensions_proto3_ext3_depIdxs = []int32{
+var xxx_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
@@ -693,18 +693,18 @@
 func init() {
 	var messageTypes [1]protoreflect.MessageType
 	var extensionTypes [34]protoreflect.ExtensionType
-	ProtoFile_extensions_proto3_ext3 = protoimpl.FileBuilder{
-		RawDescriptor:        fileDescriptor_3db31bb248c8865e,
-		GoTypes:              xxx_ProtoFile_extensions_proto3_ext3_goTypes,
-		DependencyIndexes:    xxx_ProtoFile_extensions_proto3_ext3_depIdxs,
-		EnumOutputTypes:      xxx_ProtoFile_extensions_proto3_ext3_enumTypes[:],
+	File_extensions_proto3_ext3_proto = protoimpl.FileBuilder{
+		RawDescriptor:        xxx_File_extensions_proto3_ext3_proto_rawdesc,
+		GoTypes:              xxx_File_extensions_proto3_ext3_proto_goTypes,
+		DependencyIndexes:    xxx_File_extensions_proto3_ext3_proto_depIdxs,
+		EnumOutputTypes:      xxx_File_extensions_proto3_ext3_proto_enumTypes[:],
 		MessageOutputTypes:   messageTypes[:],
 		ExtensionOutputTypes: extensionTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_extensions_proto3_ext3_goTypes[1:][:1]
+	messageGoTypes := xxx_File_extensions_proto3_ext3_proto_goTypes[1:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_extensions_proto3_ext3_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_extensions_proto3_ext3_messageTypes[i].PBType = mt
+		xxx_File_extensions_proto3_ext3_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_extensions_proto3_ext3_proto_messageTypes[i].PBType = mt
 	}
 	E_ExtensionBool.Type = extensionTypes[0]
 	E_ExtensionEnum.Type = extensionTypes[1]
@@ -740,6 +740,6 @@
 	E_RepeatedExtensionString.Type = extensionTypes[31]
 	E_RepeatedExtensionBytes.Type = extensionTypes[32]
 	E_RepeatedExtension_Message.Type = extensionTypes[33]
-	xxx_ProtoFile_extensions_proto3_ext3_goTypes = nil
-	xxx_ProtoFile_extensions_proto3_ext3_depIdxs = nil
+	xxx_File_extensions_proto3_ext3_proto_goTypes = nil
+	xxx_File_extensions_proto3_ext3_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
index 152119c..c044d1c 100644
--- a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
+++ b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
@@ -63,13 +63,13 @@
 }
 
 func (m *Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_fieldnames_fieldnames_messageTypes[0].MessageOf(m)
+	return xxx_File_fieldnames_fieldnames_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
 func (*Message) ProtoMessage()    {}
 func (*Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6bbe3f70febb9403_gzipped, []int{0}
+	return xxx_File_fieldnames_fieldnames_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Message) XXX_Unmarshal(b []byte) error {
@@ -290,13 +290,13 @@
 }
 
 func (m *Message_OneofMessageConflict) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_fieldnames_fieldnames_messageTypes[1].MessageOf(m)
+	return xxx_File_fieldnames_fieldnames_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Message_OneofMessageConflict) Reset()         { *m = Message_OneofMessageConflict{} }
 func (m *Message_OneofMessageConflict) String() string { return proto.CompactTextString(m) }
 func (*Message_OneofMessageConflict) ProtoMessage()    {}
 func (*Message_OneofMessageConflict) Descriptor() ([]byte, []int) {
-	return fileDescriptor_6bbe3f70febb9403_gzipped, []int{0, 0}
+	return xxx_File_fieldnames_fieldnames_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *Message_OneofMessageConflict) XXX_Unmarshal(b []byte) error {
@@ -318,12 +318,12 @@
 var xxx_messageInfo_Message_OneofMessageConflict proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("fieldnames/fieldnames.proto", fileDescriptor_6bbe3f70febb9403_gzipped)
+	proto.RegisterFile("fieldnames/fieldnames.proto", xxx_File_fieldnames_fieldnames_proto_rawdesc_gzipped)
 	proto.RegisterType((*Message)(nil), "goproto.protoc.fieldnames.Message")
 	proto.RegisterType((*Message_OneofMessageConflict)(nil), "goproto.protoc.fieldnames.Message.OneofMessageConflict")
 }
 
-var fileDescriptor_6bbe3f70febb9403 = []byte{
+var xxx_File_fieldnames_fieldnames_proto_rawdesc = []byte{
 	// 826 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x65,
 	0x6c, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x67,
@@ -379,32 +379,32 @@
 	0x66, 0x69, 0x65, 0x6c, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x73,
 }
 
-var fileDescriptor_6bbe3f70febb9403_gzipped = protoapi.CompressGZIP(fileDescriptor_6bbe3f70febb9403)
+var xxx_File_fieldnames_fieldnames_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_fieldnames_fieldnames_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_fieldnames_fieldnames protoreflect.FileDescriptor
+var File_fieldnames_fieldnames_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_fieldnames_fieldnames_messageTypes [2]protoimpl.MessageType
-var xxx_ProtoFile_fieldnames_fieldnames_goTypes = []interface{}{
+var xxx_File_fieldnames_fieldnames_proto_messageTypes [2]protoimpl.MessageType
+var xxx_File_fieldnames_fieldnames_proto_goTypes = []interface{}{
 	(*Message)(nil),                      // 0: goproto.protoc.fieldnames.Message
 	(*Message_OneofMessageConflict)(nil), // 1: goproto.protoc.fieldnames.Message.OneofMessageConflict
 }
-var xxx_ProtoFile_fieldnames_fieldnames_depIdxs = []int32{}
+var xxx_File_fieldnames_fieldnames_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [2]protoreflect.MessageType
-	ProtoFile_fieldnames_fieldnames = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_6bbe3f70febb9403,
-		GoTypes:            xxx_ProtoFile_fieldnames_fieldnames_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_fieldnames_fieldnames_depIdxs,
+	File_fieldnames_fieldnames_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_fieldnames_fieldnames_proto_rawdesc,
+		GoTypes:            xxx_File_fieldnames_fieldnames_proto_goTypes,
+		DependencyIndexes:  xxx_File_fieldnames_fieldnames_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_fieldnames_fieldnames_goTypes[0:][:2]
+	messageGoTypes := xxx_File_fieldnames_fieldnames_proto_goTypes[0:][:2]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_fieldnames_fieldnames_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_fieldnames_fieldnames_messageTypes[i].PBType = mt
+		xxx_File_fieldnames_fieldnames_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_fieldnames_fieldnames_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_fieldnames_fieldnames_goTypes = nil
-	xxx_ProtoFile_fieldnames_fieldnames_depIdxs = nil
+	xxx_File_fieldnames_fieldnames_proto_goTypes = nil
+	xxx_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 46a7c2b..afc439f 100644
--- a/cmd/protoc-gen-go/testdata/import_public/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
@@ -71,13 +71,13 @@
 }
 
 func (m *Public) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_import_public_a_messageTypes[0].MessageOf(m)
+	return xxx_File_import_public_a_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Public) Reset()         { *m = Public{} }
 func (m *Public) String() string { return proto.CompactTextString(m) }
 func (*Public) ProtoMessage()    {}
 func (*Public) Descriptor() ([]byte, []int) {
-	return fileDescriptor_73b7577c95fa6b70_gzipped, []int{0}
+	return xxx_File_import_public_a_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Public) XXX_Unmarshal(b []byte) error {
@@ -120,11 +120,11 @@
 }
 
 func init() {
-	proto.RegisterFile("import_public/a.proto", fileDescriptor_73b7577c95fa6b70_gzipped)
+	proto.RegisterFile("import_public/a.proto", xxx_File_import_public_a_proto_rawdesc_gzipped)
 	proto.RegisterType((*Public)(nil), "goproto.protoc.import_public.Public")
 }
 
-var fileDescriptor_73b7577c95fa6b70 = []byte{
+var xxx_File_import_public_a_proto_rawdesc = []byte{
 	// 383 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x15, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
 	0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
@@ -152,20 +152,20 @@
 	0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x00, 0x50, 0x01, 0x50, 0x02,
 }
 
-var fileDescriptor_73b7577c95fa6b70_gzipped = protoapi.CompressGZIP(fileDescriptor_73b7577c95fa6b70)
+var xxx_File_import_public_a_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_import_public_a_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_import_public_a protoreflect.FileDescriptor
+var File_import_public_a_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_import_public_a_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_import_public_a_goTypes = []interface{}{
+var xxx_File_import_public_a_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_import_public_a_proto_goTypes = []interface{}{
 	(*Public)(nil), // 0: goproto.protoc.import_public.Public
 	(*sub.M)(nil),  // 1: goproto.protoc.import_public.sub.M
 	(sub.E)(0),     // 2: goproto.protoc.import_public.sub.E
 	(*Local)(nil),  // 3: goproto.protoc.import_public.Local
 }
-var xxx_ProtoFile_import_public_a_depIdxs = []int32{
+var xxx_File_import_public_a_proto_depIdxs = []int32{
 	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
@@ -173,17 +173,17 @@
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_import_public_a = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_73b7577c95fa6b70,
-		GoTypes:            xxx_ProtoFile_import_public_a_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_import_public_a_depIdxs,
+	File_import_public_a_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_import_public_a_proto_rawdesc,
+		GoTypes:            xxx_File_import_public_a_proto_goTypes,
+		DependencyIndexes:  xxx_File_import_public_a_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_import_public_a_goTypes[0:][:1]
+	messageGoTypes := xxx_File_import_public_a_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_import_public_a_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_import_public_a_messageTypes[i].PBType = mt
+		xxx_File_import_public_a_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_import_public_a_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_import_public_a_goTypes = nil
-	xxx_ProtoFile_import_public_a_depIdxs = nil
+	xxx_File_import_public_a_proto_goTypes = nil
+	xxx_File_import_public_a_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
index 6664f12..9f07728 100644
--- a/cmd/protoc-gen-go/testdata/import_public/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
@@ -27,13 +27,13 @@
 }
 
 func (m *Local) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_import_public_b_messageTypes[0].MessageOf(m)
+	return xxx_File_import_public_b_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Local) Reset()         { *m = Local{} }
 func (m *Local) String() string { return proto.CompactTextString(m) }
 func (*Local) ProtoMessage()    {}
 func (*Local) Descriptor() ([]byte, []int) {
-	return fileDescriptor_84995586b3d09710_gzipped, []int{0}
+	return xxx_File_import_public_b_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Local) XXX_Unmarshal(b []byte) error {
@@ -69,11 +69,11 @@
 }
 
 func init() {
-	proto.RegisterFile("import_public/b.proto", fileDescriptor_84995586b3d09710_gzipped)
+	proto.RegisterFile("import_public/b.proto", xxx_File_import_public_b_proto_rawdesc_gzipped)
 	proto.RegisterType((*Local)(nil), "goproto.protoc.import_public.Local")
 }
 
-var fileDescriptor_84995586b3d09710 = []byte{
+var xxx_File_import_public_b_proto_rawdesc = []byte{
 	// 265 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x15, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
 	0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
@@ -94,36 +94,36 @@
 	0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,
 }
 
-var fileDescriptor_84995586b3d09710_gzipped = protoapi.CompressGZIP(fileDescriptor_84995586b3d09710)
+var xxx_File_import_public_b_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_import_public_b_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_import_public_b protoreflect.FileDescriptor
+var File_import_public_b_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_import_public_b_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_import_public_b_goTypes = []interface{}{
+var xxx_File_import_public_b_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_import_public_b_proto_goTypes = []interface{}{
 	(*Local)(nil), // 0: goproto.protoc.import_public.Local
 	(*sub.M)(nil), // 1: goproto.protoc.import_public.sub.M
 	(sub.E)(0),    // 2: goproto.protoc.import_public.sub.E
 }
-var xxx_ProtoFile_import_public_b_depIdxs = []int32{
+var xxx_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
 }
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_import_public_b = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_84995586b3d09710,
-		GoTypes:            xxx_ProtoFile_import_public_b_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_import_public_b_depIdxs,
+	File_import_public_b_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_import_public_b_proto_rawdesc,
+		GoTypes:            xxx_File_import_public_b_proto_goTypes,
+		DependencyIndexes:  xxx_File_import_public_b_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_import_public_b_goTypes[0:][:1]
+	messageGoTypes := xxx_File_import_public_b_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_import_public_b_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_import_public_b_messageTypes[i].PBType = mt
+		xxx_File_import_public_b_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_import_public_b_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_import_public_b_goTypes = nil
-	xxx_ProtoFile_import_public_b_depIdxs = nil
+	xxx_File_import_public_b_proto_goTypes = nil
+	xxx_File_import_public_b_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
index 40daaa9..3db3cb5 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
@@ -30,7 +30,7 @@
 )
 
 func (e E) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_import_public_sub_a_enumTypes[0]
+	return xxx_File_import_public_sub_a_proto_enumTypes[0]
 }
 func (e E) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -64,7 +64,7 @@
 }
 
 func (E) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_382f7805394b5c4e_gzipped, []int{0}
+	return xxx_File_import_public_sub_a_proto_rawdesc_gzipped, []int{0}
 }
 
 type M_Subenum int32
@@ -74,7 +74,7 @@
 )
 
 func (e M_Subenum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_import_public_sub_a_enumTypes[1]
+	return xxx_File_import_public_sub_a_proto_enumTypes[1]
 }
 func (e M_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -108,7 +108,7 @@
 }
 
 func (M_Subenum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_382f7805394b5c4e_gzipped, []int{0, 0}
+	return xxx_File_import_public_sub_a_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 type M_Submessage_Submessage_Subenum int32
@@ -118,7 +118,7 @@
 )
 
 func (e M_Submessage_Submessage_Subenum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_import_public_sub_a_enumTypes[2]
+	return xxx_File_import_public_sub_a_proto_enumTypes[2]
 }
 func (e M_Submessage_Submessage_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -152,7 +152,7 @@
 }
 
 func (M_Submessage_Submessage_Subenum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_382f7805394b5c4e_gzipped, []int{0, 0, 0}
+	return xxx_File_import_public_sub_a_proto_rawdesc_gzipped, []int{0, 0, 0}
 }
 
 type M struct {
@@ -172,13 +172,13 @@
 }
 
 func (m *M) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_import_public_sub_a_messageTypes[0].MessageOf(m)
+	return xxx_File_import_public_sub_a_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M) Reset()         { *m = M{} }
 func (m *M) String() string { return proto.CompactTextString(m) }
 func (*M) ProtoMessage()    {}
 func (*M) Descriptor() ([]byte, []int) {
-	return fileDescriptor_382f7805394b5c4e_gzipped, []int{0}
+	return xxx_File_import_public_sub_a_proto_rawdesc_gzipped, []int{0}
 }
 
 var extRange_M = []proto.ExtensionRange{
@@ -296,13 +296,13 @@
 }
 
 func (m *M_Submessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_import_public_sub_a_messageTypes[1].MessageOf(m)
+	return xxx_File_import_public_sub_a_proto_messageTypes[1].MessageOf(m)
 }
 func (m *M_Submessage) Reset()         { *m = M_Submessage{} }
 func (m *M_Submessage) String() string { return proto.CompactTextString(m) }
 func (*M_Submessage) ProtoMessage()    {}
 func (*M_Submessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_382f7805394b5c4e_gzipped, []int{0, 0}
+	return xxx_File_import_public_sub_a_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *M_Submessage) XXX_Unmarshal(b []byte) error {
@@ -378,7 +378,7 @@
 }
 
 func init() {
-	proto.RegisterFile("import_public/sub/a.proto", fileDescriptor_382f7805394b5c4e_gzipped)
+	proto.RegisterFile("import_public/sub/a.proto", xxx_File_import_public_sub_a_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.import_public.sub.E", E_name, E_value)
 	proto.RegisterEnum("goproto.protoc.import_public.sub.M_Subenum", M_Subenum_name, M_Subenum_value)
 	proto.RegisterEnum("goproto.protoc.import_public.sub.M_Submessage_Submessage_Subenum", M_Submessage_Submessage_Subenum_name, M_Submessage_Submessage_Subenum_value)
@@ -387,7 +387,7 @@
 	proto.RegisterExtension(E_ExtensionField)
 }
 
-var fileDescriptor_382f7805394b5c4e = []byte{
+var xxx_File_import_public_sub_a_proto_rawdesc = []byte{
 	// 730 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
 	0x73, 0x75, 0x62, 0x2f, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x67, 0x6f, 0x70,
@@ -437,15 +437,15 @@
 	0x62, 0x6c, 0x69, 0x63, 0x2f, 0x73, 0x75, 0x62, 0x50, 0x01,
 }
 
-var fileDescriptor_382f7805394b5c4e_gzipped = protoapi.CompressGZIP(fileDescriptor_382f7805394b5c4e)
+var xxx_File_import_public_sub_a_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_import_public_sub_a_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_import_public_sub_a protoreflect.FileDescriptor
+var File_import_public_sub_a_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_import_public_sub_a_enumTypes [3]protoreflect.EnumType
-var xxx_ProtoFile_import_public_sub_a_messageTypes [2]protoimpl.MessageType
-var xxx_ProtoFile_import_public_sub_a_goTypes = []interface{}{
+var xxx_File_import_public_sub_a_proto_enumTypes [3]protoreflect.EnumType
+var xxx_File_import_public_sub_a_proto_messageTypes [2]protoimpl.MessageType
+var xxx_File_import_public_sub_a_proto_goTypes = []interface{}{
 	(E)(0),                               // 0: goproto.protoc.import_public.sub.E
 	(M_Subenum)(0),                       // 1: goproto.protoc.import_public.sub.M.Subenum
 	(M_Submessage_Submessage_Subenum)(0), // 2: goproto.protoc.import_public.sub.M.Submessage.Submessage_Subenum
@@ -453,7 +453,7 @@
 	(*M_Submessage)(nil),                 // 4: goproto.protoc.import_public.sub.M.Submessage
 	(*M2)(nil),                           // 5: goproto.protoc.import_public.sub.M2
 }
-var xxx_ProtoFile_import_public_sub_a_depIdxs = []int32{
+var xxx_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
 }
@@ -461,20 +461,20 @@
 func init() {
 	var messageTypes [2]protoreflect.MessageType
 	var extensionTypes [1]protoreflect.ExtensionType
-	ProtoFile_import_public_sub_a = protoimpl.FileBuilder{
-		RawDescriptor:        fileDescriptor_382f7805394b5c4e,
-		GoTypes:              xxx_ProtoFile_import_public_sub_a_goTypes,
-		DependencyIndexes:    xxx_ProtoFile_import_public_sub_a_depIdxs,
-		EnumOutputTypes:      xxx_ProtoFile_import_public_sub_a_enumTypes[:],
+	File_import_public_sub_a_proto = protoimpl.FileBuilder{
+		RawDescriptor:        xxx_File_import_public_sub_a_proto_rawdesc,
+		GoTypes:              xxx_File_import_public_sub_a_proto_goTypes,
+		DependencyIndexes:    xxx_File_import_public_sub_a_proto_depIdxs,
+		EnumOutputTypes:      xxx_File_import_public_sub_a_proto_enumTypes[:],
 		MessageOutputTypes:   messageTypes[:],
 		ExtensionOutputTypes: extensionTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_import_public_sub_a_goTypes[3:][:2]
+	messageGoTypes := xxx_File_import_public_sub_a_proto_goTypes[3:][:2]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_import_public_sub_a_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_import_public_sub_a_messageTypes[i].PBType = mt
+		xxx_File_import_public_sub_a_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_import_public_sub_a_proto_messageTypes[i].PBType = mt
 	}
 	E_ExtensionField.Type = extensionTypes[0]
-	xxx_ProtoFile_import_public_sub_a_goTypes = nil
-	xxx_ProtoFile_import_public_sub_a_depIdxs = nil
+	xxx_File_import_public_sub_a_proto_goTypes = nil
+	xxx_File_import_public_sub_a_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
index 5c375e0..212681c 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
@@ -24,13 +24,13 @@
 }
 
 func (m *M2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_import_public_sub_b_messageTypes[0].MessageOf(m)
+	return xxx_File_import_public_sub_b_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M2) Reset()         { *m = M2{} }
 func (m *M2) String() string { return proto.CompactTextString(m) }
 func (*M2) ProtoMessage()    {}
 func (*M2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fc66afda3d7c2232_gzipped, []int{0}
+	return xxx_File_import_public_sub_b_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M2) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_M2 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("import_public/sub/b.proto", fileDescriptor_fc66afda3d7c2232_gzipped)
+	proto.RegisterFile("import_public/sub/b.proto", xxx_File_import_public_sub_b_proto_rawdesc_gzipped)
 	proto.RegisterType((*M2)(nil), "goproto.protoc.import_public.sub.M2")
 }
 
-var fileDescriptor_fc66afda3d7c2232 = []byte{
+var xxx_File_import_public_sub_b_proto_rawdesc = []byte{
 	// 145 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
 	0x73, 0x75, 0x62, 0x2f, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x67, 0x6f, 0x70,
@@ -70,31 +70,31 @@
 	0x62,
 }
 
-var fileDescriptor_fc66afda3d7c2232_gzipped = protoapi.CompressGZIP(fileDescriptor_fc66afda3d7c2232)
+var xxx_File_import_public_sub_b_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_import_public_sub_b_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_import_public_sub_b protoreflect.FileDescriptor
+var File_import_public_sub_b_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_import_public_sub_b_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_import_public_sub_b_goTypes = []interface{}{
+var xxx_File_import_public_sub_b_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_import_public_sub_b_proto_goTypes = []interface{}{
 	(*M2)(nil), // 0: goproto.protoc.import_public.sub.M2
 }
-var xxx_ProtoFile_import_public_sub_b_depIdxs = []int32{}
+var xxx_File_import_public_sub_b_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_import_public_sub_b = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_fc66afda3d7c2232,
-		GoTypes:            xxx_ProtoFile_import_public_sub_b_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_import_public_sub_b_depIdxs,
+	File_import_public_sub_b_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_import_public_sub_b_proto_rawdesc,
+		GoTypes:            xxx_File_import_public_sub_b_proto_goTypes,
+		DependencyIndexes:  xxx_File_import_public_sub_b_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_import_public_sub_b_goTypes[0:][:1]
+	messageGoTypes := xxx_File_import_public_sub_b_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_import_public_sub_b_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_import_public_sub_b_messageTypes[i].PBType = mt
+		xxx_File_import_public_sub_b_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_import_public_sub_b_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_import_public_sub_b_goTypes = nil
-	xxx_ProtoFile_import_public_sub_b_depIdxs = nil
+	xxx_File_import_public_sub_b_proto_goTypes = nil
+	xxx_File_import_public_sub_b_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go
index ae05e82..9e0a934 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
@@ -24,13 +24,13 @@
 }
 
 func (m *Sub2Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_import_public_sub2_a_messageTypes[0].MessageOf(m)
+	return xxx_File_import_public_sub2_a_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Sub2Message) Reset()         { *m = Sub2Message{} }
 func (m *Sub2Message) String() string { return proto.CompactTextString(m) }
 func (*Sub2Message) ProtoMessage()    {}
 func (*Sub2Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ac53d99328778ac_gzipped, []int{0}
+	return xxx_File_import_public_sub2_a_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Sub2Message) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_Sub2Message proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("import_public/sub2/a.proto", fileDescriptor_7ac53d99328778ac_gzipped)
+	proto.RegisterFile("import_public/sub2/a.proto", xxx_File_import_public_sub2_a_proto_rawdesc_gzipped)
 	proto.RegisterType((*Sub2Message)(nil), "goproto.protoc.import_public.sub2.Sub2Message")
 }
 
-var fileDescriptor_7ac53d99328778ac = []byte{
+var xxx_File_import_public_sub2_a_proto_rawdesc = []byte{
 	// 157 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1a, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
 	0x73, 0x75, 0x62, 0x32, 0x2f, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x67, 0x6f,
@@ -70,31 +70,31 @@
 	0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x73, 0x75, 0x62, 0x32,
 }
 
-var fileDescriptor_7ac53d99328778ac_gzipped = protoapi.CompressGZIP(fileDescriptor_7ac53d99328778ac)
+var xxx_File_import_public_sub2_a_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_import_public_sub2_a_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_import_public_sub2_a protoreflect.FileDescriptor
+var File_import_public_sub2_a_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_import_public_sub2_a_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_import_public_sub2_a_goTypes = []interface{}{
+var xxx_File_import_public_sub2_a_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_import_public_sub2_a_proto_goTypes = []interface{}{
 	(*Sub2Message)(nil), // 0: goproto.protoc.import_public.sub2.Sub2Message
 }
-var xxx_ProtoFile_import_public_sub2_a_depIdxs = []int32{}
+var xxx_File_import_public_sub2_a_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_import_public_sub2_a = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_7ac53d99328778ac,
-		GoTypes:            xxx_ProtoFile_import_public_sub2_a_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_import_public_sub2_a_depIdxs,
+	File_import_public_sub2_a_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_import_public_sub2_a_proto_rawdesc,
+		GoTypes:            xxx_File_import_public_sub2_a_proto_goTypes,
+		DependencyIndexes:  xxx_File_import_public_sub2_a_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_import_public_sub2_a_goTypes[0:][:1]
+	messageGoTypes := xxx_File_import_public_sub2_a_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_import_public_sub2_a_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_import_public_sub2_a_messageTypes[i].PBType = mt
+		xxx_File_import_public_sub2_a_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_import_public_sub2_a_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_import_public_sub2_a_goTypes = nil
-	xxx_ProtoFile_import_public_sub2_a_depIdxs = nil
+	xxx_File_import_public_sub2_a_proto_goTypes = nil
+	xxx_File_import_public_sub2_a_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
index 184c375..cef90a4 100644
--- a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
@@ -24,13 +24,13 @@
 }
 
 func (m *M) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_fmt_m_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_fmt_m_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M) Reset()         { *m = M{} }
 func (m *M) String() string { return proto.CompactTextString(m) }
 func (*M) ProtoMessage()    {}
 func (*M) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72c126fcd452e392_gzipped, []int{0}
+	return xxx_File_imports_fmt_m_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_M proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("imports/fmt/m.proto", fileDescriptor_72c126fcd452e392_gzipped)
+	proto.RegisterFile("imports/fmt/m.proto", xxx_File_imports_fmt_m_proto_rawdesc_gzipped)
 	proto.RegisterType((*M)(nil), "fmt.M")
 }
 
-var fileDescriptor_72c126fcd452e392 = []byte{
+var xxx_File_imports_fmt_m_proto_rawdesc = []byte{
 	// 104 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x13, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x66, 0x6d, 0x74, 0x2f, 0x6d, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x66, 0x6d, 0x74, 0x22, 0x03, 0x0a, 0x01, 0x4d, 0x42,
@@ -67,31 +67,31 @@
 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_72c126fcd452e392_gzipped = protoapi.CompressGZIP(fileDescriptor_72c126fcd452e392)
+var xxx_File_imports_fmt_m_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_fmt_m_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_fmt_m protoreflect.FileDescriptor
+var File_imports_fmt_m_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_fmt_m_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_fmt_m_goTypes = []interface{}{
+var xxx_File_imports_fmt_m_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_fmt_m_proto_goTypes = []interface{}{
 	(*M)(nil), // 0: fmt.M
 }
-var xxx_ProtoFile_imports_fmt_m_depIdxs = []int32{}
+var xxx_File_imports_fmt_m_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_fmt_m = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_72c126fcd452e392,
-		GoTypes:            xxx_ProtoFile_imports_fmt_m_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_fmt_m_depIdxs,
+	File_imports_fmt_m_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_fmt_m_proto_rawdesc,
+		GoTypes:            xxx_File_imports_fmt_m_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_fmt_m_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_fmt_m_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_fmt_m_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_fmt_m_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_fmt_m_messageTypes[i].PBType = mt
+		xxx_File_imports_fmt_m_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_fmt_m_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_fmt_m_goTypes = nil
-	xxx_ProtoFile_imports_fmt_m_depIdxs = nil
+	xxx_File_imports_fmt_m_proto_goTypes = nil
+	xxx_File_imports_fmt_m_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
index a8e7e93..fb56be3 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
@@ -24,7 +24,7 @@
 )
 
 func (e E1) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_imports_test_a_1_m1_enumTypes[0]
+	return xxx_File_imports_test_a_1_m1_proto_enumTypes[0]
 }
 func (e E1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -43,7 +43,7 @@
 }
 
 func (E1) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c1091de3fa870a14_gzipped, []int{0}
+	return xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped, []int{0}
 }
 
 type M1 struct {
@@ -53,13 +53,13 @@
 }
 
 func (m *M1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_a_1_m1_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_a_1_m1_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M1) Reset()         { *m = M1{} }
 func (m *M1) String() string { return proto.CompactTextString(m) }
 func (*M1) ProtoMessage()    {}
 func (*M1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c1091de3fa870a14_gzipped, []int{0}
+	return xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M1) XXX_Unmarshal(b []byte) error {
@@ -88,13 +88,13 @@
 }
 
 func (m *M1_1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_a_1_m1_messageTypes[1].MessageOf(m)
+	return xxx_File_imports_test_a_1_m1_proto_messageTypes[1].MessageOf(m)
 }
 func (m *M1_1) Reset()         { *m = M1_1{} }
 func (m *M1_1) String() string { return proto.CompactTextString(m) }
 func (*M1_1) ProtoMessage()    {}
 func (*M1_1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c1091de3fa870a14_gzipped, []int{1}
+	return xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *M1_1) XXX_Unmarshal(b []byte) error {
@@ -123,13 +123,13 @@
 }
 
 func init() {
-	proto.RegisterFile("imports/test_a_1/m1.proto", fileDescriptor_c1091de3fa870a14_gzipped)
+	proto.RegisterFile("imports/test_a_1/m1.proto", xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped)
 	proto.RegisterEnum("test.a.E1", E1_name, E1_value)
 	proto.RegisterType((*M1)(nil), "test.a.M1")
 	proto.RegisterType((*M1_1)(nil), "test.a.M1_1")
 }
 
-var fileDescriptor_c1091de3fa870a14 = []byte{
+var xxx_File_imports_test_a_1_m1_proto_rawdesc = []byte{
 	// 174 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
 	0x5f, 0x31, 0x2f, 0x6d, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x74, 0x65, 0x73,
@@ -144,37 +144,37 @@
 	0x73, 0x74, 0x5f, 0x61, 0x5f, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_c1091de3fa870a14_gzipped = protoapi.CompressGZIP(fileDescriptor_c1091de3fa870a14)
+var xxx_File_imports_test_a_1_m1_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_a_1_m1_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_a_1_m1 protoreflect.FileDescriptor
+var File_imports_test_a_1_m1_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_a_1_m1_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_imports_test_a_1_m1_messageTypes [2]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_a_1_m1_goTypes = []interface{}{
+var xxx_File_imports_test_a_1_m1_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_imports_test_a_1_m1_proto_messageTypes [2]protoimpl.MessageType
+var xxx_File_imports_test_a_1_m1_proto_goTypes = []interface{}{
 	(E1)(0),      // 0: test.a.E1
 	(*M1)(nil),   // 1: test.a.M1
 	(*M1_1)(nil), // 2: test.a.M1_1
 }
-var xxx_ProtoFile_imports_test_a_1_m1_depIdxs = []int32{
+var xxx_File_imports_test_a_1_m1_proto_depIdxs = []int32{
 	1, // test.a.M1_1.m1:type_name -> test.a.M1
 }
 
 func init() {
 	var messageTypes [2]protoreflect.MessageType
-	ProtoFile_imports_test_a_1_m1 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_c1091de3fa870a14,
-		GoTypes:            xxx_ProtoFile_imports_test_a_1_m1_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_a_1_m1_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_imports_test_a_1_m1_enumTypes[:],
+	File_imports_test_a_1_m1_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_a_1_m1_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_a_1_m1_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_a_1_m1_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_imports_test_a_1_m1_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_a_1_m1_goTypes[1:][:2]
+	messageGoTypes := xxx_File_imports_test_a_1_m1_proto_goTypes[1:][:2]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_a_1_m1_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_a_1_m1_messageTypes[i].PBType = mt
+		xxx_File_imports_test_a_1_m1_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_a_1_m1_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_a_1_m1_goTypes = nil
-	xxx_ProtoFile_imports_test_a_1_m1_depIdxs = nil
+	xxx_File_imports_test_a_1_m1_proto_goTypes = nil
+	xxx_File_imports_test_a_1_m1_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
index 318bffa..b1250a7 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
@@ -24,13 +24,13 @@
 }
 
 func (m *M2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_a_1_m2_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_a_1_m2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M2) Reset()         { *m = M2{} }
 func (m *M2) String() string { return proto.CompactTextString(m) }
 func (*M2) ProtoMessage()    {}
 func (*M2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_20cf27515c0d621c_gzipped, []int{0}
+	return xxx_File_imports_test_a_1_m2_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M2) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_M2 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("imports/test_a_1/m2.proto", fileDescriptor_20cf27515c0d621c_gzipped)
+	proto.RegisterFile("imports/test_a_1/m2.proto", xxx_File_imports_test_a_1_m2_proto_rawdesc_gzipped)
 	proto.RegisterType((*M2)(nil), "test.a.M2")
 }
 
-var fileDescriptor_20cf27515c0d621c = []byte{
+var xxx_File_imports_test_a_1_m2_proto_rawdesc = []byte{
 	// 119 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
 	0x5f, 0x31, 0x2f, 0x6d, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x74, 0x65, 0x73,
@@ -68,31 +68,31 @@
 	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_20cf27515c0d621c_gzipped = protoapi.CompressGZIP(fileDescriptor_20cf27515c0d621c)
+var xxx_File_imports_test_a_1_m2_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_a_1_m2_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_a_1_m2 protoreflect.FileDescriptor
+var File_imports_test_a_1_m2_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_a_1_m2_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_a_1_m2_goTypes = []interface{}{
+var xxx_File_imports_test_a_1_m2_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_a_1_m2_proto_goTypes = []interface{}{
 	(*M2)(nil), // 0: test.a.M2
 }
-var xxx_ProtoFile_imports_test_a_1_m2_depIdxs = []int32{}
+var xxx_File_imports_test_a_1_m2_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_a_1_m2 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_20cf27515c0d621c,
-		GoTypes:            xxx_ProtoFile_imports_test_a_1_m2_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_a_1_m2_depIdxs,
+	File_imports_test_a_1_m2_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_a_1_m2_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_a_1_m2_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_a_1_m2_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_a_1_m2_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_a_1_m2_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_a_1_m2_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_a_1_m2_messageTypes[i].PBType = mt
+		xxx_File_imports_test_a_1_m2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_a_1_m2_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_a_1_m2_goTypes = nil
-	xxx_ProtoFile_imports_test_a_1_m2_depIdxs = nil
+	xxx_File_imports_test_a_1_m2_proto_goTypes = nil
+	xxx_File_imports_test_a_1_m2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
index bedc1b3..f05c60e 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
@@ -24,13 +24,13 @@
 }
 
 func (m *M3) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_a_2_m3_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_a_2_m3_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M3) Reset()         { *m = M3{} }
 func (m *M3) String() string { return proto.CompactTextString(m) }
 func (*M3) ProtoMessage()    {}
 func (*M3) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ff9d8f834875c9c5_gzipped, []int{0}
+	return xxx_File_imports_test_a_2_m3_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M3) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_M3 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("imports/test_a_2/m3.proto", fileDescriptor_ff9d8f834875c9c5_gzipped)
+	proto.RegisterFile("imports/test_a_2/m3.proto", xxx_File_imports_test_a_2_m3_proto_rawdesc_gzipped)
 	proto.RegisterType((*M3)(nil), "test.a.M3")
 }
 
-var fileDescriptor_ff9d8f834875c9c5 = []byte{
+var xxx_File_imports_test_a_2_m3_proto_rawdesc = []byte{
 	// 119 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
 	0x5f, 0x32, 0x2f, 0x6d, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x74, 0x65, 0x73,
@@ -68,31 +68,31 @@
 	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_ff9d8f834875c9c5_gzipped = protoapi.CompressGZIP(fileDescriptor_ff9d8f834875c9c5)
+var xxx_File_imports_test_a_2_m3_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_a_2_m3_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_a_2_m3 protoreflect.FileDescriptor
+var File_imports_test_a_2_m3_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_a_2_m3_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_a_2_m3_goTypes = []interface{}{
+var xxx_File_imports_test_a_2_m3_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_a_2_m3_proto_goTypes = []interface{}{
 	(*M3)(nil), // 0: test.a.M3
 }
-var xxx_ProtoFile_imports_test_a_2_m3_depIdxs = []int32{}
+var xxx_File_imports_test_a_2_m3_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_a_2_m3 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_ff9d8f834875c9c5,
-		GoTypes:            xxx_ProtoFile_imports_test_a_2_m3_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_a_2_m3_depIdxs,
+	File_imports_test_a_2_m3_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_a_2_m3_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_a_2_m3_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_a_2_m3_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_a_2_m3_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_a_2_m3_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_a_2_m3_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_a_2_m3_messageTypes[i].PBType = mt
+		xxx_File_imports_test_a_2_m3_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_a_2_m3_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_a_2_m3_goTypes = nil
-	xxx_ProtoFile_imports_test_a_2_m3_depIdxs = nil
+	xxx_File_imports_test_a_2_m3_proto_goTypes = nil
+	xxx_File_imports_test_a_2_m3_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
index 56078f0..cfca353 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
@@ -24,13 +24,13 @@
 }
 
 func (m *M4) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_a_2_m4_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_a_2_m4_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M4) Reset()         { *m = M4{} }
 func (m *M4) String() string { return proto.CompactTextString(m) }
 func (*M4) ProtoMessage()    {}
 func (*M4) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fdd24f82f6c5a786_gzipped, []int{0}
+	return xxx_File_imports_test_a_2_m4_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M4) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_M4 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("imports/test_a_2/m4.proto", fileDescriptor_fdd24f82f6c5a786_gzipped)
+	proto.RegisterFile("imports/test_a_2/m4.proto", xxx_File_imports_test_a_2_m4_proto_rawdesc_gzipped)
 	proto.RegisterType((*M4)(nil), "test.a.M4")
 }
 
-var fileDescriptor_fdd24f82f6c5a786 = []byte{
+var xxx_File_imports_test_a_2_m4_proto_rawdesc = []byte{
 	// 119 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
 	0x5f, 0x32, 0x2f, 0x6d, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x74, 0x65, 0x73,
@@ -68,31 +68,31 @@
 	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_fdd24f82f6c5a786_gzipped = protoapi.CompressGZIP(fileDescriptor_fdd24f82f6c5a786)
+var xxx_File_imports_test_a_2_m4_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_a_2_m4_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_a_2_m4 protoreflect.FileDescriptor
+var File_imports_test_a_2_m4_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_a_2_m4_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_a_2_m4_goTypes = []interface{}{
+var xxx_File_imports_test_a_2_m4_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_a_2_m4_proto_goTypes = []interface{}{
 	(*M4)(nil), // 0: test.a.M4
 }
-var xxx_ProtoFile_imports_test_a_2_m4_depIdxs = []int32{}
+var xxx_File_imports_test_a_2_m4_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_a_2_m4 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_fdd24f82f6c5a786,
-		GoTypes:            xxx_ProtoFile_imports_test_a_2_m4_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_a_2_m4_depIdxs,
+	File_imports_test_a_2_m4_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_a_2_m4_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_a_2_m4_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_a_2_m4_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_a_2_m4_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_a_2_m4_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_a_2_m4_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_a_2_m4_messageTypes[i].PBType = mt
+		xxx_File_imports_test_a_2_m4_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_a_2_m4_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_a_2_m4_goTypes = nil
-	xxx_ProtoFile_imports_test_a_2_m4_depIdxs = nil
+	xxx_File_imports_test_a_2_m4_proto_goTypes = nil
+	xxx_File_imports_test_a_2_m4_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
index 24d0065..a116386 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
@@ -24,13 +24,13 @@
 }
 
 func (m *M1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_b_1_m1_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_b_1_m1_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M1) Reset()         { *m = M1{} }
 func (m *M1) String() string { return proto.CompactTextString(m) }
 func (*M1) ProtoMessage()    {}
 func (*M1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7f49573d035512a8_gzipped, []int{0}
+	return xxx_File_imports_test_b_1_m1_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M1) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_M1 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("imports/test_b_1/m1.proto", fileDescriptor_7f49573d035512a8_gzipped)
+	proto.RegisterFile("imports/test_b_1/m1.proto", xxx_File_imports_test_b_1_m1_proto_rawdesc_gzipped)
 	proto.RegisterType((*M1)(nil), "test.b.part1.M1")
 }
 
-var fileDescriptor_7f49573d035512a8 = []byte{
+var xxx_File_imports_test_b_1_m1_proto_rawdesc = []byte{
 	// 130 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x62,
 	0x5f, 0x31, 0x2f, 0x6d, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x74, 0x65, 0x73,
@@ -69,31 +69,31 @@
 	0x6f, 0x33,
 }
 
-var fileDescriptor_7f49573d035512a8_gzipped = protoapi.CompressGZIP(fileDescriptor_7f49573d035512a8)
+var xxx_File_imports_test_b_1_m1_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_b_1_m1_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_b_1_m1 protoreflect.FileDescriptor
+var File_imports_test_b_1_m1_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_b_1_m1_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_b_1_m1_goTypes = []interface{}{
+var xxx_File_imports_test_b_1_m1_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_b_1_m1_proto_goTypes = []interface{}{
 	(*M1)(nil), // 0: test.b.part1.M1
 }
-var xxx_ProtoFile_imports_test_b_1_m1_depIdxs = []int32{}
+var xxx_File_imports_test_b_1_m1_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_b_1_m1 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_7f49573d035512a8,
-		GoTypes:            xxx_ProtoFile_imports_test_b_1_m1_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_b_1_m1_depIdxs,
+	File_imports_test_b_1_m1_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_b_1_m1_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_b_1_m1_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_b_1_m1_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_b_1_m1_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_b_1_m1_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_b_1_m1_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_b_1_m1_messageTypes[i].PBType = mt
+		xxx_File_imports_test_b_1_m1_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_b_1_m1_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_b_1_m1_goTypes = nil
-	xxx_ProtoFile_imports_test_b_1_m1_depIdxs = nil
+	xxx_File_imports_test_b_1_m1_proto_goTypes = nil
+	xxx_File_imports_test_b_1_m1_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
index 82cc175..f7da208 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
@@ -24,13 +24,13 @@
 }
 
 func (m *M2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_b_1_m2_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_b_1_m2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *M2) Reset()         { *m = M2{} }
 func (m *M2) String() string { return proto.CompactTextString(m) }
 func (*M2) ProtoMessage()    {}
 func (*M2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a1becddceeb586f2_gzipped, []int{0}
+	return xxx_File_imports_test_b_1_m2_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *M2) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_M2 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("imports/test_b_1/m2.proto", fileDescriptor_a1becddceeb586f2_gzipped)
+	proto.RegisterFile("imports/test_b_1/m2.proto", xxx_File_imports_test_b_1_m2_proto_rawdesc_gzipped)
 	proto.RegisterType((*M2)(nil), "test.b.part2.M2")
 }
 
-var fileDescriptor_a1becddceeb586f2 = []byte{
+var xxx_File_imports_test_b_1_m2_proto_rawdesc = []byte{
 	// 130 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x62,
 	0x5f, 0x31, 0x2f, 0x6d, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x74, 0x65, 0x73,
@@ -69,31 +69,31 @@
 	0x6f, 0x33,
 }
 
-var fileDescriptor_a1becddceeb586f2_gzipped = protoapi.CompressGZIP(fileDescriptor_a1becddceeb586f2)
+var xxx_File_imports_test_b_1_m2_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_b_1_m2_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_b_1_m2 protoreflect.FileDescriptor
+var File_imports_test_b_1_m2_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_b_1_m2_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_b_1_m2_goTypes = []interface{}{
+var xxx_File_imports_test_b_1_m2_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_b_1_m2_proto_goTypes = []interface{}{
 	(*M2)(nil), // 0: test.b.part2.M2
 }
-var xxx_ProtoFile_imports_test_b_1_m2_depIdxs = []int32{}
+var xxx_File_imports_test_b_1_m2_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_b_1_m2 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_a1becddceeb586f2,
-		GoTypes:            xxx_ProtoFile_imports_test_b_1_m2_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_b_1_m2_depIdxs,
+	File_imports_test_b_1_m2_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_b_1_m2_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_b_1_m2_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_b_1_m2_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_b_1_m2_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_b_1_m2_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_b_1_m2_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_b_1_m2_messageTypes[i].PBType = mt
+		xxx_File_imports_test_b_1_m2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_b_1_m2_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_b_1_m2_goTypes = nil
-	xxx_ProtoFile_imports_test_b_1_m2_depIdxs = nil
+	xxx_File_imports_test_b_1_m2_proto_goTypes = nil
+	xxx_File_imports_test_b_1_m2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
index 0a18af3..b6f66f3 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
@@ -26,13 +26,13 @@
 }
 
 func (m *A1M1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_import_a1m1_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_import_a1m1_proto_messageTypes[0].MessageOf(m)
 }
 func (m *A1M1) Reset()         { *m = A1M1{} }
 func (m *A1M1) String() string { return proto.CompactTextString(m) }
 func (*A1M1) ProtoMessage()    {}
 func (*A1M1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3b904a47327455f3_gzipped, []int{0}
+	return xxx_File_imports_test_import_a1m1_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *A1M1) XXX_Unmarshal(b []byte) error {
@@ -61,11 +61,11 @@
 }
 
 func init() {
-	proto.RegisterFile("imports/test_import_a1m1.proto", fileDescriptor_3b904a47327455f3_gzipped)
+	proto.RegisterFile("imports/test_import_a1m1.proto", xxx_File_imports_test_import_a1m1_proto_rawdesc_gzipped)
 	proto.RegisterType((*A1M1)(nil), "test.A1M1")
 }
 
-var fileDescriptor_3b904a47327455f3 = []byte{
+var xxx_File_imports_test_import_a1m1_proto_rawdesc = []byte{
 	// 168 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69,
 	0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x31, 0x6d, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
@@ -80,34 +80,34 @@
 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_3b904a47327455f3_gzipped = protoapi.CompressGZIP(fileDescriptor_3b904a47327455f3)
+var xxx_File_imports_test_import_a1m1_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_import_a1m1_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_import_a1m1 protoreflect.FileDescriptor
+var File_imports_test_import_a1m1_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_import_a1m1_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_import_a1m1_goTypes = []interface{}{
+var xxx_File_imports_test_import_a1m1_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_import_a1m1_proto_goTypes = []interface{}{
 	(*A1M1)(nil),        // 0: test.A1M1
 	(*test_a_1.M1)(nil), // 1: test.a.M1
 }
-var xxx_ProtoFile_imports_test_import_a1m1_depIdxs = []int32{
+var xxx_File_imports_test_import_a1m1_proto_depIdxs = []int32{
 	1, // test.A1M1.f:type_name -> test.a.M1
 }
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_import_a1m1 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_3b904a47327455f3,
-		GoTypes:            xxx_ProtoFile_imports_test_import_a1m1_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_import_a1m1_depIdxs,
+	File_imports_test_import_a1m1_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_import_a1m1_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_import_a1m1_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_import_a1m1_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_import_a1m1_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_import_a1m1_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_import_a1m1_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_import_a1m1_messageTypes[i].PBType = mt
+		xxx_File_imports_test_import_a1m1_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_import_a1m1_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_import_a1m1_goTypes = nil
-	xxx_ProtoFile_imports_test_import_a1m1_depIdxs = nil
+	xxx_File_imports_test_import_a1m1_proto_goTypes = nil
+	xxx_File_imports_test_import_a1m1_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
index 194ebed..3485ea9 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
@@ -26,13 +26,13 @@
 }
 
 func (m *A1M2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_import_a1m2_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_import_a1m2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *A1M2) Reset()         { *m = A1M2{} }
 func (m *A1M2) String() string { return proto.CompactTextString(m) }
 func (*A1M2) ProtoMessage()    {}
 func (*A1M2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bdb27b114687957d_gzipped, []int{0}
+	return xxx_File_imports_test_import_a1m2_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *A1M2) XXX_Unmarshal(b []byte) error {
@@ -61,11 +61,11 @@
 }
 
 func init() {
-	proto.RegisterFile("imports/test_import_a1m2.proto", fileDescriptor_bdb27b114687957d_gzipped)
+	proto.RegisterFile("imports/test_import_a1m2.proto", xxx_File_imports_test_import_a1m2_proto_rawdesc_gzipped)
 	proto.RegisterType((*A1M2)(nil), "test.A1M2")
 }
 
-var fileDescriptor_bdb27b114687957d = []byte{
+var xxx_File_imports_test_import_a1m2_proto_rawdesc = []byte{
 	// 168 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69,
 	0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x31, 0x6d, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
@@ -80,34 +80,34 @@
 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_bdb27b114687957d_gzipped = protoapi.CompressGZIP(fileDescriptor_bdb27b114687957d)
+var xxx_File_imports_test_import_a1m2_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_import_a1m2_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_import_a1m2 protoreflect.FileDescriptor
+var File_imports_test_import_a1m2_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_import_a1m2_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_import_a1m2_goTypes = []interface{}{
+var xxx_File_imports_test_import_a1m2_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_import_a1m2_proto_goTypes = []interface{}{
 	(*A1M2)(nil),        // 0: test.A1M2
 	(*test_a_1.M2)(nil), // 1: test.a.M2
 }
-var xxx_ProtoFile_imports_test_import_a1m2_depIdxs = []int32{
+var xxx_File_imports_test_import_a1m2_proto_depIdxs = []int32{
 	1, // test.A1M2.f:type_name -> test.a.M2
 }
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_import_a1m2 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_bdb27b114687957d,
-		GoTypes:            xxx_ProtoFile_imports_test_import_a1m2_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_import_a1m2_depIdxs,
+	File_imports_test_import_a1m2_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_import_a1m2_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_import_a1m2_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_import_a1m2_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_import_a1m2_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_import_a1m2_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_import_a1m2_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_import_a1m2_messageTypes[i].PBType = mt
+		xxx_File_imports_test_import_a1m2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_import_a1m2_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_import_a1m2_goTypes = nil
-	xxx_ProtoFile_imports_test_import_a1m2_depIdxs = nil
+	xxx_File_imports_test_import_a1m2_proto_goTypes = nil
+	xxx_File_imports_test_import_a1m2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
index 5f1e9e4..7c715b2 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
@@ -33,13 +33,13 @@
 }
 
 func (m *All) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_imports_test_import_all_messageTypes[0].MessageOf(m)
+	return xxx_File_imports_test_import_all_proto_messageTypes[0].MessageOf(m)
 }
 func (m *All) Reset()         { *m = All{} }
 func (m *All) String() string { return proto.CompactTextString(m) }
 func (*All) ProtoMessage()    {}
 func (*All) Descriptor() ([]byte, []int) {
-	return fileDescriptor_324466f0afc16f77_gzipped, []int{0}
+	return xxx_File_imports_test_import_all_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *All) XXX_Unmarshal(b []byte) error {
@@ -96,11 +96,11 @@
 }
 
 func init() {
-	proto.RegisterFile("imports/test_import_all.proto", fileDescriptor_324466f0afc16f77_gzipped)
+	proto.RegisterFile("imports/test_import_all.proto", xxx_File_imports_test_import_all_proto_rawdesc_gzipped)
 	proto.RegisterType((*All)(nil), "test.All")
 }
 
-var fileDescriptor_324466f0afc16f77 = []byte{
+var xxx_File_imports_test_import_all_proto_rawdesc = []byte{
 	// 455 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1d, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69,
 	0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
@@ -133,14 +133,14 @@
 	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_324466f0afc16f77_gzipped = protoapi.CompressGZIP(fileDescriptor_324466f0afc16f77)
+var xxx_File_imports_test_import_all_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_imports_test_import_all_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_imports_test_import_all protoreflect.FileDescriptor
+var File_imports_test_import_all_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_imports_test_import_all_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_imports_test_import_all_goTypes = []interface{}{
+var xxx_File_imports_test_import_all_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_imports_test_import_all_proto_goTypes = []interface{}{
 	(*All)(nil),         // 0: test.All
 	(*test_a_1.M1)(nil), // 1: test.a.M1
 	(*test_a_1.M2)(nil), // 2: test.a.M2
@@ -148,7 +148,7 @@
 	(*test_b_1.M2)(nil), // 4: test.b.part2.M2
 	(*fmt.M)(nil),       // 5: fmt.M
 }
-var xxx_ProtoFile_imports_test_import_all_depIdxs = []int32{
+var xxx_File_imports_test_import_all_proto_depIdxs = []int32{
 	1, // test.All.am1:type_name -> test.a.M1
 	2, // test.All.am2:type_name -> test.a.M2
 	3, // test.All.bm1:type_name -> test.b.part1.M1
@@ -158,17 +158,17 @@
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_imports_test_import_all = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_324466f0afc16f77,
-		GoTypes:            xxx_ProtoFile_imports_test_import_all_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_imports_test_import_all_depIdxs,
+	File_imports_test_import_all_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_imports_test_import_all_proto_rawdesc,
+		GoTypes:            xxx_File_imports_test_import_all_proto_goTypes,
+		DependencyIndexes:  xxx_File_imports_test_import_all_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_imports_test_import_all_goTypes[0:][:1]
+	messageGoTypes := xxx_File_imports_test_import_all_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_imports_test_import_all_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_imports_test_import_all_messageTypes[i].PBType = mt
+		xxx_File_imports_test_import_all_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_imports_test_import_all_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_imports_test_import_all_goTypes = nil
-	xxx_ProtoFile_imports_test_import_all_depIdxs = nil
+	xxx_File_imports_test_import_all_proto_goTypes = nil
+	xxx_File_imports_test_import_all_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go b/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go
index 79572fa..55da1e6 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
@@ -27,13 +27,13 @@
 }
 
 func (m *Foo) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_issue780_oneof_conflict_test_messageTypes[0].MessageOf(m)
+	return xxx_File_issue780_oneof_conflict_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Foo) Reset()         { *m = Foo{} }
 func (m *Foo) String() string { return proto.CompactTextString(m) }
 func (*Foo) ProtoMessage()    {}
 func (*Foo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_48462cafc802a68e_gzipped, []int{0}
+	return xxx_File_issue780_oneof_conflict_test_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Foo) XXX_Unmarshal(b []byte) error {
@@ -86,11 +86,11 @@
 }
 
 func init() {
-	proto.RegisterFile("issue780_oneof_conflict/test.proto", fileDescriptor_48462cafc802a68e_gzipped)
+	proto.RegisterFile("issue780_oneof_conflict/test.proto", xxx_File_issue780_oneof_conflict_test_proto_rawdesc_gzipped)
 	proto.RegisterType((*Foo)(nil), "oneoftest.Foo")
 }
 
-var fileDescriptor_48462cafc802a68e = []byte{
+var xxx_File_issue780_oneof_conflict_test_proto_rawdesc = []byte{
 	// 88 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x22, 0x69, 0x73, 0x73, 0x75, 0x65, 0x37, 0x38, 0x30, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66,
 	0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70,
@@ -100,31 +100,31 @@
 	0x72, 0x42, 0x05, 0x0a, 0x03, 0x62, 0x61, 0x72,
 }
 
-var fileDescriptor_48462cafc802a68e_gzipped = protoapi.CompressGZIP(fileDescriptor_48462cafc802a68e)
+var xxx_File_issue780_oneof_conflict_test_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_issue780_oneof_conflict_test_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_issue780_oneof_conflict_test protoreflect.FileDescriptor
+var File_issue780_oneof_conflict_test_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_issue780_oneof_conflict_test_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_issue780_oneof_conflict_test_goTypes = []interface{}{
+var xxx_File_issue780_oneof_conflict_test_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_issue780_oneof_conflict_test_proto_goTypes = []interface{}{
 	(*Foo)(nil), // 0: oneoftest.Foo
 }
-var xxx_ProtoFile_issue780_oneof_conflict_test_depIdxs = []int32{}
+var xxx_File_issue780_oneof_conflict_test_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_issue780_oneof_conflict_test = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_48462cafc802a68e,
-		GoTypes:            xxx_ProtoFile_issue780_oneof_conflict_test_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_issue780_oneof_conflict_test_depIdxs,
+	File_issue780_oneof_conflict_test_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_issue780_oneof_conflict_test_proto_rawdesc,
+		GoTypes:            xxx_File_issue780_oneof_conflict_test_proto_goTypes,
+		DependencyIndexes:  xxx_File_issue780_oneof_conflict_test_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_issue780_oneof_conflict_test_goTypes[0:][:1]
+	messageGoTypes := xxx_File_issue780_oneof_conflict_test_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_issue780_oneof_conflict_test_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_issue780_oneof_conflict_test_messageTypes[i].PBType = mt
+		xxx_File_issue780_oneof_conflict_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_issue780_oneof_conflict_test_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_issue780_oneof_conflict_test_goTypes = nil
-	xxx_ProtoFile_issue780_oneof_conflict_test_depIdxs = nil
+	xxx_File_issue780_oneof_conflict_test_proto_goTypes = nil
+	xxx_File_issue780_oneof_conflict_test_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
index 504be4b..ea369ea 100644
--- a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
+++ b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
@@ -24,7 +24,7 @@
 )
 
 func (e Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_nopackage_nopackage_enumTypes[0]
+	return xxx_File_nopackage_nopackage_proto_enumTypes[0]
 }
 func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -58,7 +58,7 @@
 }
 
 func (Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_f33a1d5d178c43c9_gzipped, []int{0}
+	return xxx_File_nopackage_nopackage_proto_rawdesc_gzipped, []int{0}
 }
 
 type Message struct {
@@ -70,13 +70,13 @@
 }
 
 func (m *Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_nopackage_nopackage_messageTypes[0].MessageOf(m)
+	return xxx_File_nopackage_nopackage_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
 func (*Message) ProtoMessage()    {}
 func (*Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_f33a1d5d178c43c9_gzipped, []int{0}
+	return xxx_File_nopackage_nopackage_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Message) XXX_Unmarshal(b []byte) error {
@@ -114,12 +114,12 @@
 }
 
 func init() {
-	proto.RegisterFile("nopackage/nopackage.proto", fileDescriptor_f33a1d5d178c43c9_gzipped)
+	proto.RegisterFile("nopackage/nopackage.proto", xxx_File_nopackage_nopackage_proto_rawdesc_gzipped)
 	proto.RegisterEnum("Enum", Enum_name, Enum_value)
 	proto.RegisterType((*Message)(nil), "Message")
 }
 
-var fileDescriptor_f33a1d5d178c43c9 = []byte{
+var xxx_File_nopackage_nopackage_proto_rawdesc = []byte{
 	// 135 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x19, 0x6e, 0x6f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2f, 0x6e, 0x6f, 0x70, 0x61,
 	0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x58, 0x0a, 0x07, 0x4d,
@@ -132,36 +132,36 @@
 	0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00,
 }
 
-var fileDescriptor_f33a1d5d178c43c9_gzipped = protoapi.CompressGZIP(fileDescriptor_f33a1d5d178c43c9)
+var xxx_File_nopackage_nopackage_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_nopackage_nopackage_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_nopackage_nopackage protoreflect.FileDescriptor
+var File_nopackage_nopackage_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_nopackage_nopackage_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_nopackage_nopackage_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_nopackage_nopackage_goTypes = []interface{}{
+var xxx_File_nopackage_nopackage_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_nopackage_nopackage_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_nopackage_nopackage_proto_goTypes = []interface{}{
 	(Enum)(0),       // 0: Enum
 	(*Message)(nil), // 1: Message
 }
-var xxx_ProtoFile_nopackage_nopackage_depIdxs = []int32{
+var xxx_File_nopackage_nopackage_proto_depIdxs = []int32{
 	0, // Message.enum_field:type_name -> Enum
 }
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_nopackage_nopackage = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_f33a1d5d178c43c9,
-		GoTypes:            xxx_ProtoFile_nopackage_nopackage_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_nopackage_nopackage_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_nopackage_nopackage_enumTypes[:],
+	File_nopackage_nopackage_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_nopackage_nopackage_proto_rawdesc,
+		GoTypes:            xxx_File_nopackage_nopackage_proto_goTypes,
+		DependencyIndexes:  xxx_File_nopackage_nopackage_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_nopackage_nopackage_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_nopackage_nopackage_goTypes[1:][:1]
+	messageGoTypes := xxx_File_nopackage_nopackage_proto_goTypes[1:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_nopackage_nopackage_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_nopackage_nopackage_messageTypes[i].PBType = mt
+		xxx_File_nopackage_nopackage_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_nopackage_nopackage_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_nopackage_nopackage_goTypes = nil
-	xxx_ProtoFile_nopackage_nopackage_depIdxs = nil
+	xxx_File_nopackage_nopackage_proto_goTypes = nil
+	xxx_File_nopackage_nopackage_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
index 50a943d..96dd21b 100644
--- a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
@@ -28,7 +28,7 @@
 )
 
 func (e EnumType1) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto2_enum_enumTypes[0]
+	return xxx_File_proto2_enum_proto_enumTypes[0]
 }
 func (e EnumType1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -64,7 +64,7 @@
 }
 
 func (EnumType1) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{0}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0}
 }
 
 type EnumType2 int32
@@ -75,7 +75,7 @@
 )
 
 func (e EnumType2) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto2_enum_enumTypes[1]
+	return xxx_File_proto2_enum_proto_enumTypes[1]
 }
 func (e EnumType2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -111,7 +111,7 @@
 }
 
 func (EnumType2) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{1}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{1}
 }
 
 // NestedEnumType1A comment.
@@ -123,7 +123,7 @@
 )
 
 func (e EnumContainerMessage1_NestedEnumType1A) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto2_enum_enumTypes[2]
+	return xxx_File_proto2_enum_proto_enumTypes[2]
 }
 func (e EnumContainerMessage1_NestedEnumType1A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -157,7 +157,7 @@
 }
 
 func (EnumContainerMessage1_NestedEnumType1A) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{0, 0}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 type EnumContainerMessage1_NestedEnumType1B int32
@@ -167,7 +167,7 @@
 )
 
 func (e EnumContainerMessage1_NestedEnumType1B) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto2_enum_enumTypes[3]
+	return xxx_File_proto2_enum_proto_enumTypes[3]
 }
 func (e EnumContainerMessage1_NestedEnumType1B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -201,7 +201,7 @@
 }
 
 func (EnumContainerMessage1_NestedEnumType1B) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{0, 1}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0, 1}
 }
 
 // NestedEnumType2A comment.
@@ -213,7 +213,7 @@
 )
 
 func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto2_enum_enumTypes[4]
+	return xxx_File_proto2_enum_proto_enumTypes[4]
 }
 func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -247,7 +247,7 @@
 }
 
 func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{0, 0, 0}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0, 0, 0}
 }
 
 type EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B int32
@@ -257,7 +257,7 @@
 )
 
 func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto2_enum_enumTypes[5]
+	return xxx_File_proto2_enum_proto_enumTypes[5]
 }
 func (e EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -291,7 +291,7 @@
 }
 
 func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{0, 0, 1}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0, 0, 1}
 }
 
 type EnumContainerMessage1 struct {
@@ -303,13 +303,13 @@
 }
 
 func (m *EnumContainerMessage1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_enum_messageTypes[0].MessageOf(m)
+	return xxx_File_proto2_enum_proto_messageTypes[0].MessageOf(m)
 }
 func (m *EnumContainerMessage1) Reset()         { *m = EnumContainerMessage1{} }
 func (m *EnumContainerMessage1) String() string { return proto.CompactTextString(m) }
 func (*EnumContainerMessage1) ProtoMessage()    {}
 func (*EnumContainerMessage1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{0}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *EnumContainerMessage1) XXX_Unmarshal(b []byte) error {
@@ -354,7 +354,7 @@
 }
 
 func (m *EnumContainerMessage1_EnumContainerMessage2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_enum_messageTypes[1].MessageOf(m)
+	return xxx_File_proto2_enum_proto_messageTypes[1].MessageOf(m)
 }
 func (m *EnumContainerMessage1_EnumContainerMessage2) Reset() {
 	*m = EnumContainerMessage1_EnumContainerMessage2{}
@@ -364,7 +364,7 @@
 }
 func (*EnumContainerMessage1_EnumContainerMessage2) ProtoMessage() {}
 func (*EnumContainerMessage1_EnumContainerMessage2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_de9f68860d540858_gzipped, []int{0, 0}
+	return xxx_File_proto2_enum_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *EnumContainerMessage1_EnumContainerMessage2) XXX_Unmarshal(b []byte) error {
@@ -386,7 +386,7 @@
 var xxx_messageInfo_EnumContainerMessage1_EnumContainerMessage2 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("proto2/enum.proto", fileDescriptor_de9f68860d540858_gzipped)
+	proto.RegisterFile("proto2/enum.proto", xxx_File_proto2_enum_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.proto2.EnumType1", EnumType1_name, EnumType1_value)
 	proto.RegisterEnum("goproto.protoc.proto2.EnumType2", EnumType2_name, EnumType2_value)
 	proto.RegisterEnum("goproto.protoc.proto2.EnumContainerMessage1_NestedEnumType1A", EnumContainerMessage1_NestedEnumType1A_name, EnumContainerMessage1_NestedEnumType1A_value)
@@ -397,7 +397,7 @@
 	proto.RegisterType((*EnumContainerMessage1_EnumContainerMessage2)(nil), "goproto.protoc.proto2.EnumContainerMessage1.EnumContainerMessage2")
 }
 
-var fileDescriptor_de9f68860d540858 = []byte{
+var xxx_File_proto2_enum_proto_rawdesc = []byte{
 	// 624 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
@@ -440,15 +440,15 @@
 	0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,
 }
 
-var fileDescriptor_de9f68860d540858_gzipped = protoapi.CompressGZIP(fileDescriptor_de9f68860d540858)
+var xxx_File_proto2_enum_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_proto2_enum_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_proto2_enum protoreflect.FileDescriptor
+var File_proto2_enum_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_proto2_enum_enumTypes [6]protoreflect.EnumType
-var xxx_ProtoFile_proto2_enum_messageTypes [2]protoimpl.MessageType
-var xxx_ProtoFile_proto2_enum_goTypes = []interface{}{
+var xxx_File_proto2_enum_proto_enumTypes [6]protoreflect.EnumType
+var xxx_File_proto2_enum_proto_messageTypes [2]protoimpl.MessageType
+var xxx_File_proto2_enum_proto_goTypes = []interface{}{
 	(EnumType1)(0), // 0: goproto.protoc.proto2.EnumType1
 	(EnumType2)(0), // 1: goproto.protoc.proto2.EnumType2
 	(EnumContainerMessage1_NestedEnumType1A)(0),                       // 2: goproto.protoc.proto2.EnumContainerMessage1.NestedEnumType1A
@@ -458,25 +458,25 @@
 	(*EnumContainerMessage1)(nil),                                     // 6: goproto.protoc.proto2.EnumContainerMessage1
 	(*EnumContainerMessage1_EnumContainerMessage2)(nil),               // 7: goproto.protoc.proto2.EnumContainerMessage1.EnumContainerMessage2
 }
-var xxx_ProtoFile_proto2_enum_depIdxs = []int32{
+var xxx_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
 }
 
 func init() {
 	var messageTypes [2]protoreflect.MessageType
-	ProtoFile_proto2_enum = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_de9f68860d540858,
-		GoTypes:            xxx_ProtoFile_proto2_enum_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_proto2_enum_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_proto2_enum_enumTypes[:],
+	File_proto2_enum_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_proto2_enum_proto_rawdesc,
+		GoTypes:            xxx_File_proto2_enum_proto_goTypes,
+		DependencyIndexes:  xxx_File_proto2_enum_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_proto2_enum_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_proto2_enum_goTypes[6:][:2]
+	messageGoTypes := xxx_File_proto2_enum_proto_goTypes[6:][:2]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_proto2_enum_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_proto2_enum_messageTypes[i].PBType = mt
+		xxx_File_proto2_enum_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_proto2_enum_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_proto2_enum_goTypes = nil
-	xxx_ProtoFile_proto2_enum_depIdxs = nil
+	xxx_File_proto2_enum_proto_goTypes = nil
+	xxx_File_proto2_enum_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
index 1bc1330..9e25078 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
@@ -26,7 +26,7 @@
 )
 
 func (e FieldTestMessage_Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto2_fields_enumTypes[0]
+	return xxx_File_proto2_fields_proto_enumTypes[0]
 }
 func (e FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -62,7 +62,7 @@
 }
 
 func (FieldTestMessage_Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_fd8a9d72b841fd68_gzipped, []int{0, 0}
+	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 type FieldTestMessage struct {
@@ -178,13 +178,13 @@
 }
 
 func (m *FieldTestMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_fields_messageTypes[0].MessageOf(m)
+	return xxx_File_proto2_fields_proto_messageTypes[0].MessageOf(m)
 }
 func (m *FieldTestMessage) Reset()         { *m = FieldTestMessage{} }
 func (m *FieldTestMessage) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage) ProtoMessage()    {}
 func (*FieldTestMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fd8a9d72b841fd68_gzipped, []int{0}
+	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *FieldTestMessage) XXX_Unmarshal(b []byte) error {
@@ -1130,13 +1130,13 @@
 }
 
 func (m *FieldTestMessage_OptionalGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_fields_messageTypes[1].MessageOf(m)
+	return xxx_File_proto2_fields_proto_messageTypes[1].MessageOf(m)
 }
 func (m *FieldTestMessage_OptionalGroup) Reset()         { *m = FieldTestMessage_OptionalGroup{} }
 func (m *FieldTestMessage_OptionalGroup) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage_OptionalGroup) ProtoMessage()    {}
 func (*FieldTestMessage_OptionalGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fd8a9d72b841fd68_gzipped, []int{0, 0}
+	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *FieldTestMessage_OptionalGroup) XXX_Unmarshal(b []byte) error {
@@ -1172,13 +1172,13 @@
 }
 
 func (m *FieldTestMessage_RequiredGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_fields_messageTypes[2].MessageOf(m)
+	return xxx_File_proto2_fields_proto_messageTypes[2].MessageOf(m)
 }
 func (m *FieldTestMessage_RequiredGroup) Reset()         { *m = FieldTestMessage_RequiredGroup{} }
 func (m *FieldTestMessage_RequiredGroup) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage_RequiredGroup) ProtoMessage()    {}
 func (*FieldTestMessage_RequiredGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fd8a9d72b841fd68_gzipped, []int{0, 1}
+	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 1}
 }
 
 func (m *FieldTestMessage_RequiredGroup) XXX_Unmarshal(b []byte) error {
@@ -1214,13 +1214,13 @@
 }
 
 func (m *FieldTestMessage_RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_fields_messageTypes[3].MessageOf(m)
+	return xxx_File_proto2_fields_proto_messageTypes[3].MessageOf(m)
 }
 func (m *FieldTestMessage_RepeatedGroup) Reset()         { *m = FieldTestMessage_RepeatedGroup{} }
 func (m *FieldTestMessage_RepeatedGroup) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage_RepeatedGroup) ProtoMessage()    {}
 func (*FieldTestMessage_RepeatedGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fd8a9d72b841fd68_gzipped, []int{0, 2}
+	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 2}
 }
 
 func (m *FieldTestMessage_RepeatedGroup) XXX_Unmarshal(b []byte) error {
@@ -1256,13 +1256,13 @@
 }
 
 func (m *FieldTestMessage_OneofGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_fields_messageTypes[7].MessageOf(m)
+	return xxx_File_proto2_fields_proto_messageTypes[7].MessageOf(m)
 }
 func (m *FieldTestMessage_OneofGroup) Reset()         { *m = FieldTestMessage_OneofGroup{} }
 func (m *FieldTestMessage_OneofGroup) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage_OneofGroup) ProtoMessage()    {}
 func (*FieldTestMessage_OneofGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fd8a9d72b841fd68_gzipped, []int{0, 6}
+	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 6}
 }
 
 func (m *FieldTestMessage_OneofGroup) XXX_Unmarshal(b []byte) error {
@@ -1297,13 +1297,13 @@
 }
 
 func (m *FieldTestMessage_Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_fields_messageTypes[8].MessageOf(m)
+	return xxx_File_proto2_fields_proto_messageTypes[8].MessageOf(m)
 }
 func (m *FieldTestMessage_Message) Reset()         { *m = FieldTestMessage_Message{} }
 func (m *FieldTestMessage_Message) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage_Message) ProtoMessage()    {}
 func (*FieldTestMessage_Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fd8a9d72b841fd68_gzipped, []int{0, 7}
+	return xxx_File_proto2_fields_proto_rawdesc_gzipped, []int{0, 7}
 }
 
 func (m *FieldTestMessage_Message) XXX_Unmarshal(b []byte) error {
@@ -1325,7 +1325,7 @@
 var xxx_messageInfo_FieldTestMessage_Message proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("proto2/fields.proto", fileDescriptor_fd8a9d72b841fd68_gzipped)
+	proto.RegisterFile("proto2/fields.proto", xxx_File_proto2_fields_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.proto2.FieldTestMessage_Enum", FieldTestMessage_Enum_name, FieldTestMessage_Enum_value)
 	proto.RegisterType((*FieldTestMessage)(nil), "goproto.protoc.proto2.FieldTestMessage")
 	proto.RegisterMapType((map[uint64]FieldTestMessage_Enum)(nil), "goproto.protoc.proto2.FieldTestMessage.MapFixed64EnumEntry")
@@ -1338,7 +1338,7 @@
 	proto.RegisterType((*FieldTestMessage_Message)(nil), "goproto.protoc.proto2.FieldTestMessage.Message")
 }
 
-var fileDescriptor_fd8a9d72b841fd68 = []byte{
+var xxx_File_proto2_fields_proto_rawdesc = []byte{
 	// 5913 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70,
@@ -1712,15 +1712,15 @@
 	0x74, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,
 }
 
-var fileDescriptor_fd8a9d72b841fd68_gzipped = protoapi.CompressGZIP(fileDescriptor_fd8a9d72b841fd68)
+var xxx_File_proto2_fields_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_proto2_fields_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_proto2_fields protoreflect.FileDescriptor
+var File_proto2_fields_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_proto2_fields_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_proto2_fields_messageTypes [9]protoimpl.MessageType
-var xxx_ProtoFile_proto2_fields_goTypes = []interface{}{
+var xxx_File_proto2_fields_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_proto2_fields_proto_messageTypes [9]protoimpl.MessageType
+var xxx_File_proto2_fields_proto_goTypes = []interface{}{
 	(FieldTestMessage_Enum)(0),             // 0: goproto.protoc.proto2.FieldTestMessage.Enum
 	(*FieldTestMessage)(nil),               // 1: goproto.protoc.proto2.FieldTestMessage
 	(*FieldTestMessage_OptionalGroup)(nil), // 2: goproto.protoc.proto2.FieldTestMessage.OptionalGroup
@@ -1732,7 +1732,7 @@
 	(*FieldTestMessage_OneofGroup)(nil),    // 8: goproto.protoc.proto2.FieldTestMessage.OneofGroup
 	(*FieldTestMessage_Message)(nil),       // 9: goproto.protoc.proto2.FieldTestMessage.Message
 }
-var xxx_ProtoFile_proto2_fields_depIdxs = []int32{
+var xxx_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
@@ -1755,18 +1755,18 @@
 
 func init() {
 	var messageTypes [9]protoreflect.MessageType
-	ProtoFile_proto2_fields = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_fd8a9d72b841fd68,
-		GoTypes:            xxx_ProtoFile_proto2_fields_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_proto2_fields_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_proto2_fields_enumTypes[:],
+	File_proto2_fields_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_proto2_fields_proto_rawdesc,
+		GoTypes:            xxx_File_proto2_fields_proto_goTypes,
+		DependencyIndexes:  xxx_File_proto2_fields_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_proto2_fields_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_proto2_fields_goTypes[1:][:9]
+	messageGoTypes := xxx_File_proto2_fields_proto_goTypes[1:][:9]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_proto2_fields_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_proto2_fields_messageTypes[i].PBType = mt
+		xxx_File_proto2_fields_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_proto2_fields_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_proto2_fields_goTypes = nil
-	xxx_ProtoFile_proto2_fields_depIdxs = nil
+	xxx_File_proto2_fields_proto_goTypes = nil
+	xxx_File_proto2_fields_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
index 9f170cd..80147a5 100644
--- a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
@@ -26,13 +26,13 @@
 }
 
 func (m *Layer1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_nested_messages_messageTypes[0].MessageOf(m)
+	return xxx_File_proto2_nested_messages_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Layer1) Reset()         { *m = Layer1{} }
 func (m *Layer1) String() string { return proto.CompactTextString(m) }
 func (*Layer1) ProtoMessage()    {}
 func (*Layer1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7417ee157699d191_gzipped, []int{0}
+	return xxx_File_proto2_nested_messages_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Layer1) XXX_Unmarshal(b []byte) error {
@@ -75,13 +75,13 @@
 }
 
 func (m *Layer1_Layer2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_nested_messages_messageTypes[1].MessageOf(m)
+	return xxx_File_proto2_nested_messages_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Layer1_Layer2) Reset()         { *m = Layer1_Layer2{} }
 func (m *Layer1_Layer2) String() string { return proto.CompactTextString(m) }
 func (*Layer1_Layer2) ProtoMessage()    {}
 func (*Layer1_Layer2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7417ee157699d191_gzipped, []int{0, 0}
+	return xxx_File_proto2_nested_messages_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *Layer1_Layer2) XXX_Unmarshal(b []byte) error {
@@ -116,13 +116,13 @@
 }
 
 func (m *Layer1_Layer2_Layer3) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_nested_messages_messageTypes[2].MessageOf(m)
+	return xxx_File_proto2_nested_messages_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Layer1_Layer2_Layer3) Reset()         { *m = Layer1_Layer2_Layer3{} }
 func (m *Layer1_Layer2_Layer3) String() string { return proto.CompactTextString(m) }
 func (*Layer1_Layer2_Layer3) ProtoMessage()    {}
 func (*Layer1_Layer2_Layer3) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7417ee157699d191_gzipped, []int{0, 0, 0}
+	return xxx_File_proto2_nested_messages_proto_rawdesc_gzipped, []int{0, 0, 0}
 }
 
 func (m *Layer1_Layer2_Layer3) XXX_Unmarshal(b []byte) error {
@@ -144,13 +144,13 @@
 var xxx_messageInfo_Layer1_Layer2_Layer3 proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("proto2/nested_messages.proto", fileDescriptor_7417ee157699d191_gzipped)
+	proto.RegisterFile("proto2/nested_messages.proto", xxx_File_proto2_nested_messages_proto_rawdesc_gzipped)
 	proto.RegisterType((*Layer1)(nil), "goproto.protoc.proto2.Layer1")
 	proto.RegisterType((*Layer1_Layer2)(nil), "goproto.protoc.proto2.Layer1.Layer2")
 	proto.RegisterType((*Layer1_Layer2_Layer3)(nil), "goproto.protoc.proto2.Layer1.Layer2.Layer3")
 }
 
-var fileDescriptor_7417ee157699d191 = []byte{
+var xxx_File_proto2_nested_messages_proto_rawdesc = []byte{
 	// 327 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f,
 	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15,
@@ -175,19 +175,19 @@
 	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,
 }
 
-var fileDescriptor_7417ee157699d191_gzipped = protoapi.CompressGZIP(fileDescriptor_7417ee157699d191)
+var xxx_File_proto2_nested_messages_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_proto2_nested_messages_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_proto2_nested_messages protoreflect.FileDescriptor
+var File_proto2_nested_messages_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_proto2_nested_messages_messageTypes [3]protoimpl.MessageType
-var xxx_ProtoFile_proto2_nested_messages_goTypes = []interface{}{
+var xxx_File_proto2_nested_messages_proto_messageTypes [3]protoimpl.MessageType
+var xxx_File_proto2_nested_messages_proto_goTypes = []interface{}{
 	(*Layer1)(nil),               // 0: goproto.protoc.proto2.Layer1
 	(*Layer1_Layer2)(nil),        // 1: goproto.protoc.proto2.Layer1.Layer2
 	(*Layer1_Layer2_Layer3)(nil), // 2: goproto.protoc.proto2.Layer1.Layer2.Layer3
 }
-var xxx_ProtoFile_proto2_nested_messages_depIdxs = []int32{
+var xxx_File_proto2_nested_messages_proto_depIdxs = []int32{
 	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
@@ -195,17 +195,17 @@
 
 func init() {
 	var messageTypes [3]protoreflect.MessageType
-	ProtoFile_proto2_nested_messages = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_7417ee157699d191,
-		GoTypes:            xxx_ProtoFile_proto2_nested_messages_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_proto2_nested_messages_depIdxs,
+	File_proto2_nested_messages_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_proto2_nested_messages_proto_rawdesc,
+		GoTypes:            xxx_File_proto2_nested_messages_proto_goTypes,
+		DependencyIndexes:  xxx_File_proto2_nested_messages_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_proto2_nested_messages_goTypes[0:][:3]
+	messageGoTypes := xxx_File_proto2_nested_messages_proto_goTypes[0:][:3]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_proto2_nested_messages_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_proto2_nested_messages_messageTypes[i].PBType = mt
+		xxx_File_proto2_nested_messages_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_proto2_nested_messages_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_proto2_nested_messages_goTypes = nil
-	xxx_ProtoFile_proto2_nested_messages_depIdxs = nil
+	xxx_File_proto2_nested_messages_proto_goTypes = nil
+	xxx_File_proto2_nested_messages_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
index 3f52ab4..2a7a8df 100644
--- a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
@@ -26,13 +26,13 @@
 }
 
 func (m *Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto2_proto2_messageTypes[0].MessageOf(m)
+	return xxx_File_proto2_proto2_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message) Reset()         { *m = Message{} }
 func (m *Message) String() string { return proto.CompactTextString(m) }
 func (*Message) ProtoMessage()    {}
 func (*Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d756bbe8817c03c1_gzipped, []int{0}
+	return xxx_File_proto2_proto2_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Message) XXX_Unmarshal(b []byte) error {
@@ -68,11 +68,11 @@
 }
 
 func init() {
-	proto.RegisterFile("proto2/proto2.proto", fileDescriptor_d756bbe8817c03c1_gzipped)
+	proto.RegisterFile("proto2/proto2.proto", xxx_File_proto2_proto2_proto_rawdesc_gzipped)
 	proto.RegisterType((*Message)(nil), "goproto.protoc.proto2.Message")
 }
 
-var fileDescriptor_d756bbe8817c03c1 = []byte{
+var xxx_File_proto2_proto2_proto_rawdesc = []byte{
 	// 186 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70,
@@ -88,33 +88,33 @@
 	0x61, 0x74, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32,
 }
 
-var fileDescriptor_d756bbe8817c03c1_gzipped = protoapi.CompressGZIP(fileDescriptor_d756bbe8817c03c1)
+var xxx_File_proto2_proto2_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_proto2_proto2_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_proto2_proto2 protoreflect.FileDescriptor
+var File_proto2_proto2_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_proto2_proto2_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_proto2_proto2_goTypes = []interface{}{
+var xxx_File_proto2_proto2_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_proto2_proto2_proto_goTypes = []interface{}{
 	(*Message)(nil), // 0: goproto.protoc.proto2.Message
 }
-var xxx_ProtoFile_proto2_proto2_depIdxs = []int32{
+var xxx_File_proto2_proto2_proto_depIdxs = []int32{
 	0, // goproto.protoc.proto2.Message.m:type_name -> goproto.protoc.proto2.Message
 }
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_proto2_proto2 = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_d756bbe8817c03c1,
-		GoTypes:            xxx_ProtoFile_proto2_proto2_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_proto2_proto2_depIdxs,
+	File_proto2_proto2_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_proto2_proto2_proto_rawdesc,
+		GoTypes:            xxx_File_proto2_proto2_proto_goTypes,
+		DependencyIndexes:  xxx_File_proto2_proto2_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_proto2_proto2_goTypes[0:][:1]
+	messageGoTypes := xxx_File_proto2_proto2_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_proto2_proto2_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_proto2_proto2_messageTypes[i].PBType = mt
+		xxx_File_proto2_proto2_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_proto2_proto2_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_proto2_proto2_goTypes = nil
-	xxx_ProtoFile_proto2_proto2_depIdxs = nil
+	xxx_File_proto2_proto2_proto_goTypes = nil
+	xxx_File_proto2_proto2_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto3/enum.pb.go b/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
index 6db834e..be3a781 100644
--- a/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
@@ -25,7 +25,7 @@
 )
 
 func (e Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto3_enum_enumTypes[0]
+	return xxx_File_proto3_enum_proto_enumTypes[0]
 }
 func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -48,15 +48,15 @@
 }
 
 func (Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_b4b9b1e8d161a9a6_gzipped, []int{0}
+	return xxx_File_proto3_enum_proto_rawdesc_gzipped, []int{0}
 }
 
 func init() {
-	proto.RegisterFile("proto3/enum.proto", fileDescriptor_b4b9b1e8d161a9a6_gzipped)
+	proto.RegisterFile("proto3/enum.proto", xxx_File_proto3_enum_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.proto3.Enum", Enum_name, Enum_value)
 }
 
-var fileDescriptor_b4b9b1e8d161a9a6 = []byte{
+var xxx_File_proto3_enum_proto_rawdesc = []byte{
 	// 153 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
@@ -70,25 +70,25 @@
 	0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_b4b9b1e8d161a9a6_gzipped = protoapi.CompressGZIP(fileDescriptor_b4b9b1e8d161a9a6)
+var xxx_File_proto3_enum_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_proto3_enum_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_proto3_enum protoreflect.FileDescriptor
+var File_proto3_enum_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_proto3_enum_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_proto3_enum_goTypes = []interface{}{
+var xxx_File_proto3_enum_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_proto3_enum_proto_goTypes = []interface{}{
 	(Enum)(0), // 0: goproto.protoc.proto3.Enum
 }
-var xxx_ProtoFile_proto3_enum_depIdxs = []int32{}
+var xxx_File_proto3_enum_proto_depIdxs = []int32{}
 
 func init() {
-	ProtoFile_proto3_enum = protoimpl.FileBuilder{
-		RawDescriptor:     fileDescriptor_b4b9b1e8d161a9a6,
-		GoTypes:           xxx_ProtoFile_proto3_enum_goTypes,
-		DependencyIndexes: xxx_ProtoFile_proto3_enum_depIdxs,
-		EnumOutputTypes:   xxx_ProtoFile_proto3_enum_enumTypes[:],
+	File_proto3_enum_proto = protoimpl.FileBuilder{
+		RawDescriptor:     xxx_File_proto3_enum_proto_rawdesc,
+		GoTypes:           xxx_File_proto3_enum_proto_goTypes,
+		DependencyIndexes: xxx_File_proto3_enum_proto_depIdxs,
+		EnumOutputTypes:   xxx_File_proto3_enum_proto_enumTypes[:],
 	}.Init()
-	xxx_ProtoFile_proto3_enum_goTypes = nil
-	xxx_ProtoFile_proto3_enum_depIdxs = nil
+	xxx_File_proto3_enum_proto_goTypes = nil
+	xxx_File_proto3_enum_proto_depIdxs = nil
 }
diff --git a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
index b353dca..2cf26ce 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
@@ -24,7 +24,7 @@
 )
 
 func (e FieldTestMessage_Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_proto3_fields_enumTypes[0]
+	return xxx_File_proto3_fields_proto_enumTypes[0]
 }
 func (e FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -43,7 +43,7 @@
 }
 
 func (FieldTestMessage_Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_f1e3ea068187307c_gzipped, []int{0, 0}
+	return xxx_File_proto3_fields_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 type FieldTestMessage struct {
@@ -90,13 +90,13 @@
 }
 
 func (m *FieldTestMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto3_fields_messageTypes[0].MessageOf(m)
+	return xxx_File_proto3_fields_proto_messageTypes[0].MessageOf(m)
 }
 func (m *FieldTestMessage) Reset()         { *m = FieldTestMessage{} }
 func (m *FieldTestMessage) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage) ProtoMessage()    {}
 func (*FieldTestMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_f1e3ea068187307c_gzipped, []int{0}
+	return xxx_File_proto3_fields_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *FieldTestMessage) XXX_Unmarshal(b []byte) error {
@@ -383,13 +383,13 @@
 }
 
 func (m *FieldTestMessage_Message) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_proto3_fields_messageTypes[4].MessageOf(m)
+	return xxx_File_proto3_fields_proto_messageTypes[4].MessageOf(m)
 }
 func (m *FieldTestMessage_Message) Reset()         { *m = FieldTestMessage_Message{} }
 func (m *FieldTestMessage_Message) String() string { return proto.CompactTextString(m) }
 func (*FieldTestMessage_Message) ProtoMessage()    {}
 func (*FieldTestMessage_Message) Descriptor() ([]byte, []int) {
-	return fileDescriptor_f1e3ea068187307c_gzipped, []int{0, 3}
+	return xxx_File_proto3_fields_proto_rawdesc_gzipped, []int{0, 3}
 }
 
 func (m *FieldTestMessage_Message) XXX_Unmarshal(b []byte) error {
@@ -411,7 +411,7 @@
 var xxx_messageInfo_FieldTestMessage_Message proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("proto3/fields.proto", fileDescriptor_f1e3ea068187307c_gzipped)
+	proto.RegisterFile("proto3/fields.proto", xxx_File_proto3_fields_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.protoc.proto3.FieldTestMessage_Enum", FieldTestMessage_Enum_name, FieldTestMessage_Enum_value)
 	proto.RegisterType((*FieldTestMessage)(nil), "goproto.protoc.proto3.FieldTestMessage")
 	proto.RegisterMapType((map[uint64]FieldTestMessage_Enum)(nil), "goproto.protoc.proto3.FieldTestMessage.MapFixed64EnumEntry")
@@ -420,7 +420,7 @@
 	proto.RegisterType((*FieldTestMessage_Message)(nil), "goproto.protoc.proto3.FieldTestMessage.Message")
 }
 
-var fileDescriptor_f1e3ea068187307c = []byte{
+var xxx_File_proto3_fields_proto_rawdesc = []byte{
 	// 2378 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70,
@@ -573,15 +573,15 @@
 	0x6f, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var fileDescriptor_f1e3ea068187307c_gzipped = protoapi.CompressGZIP(fileDescriptor_f1e3ea068187307c)
+var xxx_File_proto3_fields_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_proto3_fields_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_proto3_fields protoreflect.FileDescriptor
+var File_proto3_fields_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_proto3_fields_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_proto3_fields_messageTypes [5]protoimpl.MessageType
-var xxx_ProtoFile_proto3_fields_goTypes = []interface{}{
+var xxx_File_proto3_fields_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_proto3_fields_proto_messageTypes [5]protoimpl.MessageType
+var xxx_File_proto3_fields_proto_goTypes = []interface{}{
 	(FieldTestMessage_Enum)(0),       // 0: goproto.protoc.proto3.FieldTestMessage.Enum
 	(*FieldTestMessage)(nil),         // 1: goproto.protoc.proto3.FieldTestMessage
 	nil,                              // 2: goproto.protoc.proto3.FieldTestMessage.MapInt32Int64Entry
@@ -589,7 +589,7 @@
 	nil,                              // 4: goproto.protoc.proto3.FieldTestMessage.MapFixed64EnumEntry
 	(*FieldTestMessage_Message)(nil), // 5: goproto.protoc.proto3.FieldTestMessage.Message
 }
-var xxx_ProtoFile_proto3_fields_depIdxs = []int32{
+var xxx_File_proto3_fields_proto_depIdxs = []int32{
 	0, // goproto.protoc.proto3.FieldTestMessage.optional_enum:type_name -> goproto.protoc.proto3.FieldTestMessage.Enum
 	5, // goproto.protoc.proto3.FieldTestMessage.optional_Message:type_name -> goproto.protoc.proto3.FieldTestMessage.Message
 	0, // goproto.protoc.proto3.FieldTestMessage.repeated_enum:type_name -> goproto.protoc.proto3.FieldTestMessage.Enum
@@ -603,18 +603,18 @@
 
 func init() {
 	var messageTypes [5]protoreflect.MessageType
-	ProtoFile_proto3_fields = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_f1e3ea068187307c,
-		GoTypes:            xxx_ProtoFile_proto3_fields_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_proto3_fields_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_proto3_fields_enumTypes[:],
+	File_proto3_fields_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_proto3_fields_proto_rawdesc,
+		GoTypes:            xxx_File_proto3_fields_proto_goTypes,
+		DependencyIndexes:  xxx_File_proto3_fields_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_proto3_fields_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_proto3_fields_goTypes[1:][:5]
+	messageGoTypes := xxx_File_proto3_fields_proto_goTypes[1:][:5]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_proto3_fields_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_proto3_fields_messageTypes[i].PBType = mt
+		xxx_File_proto3_fields_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_proto3_fields_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_proto3_fields_goTypes = nil
-	xxx_ProtoFile_proto3_fields_depIdxs = nil
+	xxx_File_proto3_fields_proto_goTypes = nil
+	xxx_File_proto3_fields_proto_depIdxs = nil
 }
diff --git a/encoding/testprotos/pb2/test.pb.go b/encoding/testprotos/pb2/test.pb.go
index 2d4f269..05944ef 100644
--- a/encoding/testprotos/pb2/test.pb.go
+++ b/encoding/testprotos/pb2/test.pb.go
@@ -32,7 +32,7 @@
 )
 
 func (e Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_enumTypes[0]
+	return xxx_File_encoding_testprotos_pb2_test_proto_enumTypes[0]
 }
 func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -70,7 +70,7 @@
 }
 
 func (Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{0}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{0}
 }
 
 type Enums_NestedEnum int32
@@ -82,7 +82,7 @@
 )
 
 func (e Enums_NestedEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_enumTypes[1]
+	return xxx_File_encoding_testprotos_pb2_test_proto_enumTypes[1]
 }
 func (e Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -120,7 +120,7 @@
 }
 
 func (Enums_NestedEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{1, 0}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{1, 0}
 }
 
 // Scalars contains optional scalar fields.
@@ -146,13 +146,13 @@
 }
 
 func (m *Scalars) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[0].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Scalars) Reset()         { *m = Scalars{} }
 func (m *Scalars) String() string { return proto.CompactTextString(m) }
 func (*Scalars) ProtoMessage()    {}
 func (*Scalars) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{0}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Scalars) XXX_Unmarshal(b []byte) error {
@@ -290,13 +290,13 @@
 }
 
 func (m *Enums) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[1].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Enums) Reset()         { *m = Enums{} }
 func (m *Enums) String() string { return proto.CompactTextString(m) }
 func (*Enums) ProtoMessage()    {}
 func (*Enums) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{1}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *Enums) XXX_Unmarshal(b []byte) error {
@@ -362,13 +362,13 @@
 }
 
 func (m *Repeats) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[2].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Repeats) Reset()         { *m = Repeats{} }
 func (m *Repeats) String() string { return proto.CompactTextString(m) }
 func (*Repeats) ProtoMessage()    {}
 func (*Repeats) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{2}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{2}
 }
 
 func (m *Repeats) XXX_Unmarshal(b []byte) error {
@@ -462,13 +462,13 @@
 }
 
 func (m *Nested) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[3].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Nested) Reset()         { *m = Nested{} }
 func (m *Nested) String() string { return proto.CompactTextString(m) }
 func (*Nested) ProtoMessage()    {}
 func (*Nested) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{3}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{3}
 }
 
 func (m *Nested) XXX_Unmarshal(b []byte) error {
@@ -515,13 +515,13 @@
 }
 
 func (m *Nests) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[4].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Nests) Reset()         { *m = Nests{} }
 func (m *Nests) String() string { return proto.CompactTextString(m) }
 func (*Nests) ProtoMessage()    {}
 func (*Nests) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{4}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{4}
 }
 
 func (m *Nests) XXX_Unmarshal(b []byte) error {
@@ -584,13 +584,13 @@
 }
 
 func (m *Requireds) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[5].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[5].MessageOf(m)
 }
 func (m *Requireds) Reset()         { *m = Requireds{} }
 func (m *Requireds) String() string { return proto.CompactTextString(m) }
 func (*Requireds) ProtoMessage()    {}
 func (*Requireds) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{5}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{5}
 }
 
 func (m *Requireds) XXX_Unmarshal(b []byte) error {
@@ -663,13 +663,13 @@
 }
 
 func (m *PartialRequired) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[6].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[6].MessageOf(m)
 }
 func (m *PartialRequired) Reset()         { *m = PartialRequired{} }
 func (m *PartialRequired) String() string { return proto.CompactTextString(m) }
 func (*PartialRequired) ProtoMessage()    {}
 func (*PartialRequired) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{6}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{6}
 }
 
 func (m *PartialRequired) XXX_Unmarshal(b []byte) error {
@@ -712,13 +712,13 @@
 }
 
 func (m *NestedWithRequired) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[7].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[7].MessageOf(m)
 }
 func (m *NestedWithRequired) Reset()         { *m = NestedWithRequired{} }
 func (m *NestedWithRequired) String() string { return proto.CompactTextString(m) }
 func (*NestedWithRequired) ProtoMessage()    {}
 func (*NestedWithRequired) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{7}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{7}
 }
 
 func (m *NestedWithRequired) XXX_Unmarshal(b []byte) error {
@@ -759,13 +759,13 @@
 }
 
 func (m *IndirectRequired) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[8].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[8].MessageOf(m)
 }
 func (m *IndirectRequired) Reset()         { *m = IndirectRequired{} }
 func (m *IndirectRequired) String() string { return proto.CompactTextString(m) }
 func (*IndirectRequired) ProtoMessage()    {}
 func (*IndirectRequired) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{8}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{8}
 }
 
 func (m *IndirectRequired) XXX_Unmarshal(b []byte) error {
@@ -849,13 +849,13 @@
 }
 
 func (m *Extensions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[9].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[9].MessageOf(m)
 }
 func (m *Extensions) Reset()         { *m = Extensions{} }
 func (m *Extensions) String() string { return proto.CompactTextString(m) }
 func (*Extensions) ProtoMessage()    {}
 func (*Extensions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{9}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{9}
 }
 
 var extRange_Extensions = []proto.ExtensionRange{
@@ -912,13 +912,13 @@
 }
 
 func (m *ExtensionsContainer) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[10].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[10].MessageOf(m)
 }
 func (m *ExtensionsContainer) Reset()         { *m = ExtensionsContainer{} }
 func (m *ExtensionsContainer) String() string { return proto.CompactTextString(m) }
 func (*ExtensionsContainer) ProtoMessage()    {}
 func (*ExtensionsContainer) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{10}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{10}
 }
 
 func (m *ExtensionsContainer) XXX_Unmarshal(b []byte) error {
@@ -947,13 +947,13 @@
 }
 
 func (m *MessageSet) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[11].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[11].MessageOf(m)
 }
 func (m *MessageSet) Reset()         { *m = MessageSet{} }
 func (m *MessageSet) String() string { return proto.CompactTextString(m) }
 func (*MessageSet) ProtoMessage()    {}
 func (*MessageSet) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{11}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{11}
 }
 
 var extRange_MessageSet = []proto.ExtensionRange{
@@ -990,13 +990,13 @@
 }
 
 func (m *MessageSetExtension) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[12].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[12].MessageOf(m)
 }
 func (m *MessageSetExtension) Reset()         { *m = MessageSetExtension{} }
 func (m *MessageSetExtension) String() string { return proto.CompactTextString(m) }
 func (*MessageSetExtension) ProtoMessage()    {}
 func (*MessageSetExtension) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{12}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{12}
 }
 
 func (m *MessageSetExtension) XXX_Unmarshal(b []byte) error {
@@ -1032,13 +1032,13 @@
 }
 
 func (m *FakeMessageSet) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[13].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[13].MessageOf(m)
 }
 func (m *FakeMessageSet) Reset()         { *m = FakeMessageSet{} }
 func (m *FakeMessageSet) String() string { return proto.CompactTextString(m) }
 func (*FakeMessageSet) ProtoMessage()    {}
 func (*FakeMessageSet) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{13}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{13}
 }
 
 var extRange_FakeMessageSet = []proto.ExtensionRange{
@@ -1075,13 +1075,13 @@
 }
 
 func (m *FakeMessageSetExtension) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[14].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[14].MessageOf(m)
 }
 func (m *FakeMessageSetExtension) Reset()         { *m = FakeMessageSetExtension{} }
 func (m *FakeMessageSetExtension) String() string { return proto.CompactTextString(m) }
 func (*FakeMessageSetExtension) ProtoMessage()    {}
 func (*FakeMessageSetExtension) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{14}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{14}
 }
 
 func (m *FakeMessageSetExtension) XXX_Unmarshal(b []byte) error {
@@ -1133,13 +1133,13 @@
 }
 
 func (m *KnownTypes) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[15].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[15].MessageOf(m)
 }
 func (m *KnownTypes) Reset()         { *m = KnownTypes{} }
 func (m *KnownTypes) String() string { return proto.CompactTextString(m) }
 func (*KnownTypes) ProtoMessage()    {}
 func (*KnownTypes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{15}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{15}
 }
 
 func (m *KnownTypes) XXX_Unmarshal(b []byte) error {
@@ -1282,13 +1282,13 @@
 }
 
 func (m *Nests_OptGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[16].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[16].MessageOf(m)
 }
 func (m *Nests_OptGroup) Reset()         { *m = Nests_OptGroup{} }
 func (m *Nests_OptGroup) String() string { return proto.CompactTextString(m) }
 func (*Nests_OptGroup) ProtoMessage()    {}
 func (*Nests_OptGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{4, 0}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{4, 0}
 }
 
 func (m *Nests_OptGroup) XXX_Unmarshal(b []byte) error {
@@ -1338,13 +1338,13 @@
 }
 
 func (m *Nests_RptGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[17].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[17].MessageOf(m)
 }
 func (m *Nests_RptGroup) Reset()         { *m = Nests_RptGroup{} }
 func (m *Nests_RptGroup) String() string { return proto.CompactTextString(m) }
 func (*Nests_RptGroup) ProtoMessage()    {}
 func (*Nests_RptGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{4, 1}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{4, 1}
 }
 
 func (m *Nests_RptGroup) XXX_Unmarshal(b []byte) error {
@@ -1380,13 +1380,13 @@
 }
 
 func (m *Nests_OptGroup_OptNestedGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[18].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[18].MessageOf(m)
 }
 func (m *Nests_OptGroup_OptNestedGroup) Reset()         { *m = Nests_OptGroup_OptNestedGroup{} }
 func (m *Nests_OptGroup_OptNestedGroup) String() string { return proto.CompactTextString(m) }
 func (*Nests_OptGroup_OptNestedGroup) ProtoMessage()    {}
 func (*Nests_OptGroup_OptNestedGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_72e37deb177b50f8_gzipped, []int{4, 0, 0}
+	return xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped, []int{4, 0, 0}
 }
 
 func (m *Nests_OptGroup_OptNestedGroup) XXX_Unmarshal(b []byte) error {
@@ -1586,7 +1586,7 @@
 }
 
 func init() {
-	proto.RegisterFile("encoding/testprotos/pb2/test.proto", fileDescriptor_72e37deb177b50f8_gzipped)
+	proto.RegisterFile("encoding/testprotos/pb2/test.proto", xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped)
 	proto.RegisterEnum("pb2.Enum", Enum_name, Enum_value)
 	proto.RegisterEnum("pb2.Enums_NestedEnum", Enums_NestedEnum_name, Enums_NestedEnum_value)
 	proto.RegisterType((*Scalars)(nil), "pb2.Scalars")
@@ -1630,7 +1630,7 @@
 	proto.RegisterExtension(E_FakeMessageSetExtension_MessageSetExtension)
 }
 
-var fileDescriptor_72e37deb177b50f8 = []byte{
+var xxx_File_encoding_testprotos_pb2_test_proto_rawdesc = []byte{
 	// 5146 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x22, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70,
 	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70, 0x62, 0x32, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70,
@@ -1956,15 +1956,15 @@
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70, 0x62, 0x32,
 }
 
-var fileDescriptor_72e37deb177b50f8_gzipped = protoapi.CompressGZIP(fileDescriptor_72e37deb177b50f8)
+var xxx_File_encoding_testprotos_pb2_test_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_encoding_testprotos_pb2_test_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_encoding_testprotos_pb2_test protoreflect.FileDescriptor
+var File_encoding_testprotos_pb2_test_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_encoding_testprotos_pb2_test_enumTypes [2]protoreflect.EnumType
-var xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes [20]protoimpl.MessageType
-var xxx_ProtoFile_encoding_testprotos_pb2_test_goTypes = []interface{}{
+var xxx_File_encoding_testprotos_pb2_test_proto_enumTypes [2]protoreflect.EnumType
+var xxx_File_encoding_testprotos_pb2_test_proto_messageTypes [20]protoimpl.MessageType
+var xxx_File_encoding_testprotos_pb2_test_proto_goTypes = []interface{}{
 	(Enum)(0),                             // 0: pb2.Enum
 	(Enums_NestedEnum)(0),                 // 1: pb2.Enums.NestedEnum
 	(*Scalars)(nil),                       // 2: pb2.Scalars
@@ -2004,7 +2004,7 @@
 	(*empty.Empty)(nil),                   // 36: google.protobuf.Empty
 	(*any.Any)(nil),                       // 37: google.protobuf.Any
 }
-var xxx_ProtoFile_encoding_testprotos_pb2_test_depIdxs = []int32{
+var xxx_File_encoding_testprotos_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
@@ -2076,18 +2076,18 @@
 func init() {
 	var messageTypes [20]protoreflect.MessageType
 	var extensionTypes [19]protoreflect.ExtensionType
-	ProtoFile_encoding_testprotos_pb2_test = protoimpl.FileBuilder{
-		RawDescriptor:        fileDescriptor_72e37deb177b50f8,
-		GoTypes:              xxx_ProtoFile_encoding_testprotos_pb2_test_goTypes,
-		DependencyIndexes:    xxx_ProtoFile_encoding_testprotos_pb2_test_depIdxs,
-		EnumOutputTypes:      xxx_ProtoFile_encoding_testprotos_pb2_test_enumTypes[:],
+	File_encoding_testprotos_pb2_test_proto = protoimpl.FileBuilder{
+		RawDescriptor:        xxx_File_encoding_testprotos_pb2_test_proto_rawdesc,
+		GoTypes:              xxx_File_encoding_testprotos_pb2_test_proto_goTypes,
+		DependencyIndexes:    xxx_File_encoding_testprotos_pb2_test_proto_depIdxs,
+		EnumOutputTypes:      xxx_File_encoding_testprotos_pb2_test_proto_enumTypes[:],
 		MessageOutputTypes:   messageTypes[:],
 		ExtensionOutputTypes: extensionTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_encoding_testprotos_pb2_test_goTypes[2:][:20]
+	messageGoTypes := xxx_File_encoding_testprotos_pb2_test_proto_goTypes[2:][:20]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_encoding_testprotos_pb2_test_messageTypes[i].PBType = mt
+		xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_encoding_testprotos_pb2_test_proto_messageTypes[i].PBType = mt
 	}
 	E_OptExtBool.Type = extensionTypes[0]
 	E_OptExtString.Type = extensionTypes[1]
@@ -2108,6 +2108,6 @@
 	E_MessageSetExtension_NotMessageSetExtension.Type = extensionTypes[16]
 	E_MessageSetExtension_ExtNested.Type = extensionTypes[17]
 	E_FakeMessageSetExtension_MessageSetExtension.Type = extensionTypes[18]
-	xxx_ProtoFile_encoding_testprotos_pb2_test_goTypes = nil
-	xxx_ProtoFile_encoding_testprotos_pb2_test_depIdxs = nil
+	xxx_File_encoding_testprotos_pb2_test_proto_goTypes = nil
+	xxx_File_encoding_testprotos_pb2_test_proto_depIdxs = nil
 }
diff --git a/encoding/testprotos/pb3/test.pb.go b/encoding/testprotos/pb3/test.pb.go
index b67b65e..3ba43d2 100644
--- a/encoding/testprotos/pb3/test.pb.go
+++ b/encoding/testprotos/pb3/test.pb.go
@@ -27,7 +27,7 @@
 )
 
 func (e Enum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_enumTypes[0]
+	return xxx_File_encoding_testprotos_pb3_test_proto_enumTypes[0]
 }
 func (e Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -52,7 +52,7 @@
 }
 
 func (Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{0}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{0}
 }
 
 type Enums_NestedEnum int32
@@ -65,7 +65,7 @@
 )
 
 func (e Enums_NestedEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_enumTypes[1]
+	return xxx_File_encoding_testprotos_pb3_test_proto_enumTypes[1]
 }
 func (e Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -90,7 +90,7 @@
 }
 
 func (Enums_NestedEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{1, 0}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{1, 0}
 }
 
 // Scalars contains scalar field types.
@@ -116,13 +116,13 @@
 }
 
 func (m *Scalars) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[0].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Scalars) Reset()         { *m = Scalars{} }
 func (m *Scalars) String() string { return proto.CompactTextString(m) }
 func (*Scalars) ProtoMessage()    {}
 func (*Scalars) Descriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{0}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Scalars) XXX_Unmarshal(b []byte) error {
@@ -258,13 +258,13 @@
 }
 
 func (m *Enums) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[1].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Enums) Reset()         { *m = Enums{} }
 func (m *Enums) String() string { return proto.CompactTextString(m) }
 func (*Enums) ProtoMessage()    {}
 func (*Enums) Descriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{1}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *Enums) XXX_Unmarshal(b []byte) error {
@@ -308,13 +308,13 @@
 }
 
 func (m *Nests) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[2].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Nests) Reset()         { *m = Nests{} }
 func (m *Nests) String() string { return proto.CompactTextString(m) }
 func (*Nests) ProtoMessage()    {}
 func (*Nests) Descriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{2}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{2}
 }
 
 func (m *Nests) XXX_Unmarshal(b []byte) error {
@@ -352,13 +352,13 @@
 }
 
 func (m *Nested) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[3].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Nested) Reset()         { *m = Nested{} }
 func (m *Nested) String() string { return proto.CompactTextString(m) }
 func (*Nested) ProtoMessage()    {}
 func (*Nested) Descriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{3}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{3}
 }
 
 func (m *Nested) XXX_Unmarshal(b []byte) error {
@@ -406,13 +406,13 @@
 }
 
 func (m *Oneofs) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[4].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[4].MessageOf(m)
 }
 func (m *Oneofs) Reset()         { *m = Oneofs{} }
 func (m *Oneofs) String() string { return proto.CompactTextString(m) }
 func (*Oneofs) ProtoMessage()    {}
 func (*Oneofs) Descriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{4}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{4}
 }
 
 func (m *Oneofs) XXX_Unmarshal(b []byte) error {
@@ -505,13 +505,13 @@
 }
 
 func (m *Maps) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[5].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[5].MessageOf(m)
 }
 func (m *Maps) Reset()         { *m = Maps{} }
 func (m *Maps) String() string { return proto.CompactTextString(m) }
 func (*Maps) ProtoMessage()    {}
 func (*Maps) Descriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{5}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{5}
 }
 
 func (m *Maps) XXX_Unmarshal(b []byte) error {
@@ -576,13 +576,13 @@
 }
 
 func (m *JSONNames) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[6].MessageOf(m)
+	return xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[6].MessageOf(m)
 }
 func (m *JSONNames) Reset()         { *m = JSONNames{} }
 func (m *JSONNames) String() string { return proto.CompactTextString(m) }
 func (*JSONNames) ProtoMessage()    {}
 func (*JSONNames) Descriptor() ([]byte, []int) {
-	return fileDescriptor_33e0a17922cde063_gzipped, []int{6}
+	return xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped, []int{6}
 }
 
 func (m *JSONNames) XXX_Unmarshal(b []byte) error {
@@ -611,7 +611,7 @@
 }
 
 func init() {
-	proto.RegisterFile("encoding/testprotos/pb3/test.proto", fileDescriptor_33e0a17922cde063_gzipped)
+	proto.RegisterFile("encoding/testprotos/pb3/test.proto", xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped)
 	proto.RegisterEnum("pb3.Enum", Enum_name, Enum_value)
 	proto.RegisterEnum("pb3.Enums_NestedEnum", Enums_NestedEnum_name, Enums_NestedEnum_value)
 	proto.RegisterType((*Scalars)(nil), "pb3.Scalars")
@@ -628,7 +628,7 @@
 	proto.RegisterType((*JSONNames)(nil), "pb3.JSONNames")
 }
 
-var fileDescriptor_33e0a17922cde063 = []byte{
+var xxx_File_encoding_testprotos_pb3_test_proto_rawdesc = []byte{
 	// 1730 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x22, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70,
 	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70, 0x62, 0x33, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70,
@@ -741,15 +741,15 @@
 	0x6f, 0x33,
 }
 
-var fileDescriptor_33e0a17922cde063_gzipped = protoapi.CompressGZIP(fileDescriptor_33e0a17922cde063)
+var xxx_File_encoding_testprotos_pb3_test_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_encoding_testprotos_pb3_test_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_encoding_testprotos_pb3_test protoreflect.FileDescriptor
+var File_encoding_testprotos_pb3_test_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_encoding_testprotos_pb3_test_enumTypes [2]protoreflect.EnumType
-var xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes [12]protoimpl.MessageType
-var xxx_ProtoFile_encoding_testprotos_pb3_test_goTypes = []interface{}{
+var xxx_File_encoding_testprotos_pb3_test_proto_enumTypes [2]protoreflect.EnumType
+var xxx_File_encoding_testprotos_pb3_test_proto_messageTypes [12]protoimpl.MessageType
+var xxx_File_encoding_testprotos_pb3_test_proto_goTypes = []interface{}{
 	(Enum)(0),             // 0: pb3.Enum
 	(Enums_NestedEnum)(0), // 1: pb3.Enums.NestedEnum
 	(*Scalars)(nil),       // 2: pb3.Scalars
@@ -765,7 +765,7 @@
 	nil,                   // 12: pb3.Maps.StrToNestedEntry
 	nil,                   // 13: pb3.Maps.StrToOneofsEntry
 }
-var xxx_ProtoFile_encoding_testprotos_pb3_test_depIdxs = []int32{
+var xxx_File_encoding_testprotos_pb3_test_proto_depIdxs = []int32{
 	0,  // pb3.Enums.s_enum:type_name -> pb3.Enum
 	1,  // pb3.Enums.s_nested_enum:type_name -> pb3.Enums.NestedEnum
 	5,  // pb3.Nests.s_nested:type_name -> pb3.Nested
@@ -784,18 +784,18 @@
 
 func init() {
 	var messageTypes [12]protoreflect.MessageType
-	ProtoFile_encoding_testprotos_pb3_test = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_33e0a17922cde063,
-		GoTypes:            xxx_ProtoFile_encoding_testprotos_pb3_test_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_encoding_testprotos_pb3_test_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_encoding_testprotos_pb3_test_enumTypes[:],
+	File_encoding_testprotos_pb3_test_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_encoding_testprotos_pb3_test_proto_rawdesc,
+		GoTypes:            xxx_File_encoding_testprotos_pb3_test_proto_goTypes,
+		DependencyIndexes:  xxx_File_encoding_testprotos_pb3_test_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_encoding_testprotos_pb3_test_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_encoding_testprotos_pb3_test_goTypes[2:][:12]
+	messageGoTypes := xxx_File_encoding_testprotos_pb3_test_proto_goTypes[2:][:12]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_encoding_testprotos_pb3_test_messageTypes[i].PBType = mt
+		xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_encoding_testprotos_pb3_test_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_encoding_testprotos_pb3_test_goTypes = nil
-	xxx_ProtoFile_encoding_testprotos_pb3_test_depIdxs = nil
+	xxx_File_encoding_testprotos_pb3_test_proto_goTypes = nil
+	xxx_File_encoding_testprotos_pb3_test_proto_depIdxs = nil
 }
diff --git a/internal/fileinit/fileinit_test.go b/internal/fileinit/fileinit_test.go
index b6ba1e1..a02036b 100644
--- a/internal/fileinit/fileinit_test.go
+++ b/internal/fileinit/fileinit_test.go
@@ -20,7 +20,7 @@
 	// 2. The protoc-generated wire-encoded message.
 	//
 	// This serves as a test of both fileinit and protodesc.
-	got := protodesc.ToFileDescriptorProto(testpb.ProtoFile_test)
+	got := protodesc.ToFileDescriptorProto(testpb.File_test_proto)
 
 	want := &descriptorpb.FileDescriptorProto{}
 	zb, _ := (&testpb.TestAllTypes{}).Descriptor()
@@ -60,7 +60,7 @@
 		"ServiceDescriptorProto",
 		"MethodDescriptorProto",
 	} {
-		message := descriptorpb.ProtoFile_google_protobuf_descriptor.Messages().ByName(messageName)
+		message := descriptorpb.File_google_protobuf_descriptor_proto.Messages().ByName(messageName)
 		for i, fields := 0, message.Fields(); i < fields.Len(); i++ {
 			if name := fields.Get(i).FullName(); !seen[name] && !ignore[name] {
 				t.Errorf("No test for descriptor field: %v", name)
diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go
index 0d35481..37e45e4 100644
--- a/internal/testprotos/test/test.pb.go
+++ b/internal/testprotos/test/test.pb.go
@@ -26,7 +26,7 @@
 )
 
 func (e ForeignEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_test_enumTypes[0]
+	return xxx_File_test_proto_enumTypes[0]
 }
 func (e ForeignEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -64,7 +64,7 @@
 }
 
 func (ForeignEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{0}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{0}
 }
 
 type TestReservedEnumFields int32
@@ -74,7 +74,7 @@
 )
 
 func (e TestReservedEnumFields) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_test_enumTypes[1]
+	return xxx_File_test_proto_enumTypes[1]
 }
 func (e TestReservedEnumFields) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -108,7 +108,7 @@
 }
 
 func (TestReservedEnumFields) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{1}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{1}
 }
 
 type TestAllTypes_NestedEnum int32
@@ -121,7 +121,7 @@
 )
 
 func (e TestAllTypes_NestedEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_test_enumTypes[2]
+	return xxx_File_test_proto_enumTypes[2]
 }
 func (e TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -161,7 +161,7 @@
 }
 
 func (TestAllTypes_NestedEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{0, 0}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 type TestDeprecatedMessage_DeprecatedEnum int32 // Deprecated: Do not use.
@@ -170,7 +170,7 @@
 )
 
 func (e TestDeprecatedMessage_DeprecatedEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_test_enumTypes[3]
+	return xxx_File_test_proto_enumTypes[3]
 }
 func (e TestDeprecatedMessage_DeprecatedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -204,7 +204,7 @@
 }
 
 func (TestDeprecatedMessage_DeprecatedEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{1, 0}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{1, 0}
 }
 
 type TestAllTypes struct {
@@ -304,13 +304,13 @@
 }
 
 func (m *TestAllTypes) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[0].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *TestAllTypes) Reset()         { *m = TestAllTypes{} }
 func (m *TestAllTypes) String() string { return proto.CompactTextString(m) }
 func (*TestAllTypes) ProtoMessage()    {}
 func (*TestAllTypes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{0}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *TestAllTypes) XXX_Unmarshal(b []byte) error {
@@ -1052,13 +1052,13 @@
 }
 
 func (m *TestDeprecatedMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[1].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *TestDeprecatedMessage) Reset()         { *m = TestDeprecatedMessage{} }
 func (m *TestDeprecatedMessage) String() string { return proto.CompactTextString(m) }
 func (*TestDeprecatedMessage) ProtoMessage()    {}
 func (*TestDeprecatedMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{1}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *TestDeprecatedMessage) XXX_Unmarshal(b []byte) error {
@@ -1128,13 +1128,13 @@
 }
 
 func (m *ForeignMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[2].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *ForeignMessage) Reset()         { *m = ForeignMessage{} }
 func (m *ForeignMessage) String() string { return proto.CompactTextString(m) }
 func (*ForeignMessage) ProtoMessage()    {}
 func (*ForeignMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{2}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{2}
 }
 
 func (m *ForeignMessage) XXX_Unmarshal(b []byte) error {
@@ -1176,13 +1176,13 @@
 }
 
 func (m *TestReservedFields) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[3].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *TestReservedFields) Reset()         { *m = TestReservedFields{} }
 func (m *TestReservedFields) String() string { return proto.CompactTextString(m) }
 func (*TestReservedFields) ProtoMessage()    {}
 func (*TestReservedFields) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{3}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{3}
 }
 
 func (m *TestReservedFields) XXX_Unmarshal(b []byte) error {
@@ -1211,13 +1211,13 @@
 }
 
 func (m *TestAllExtensions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[4].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[4].MessageOf(m)
 }
 func (m *TestAllExtensions) Reset()         { *m = TestAllExtensions{} }
 func (m *TestAllExtensions) String() string { return proto.CompactTextString(m) }
 func (*TestAllExtensions) ProtoMessage()    {}
 func (*TestAllExtensions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{4}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{4}
 }
 
 var extRange_TestAllExtensions = []proto.ExtensionRange{
@@ -1254,13 +1254,13 @@
 }
 
 func (m *OptionalGroupExtension) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[5].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[5].MessageOf(m)
 }
 func (m *OptionalGroupExtension) Reset()         { *m = OptionalGroupExtension{} }
 func (m *OptionalGroupExtension) String() string { return proto.CompactTextString(m) }
 func (*OptionalGroupExtension) ProtoMessage()    {}
 func (*OptionalGroupExtension) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{5}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{5}
 }
 
 func (m *OptionalGroupExtension) XXX_Unmarshal(b []byte) error {
@@ -1296,13 +1296,13 @@
 }
 
 func (m *RepeatedGroupExtension) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[6].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[6].MessageOf(m)
 }
 func (m *RepeatedGroupExtension) Reset()         { *m = RepeatedGroupExtension{} }
 func (m *RepeatedGroupExtension) String() string { return proto.CompactTextString(m) }
 func (*RepeatedGroupExtension) ProtoMessage()    {}
 func (*RepeatedGroupExtension) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{6}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{6}
 }
 
 func (m *RepeatedGroupExtension) XXX_Unmarshal(b []byte) error {
@@ -1337,13 +1337,13 @@
 }
 
 func (m *TestNestedExtension) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[7].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[7].MessageOf(m)
 }
 func (m *TestNestedExtension) Reset()         { *m = TestNestedExtension{} }
 func (m *TestNestedExtension) String() string { return proto.CompactTextString(m) }
 func (*TestNestedExtension) ProtoMessage()    {}
 func (*TestNestedExtension) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{7}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{7}
 }
 
 func (m *TestNestedExtension) XXX_Unmarshal(b []byte) error {
@@ -1372,13 +1372,13 @@
 }
 
 func (m *FooRequest) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[8].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[8].MessageOf(m)
 }
 func (m *FooRequest) Reset()         { *m = FooRequest{} }
 func (m *FooRequest) String() string { return proto.CompactTextString(m) }
 func (*FooRequest) ProtoMessage()    {}
 func (*FooRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{8}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{8}
 }
 
 func (m *FooRequest) XXX_Unmarshal(b []byte) error {
@@ -1406,13 +1406,13 @@
 }
 
 func (m *FooResponse) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[9].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[9].MessageOf(m)
 }
 func (m *FooResponse) Reset()         { *m = FooResponse{} }
 func (m *FooResponse) String() string { return proto.CompactTextString(m) }
 func (*FooResponse) ProtoMessage()    {}
 func (*FooResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{9}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{9}
 }
 
 func (m *FooResponse) XXX_Unmarshal(b []byte) error {
@@ -1442,13 +1442,13 @@
 }
 
 func (m *TestAllTypes_NestedMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[10].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[10].MessageOf(m)
 }
 func (m *TestAllTypes_NestedMessage) Reset()         { *m = TestAllTypes_NestedMessage{} }
 func (m *TestAllTypes_NestedMessage) String() string { return proto.CompactTextString(m) }
 func (*TestAllTypes_NestedMessage) ProtoMessage()    {}
 func (*TestAllTypes_NestedMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{0, 0}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{0, 0}
 }
 
 func (m *TestAllTypes_NestedMessage) XXX_Unmarshal(b []byte) error {
@@ -1491,13 +1491,13 @@
 }
 
 func (m *TestAllTypes_OptionalGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[11].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[11].MessageOf(m)
 }
 func (m *TestAllTypes_OptionalGroup) Reset()         { *m = TestAllTypes_OptionalGroup{} }
 func (m *TestAllTypes_OptionalGroup) String() string { return proto.CompactTextString(m) }
 func (*TestAllTypes_OptionalGroup) ProtoMessage()    {}
 func (*TestAllTypes_OptionalGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{0, 1}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{0, 1}
 }
 
 func (m *TestAllTypes_OptionalGroup) XXX_Unmarshal(b []byte) error {
@@ -1533,13 +1533,13 @@
 }
 
 func (m *TestAllTypes_RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_messageTypes[12].MessageOf(m)
+	return xxx_File_test_proto_messageTypes[12].MessageOf(m)
 }
 func (m *TestAllTypes_RepeatedGroup) Reset()         { *m = TestAllTypes_RepeatedGroup{} }
 func (m *TestAllTypes_RepeatedGroup) String() string { return proto.CompactTextString(m) }
 func (*TestAllTypes_RepeatedGroup) ProtoMessage()    {}
 func (*TestAllTypes_RepeatedGroup) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c161fcfdc0c3ff1e_gzipped, []int{0, 2}
+	return xxx_File_test_proto_rawdesc_gzipped, []int{0, 2}
 }
 
 func (m *TestAllTypes_RepeatedGroup) XXX_Unmarshal(b []byte) error {
@@ -1901,7 +1901,7 @@
 }
 
 func init() {
-	proto.RegisterFile("test.proto", fileDescriptor_c161fcfdc0c3ff1e_gzipped)
+	proto.RegisterFile("test.proto", xxx_File_test_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.proto.test.ForeignEnum", ForeignEnum_name, ForeignEnum_value)
 	proto.RegisterEnum("goproto.proto.test.TestReservedEnumFields", TestReservedEnumFields_name, TestReservedEnumFields_value)
 	proto.RegisterEnum("goproto.proto.test.TestAllTypes_NestedEnum", TestAllTypes_NestedEnum_name, TestAllTypes_NestedEnum_value)
@@ -1975,7 +1975,7 @@
 	proto.RegisterExtension(E_TestNestedExtension_NestedStringExtension)
 }
 
-var fileDescriptor_c161fcfdc0c3ff1e = []byte{
+var xxx_File_test_proto_rawdesc = []byte{
 	// 12054 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x67, 0x6f,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74,
@@ -2733,15 +2733,15 @@
 	0x73, 0x74, 0x50, 0x01, 0x58, 0x02,
 }
 
-var fileDescriptor_c161fcfdc0c3ff1e_gzipped = protoapi.CompressGZIP(fileDescriptor_c161fcfdc0c3ff1e)
+var xxx_File_test_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_test_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_test protoreflect.FileDescriptor
+var File_test_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_test_enumTypes [4]protoreflect.EnumType
-var xxx_ProtoFile_test_messageTypes [30]protoimpl.MessageType
-var xxx_ProtoFile_test_goTypes = []interface{}{
+var xxx_File_test_proto_enumTypes [4]protoreflect.EnumType
+var xxx_File_test_proto_messageTypes [30]protoimpl.MessageType
+var xxx_File_test_proto_goTypes = []interface{}{
 	(ForeignEnum)(0),                          // 0: goproto.proto.test.ForeignEnum
 	(TestReservedEnumFields)(0),               // 1: goproto.proto.test.TestReservedEnumFields
 	(TestAllTypes_NestedEnum)(0),              // 2: goproto.proto.test.TestAllTypes.NestedEnum
@@ -2779,7 +2779,7 @@
 	(*ImportMessage)(nil),                     // 34: goproto.proto.test.ImportMessage
 	(ImportEnum)(0),                           // 35: goproto.proto.test.ImportEnum
 }
-var xxx_ProtoFile_test_depIdxs = []int32{
+var xxx_File_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
@@ -2872,18 +2872,18 @@
 func init() {
 	var messageTypes [30]protoreflect.MessageType
 	var extensionTypes [37]protoreflect.ExtensionType
-	ProtoFile_test = protoimpl.FileBuilder{
-		RawDescriptor:        fileDescriptor_c161fcfdc0c3ff1e,
-		GoTypes:              xxx_ProtoFile_test_goTypes,
-		DependencyIndexes:    xxx_ProtoFile_test_depIdxs,
-		EnumOutputTypes:      xxx_ProtoFile_test_enumTypes[:],
+	File_test_proto = protoimpl.FileBuilder{
+		RawDescriptor:        xxx_File_test_proto_rawdesc,
+		GoTypes:              xxx_File_test_proto_goTypes,
+		DependencyIndexes:    xxx_File_test_proto_depIdxs,
+		EnumOutputTypes:      xxx_File_test_proto_enumTypes[:],
 		MessageOutputTypes:   messageTypes[:],
 		ExtensionOutputTypes: extensionTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_test_goTypes[4:][:30]
+	messageGoTypes := xxx_File_test_proto_goTypes[4:][:30]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_test_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_test_messageTypes[i].PBType = mt
+		xxx_File_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_test_proto_messageTypes[i].PBType = mt
 	}
 	E_OptionalInt32Extension.Type = extensionTypes[0]
 	E_OptionalInt64Extension.Type = extensionTypes[1]
@@ -2922,6 +2922,6 @@
 	E_RepeatedNestedMessageExtension.Type = extensionTypes[34]
 	E_RepeatedNestedEnumExtension.Type = extensionTypes[35]
 	E_TestNestedExtension_NestedStringExtension.Type = extensionTypes[36]
-	xxx_ProtoFile_test_goTypes = nil
-	xxx_ProtoFile_test_depIdxs = nil
+	xxx_File_test_proto_goTypes = nil
+	xxx_File_test_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/test_import.pb.go b/internal/testprotos/test/test_import.pb.go
index c0f25b3..71ac2fb 100644
--- a/internal/testprotos/test/test_import.pb.go
+++ b/internal/testprotos/test/test_import.pb.go
@@ -24,7 +24,7 @@
 )
 
 func (e ImportEnum) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_test_import_enumTypes[0]
+	return xxx_File_test_import_proto_enumTypes[0]
 }
 func (e ImportEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -58,7 +58,7 @@
 }
 
 func (ImportEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_89be98e26346f54e_gzipped, []int{0}
+	return xxx_File_test_import_proto_rawdesc_gzipped, []int{0}
 }
 
 type ImportMessage struct {
@@ -68,13 +68,13 @@
 }
 
 func (m *ImportMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_import_messageTypes[0].MessageOf(m)
+	return xxx_File_test_import_proto_messageTypes[0].MessageOf(m)
 }
 func (m *ImportMessage) Reset()         { *m = ImportMessage{} }
 func (m *ImportMessage) String() string { return proto.CompactTextString(m) }
 func (*ImportMessage) ProtoMessage()    {}
 func (*ImportMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_89be98e26346f54e_gzipped, []int{0}
+	return xxx_File_test_import_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *ImportMessage) XXX_Unmarshal(b []byte) error {
@@ -96,12 +96,12 @@
 var xxx_messageInfo_ImportMessage proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("test_import.proto", fileDescriptor_89be98e26346f54e_gzipped)
+	proto.RegisterFile("test_import.proto", xxx_File_test_import_proto_rawdesc_gzipped)
 	proto.RegisterEnum("goproto.proto.test.ImportEnum", ImportEnum_name, ImportEnum_value)
 	proto.RegisterType((*ImportMessage)(nil), "goproto.proto.test.ImportMessage")
 }
 
-var fileDescriptor_89be98e26346f54e = []byte{
+var xxx_File_test_import_proto_rawdesc = []byte{
 	// 145 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x11, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x12, 0x12, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
@@ -115,34 +115,34 @@
 	0x74,
 }
 
-var fileDescriptor_89be98e26346f54e_gzipped = protoapi.CompressGZIP(fileDescriptor_89be98e26346f54e)
+var xxx_File_test_import_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_test_import_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_test_import protoreflect.FileDescriptor
+var File_test_import_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_test_import_enumTypes [1]protoreflect.EnumType
-var xxx_ProtoFile_test_import_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_test_import_goTypes = []interface{}{
+var xxx_File_test_import_proto_enumTypes [1]protoreflect.EnumType
+var xxx_File_test_import_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_test_import_proto_goTypes = []interface{}{
 	(ImportEnum)(0),       // 0: goproto.proto.test.ImportEnum
 	(*ImportMessage)(nil), // 1: goproto.proto.test.ImportMessage
 }
-var xxx_ProtoFile_test_import_depIdxs = []int32{}
+var xxx_File_test_import_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_test_import = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_89be98e26346f54e,
-		GoTypes:            xxx_ProtoFile_test_import_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_test_import_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_test_import_enumTypes[:],
+	File_test_import_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_test_import_proto_rawdesc,
+		GoTypes:            xxx_File_test_import_proto_goTypes,
+		DependencyIndexes:  xxx_File_test_import_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_test_import_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_test_import_goTypes[1:][:1]
+	messageGoTypes := xxx_File_test_import_proto_goTypes[1:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_test_import_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_test_import_messageTypes[i].PBType = mt
+		xxx_File_test_import_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_test_import_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_test_import_goTypes = nil
-	xxx_ProtoFile_test_import_depIdxs = nil
+	xxx_File_test_import_proto_goTypes = nil
+	xxx_File_test_import_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/test_public.pb.go b/internal/testprotos/test/test_public.pb.go
index c75905d..f9bbf3a 100644
--- a/internal/testprotos/test/test_public.pb.go
+++ b/internal/testprotos/test/test_public.pb.go
@@ -24,13 +24,13 @@
 }
 
 func (m *PublicImportMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_public_messageTypes[0].MessageOf(m)
+	return xxx_File_test_public_proto_messageTypes[0].MessageOf(m)
 }
 func (m *PublicImportMessage) Reset()         { *m = PublicImportMessage{} }
 func (m *PublicImportMessage) String() string { return proto.CompactTextString(m) }
 func (*PublicImportMessage) ProtoMessage()    {}
 func (*PublicImportMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_36dd44afd5b47374_gzipped, []int{0}
+	return xxx_File_test_public_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *PublicImportMessage) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_PublicImportMessage proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("test_public.proto", fileDescriptor_36dd44afd5b47374_gzipped)
+	proto.RegisterFile("test_public.proto", xxx_File_test_public_proto_rawdesc_gzipped)
 	proto.RegisterType((*PublicImportMessage)(nil), "goproto.proto.test.PublicImportMessage")
 }
 
-var fileDescriptor_36dd44afd5b47374 = []byte{
+var xxx_File_test_public_proto_rawdesc = []byte{
 	// 120 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x11, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x12, 0x12, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
@@ -68,31 +68,31 @@
 	0x74, 0x6f, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74,
 }
 
-var fileDescriptor_36dd44afd5b47374_gzipped = protoapi.CompressGZIP(fileDescriptor_36dd44afd5b47374)
+var xxx_File_test_public_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_test_public_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_test_public protoreflect.FileDescriptor
+var File_test_public_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_test_public_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_test_public_goTypes = []interface{}{
+var xxx_File_test_public_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_test_public_proto_goTypes = []interface{}{
 	(*PublicImportMessage)(nil), // 0: goproto.proto.test.PublicImportMessage
 }
-var xxx_ProtoFile_test_public_depIdxs = []int32{}
+var xxx_File_test_public_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_test_public = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_36dd44afd5b47374,
-		GoTypes:            xxx_ProtoFile_test_public_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_test_public_depIdxs,
+	File_test_public_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_test_public_proto_rawdesc,
+		GoTypes:            xxx_File_test_public_proto_goTypes,
+		DependencyIndexes:  xxx_File_test_public_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_test_public_goTypes[0:][:1]
+	messageGoTypes := xxx_File_test_public_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_test_public_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_test_public_messageTypes[i].PBType = mt
+		xxx_File_test_public_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_test_public_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_test_public_goTypes = nil
-	xxx_ProtoFile_test_public_depIdxs = nil
+	xxx_File_test_public_proto_goTypes = nil
+	xxx_File_test_public_proto_depIdxs = nil
 }
diff --git a/internal/testprotos/test/test_weak.pb.go b/internal/testprotos/test/test_weak.pb.go
index 98632fc..9b0583f 100644
--- a/internal/testprotos/test/test_weak.pb.go
+++ b/internal/testprotos/test/test_weak.pb.go
@@ -24,13 +24,13 @@
 }
 
 func (m *WeakImportMessage) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_test_weak_messageTypes[0].MessageOf(m)
+	return xxx_File_test_weak_proto_messageTypes[0].MessageOf(m)
 }
 func (m *WeakImportMessage) Reset()         { *m = WeakImportMessage{} }
 func (m *WeakImportMessage) String() string { return proto.CompactTextString(m) }
 func (*WeakImportMessage) ProtoMessage()    {}
 func (*WeakImportMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2b8edfebc4f71b3_gzipped, []int{0}
+	return xxx_File_test_weak_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *WeakImportMessage) XXX_Unmarshal(b []byte) error {
@@ -52,11 +52,11 @@
 var xxx_messageInfo_WeakImportMessage proto.InternalMessageInfo
 
 func init() {
-	proto.RegisterFile("test_weak.proto", fileDescriptor_c2b8edfebc4f71b3_gzipped)
+	proto.RegisterFile("test_weak.proto", xxx_File_test_weak_proto_rawdesc_gzipped)
 	proto.RegisterType((*WeakImportMessage)(nil), "goproto.proto.test.WeakImportMessage")
 }
 
-var fileDescriptor_c2b8edfebc4f71b3 = []byte{
+var xxx_File_test_weak_proto_rawdesc = []byte{
 	// 116 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x65, 0x61, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
 	0x6f, 0x12, 0x12, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
@@ -68,31 +68,31 @@
 	0x74, 0x65, 0x73, 0x74,
 }
 
-var fileDescriptor_c2b8edfebc4f71b3_gzipped = protoapi.CompressGZIP(fileDescriptor_c2b8edfebc4f71b3)
+var xxx_File_test_weak_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_test_weak_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_test_weak protoreflect.FileDescriptor
+var File_test_weak_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_test_weak_messageTypes [1]protoimpl.MessageType
-var xxx_ProtoFile_test_weak_goTypes = []interface{}{
+var xxx_File_test_weak_proto_messageTypes [1]protoimpl.MessageType
+var xxx_File_test_weak_proto_goTypes = []interface{}{
 	(*WeakImportMessage)(nil), // 0: goproto.proto.test.WeakImportMessage
 }
-var xxx_ProtoFile_test_weak_depIdxs = []int32{}
+var xxx_File_test_weak_proto_depIdxs = []int32{}
 
 func init() {
 	var messageTypes [1]protoreflect.MessageType
-	ProtoFile_test_weak = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_c2b8edfebc4f71b3,
-		GoTypes:            xxx_ProtoFile_test_weak_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_test_weak_depIdxs,
+	File_test_weak_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_test_weak_proto_rawdesc,
+		GoTypes:            xxx_File_test_weak_proto_goTypes,
+		DependencyIndexes:  xxx_File_test_weak_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_test_weak_goTypes[0:][:1]
+	messageGoTypes := xxx_File_test_weak_proto_goTypes[0:][:1]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_test_weak_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_test_weak_messageTypes[i].PBType = mt
+		xxx_File_test_weak_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_test_weak_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_test_weak_goTypes = nil
-	xxx_ProtoFile_test_weak_depIdxs = nil
+	xxx_File_test_weak_proto_goTypes = nil
+	xxx_File_test_weak_proto_depIdxs = nil
 }
diff --git a/protogen/names.go b/protogen/names.go
index a1bddf7..5cf953c 100644
--- a/protogen/names.go
+++ b/protogen/names.go
@@ -48,12 +48,11 @@
 
 // cleanPackageName converts a string to a valid Go package name.
 func cleanPackageName(name string) GoPackageName {
-	return GoPackageName(cleanGoName(name, false))
+	return GoPackageName(cleanGoName(name))
 }
 
 // cleanGoName converts a string to a valid Go identifier.
-// If mustExport, then the returned identifier is exported if not already.
-func cleanGoName(s string, mustExport bool) string {
+func cleanGoName(s string) string {
 	// Sanitize the input to the set of valid characters,
 	// which must be '_' or be in the Unicode L or N categories.
 	s = strings.Map(func(r rune) rune {
@@ -62,21 +61,10 @@
 		}
 		return '_'
 	}, s)
-	r, n := utf8.DecodeRuneInString(s)
-
-	// Export the identifier by either uppercasing the first character or by
-	// prepending 'X' (to ensure name starts in the Unicode Lu category).
-	if mustExport {
-		// If possible, uppercase the first character. However, not all
-		// characters in the Unicode L category have an Lu equivalent.
-		if unicode.IsUpper(unicode.ToUpper(r)) {
-			return string(unicode.ToUpper(r)) + s[n:]
-		}
-		return "X" + s
-	}
 
 	// Prepend '_' in the event of a Go keyword conflict or if
 	// the identifier is invalid (does not start in the Unicode L category).
+	r, _ := utf8.DecodeRuneInString(s)
 	if token.Lookup(s).IsKeyword() || !unicode.IsLetter(r) {
 		return "_" + s
 	}
diff --git a/protogen/names_test.go b/protogen/names_test.go
index 7bb5e9b..6f03cc9 100644
--- a/protogen/names_test.go
+++ b/protogen/names_test.go
@@ -41,25 +41,22 @@
 
 func TestCleanGoName(t *testing.T) {
 	tests := []struct {
-		in, want, wantExported string
+		in, want string
 	}{
-		{"", "_", "X"},
-		{"boo", "boo", "Boo"},
-		{"Boo", "Boo", "Boo"},
-		{"ßoo", "ßoo", "Xßoo"},
-		{"default", "_default", "Default"},
-		{"hello", "hello", "Hello"},
-		{"hello-world!!", "hello_world__", "Hello_world__"},
-		{"hello-\xde\xad\xbe\xef\x00", "hello_____", "Hello_____"},
-		{"hello 世界", "hello_世界", "Hello_世界"},
-		{"世界", "世界", "X世界"},
+		{"", "_"},
+		{"boo", "boo"},
+		{"Boo", "Boo"},
+		{"ßoo", "ßoo"},
+		{"default", "_default"},
+		{"hello", "hello"},
+		{"hello-world!!", "hello_world__"},
+		{"hello-\xde\xad\xbe\xef\x00", "hello_____"},
+		{"hello 世界", "hello_世界"},
+		{"世界", "世界"},
 	}
 	for _, tc := range tests {
-		if got := cleanGoName(tc.in, false); got != tc.want {
-			t.Errorf("cleanGoName(%q, false) = %q, want %q", tc.in, got, tc.want)
-		}
-		if got := cleanGoName(tc.in, true); got != tc.wantExported {
-			t.Errorf("cleanGoName(%q, true) = %q, want %q", tc.in, got, tc.wantExported)
+		if got := cleanGoName(tc.in); got != tc.want {
+			t.Errorf("cleanGoName(%q) = %q, want %q", tc.in, got, tc.want)
 		}
 	}
 }
diff --git a/protogen/protogen.go b/protogen/protogen.go
index 758a20f..3e49719 100644
--- a/protogen/protogen.go
+++ b/protogen/protogen.go
@@ -435,7 +435,7 @@
 		}
 	}
 	f.GoDescriptorIdent = GoIdent{
-		GoName:       "ProtoFile_" + cleanGoName(prefix, false),
+		GoName:       "File_" + cleanGoName(p.GetName()),
 		GoImportPath: f.GoImportPath,
 	}
 	f.GeneratedFilenamePrefix = prefix
diff --git a/reflect/protoregistry/testprotos/test.pb.go b/reflect/protoregistry/testprotos/test.pb.go
index ccd0c37..be46c73 100644
--- a/reflect/protoregistry/testprotos/test.pb.go
+++ b/reflect/protoregistry/testprotos/test.pb.go
@@ -24,7 +24,7 @@
 )
 
 func (e Enum1) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_reflect_protoregistry_testprotos_test_enumTypes[0]
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_enumTypes[0]
 }
 func (e Enum1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -58,7 +58,7 @@
 }
 
 func (Enum1) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_3628d63611f7063d_gzipped, []int{0}
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped, []int{0}
 }
 
 type Enum2 int32
@@ -68,7 +68,7 @@
 )
 
 func (e Enum2) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_reflect_protoregistry_testprotos_test_enumTypes[1]
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_enumTypes[1]
 }
 func (e Enum2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -102,7 +102,7 @@
 }
 
 func (Enum2) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_3628d63611f7063d_gzipped, []int{1}
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped, []int{1}
 }
 
 type Enum3 int32
@@ -112,7 +112,7 @@
 )
 
 func (e Enum3) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_reflect_protoregistry_testprotos_test_enumTypes[2]
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_enumTypes[2]
 }
 func (e Enum3) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -146,7 +146,7 @@
 }
 
 func (Enum3) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_3628d63611f7063d_gzipped, []int{2}
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped, []int{2}
 }
 
 type Message1 struct {
@@ -157,13 +157,13 @@
 }
 
 func (m *Message1) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_reflect_protoregistry_testprotos_test_messageTypes[0].MessageOf(m)
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Message1) Reset()         { *m = Message1{} }
 func (m *Message1) String() string { return proto.CompactTextString(m) }
 func (*Message1) ProtoMessage()    {}
 func (*Message1) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3628d63611f7063d_gzipped, []int{0}
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped, []int{0}
 }
 
 var extRange_Message1 = []proto.ExtensionRange{
@@ -199,13 +199,13 @@
 }
 
 func (m *Message2) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_reflect_protoregistry_testprotos_test_messageTypes[1].MessageOf(m)
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_messageTypes[1].MessageOf(m)
 }
 func (m *Message2) Reset()         { *m = Message2{} }
 func (m *Message2) String() string { return proto.CompactTextString(m) }
 func (*Message2) ProtoMessage()    {}
 func (*Message2) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3628d63611f7063d_gzipped, []int{1}
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *Message2) XXX_Unmarshal(b []byte) error {
@@ -233,13 +233,13 @@
 }
 
 func (m *Message3) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_reflect_protoregistry_testprotos_test_messageTypes[2].MessageOf(m)
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_messageTypes[2].MessageOf(m)
 }
 func (m *Message3) Reset()         { *m = Message3{} }
 func (m *Message3) String() string { return proto.CompactTextString(m) }
 func (*Message3) ProtoMessage()    {}
 func (*Message3) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3628d63611f7063d_gzipped, []int{2}
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped, []int{2}
 }
 
 func (m *Message3) XXX_Unmarshal(b []byte) error {
@@ -268,13 +268,13 @@
 }
 
 func (m *Message4) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_reflect_protoregistry_testprotos_test_messageTypes[3].MessageOf(m)
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_messageTypes[3].MessageOf(m)
 }
 func (m *Message4) Reset()         { *m = Message4{} }
 func (m *Message4) String() string { return proto.CompactTextString(m) }
 func (*Message4) ProtoMessage()    {}
 func (*Message4) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3628d63611f7063d_gzipped, []int{3}
+	return xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped, []int{3}
 }
 
 func (m *Message4) XXX_Unmarshal(b []byte) error {
@@ -357,7 +357,7 @@
 }
 
 func init() {
-	proto.RegisterFile("reflect/protoregistry/testprotos/test.proto", fileDescriptor_3628d63611f7063d_gzipped)
+	proto.RegisterFile("reflect/protoregistry/testprotos/test.proto", xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped)
 	proto.RegisterEnum("testprotos.Enum1", Enum1_name, Enum1_value)
 	proto.RegisterEnum("testprotos.Enum2", Enum2_name, Enum2_value)
 	proto.RegisterEnum("testprotos.Enum3", Enum3_name, Enum3_value)
@@ -373,7 +373,7 @@
 	proto.RegisterExtension(E_Message4_StringField)
 }
 
-var fileDescriptor_3628d63611f7063d = []byte{
+var xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc = []byte{
 	// 686 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x2b, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x72,
 	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74,
@@ -420,15 +420,15 @@
 	0x74, 0x72, 0x79, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
 }
 
-var fileDescriptor_3628d63611f7063d_gzipped = protoapi.CompressGZIP(fileDescriptor_3628d63611f7063d)
+var xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_reflect_protoregistry_testprotos_test protoreflect.FileDescriptor
+var File_reflect_protoregistry_testprotos_test_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_reflect_protoregistry_testprotos_test_enumTypes [3]protoreflect.EnumType
-var xxx_ProtoFile_reflect_protoregistry_testprotos_test_messageTypes [4]protoimpl.MessageType
-var xxx_ProtoFile_reflect_protoregistry_testprotos_test_goTypes = []interface{}{
+var xxx_File_reflect_protoregistry_testprotos_test_proto_enumTypes [3]protoreflect.EnumType
+var xxx_File_reflect_protoregistry_testprotos_test_proto_messageTypes [4]protoimpl.MessageType
+var xxx_File_reflect_protoregistry_testprotos_test_proto_goTypes = []interface{}{
 	(Enum1)(0),       // 0: testprotos.Enum1
 	(Enum2)(0),       // 1: testprotos.Enum2
 	(Enum3)(0),       // 2: testprotos.Enum3
@@ -437,7 +437,7 @@
 	(*Message3)(nil), // 5: testprotos.Message3
 	(*Message4)(nil), // 6: testprotos.Message4
 }
-var xxx_ProtoFile_reflect_protoregistry_testprotos_test_depIdxs = []int32{
+var xxx_File_reflect_protoregistry_testprotos_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
@@ -453,18 +453,18 @@
 func init() {
 	var messageTypes [4]protoreflect.MessageType
 	var extensionTypes [6]protoreflect.ExtensionType
-	ProtoFile_reflect_protoregistry_testprotos_test = protoimpl.FileBuilder{
-		RawDescriptor:        fileDescriptor_3628d63611f7063d,
-		GoTypes:              xxx_ProtoFile_reflect_protoregistry_testprotos_test_goTypes,
-		DependencyIndexes:    xxx_ProtoFile_reflect_protoregistry_testprotos_test_depIdxs,
-		EnumOutputTypes:      xxx_ProtoFile_reflect_protoregistry_testprotos_test_enumTypes[:],
+	File_reflect_protoregistry_testprotos_test_proto = protoimpl.FileBuilder{
+		RawDescriptor:        xxx_File_reflect_protoregistry_testprotos_test_proto_rawdesc,
+		GoTypes:              xxx_File_reflect_protoregistry_testprotos_test_proto_goTypes,
+		DependencyIndexes:    xxx_File_reflect_protoregistry_testprotos_test_proto_depIdxs,
+		EnumOutputTypes:      xxx_File_reflect_protoregistry_testprotos_test_proto_enumTypes[:],
 		MessageOutputTypes:   messageTypes[:],
 		ExtensionOutputTypes: extensionTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_reflect_protoregistry_testprotos_test_goTypes[3:][:4]
+	messageGoTypes := xxx_File_reflect_protoregistry_testprotos_test_proto_goTypes[3:][:4]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_reflect_protoregistry_testprotos_test_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_reflect_protoregistry_testprotos_test_messageTypes[i].PBType = mt
+		xxx_File_reflect_protoregistry_testprotos_test_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_reflect_protoregistry_testprotos_test_proto_messageTypes[i].PBType = mt
 	}
 	E_StringField.Type = extensionTypes[0]
 	E_EnumField.Type = extensionTypes[1]
@@ -472,6 +472,6 @@
 	E_Message4_MessageField.Type = extensionTypes[3]
 	E_Message4_EnumField.Type = extensionTypes[4]
 	E_Message4_StringField.Type = extensionTypes[5]
-	xxx_ProtoFile_reflect_protoregistry_testprotos_test_goTypes = nil
-	xxx_ProtoFile_reflect_protoregistry_testprotos_test_depIdxs = nil
+	xxx_File_reflect_protoregistry_testprotos_test_proto_goTypes = nil
+	xxx_File_reflect_protoregistry_testprotos_test_proto_depIdxs = nil
 }
diff --git a/types/descriptor/descriptor.pb.go b/types/descriptor/descriptor.pb.go
index f7c32fe..eeaac86 100644
--- a/types/descriptor/descriptor.pb.go
+++ b/types/descriptor/descriptor.pb.go
@@ -46,7 +46,7 @@
 )
 
 func (e FieldDescriptorProto_Type) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_google_protobuf_descriptor_enumTypes[0]
+	return xxx_File_google_protobuf_descriptor_proto_enumTypes[0]
 }
 func (e FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -114,7 +114,7 @@
 }
 
 func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{4, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{4, 0}
 }
 
 type FieldDescriptorProto_Label int32
@@ -127,7 +127,7 @@
 )
 
 func (e FieldDescriptorProto_Label) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_google_protobuf_descriptor_enumTypes[1]
+	return xxx_File_google_protobuf_descriptor_proto_enumTypes[1]
 }
 func (e FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -165,7 +165,7 @@
 }
 
 func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{4, 1}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{4, 1}
 }
 
 // Generated classes can be optimized for speed or code size.
@@ -179,7 +179,7 @@
 )
 
 func (e FileOptions_OptimizeMode) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_google_protobuf_descriptor_enumTypes[2]
+	return xxx_File_google_protobuf_descriptor_proto_enumTypes[2]
 }
 func (e FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -217,7 +217,7 @@
 }
 
 func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{10, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{10, 0}
 }
 
 type FieldOptions_CType int32
@@ -230,7 +230,7 @@
 )
 
 func (e FieldOptions_CType) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_google_protobuf_descriptor_enumTypes[3]
+	return xxx_File_google_protobuf_descriptor_proto_enumTypes[3]
 }
 func (e FieldOptions_CType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -268,7 +268,7 @@
 }
 
 func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{12, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{12, 0}
 }
 
 type FieldOptions_JSType int32
@@ -283,7 +283,7 @@
 )
 
 func (e FieldOptions_JSType) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_google_protobuf_descriptor_enumTypes[4]
+	return xxx_File_google_protobuf_descriptor_proto_enumTypes[4]
 }
 func (e FieldOptions_JSType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -321,7 +321,7 @@
 }
 
 func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{12, 1}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{12, 1}
 }
 
 // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
@@ -336,7 +336,7 @@
 )
 
 func (e MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType {
-	return xxx_ProtoFile_google_protobuf_descriptor_enumTypes[5]
+	return xxx_File_google_protobuf_descriptor_proto_enumTypes[5]
 }
 func (e MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(e)
@@ -374,7 +374,7 @@
 }
 
 func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{17, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{17, 0}
 }
 
 // The protocol compiler can output a FileDescriptorSet containing the .proto
@@ -387,13 +387,13 @@
 }
 
 func (m *FileDescriptorSet) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[0].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[0].MessageOf(m)
 }
 func (m *FileDescriptorSet) Reset()         { *m = FileDescriptorSet{} }
 func (m *FileDescriptorSet) String() string { return protoapi.CompactTextString(m) }
 func (*FileDescriptorSet) ProtoMessage()    {}
 func (*FileDescriptorSet) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto {
@@ -434,13 +434,13 @@
 }
 
 func (m *FileDescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[1].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[1].MessageOf(m)
 }
 func (m *FileDescriptorProto) Reset()         { *m = FileDescriptorProto{} }
 func (m *FileDescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*FileDescriptorProto) ProtoMessage()    {}
 func (*FileDescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{1}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *FileDescriptorProto) GetName() string {
@@ -547,13 +547,13 @@
 }
 
 func (m *DescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[2].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[2].MessageOf(m)
 }
 func (m *DescriptorProto) Reset()         { *m = DescriptorProto{} }
 func (m *DescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*DescriptorProto) ProtoMessage()    {}
 func (*DescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{2}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{2}
 }
 
 func (m *DescriptorProto) GetName() string {
@@ -636,13 +636,13 @@
 }
 
 func (m *ExtensionRangeOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[3].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[3].MessageOf(m)
 }
 func (m *ExtensionRangeOptions) Reset()         { *m = ExtensionRangeOptions{} }
 func (m *ExtensionRangeOptions) String() string { return protoapi.CompactTextString(m) }
 func (*ExtensionRangeOptions) ProtoMessage()    {}
 func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{3}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{3}
 }
 
 var extRange_ExtensionRangeOptions = []protoapi.ExtensionRange{
@@ -698,13 +698,13 @@
 }
 
 func (m *FieldDescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[4].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[4].MessageOf(m)
 }
 func (m *FieldDescriptorProto) Reset()         { *m = FieldDescriptorProto{} }
 func (m *FieldDescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*FieldDescriptorProto) ProtoMessage()    {}
 func (*FieldDescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{4}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{4}
 }
 
 func (m *FieldDescriptorProto) GetName() string {
@@ -787,13 +787,13 @@
 }
 
 func (m *OneofDescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[5].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[5].MessageOf(m)
 }
 func (m *OneofDescriptorProto) Reset()         { *m = OneofDescriptorProto{} }
 func (m *OneofDescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*OneofDescriptorProto) ProtoMessage()    {}
 func (*OneofDescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{5}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{5}
 }
 
 func (m *OneofDescriptorProto) GetName() string {
@@ -828,13 +828,13 @@
 }
 
 func (m *EnumDescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[6].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[6].MessageOf(m)
 }
 func (m *EnumDescriptorProto) Reset()         { *m = EnumDescriptorProto{} }
 func (m *EnumDescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*EnumDescriptorProto) ProtoMessage()    {}
 func (*EnumDescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{6}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{6}
 }
 
 func (m *EnumDescriptorProto) GetName() string {
@@ -883,13 +883,13 @@
 }
 
 func (m *EnumValueDescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[7].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[7].MessageOf(m)
 }
 func (m *EnumValueDescriptorProto) Reset()         { *m = EnumValueDescriptorProto{} }
 func (m *EnumValueDescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*EnumValueDescriptorProto) ProtoMessage()    {}
 func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{7}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{7}
 }
 
 func (m *EnumValueDescriptorProto) GetName() string {
@@ -924,13 +924,13 @@
 }
 
 func (m *ServiceDescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[8].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[8].MessageOf(m)
 }
 func (m *ServiceDescriptorProto) Reset()         { *m = ServiceDescriptorProto{} }
 func (m *ServiceDescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*ServiceDescriptorProto) ProtoMessage()    {}
 func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{8}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{8}
 }
 
 func (m *ServiceDescriptorProto) GetName() string {
@@ -972,13 +972,13 @@
 }
 
 func (m *MethodDescriptorProto) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[9].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[9].MessageOf(m)
 }
 func (m *MethodDescriptorProto) Reset()         { *m = MethodDescriptorProto{} }
 func (m *MethodDescriptorProto) String() string { return protoapi.CompactTextString(m) }
 func (*MethodDescriptorProto) ProtoMessage()    {}
 func (*MethodDescriptorProto) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{9}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{9}
 }
 
 const Default_MethodDescriptorProto_ClientStreaming bool = false
@@ -1118,13 +1118,13 @@
 }
 
 func (m *FileOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[10].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[10].MessageOf(m)
 }
 func (m *FileOptions) Reset()         { *m = FileOptions{} }
 func (m *FileOptions) String() string { return protoapi.CompactTextString(m) }
 func (*FileOptions) ProtoMessage()    {}
 func (*FileOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{10}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{10}
 }
 
 var extRange_FileOptions = []protoapi.ExtensionRange{
@@ -1353,13 +1353,13 @@
 }
 
 func (m *MessageOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[11].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[11].MessageOf(m)
 }
 func (m *MessageOptions) Reset()         { *m = MessageOptions{} }
 func (m *MessageOptions) String() string { return protoapi.CompactTextString(m) }
 func (*MessageOptions) ProtoMessage()    {}
 func (*MessageOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{11}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{11}
 }
 
 var extRange_MessageOptions = []protoapi.ExtensionRange{
@@ -1478,13 +1478,13 @@
 }
 
 func (m *FieldOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[12].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[12].MessageOf(m)
 }
 func (m *FieldOptions) Reset()         { *m = FieldOptions{} }
 func (m *FieldOptions) String() string { return protoapi.CompactTextString(m) }
 func (*FieldOptions) ProtoMessage()    {}
 func (*FieldOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{12}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{12}
 }
 
 var extRange_FieldOptions = []protoapi.ExtensionRange{
@@ -1560,13 +1560,13 @@
 }
 
 func (m *OneofOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[13].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[13].MessageOf(m)
 }
 func (m *OneofOptions) Reset()         { *m = OneofOptions{} }
 func (m *OneofOptions) String() string { return protoapi.CompactTextString(m) }
 func (*OneofOptions) ProtoMessage()    {}
 func (*OneofOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{13}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{13}
 }
 
 var extRange_OneofOptions = []protoapi.ExtensionRange{
@@ -1602,13 +1602,13 @@
 }
 
 func (m *EnumOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[14].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[14].MessageOf(m)
 }
 func (m *EnumOptions) Reset()         { *m = EnumOptions{} }
 func (m *EnumOptions) String() string { return protoapi.CompactTextString(m) }
 func (*EnumOptions) ProtoMessage()    {}
 func (*EnumOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{14}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{14}
 }
 
 var extRange_EnumOptions = []protoapi.ExtensionRange{
@@ -1657,13 +1657,13 @@
 }
 
 func (m *EnumValueOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[15].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[15].MessageOf(m)
 }
 func (m *EnumValueOptions) Reset()         { *m = EnumValueOptions{} }
 func (m *EnumValueOptions) String() string { return protoapi.CompactTextString(m) }
 func (*EnumValueOptions) ProtoMessage()    {}
 func (*EnumValueOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{15}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{15}
 }
 
 var extRange_EnumValueOptions = []protoapi.ExtensionRange{
@@ -1705,13 +1705,13 @@
 }
 
 func (m *ServiceOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[16].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[16].MessageOf(m)
 }
 func (m *ServiceOptions) Reset()         { *m = ServiceOptions{} }
 func (m *ServiceOptions) String() string { return protoapi.CompactTextString(m) }
 func (*ServiceOptions) ProtoMessage()    {}
 func (*ServiceOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{16}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{16}
 }
 
 var extRange_ServiceOptions = []protoapi.ExtensionRange{
@@ -1754,13 +1754,13 @@
 }
 
 func (m *MethodOptions) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[17].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[17].MessageOf(m)
 }
 func (m *MethodOptions) Reset()         { *m = MethodOptions{} }
 func (m *MethodOptions) String() string { return protoapi.CompactTextString(m) }
 func (*MethodOptions) ProtoMessage()    {}
 func (*MethodOptions) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{17}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{17}
 }
 
 var extRange_MethodOptions = []protoapi.ExtensionRange{
@@ -1817,13 +1817,13 @@
 }
 
 func (m *UninterpretedOption) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[18].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[18].MessageOf(m)
 }
 func (m *UninterpretedOption) Reset()         { *m = UninterpretedOption{} }
 func (m *UninterpretedOption) String() string { return protoapi.CompactTextString(m) }
 func (*UninterpretedOption) ProtoMessage()    {}
 func (*UninterpretedOption) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{18}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{18}
 }
 
 func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart {
@@ -1928,13 +1928,13 @@
 }
 
 func (m *SourceCodeInfo) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[19].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[19].MessageOf(m)
 }
 func (m *SourceCodeInfo) Reset()         { *m = SourceCodeInfo{} }
 func (m *SourceCodeInfo) String() string { return protoapi.CompactTextString(m) }
 func (*SourceCodeInfo) ProtoMessage()    {}
 func (*SourceCodeInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{19}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{19}
 }
 
 func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location {
@@ -1957,13 +1957,13 @@
 }
 
 func (m *GeneratedCodeInfo) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[20].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[20].MessageOf(m)
 }
 func (m *GeneratedCodeInfo) Reset()         { *m = GeneratedCodeInfo{} }
 func (m *GeneratedCodeInfo) String() string { return protoapi.CompactTextString(m) }
 func (*GeneratedCodeInfo) ProtoMessage()    {}
 func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{20}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{20}
 }
 
 func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation {
@@ -1983,13 +1983,13 @@
 }
 
 func (m *DescriptorProto_ExtensionRange) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[21].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[21].MessageOf(m)
 }
 func (m *DescriptorProto_ExtensionRange) Reset()         { *m = DescriptorProto_ExtensionRange{} }
 func (m *DescriptorProto_ExtensionRange) String() string { return protoapi.CompactTextString(m) }
 func (*DescriptorProto_ExtensionRange) ProtoMessage()    {}
 func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{2, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{2, 0}
 }
 
 func (m *DescriptorProto_ExtensionRange) GetStart() int32 {
@@ -2025,13 +2025,13 @@
 }
 
 func (m *DescriptorProto_ReservedRange) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[22].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[22].MessageOf(m)
 }
 func (m *DescriptorProto_ReservedRange) Reset()         { *m = DescriptorProto_ReservedRange{} }
 func (m *DescriptorProto_ReservedRange) String() string { return protoapi.CompactTextString(m) }
 func (*DescriptorProto_ReservedRange) ProtoMessage()    {}
 func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{2, 1}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{2, 1}
 }
 
 func (m *DescriptorProto_ReservedRange) GetStart() int32 {
@@ -2063,13 +2063,13 @@
 }
 
 func (m *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[23].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[23].MessageOf(m)
 }
 func (m *EnumDescriptorProto_EnumReservedRange) Reset()         { *m = EnumDescriptorProto_EnumReservedRange{} }
 func (m *EnumDescriptorProto_EnumReservedRange) String() string { return protoapi.CompactTextString(m) }
 func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage()    {}
 func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{6, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{6, 0}
 }
 
 func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 {
@@ -2100,13 +2100,13 @@
 }
 
 func (m *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[24].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[24].MessageOf(m)
 }
 func (m *UninterpretedOption_NamePart) Reset()         { *m = UninterpretedOption_NamePart{} }
 func (m *UninterpretedOption_NamePart) String() string { return protoapi.CompactTextString(m) }
 func (*UninterpretedOption_NamePart) ProtoMessage()    {}
 func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{18, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{18, 0}
 }
 
 func (m *UninterpretedOption_NamePart) GetNamePart() string {
@@ -2210,13 +2210,13 @@
 }
 
 func (m *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[25].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[25].MessageOf(m)
 }
 func (m *SourceCodeInfo_Location) Reset()         { *m = SourceCodeInfo_Location{} }
 func (m *SourceCodeInfo_Location) String() string { return protoapi.CompactTextString(m) }
 func (*SourceCodeInfo_Location) ProtoMessage()    {}
 func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{19, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{19, 0}
 }
 
 func (m *SourceCodeInfo_Location) GetPath() []int32 {
@@ -2273,13 +2273,13 @@
 }
 
 func (m *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_descriptor_messageTypes[26].MessageOf(m)
+	return xxx_File_google_protobuf_descriptor_proto_messageTypes[26].MessageOf(m)
 }
 func (m *GeneratedCodeInfo_Annotation) Reset()         { *m = GeneratedCodeInfo_Annotation{} }
 func (m *GeneratedCodeInfo_Annotation) String() string { return protoapi.CompactTextString(m) }
 func (*GeneratedCodeInfo_Annotation) ProtoMessage()    {}
 func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e5baabe45344a177_gzipped, []int{20, 0}
+	return xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped, []int{20, 0}
 }
 
 func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 {
@@ -2311,7 +2311,7 @@
 }
 
 func init() {
-	protoapi.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_e5baabe45344a177_gzipped)
+	protoapi.RegisterFile("google/protobuf/descriptor.proto", xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped)
 	protoapi.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value)
 	protoapi.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value)
 	protoapi.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value)
@@ -2347,7 +2347,7 @@
 	protoapi.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation")
 }
 
-var fileDescriptor_e5baabe45344a177 = []byte{
+var xxx_File_google_protobuf_descriptor_proto_rawdesc = []byte{
 	// 7580 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
 	0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,
@@ -2825,15 +2825,15 @@
 	0x66, 0x2e, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
 }
 
-var fileDescriptor_e5baabe45344a177_gzipped = protoapi.CompressGZIP(fileDescriptor_e5baabe45344a177)
+var xxx_File_google_protobuf_descriptor_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_google_protobuf_descriptor_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_google_protobuf_descriptor protoreflect.FileDescriptor
+var File_google_protobuf_descriptor_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_google_protobuf_descriptor_enumTypes [6]protoreflect.EnumType
-var xxx_ProtoFile_google_protobuf_descriptor_messageTypes [27]protoimpl.MessageType
-var xxx_ProtoFile_google_protobuf_descriptor_goTypes = []interface{}{
+var xxx_File_google_protobuf_descriptor_proto_enumTypes [6]protoreflect.EnumType
+var xxx_File_google_protobuf_descriptor_proto_messageTypes [27]protoimpl.MessageType
+var xxx_File_google_protobuf_descriptor_proto_goTypes = []interface{}{
 	(FieldDescriptorProto_Type)(0),                // 0: google.protobuf.FieldDescriptorProto.Type
 	(FieldDescriptorProto_Label)(0),               // 1: google.protobuf.FieldDescriptorProto.Label
 	(FileOptions_OptimizeMode)(0),                 // 2: google.protobuf.FileOptions.OptimizeMode
@@ -2868,7 +2868,7 @@
 	(*SourceCodeInfo_Location)(nil),               // 31: google.protobuf.SourceCodeInfo.Location
 	(*GeneratedCodeInfo_Annotation)(nil),          // 32: google.protobuf.GeneratedCodeInfo.Annotation
 }
-var xxx_ProtoFile_google_protobuf_descriptor_depIdxs = []int32{
+var xxx_File_google_protobuf_descriptor_proto_depIdxs = []int32{
 	7,  // google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto
 	8,  // google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto
 	12, // google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto
@@ -2916,17 +2916,17 @@
 
 func init() {
 	var messageTypes [27]protoreflect.MessageType
-	ProtoFile_google_protobuf_descriptor = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_e5baabe45344a177,
-		GoTypes:            xxx_ProtoFile_google_protobuf_descriptor_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_google_protobuf_descriptor_depIdxs,
-		EnumOutputTypes:    xxx_ProtoFile_google_protobuf_descriptor_enumTypes[:],
+	File_google_protobuf_descriptor_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_google_protobuf_descriptor_proto_rawdesc,
+		GoTypes:            xxx_File_google_protobuf_descriptor_proto_goTypes,
+		DependencyIndexes:  xxx_File_google_protobuf_descriptor_proto_depIdxs,
+		EnumOutputTypes:    xxx_File_google_protobuf_descriptor_proto_enumTypes[:],
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_google_protobuf_descriptor_goTypes[6:][:27]
+	messageGoTypes := xxx_File_google_protobuf_descriptor_proto_goTypes[6:][:27]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_google_protobuf_descriptor_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_google_protobuf_descriptor_messageTypes[i].PBType = mt
+		xxx_File_google_protobuf_descriptor_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_google_protobuf_descriptor_proto_messageTypes[i].PBType = mt
 	}
 	prototype.X.RegisterExtensionRangeOptions((*ExtensionRangeOptions)(nil))
 	prototype.X.RegisterFileOptions((*FileOptions)(nil))
@@ -2937,6 +2937,6 @@
 	prototype.X.RegisterEnumValueOptions((*EnumValueOptions)(nil))
 	prototype.X.RegisterServiceOptions((*ServiceOptions)(nil))
 	prototype.X.RegisterMethodOptions((*MethodOptions)(nil))
-	xxx_ProtoFile_google_protobuf_descriptor_goTypes = nil
-	xxx_ProtoFile_google_protobuf_descriptor_depIdxs = nil
+	xxx_File_google_protobuf_descriptor_proto_goTypes = nil
+	xxx_File_google_protobuf_descriptor_proto_depIdxs = nil
 }
diff --git a/types/plugin/plugin.pb.go b/types/plugin/plugin.pb.go
index 13f1832..3f8586e 100644
--- a/types/plugin/plugin.pb.go
+++ b/types/plugin/plugin.pb.go
@@ -32,13 +32,13 @@
 }
 
 func (m *Version) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_compiler_plugin_messageTypes[0].MessageOf(m)
+	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[0].MessageOf(m)
 }
 func (m *Version) Reset()         { *m = Version{} }
 func (m *Version) String() string { return proto.CompactTextString(m) }
 func (*Version) ProtoMessage()    {}
 func (*Version) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3562add825dafed5_gzipped, []int{0}
+	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{0}
 }
 
 func (m *Version) XXX_Unmarshal(b []byte) error {
@@ -118,13 +118,13 @@
 }
 
 func (m *CodeGeneratorRequest) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_compiler_plugin_messageTypes[1].MessageOf(m)
+	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[1].MessageOf(m)
 }
 func (m *CodeGeneratorRequest) Reset()         { *m = CodeGeneratorRequest{} }
 func (m *CodeGeneratorRequest) String() string { return proto.CompactTextString(m) }
 func (*CodeGeneratorRequest) ProtoMessage()    {}
 func (*CodeGeneratorRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3562add825dafed5_gzipped, []int{1}
+	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{1}
 }
 
 func (m *CodeGeneratorRequest) XXX_Unmarshal(b []byte) error {
@@ -191,13 +191,13 @@
 }
 
 func (m *CodeGeneratorResponse) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_compiler_plugin_messageTypes[2].MessageOf(m)
+	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[2].MessageOf(m)
 }
 func (m *CodeGeneratorResponse) Reset()         { *m = CodeGeneratorResponse{} }
 func (m *CodeGeneratorResponse) String() string { return proto.CompactTextString(m) }
 func (*CodeGeneratorResponse) ProtoMessage()    {}
 func (*CodeGeneratorResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3562add825dafed5_gzipped, []int{2}
+	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{2}
 }
 
 func (m *CodeGeneratorResponse) XXX_Unmarshal(b []byte) error {
@@ -292,13 +292,13 @@
 }
 
 func (m *CodeGeneratorResponse_File) ProtoReflect() protoreflect.Message {
-	return xxx_ProtoFile_google_protobuf_compiler_plugin_messageTypes[3].MessageOf(m)
+	return xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[3].MessageOf(m)
 }
 func (m *CodeGeneratorResponse_File) Reset()         { *m = CodeGeneratorResponse_File{} }
 func (m *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(m) }
 func (*CodeGeneratorResponse_File) ProtoMessage()    {}
 func (*CodeGeneratorResponse_File) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3562add825dafed5_gzipped, []int{2, 0}
+	return xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped, []int{2, 0}
 }
 
 func (m *CodeGeneratorResponse_File) XXX_Unmarshal(b []byte) error {
@@ -341,14 +341,14 @@
 }
 
 func init() {
-	proto.RegisterFile("google/protobuf/compiler/plugin.proto", fileDescriptor_3562add825dafed5_gzipped)
+	proto.RegisterFile("google/protobuf/compiler/plugin.proto", xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped)
 	proto.RegisterType((*Version)(nil), "google.protobuf.compiler.Version")
 	proto.RegisterType((*CodeGeneratorRequest)(nil), "google.protobuf.compiler.CodeGeneratorRequest")
 	proto.RegisterType((*CodeGeneratorResponse)(nil), "google.protobuf.compiler.CodeGeneratorResponse")
 	proto.RegisterType((*CodeGeneratorResponse_File)(nil), "google.protobuf.compiler.CodeGeneratorResponse.File")
 }
 
-var fileDescriptor_3562add825dafed5 = []byte{
+var xxx_File_google_protobuf_compiler_plugin_proto_rawdesc = []byte{
 	// 764 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x25, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
 	0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69,
@@ -400,21 +400,21 @@
 	0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 }
 
-var fileDescriptor_3562add825dafed5_gzipped = protoapi.CompressGZIP(fileDescriptor_3562add825dafed5)
+var xxx_File_google_protobuf_compiler_plugin_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_google_protobuf_compiler_plugin_proto_rawdesc)
 
 const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 
-var ProtoFile_google_protobuf_compiler_plugin protoreflect.FileDescriptor
+var File_google_protobuf_compiler_plugin_proto protoreflect.FileDescriptor
 
-var xxx_ProtoFile_google_protobuf_compiler_plugin_messageTypes [4]protoimpl.MessageType
-var xxx_ProtoFile_google_protobuf_compiler_plugin_goTypes = []interface{}{
+var xxx_File_google_protobuf_compiler_plugin_proto_messageTypes [4]protoimpl.MessageType
+var xxx_File_google_protobuf_compiler_plugin_proto_goTypes = []interface{}{
 	(*Version)(nil),                        // 0: google.protobuf.compiler.Version
 	(*CodeGeneratorRequest)(nil),           // 1: google.protobuf.compiler.CodeGeneratorRequest
 	(*CodeGeneratorResponse)(nil),          // 2: google.protobuf.compiler.CodeGeneratorResponse
 	(*CodeGeneratorResponse_File)(nil),     // 3: google.protobuf.compiler.CodeGeneratorResponse.File
 	(*descriptor.FileDescriptorProto)(nil), // 4: google.protobuf.FileDescriptorProto
 }
-var xxx_ProtoFile_google_protobuf_compiler_plugin_depIdxs = []int32{
+var xxx_File_google_protobuf_compiler_plugin_proto_depIdxs = []int32{
 	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
@@ -422,17 +422,17 @@
 
 func init() {
 	var messageTypes [4]protoreflect.MessageType
-	ProtoFile_google_protobuf_compiler_plugin = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_3562add825dafed5,
-		GoTypes:            xxx_ProtoFile_google_protobuf_compiler_plugin_goTypes,
-		DependencyIndexes:  xxx_ProtoFile_google_protobuf_compiler_plugin_depIdxs,
+	File_google_protobuf_compiler_plugin_proto = protoimpl.FileBuilder{
+		RawDescriptor:      xxx_File_google_protobuf_compiler_plugin_proto_rawdesc,
+		GoTypes:            xxx_File_google_protobuf_compiler_plugin_proto_goTypes,
+		DependencyIndexes:  xxx_File_google_protobuf_compiler_plugin_proto_depIdxs,
 		MessageOutputTypes: messageTypes[:],
 	}.Init()
-	messageGoTypes := xxx_ProtoFile_google_protobuf_compiler_plugin_goTypes[0:][:4]
+	messageGoTypes := xxx_File_google_protobuf_compiler_plugin_proto_goTypes[0:][:4]
 	for i, mt := range messageTypes[:] {
-		xxx_ProtoFile_google_protobuf_compiler_plugin_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_ProtoFile_google_protobuf_compiler_plugin_messageTypes[i].PBType = mt
+		xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_File_google_protobuf_compiler_plugin_proto_messageTypes[i].PBType = mt
 	}
-	xxx_ProtoFile_google_protobuf_compiler_plugin_goTypes = nil
-	xxx_ProtoFile_google_protobuf_compiler_plugin_depIdxs = nil
+	xxx_File_google_protobuf_compiler_plugin_proto_goTypes = nil
+	xxx_File_google_protobuf_compiler_plugin_proto_depIdxs = nil
 }
