// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package filedesc

import (
	
	

	
	
	
	
	
	
)

func ( *File) () {
	.unmarshalFull(.builder.RawDescriptor)
	.resolveMessages()
	.resolveExtensions()
	.resolveServices()
}

func ( *File) () {
	var  int32
	for  := range .allMessages {
		 := &.allMessages[]

		// Resolve message field dependencies.
		for  := range .L2.Fields.List {
			 := &.L2.Fields.List[]

			// Weak fields are resolved upon actual use.
			if .L1.IsWeak {
				continue
			}

			// Resolve message field dependency.
			switch .L1.Kind {
			case protoreflect.EnumKind:
				.L1.Enum = .resolveEnumDependency(.L1.Enum, listFieldDeps, )
				++
			case protoreflect.MessageKind, protoreflect.GroupKind:
				.L1.Message = .resolveMessageDependency(.L1.Message, listFieldDeps, )
				++
			}

			// Default is resolved here since it depends on Enum being resolved.
			if  := .L1.Default.val; .IsValid() {
				.L1.Default = unmarshalDefault(.Bytes(), .L1.Kind, , .L1.Enum)
			}
		}
	}
}

func ( *File) () {
	var  int32
	for  := range .allExtensions {
		 := &.allExtensions[]

		// Resolve extension field dependency.
		switch .L1.Kind {
		case protoreflect.EnumKind:
			.L2.Enum = .resolveEnumDependency(.L2.Enum, listExtDeps, )
			++
		case protoreflect.MessageKind, protoreflect.GroupKind:
			.L2.Message = .resolveMessageDependency(.L2.Message, listExtDeps, )
			++
		}

		// Default is resolved here since it depends on Enum being resolved.
		if  := .L2.Default.val; .IsValid() {
			.L2.Default = unmarshalDefault(.Bytes(), .L1.Kind, , .L2.Enum)
		}
	}
}

func ( *File) () {
	var  int32
	for  := range .allServices {
		 := &.allServices[]

		// Resolve method dependencies.
		for  := range .L2.Methods.List {
			 := &.L2.Methods.List[]
			.L1.Input = .resolveMessageDependency(.L1.Input, listMethInDeps, )
			.L1.Output = .resolveMessageDependency(.L1.Output, listMethOutDeps, )
			++
		}
	}
}

func ( *File) ( protoreflect.EnumDescriptor, ,  int32) protoreflect.EnumDescriptor {
	 := .builder.FileRegistry
	if ,  := .(resolverByIndex);  {
		if  := .FindEnumByIndex(, , .allEnums, .allMessages);  != nil {
			return 
		}
	}
	for  := range .allEnums {
		if  := &.allEnums[]; .L0.FullName == .FullName() {
			return 
		}
	}
	if ,  := .FindDescriptorByName(.FullName());  != nil {
		return .(protoreflect.EnumDescriptor)
	}
	return 
}

func ( *File) ( protoreflect.MessageDescriptor, ,  int32) protoreflect.MessageDescriptor {
	 := .builder.FileRegistry
	if ,  := .(resolverByIndex);  {
		if  := .FindMessageByIndex(, , .allEnums, .allMessages);  != nil {
			return 
		}
	}
	for  := range .allMessages {
		if  := &.allMessages[]; .L0.FullName == .FullName() {
			return 
		}
	}
	if ,  := .FindDescriptorByName(.FullName());  != nil {
		return .(protoreflect.MessageDescriptor)
	}
	return 
}

func ( *File) ( []byte) {
	 := getBuilder()
	defer putBuilder()

	var , , ,  int
	var  []byte
	.L2 = new(FileL2)
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.FileDescriptorProto_PublicDependency_field_number:
				.L2.Imports[].IsPublic = true
			case genid.FileDescriptorProto_WeakDependency_field_number:
				.L2.Imports[].IsWeak = true
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.FileDescriptorProto_Dependency_field_number:
				 := .MakeString()
				,  := .builder.FileRegistry.FindFileByPath()
				if  == nil {
					 = PlaceholderFile()
				}
				.L2.Imports = append(.L2.Imports, protoreflect.FileImport{FileDescriptor: })
			case genid.FileDescriptorProto_EnumType_field_number:
				.L1.Enums.List[].unmarshalFull(, )
				++
			case genid.FileDescriptorProto_MessageType_field_number:
				.L1.Messages.List[].unmarshalFull(, )
				++
			case genid.FileDescriptorProto_Extension_field_number:
				.L1.Extensions.List[].unmarshalFull(, )
				++
			case genid.FileDescriptorProto_Service_field_number:
				.L1.Services.List[].unmarshalFull(, )
				++
			case genid.FileDescriptorProto_Options_field_number:
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	.L2.Options = .builder.optionsUnmarshaler(&descopts.File, )
}

