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

package protodesc

import (
	
	
	
	
	

	
)

type descsByName map[protoreflect.FullName]protoreflect.Descriptor

func ( descsByName) ( []*descriptorpb.EnumDescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.Enum,  error) {
	 = make([]filedesc.Enum, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		.L2 = new(filedesc.EnumL2)
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.EnumOptions)
			.L2.Options = func() protoreflect.ProtoMessage { return  }
		}
		for ,  := range .GetReservedName() {
			.L2.ReservedNames.List = append(.L2.ReservedNames.List, protoreflect.Name())
		}
		for ,  := range .GetReservedRange() {
			.L2.ReservedRanges.List = append(.L2.ReservedRanges.List, [2]protoreflect.EnumNumber{
				protoreflect.EnumNumber(.GetStart()),
				protoreflect.EnumNumber(.GetEnd()),
			})
		}
		if .L2.Values.List,  = .initEnumValuesFromDescriptorProto(.GetValue(), , );  != nil {
			return nil, 
		}
	}
	return , nil
}

func ( descsByName) ( []*descriptorpb.EnumValueDescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.EnumValue,  error) {
	 = make([]filedesc.EnumValue, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.EnumValueOptions)
			.L1.Options = func() protoreflect.ProtoMessage { return  }
		}
		.L1.Number = protoreflect.EnumNumber(.GetNumber())
	}
	return , nil
}

func ( descsByName) ( []*descriptorpb.DescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.Message,  error) {
	 = make([]filedesc.Message, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		.L2 = new(filedesc.MessageL2)
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.MessageOptions)
			.L2.Options = func() protoreflect.ProtoMessage { return  }
			.L1.IsMapEntry = .GetMapEntry()
			.L1.IsMessageSet = .GetMessageSetWireFormat()
		}
		for ,  := range .GetReservedName() {
			.L2.ReservedNames.List = append(.L2.ReservedNames.List, protoreflect.Name())
		}
		for ,  := range .GetReservedRange() {
			.L2.ReservedRanges.List = append(.L2.ReservedRanges.List, [2]protoreflect.FieldNumber{
				protoreflect.FieldNumber(.GetStart()),
				protoreflect.FieldNumber(.GetEnd()),
			})
		}
		for ,  := range .GetExtensionRange() {
			.L2.ExtensionRanges.List = append(.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{
				protoreflect.FieldNumber(.GetStart()),
				protoreflect.FieldNumber(.GetEnd()),
			})
			var  func() protoreflect.ProtoMessage
			if  := .GetOptions();  != nil {
				 = proto.Clone().(*descriptorpb.ExtensionRangeOptions)
				 = func() protoreflect.ProtoMessage { return  }
			}
			.L2.ExtensionRangeOptions = append(.L2.ExtensionRangeOptions, )
		}
		if .L2.Fields.List,  = .initFieldsFromDescriptorProto(.GetField(), , );  != nil {
			return nil, 
		}
		if .L2.Oneofs.List,  = .initOneofsFromDescriptorProto(.GetOneofDecl(), , );  != nil {
			return nil, 
		}
		if .L1.Enums.List,  = .initEnumDeclarations(.GetEnumType(), , );  != nil {
			return nil, 
		}
		if .L1.Messages.List,  = .(.GetNestedType(), , );  != nil {
			return nil, 
		}
		if .L1.Extensions.List,  = .initExtensionDeclarations(.GetExtension(), , );  != nil {
			return nil, 
		}
	}
	return , nil
}

func ( descsByName) ( []*descriptorpb.FieldDescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.Field,  error) {
	 = make([]filedesc.Field, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		.L1.IsProto3Optional = .GetProto3Optional()
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.FieldOptions)
			.L1.Options = func() protoreflect.ProtoMessage { return  }
			.L1.IsWeak = .GetWeak()
			.L1.HasPacked = .Packed != nil
			.L1.IsPacked = .GetPacked()
		}
		.L1.Number = protoreflect.FieldNumber(.GetNumber())
		.L1.Cardinality = protoreflect.Cardinality(.GetLabel())
		if .Type != nil {
			.L1.Kind = protoreflect.Kind(.GetType())
		}
		if .JsonName != nil {
			.L1.StringName.InitJSON(.GetJsonName())
		}
	}
	return , nil
}

func ( descsByName) ( []*descriptorpb.OneofDescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.Oneof,  error) {
	 = make([]filedesc.Oneof, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.OneofOptions)
			.L1.Options = func() protoreflect.ProtoMessage { return  }
		}
	}
	return , nil
}

func ( descsByName) ( []*descriptorpb.FieldDescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.Extension,  error) {
	 = make([]filedesc.Extension, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		.L2 = new(filedesc.ExtensionL2)
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.FieldOptions)
			.L2.Options = func() protoreflect.ProtoMessage { return  }
			.L2.IsPacked = .GetPacked()
		}
		.L1.Number = protoreflect.FieldNumber(.GetNumber())
		.L1.Cardinality = protoreflect.Cardinality(.GetLabel())
		if .Type != nil {
			.L1.Kind = protoreflect.Kind(.GetType())
		}
		if .JsonName != nil {
			.L2.StringName.InitJSON(.GetJsonName())
		}
	}
	return , nil
}

func ( descsByName) ( []*descriptorpb.ServiceDescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.Service,  error) {
	 = make([]filedesc.Service, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		.L2 = new(filedesc.ServiceL2)
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.ServiceOptions)
			.L2.Options = func() protoreflect.ProtoMessage { return  }
		}
		if .L2.Methods.List,  = .initMethodsFromDescriptorProto(.GetMethod(), , );  != nil {
			return nil, 
		}
	}
	return , nil
}

func ( descsByName) ( []*descriptorpb.MethodDescriptorProto,  protoreflect.Descriptor,  *strs.Builder) ( []filedesc.Method,  error) {
	 = make([]filedesc.Method, len()) // allocate up-front to ensure stable pointers
	for ,  := range  {
		 := &[]
		if .L0,  = .makeBase(, , .GetName(), , );  != nil {
			return nil, 
		}
		if  := .GetOptions();  != nil {
			 = proto.Clone().(*descriptorpb.MethodOptions)
			.L1.Options = func() protoreflect.ProtoMessage { return  }
		}
		.L1.IsStreamingClient = .GetClientStreaming()
		.L1.IsStreamingServer = .GetServerStreaming()
	}
	return , nil
}

func ( descsByName) (,  protoreflect.Descriptor,  string,  int,  *strs.Builder) (filedesc.BaseL0, error) {
	if !protoreflect.Name().IsValid() {
		return filedesc.BaseL0{}, errors.New("descriptor %q has an invalid nested name: %q", .FullName(), )
	}

	// Derive the full name of the child.
	// Note that enum values are a sibling to the enum parent in the namespace.
	var  protoreflect.FullName
	if ,  := .(protoreflect.EnumDescriptor);  {
		 = .AppendFullName(.FullName().Parent(), protoreflect.Name())
	} else {
		 = .AppendFullName(.FullName(), protoreflect.Name())
	}
	if ,  := [];  {
		return filedesc.BaseL0{}, errors.New("descriptor %q already declared", )
	}
	[] = 

	// TODO: Verify that the full name does not already exist in the resolver?
	// This is not as critical since most usages of NewFile will register
	// the created file back into the registry, which will perform this check.

	return filedesc.BaseL0{
		FullName:   ,
		ParentFile: .ParentFile().(*filedesc.File),
		Parent:     ,
		Index:      ,
	}, nil
}