func ( *Enum) ( []byte,  *strs.Builder) {
	var  [][]byte
	var  []byte
	if !.L1.eagerValues {
		.L2 = new(EnumL2)
	}
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.EnumDescriptorProto_Value_field_number:
				 = append(, )
			case genid.EnumDescriptorProto_ReservedName_field_number:
				.L2.ReservedNames.List = append(.L2.ReservedNames.List, protoreflect.Name(.MakeString()))
			case genid.EnumDescriptorProto_ReservedRange_field_number:
				.L2.ReservedRanges.List = append(.L2.ReservedRanges.List, unmarshalEnumReservedRange())
			case genid.EnumDescriptorProto_Options_field_number:
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	if !.L1.eagerValues && len() > 0 {
		.L2.Values.List = make([]EnumValue, len())
		for ,  := range  {
			.L2.Values.List[].unmarshalFull(, , .L0.ParentFile, , )
		}
	}
	.L2.Options = .L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, )
}

func ( []byte) ( [2]protoreflect.EnumNumber) {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number:
				[0] = protoreflect.EnumNumber()
			case genid.EnumDescriptorProto_EnumReservedRange_End_field_number:
				[1] = protoreflect.EnumNumber()
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	return 
}

func ( *EnumValue) ( []byte,  *strs.Builder,  *File,  protoreflect.Descriptor,  int) {
	.L0.ParentFile = 
	.L0.Parent = 
	.L0.Index = 

	var  []byte
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.EnumValueDescriptorProto_Number_field_number:
				.L1.Number = protoreflect.EnumNumber()
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.EnumValueDescriptorProto_Name_field_number:
				// NOTE: Enum values are in the same scope as the enum parent.
				.L0.FullName = appendFullName(, .Parent().FullName(), )
			case genid.EnumValueDescriptorProto_Options_field_number:
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	.L1.Options = .builder.optionsUnmarshaler(&descopts.EnumValue, )
}

func ( *Message) ( []byte,  *strs.Builder) {
	var ,  [][]byte
	var , ,  int
	var  []byte
	.L2 = new(MessageL2)
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.DescriptorProto_Field_field_number:
				 = append(, )
			case genid.DescriptorProto_OneofDecl_field_number:
				 = append(, )
			case genid.DescriptorProto_ReservedName_field_number:
				.L2.ReservedNames.List = append(.L2.ReservedNames.List, protoreflect.Name(.MakeString()))
			case genid.DescriptorProto_ReservedRange_field_number:
				.L2.ReservedRanges.List = append(.L2.ReservedRanges.List, unmarshalMessageReservedRange())
			case genid.DescriptorProto_ExtensionRange_field_number:
				,  := unmarshalMessageExtensionRange()
				 := .L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, )
				.L2.ExtensionRanges.List = append(.L2.ExtensionRanges.List, )
				.L2.ExtensionRangeOptions = append(.L2.ExtensionRangeOptions, )
			case genid.DescriptorProto_EnumType_field_number:
				.L1.Enums.List[].unmarshalFull(, )
				++
			case genid.DescriptorProto_NestedType_field_number:
				.L1.Messages.List[].(, )
				++
			case genid.DescriptorProto_Extension_field_number:
				.L1.Extensions.List[].unmarshalFull(, )
				++
			case genid.DescriptorProto_Options_field_number:
				.unmarshalOptions()
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	if len() > 0 || len() > 0 {
		.L2.Fields.List = make([]Field, len())
		.L2.Oneofs.List = make([]Oneof, len())
		for ,  := range  {
			 := &.L2.Fields.List[]
			.unmarshalFull(, , .L0.ParentFile, , )
			if .L1.Cardinality == protoreflect.Required {
				.L2.RequiredNumbers.List = append(.L2.RequiredNumbers.List, .L1.Number)
			}
		}
		for ,  := range  {
			 := &.L2.Oneofs.List[]
			.unmarshalFull(, , .L0.ParentFile, , )
		}
	}
	.L2.Options = .L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, )
}

func ( *Message) ( []byte) {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.MessageOptions_MapEntry_field_number:
				.L1.IsMapEntry = protowire.DecodeBool()
			case genid.MessageOptions_MessageSetWireFormat_field_number:
				.L1.IsMessageSet = protowire.DecodeBool()
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
}

func ( []byte) ( [2]protoreflect.FieldNumber) {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.DescriptorProto_ReservedRange_Start_field_number:
				[0] = protoreflect.FieldNumber()
			case genid.DescriptorProto_ReservedRange_End_field_number:
				[1] = protoreflect.FieldNumber()
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	return 
}

func ( []byte) ( [2]protoreflect.FieldNumber,  []byte) {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.DescriptorProto_ExtensionRange_Start_field_number:
				[0] = protoreflect.FieldNumber()
			case genid.DescriptorProto_ExtensionRange_End_field_number:
				[1] = protoreflect.FieldNumber()
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.DescriptorProto_ExtensionRange_Options_field_number:
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	return , 
}

func ( *Field) ( []byte,  *strs.Builder,  *File,  protoreflect.Descriptor,  int) {
	.L0.ParentFile = 
	.L0.Parent = 
	.L0.Index = 

	var  []byte
	var  []byte
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.FieldDescriptorProto_Number_field_number:
				.L1.Number = protoreflect.FieldNumber()
			case genid.FieldDescriptorProto_Label_field_number:
				.L1.Cardinality = protoreflect.Cardinality()
			case genid.FieldDescriptorProto_Type_field_number:
				.L1.Kind = protoreflect.Kind()
			case genid.FieldDescriptorProto_OneofIndex_field_number:
				// In Message.unmarshalFull, we allocate slices for both
				// the field and oneof descriptors before unmarshaling either
				// of them. This ensures pointers to slice elements are stable.
				 := &.(*Message).L2.Oneofs.List[]
				.L1.Fields.List = append(.L1.Fields.List, )
				if .L1.ContainingOneof != nil {
					panic("oneof type already set")
				}
				.L1.ContainingOneof = 
			case genid.FieldDescriptorProto_Proto3Optional_field_number:
				.L1.IsProto3Optional = protowire.DecodeBool()
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.FieldDescriptorProto_Name_field_number:
				.L0.FullName = appendFullName(, .FullName(), )
			case genid.FieldDescriptorProto_JsonName_field_number:
				.L1.StringName.InitJSON(.MakeString())
			case genid.FieldDescriptorProto_DefaultValue_field_number:
				.L1.Default.val = protoreflect.ValueOfBytes() // temporarily store as bytes; later resolved in resolveMessages
			case genid.FieldDescriptorProto_TypeName_field_number:
				 = 
			case genid.FieldDescriptorProto_Options_field_number:
				.unmarshalOptions()
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	if  != nil {
		 := makeFullName(, )
		switch .L1.Kind {
		case protoreflect.EnumKind:
			.L1.Enum = PlaceholderEnum()
		case protoreflect.MessageKind, protoreflect.GroupKind:
			.L1.Message = PlaceholderMessage()
		}
	}
	.L1.Options = .builder.optionsUnmarshaler(&descopts.Field, )
}

func ( *Field) ( []byte) {
	const  = 13

	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.FieldOptions_Packed_field_number:
				.L1.HasPacked = true
				.L1.IsPacked = protowire.DecodeBool()
			case genid.FieldOptions_Weak_field_number:
				.L1.IsWeak = protowire.DecodeBool()
			case :
				.L1.HasEnforceUTF8 = true
				.L1.EnforceUTF8 = protowire.DecodeBool()
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
}

func ( *Oneof) ( []byte,  *strs.Builder,  *File,  protoreflect.Descriptor,  int) {
	.L0.ParentFile = 
	.L0.Parent = 
	.L0.Index = 

	var  []byte
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.OneofDescriptorProto_Name_field_number:
				.L0.FullName = appendFullName(, .FullName(), )
			case genid.OneofDescriptorProto_Options_field_number:
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	.L1.Options = .builder.optionsUnmarshaler(&descopts.Oneof, )
}

func ( *Extension) ( []byte,  *strs.Builder) {
	var  []byte
	var  []byte
	.L2 = new(ExtensionL2)
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.FieldDescriptorProto_Proto3Optional_field_number:
				.L2.IsProto3Optional = protowire.DecodeBool()
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.FieldDescriptorProto_JsonName_field_number:
				.L2.StringName.InitJSON(.MakeString())
			case genid.FieldDescriptorProto_DefaultValue_field_number:
				.L2.Default.val = protoreflect.ValueOfBytes() // temporarily store as bytes; later resolved in resolveExtensions
			case genid.FieldDescriptorProto_TypeName_field_number:
				 = 
			case genid.FieldDescriptorProto_Options_field_number:
				.unmarshalOptions()
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	if  != nil {
		 := makeFullName(, )
		switch .L1.Kind {
		case protoreflect.EnumKind:
			.L2.Enum = PlaceholderEnum()
		case protoreflect.MessageKind, protoreflect.GroupKind:
			.L2.Message = PlaceholderMessage()
		}
	}
	.L2.Options = .L0.ParentFile.builder.optionsUnmarshaler(&descopts.Field, )
}

func ( *Extension) ( []byte) {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.FieldOptions_Packed_field_number:
				.L2.IsPacked = protowire.DecodeBool()
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
}

func ( *Service) ( []byte,  *strs.Builder) {
	var  [][]byte
	var  []byte
	.L2 = new(ServiceL2)
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.ServiceDescriptorProto_Method_field_number:
				 = append(, )
			case genid.ServiceDescriptorProto_Options_field_number:
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	if len() > 0 {
		.L2.Methods.List = make([]Method, len())
		for ,  := range  {
			.L2.Methods.List[].unmarshalFull(, , .L0.ParentFile, , )
		}
	}
	.L2.Options = .L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, )
}

func ( *Method) ( []byte,  *strs.Builder,  *File,  protoreflect.Descriptor,  int) {
	.L0.ParentFile = 
	.L0.Parent = 
	.L0.Index = 

	var  []byte
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.MethodDescriptorProto_ClientStreaming_field_number:
				.L1.IsStreamingClient = protowire.DecodeBool()
			case genid.MethodDescriptorProto_ServerStreaming_field_number:
				.L1.IsStreamingServer = protowire.DecodeBool()
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.MethodDescriptorProto_Name_field_number:
				.L0.FullName = appendFullName(, .FullName(), )
			case genid.MethodDescriptorProto_InputType_field_number:
				.L1.Input = PlaceholderMessage(makeFullName(, ))
			case genid.MethodDescriptorProto_OutputType_field_number:
				.L1.Output = PlaceholderMessage(makeFullName(, ))
			case genid.MethodDescriptorProto_Options_field_number:
				 = appendOptions(, )
			}
		default:
			 := protowire.ConsumeFieldValue(, , )
			 = [:]
		}
	}
	.L1.Options = .builder.optionsUnmarshaler(&descopts.Method, )
}

// appendOptions appends src to dst, where the returned slice is never nil.
// This is necessary to distinguish between empty and unpopulated options.
func (,  []byte) []byte {
	if  == nil {
		 = []byte{}
	}
	return append(, ...)
}

// optionsUnmarshaler constructs a lazy unmarshal function for an options message.
//
// The type of message to unmarshal to is passed as a pointer since the
// vars in descopts may not yet be populated at the time this function is called.
func ( *Builder) ( *protoreflect.ProtoMessage,  []byte) func() protoreflect.ProtoMessage {
	if  == nil {
		return nil
	}
	var  protoreflect.ProtoMessage
	var  sync.Once
	return func() protoreflect.ProtoMessage {
		.Do(func() {
			if * == nil {
				panic("Descriptor.Options called without importing the descriptor package")
			}
			 = reflect.New(reflect.TypeOf(*).Elem()).Interface().(protoreflect.ProtoMessage)
			if  := (proto.UnmarshalOptions{
				AllowPartial: true,
				Resolver:     .TypeResolver,
			}).Unmarshal(, );  != nil {
				panic()
			}
		})
		return 
	}
}