WIP: Save agent roles integration work before CHORUS rebrand
- Agent roles and coordination features - Chat API integration testing - New configuration and workspace management 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							
								
								
									
										157
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/build.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/build.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,157 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // Package filedesc provides functionality for constructing descriptors. | ||||
| // | ||||
| // The types in this package implement interfaces in the protoreflect package | ||||
| // related to protobuf descripriptors. | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // Builder construct a protoreflect.FileDescriptor from the raw descriptor. | ||||
| type Builder struct { | ||||
| 	// GoPackagePath is the Go package path that is invoking this builder. | ||||
| 	GoPackagePath string | ||||
|  | ||||
| 	// RawDescriptor is the wire-encoded bytes of FileDescriptorProto | ||||
| 	// and must be populated. | ||||
| 	RawDescriptor []byte | ||||
|  | ||||
| 	// NumEnums is the total number of enums declared in the file. | ||||
| 	NumEnums int32 | ||||
| 	// NumMessages is the total number of messages declared in the file. | ||||
| 	// It includes the implicit message declarations for map entries. | ||||
| 	NumMessages int32 | ||||
| 	// NumExtensions is the total number of extensions declared in the file. | ||||
| 	NumExtensions int32 | ||||
| 	// NumServices is the total number of services declared in the file. | ||||
| 	NumServices int32 | ||||
|  | ||||
| 	// TypeResolver resolves extension field types for descriptor options. | ||||
| 	// If nil, it uses protoregistry.GlobalTypes. | ||||
| 	TypeResolver interface { | ||||
| 		protoregistry.ExtensionTypeResolver | ||||
| 	} | ||||
|  | ||||
| 	// FileRegistry is use to lookup file, enum, and message dependencies. | ||||
| 	// Once constructed, the file descriptor is registered here. | ||||
| 	// If nil, it uses protoregistry.GlobalFiles. | ||||
| 	FileRegistry interface { | ||||
| 		FindFileByPath(string) (protoreflect.FileDescriptor, error) | ||||
| 		FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) | ||||
| 		RegisterFile(protoreflect.FileDescriptor) error | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // resolverByIndex is an interface Builder.FileRegistry may implement. | ||||
| // If so, it permits looking up an enum or message dependency based on the | ||||
| // sub-list and element index into filetype.Builder.DependencyIndexes. | ||||
| type resolverByIndex interface { | ||||
| 	FindEnumByIndex(int32, int32, []Enum, []Message) protoreflect.EnumDescriptor | ||||
| 	FindMessageByIndex(int32, int32, []Enum, []Message) protoreflect.MessageDescriptor | ||||
| } | ||||
|  | ||||
| // Indexes of each sub-list in filetype.Builder.DependencyIndexes. | ||||
| const ( | ||||
| 	listFieldDeps int32 = iota | ||||
| 	listExtTargets | ||||
| 	listExtDeps | ||||
| 	listMethInDeps | ||||
| 	listMethOutDeps | ||||
| ) | ||||
|  | ||||
| // Out is the output of the Builder. | ||||
| type Out struct { | ||||
| 	File protoreflect.FileDescriptor | ||||
|  | ||||
| 	// Enums is all enum descriptors in "flattened ordering". | ||||
| 	Enums []Enum | ||||
| 	// Messages is all message descriptors in "flattened ordering". | ||||
| 	// It includes the implicit message declarations for map entries. | ||||
| 	Messages []Message | ||||
| 	// Extensions is all extension descriptors in "flattened ordering". | ||||
| 	Extensions []Extension | ||||
| 	// Service is all service descriptors in "flattened ordering". | ||||
| 	Services []Service | ||||
| } | ||||
|  | ||||
| // Build constructs a FileDescriptor given the parameters set in Builder. | ||||
| // It assumes that the inputs are well-formed and panics if any inconsistencies | ||||
| // are encountered. | ||||
| // | ||||
| // If NumEnums+NumMessages+NumExtensions+NumServices is zero, | ||||
| // then Build automatically derives them from the raw descriptor. | ||||
| func (db Builder) Build() (out Out) { | ||||
| 	// Populate the counts if uninitialized. | ||||
| 	if db.NumEnums+db.NumMessages+db.NumExtensions+db.NumServices == 0 { | ||||
| 		db.unmarshalCounts(db.RawDescriptor, true) | ||||
| 	} | ||||
|  | ||||
| 	// Initialize resolvers and registries if unpopulated. | ||||
| 	if db.TypeResolver == nil { | ||||
| 		db.TypeResolver = protoregistry.GlobalTypes | ||||
| 	} | ||||
| 	if db.FileRegistry == nil { | ||||
| 		db.FileRegistry = protoregistry.GlobalFiles | ||||
| 	} | ||||
|  | ||||
| 	fd := newRawFile(db) | ||||
| 	out.File = fd | ||||
| 	out.Enums = fd.allEnums | ||||
| 	out.Messages = fd.allMessages | ||||
| 	out.Extensions = fd.allExtensions | ||||
| 	out.Services = fd.allServices | ||||
|  | ||||
| 	if err := db.FileRegistry.RegisterFile(fd); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // unmarshalCounts counts the number of enum, message, extension, and service | ||||
| // declarations in the raw message, which is either a FileDescriptorProto | ||||
| // or a MessageDescriptorProto depending on whether isFile is set. | ||||
| func (db *Builder) unmarshalCounts(b []byte, isFile bool) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			if isFile { | ||||
| 				switch num { | ||||
| 				case genid.FileDescriptorProto_EnumType_field_number: | ||||
| 					db.NumEnums++ | ||||
| 				case genid.FileDescriptorProto_MessageType_field_number: | ||||
| 					db.unmarshalCounts(v, false) | ||||
| 					db.NumMessages++ | ||||
| 				case genid.FileDescriptorProto_Extension_field_number: | ||||
| 					db.NumExtensions++ | ||||
| 				case genid.FileDescriptorProto_Service_field_number: | ||||
| 					db.NumServices++ | ||||
| 				} | ||||
| 			} else { | ||||
| 				switch num { | ||||
| 				case genid.DescriptorProto_EnumType_field_number: | ||||
| 					db.NumEnums++ | ||||
| 				case genid.DescriptorProto_NestedType_field_number: | ||||
| 					db.unmarshalCounts(v, false) | ||||
| 					db.NumMessages++ | ||||
| 				case genid.DescriptorProto_Extension_field_number: | ||||
| 					db.NumExtensions++ | ||||
| 				} | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										733
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										733
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,733 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/descfmt" | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	"google.golang.org/protobuf/internal/encoding/defval" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // Edition is an Enum for proto2.Edition | ||||
| type Edition int32 | ||||
|  | ||||
| // These values align with the value of Enum in descriptor.proto which allows | ||||
| // direct conversion between the proto enum and this enum. | ||||
| const ( | ||||
| 	EditionUnknown     Edition = 0 | ||||
| 	EditionProto2      Edition = 998 | ||||
| 	EditionProto3      Edition = 999 | ||||
| 	Edition2023        Edition = 1000 | ||||
| 	EditionUnsupported Edition = 100000 | ||||
| ) | ||||
|  | ||||
| // The types in this file may have a suffix: | ||||
| //	• L0: Contains fields common to all descriptors (except File) and | ||||
| //	must be initialized up front. | ||||
| //	• L1: Contains fields specific to a descriptor and | ||||
| //	must be initialized up front. If the associated proto uses Editions, the | ||||
| //  Editions features must always be resolved. If not explicitly set, the | ||||
| //  appropriate default must be resolved and set. | ||||
| //	• L2: Contains fields that are lazily initialized when constructing | ||||
| //	from the raw file descriptor. When constructing as a literal, the L2 | ||||
| //	fields must be initialized up front. | ||||
| // | ||||
| // The types are exported so that packages like reflect/protodesc can | ||||
| // directly construct descriptors. | ||||
|  | ||||
| type ( | ||||
| 	File struct { | ||||
| 		fileRaw | ||||
| 		L1 FileL1 | ||||
|  | ||||
| 		once uint32     // atomically set if L2 is valid | ||||
| 		mu   sync.Mutex // protects L2 | ||||
| 		L2   *FileL2 | ||||
| 	} | ||||
| 	FileL1 struct { | ||||
| 		Syntax  protoreflect.Syntax | ||||
| 		Edition Edition // Only used if Syntax == Editions | ||||
| 		Path    string | ||||
| 		Package protoreflect.FullName | ||||
|  | ||||
| 		Enums      Enums | ||||
| 		Messages   Messages | ||||
| 		Extensions Extensions | ||||
| 		Services   Services | ||||
|  | ||||
| 		EditionFeatures EditionFeatures | ||||
| 	} | ||||
| 	FileL2 struct { | ||||
| 		Options   func() protoreflect.ProtoMessage | ||||
| 		Imports   FileImports | ||||
| 		Locations SourceLocations | ||||
| 	} | ||||
|  | ||||
| 	EditionFeatures struct { | ||||
| 		// IsFieldPresence is true if field_presence is EXPLICIT | ||||
| 		// https://protobuf.dev/editions/features/#field_presence | ||||
| 		IsFieldPresence bool | ||||
| 		// IsFieldPresence is true if field_presence is LEGACY_REQUIRED | ||||
| 		// https://protobuf.dev/editions/features/#field_presence | ||||
| 		IsLegacyRequired bool | ||||
| 		// IsOpenEnum is true if enum_type is OPEN | ||||
| 		// https://protobuf.dev/editions/features/#enum_type | ||||
| 		IsOpenEnum bool | ||||
| 		// IsPacked is true if repeated_field_encoding is PACKED | ||||
| 		// https://protobuf.dev/editions/features/#repeated_field_encoding | ||||
| 		IsPacked bool | ||||
| 		// IsUTF8Validated is true if utf_validation is VERIFY | ||||
| 		// https://protobuf.dev/editions/features/#utf8_validation | ||||
| 		IsUTF8Validated bool | ||||
| 		// IsDelimitedEncoded is true if message_encoding is DELIMITED | ||||
| 		// https://protobuf.dev/editions/features/#message_encoding | ||||
| 		IsDelimitedEncoded bool | ||||
| 		// IsJSONCompliant is true if json_format is ALLOW | ||||
| 		// https://protobuf.dev/editions/features/#json_format | ||||
| 		IsJSONCompliant bool | ||||
| 		// GenerateLegacyUnmarshalJSON determines if the plugin generates the | ||||
| 		// UnmarshalJSON([]byte) error method for enums. | ||||
| 		GenerateLegacyUnmarshalJSON bool | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } | ||||
| func (fd *File) Parent() protoreflect.Descriptor         { return nil } | ||||
| func (fd *File) Index() int                              { return 0 } | ||||
| func (fd *File) Syntax() protoreflect.Syntax             { return fd.L1.Syntax } | ||||
|  | ||||
| // Not exported and just used to reconstruct the original FileDescriptor proto | ||||
| func (fd *File) Edition() int32                  { return int32(fd.L1.Edition) } | ||||
| func (fd *File) Name() protoreflect.Name         { return fd.L1.Package.Name() } | ||||
| func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } | ||||
| func (fd *File) IsPlaceholder() bool             { return false } | ||||
| func (fd *File) Options() protoreflect.ProtoMessage { | ||||
| 	if f := fd.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.File | ||||
| } | ||||
| func (fd *File) Path() string                                  { return fd.L1.Path } | ||||
| func (fd *File) Package() protoreflect.FullName                { return fd.L1.Package } | ||||
| func (fd *File) Imports() protoreflect.FileImports             { return &fd.lazyInit().Imports } | ||||
| func (fd *File) Enums() protoreflect.EnumDescriptors           { return &fd.L1.Enums } | ||||
| func (fd *File) Messages() protoreflect.MessageDescriptors     { return &fd.L1.Messages } | ||||
| func (fd *File) Extensions() protoreflect.ExtensionDescriptors { return &fd.L1.Extensions } | ||||
| func (fd *File) Services() protoreflect.ServiceDescriptors     { return &fd.L1.Services } | ||||
| func (fd *File) SourceLocations() protoreflect.SourceLocations { return &fd.lazyInit().Locations } | ||||
| func (fd *File) Format(s fmt.State, r rune)                    { descfmt.FormatDesc(s, r, fd) } | ||||
| func (fd *File) ProtoType(protoreflect.FileDescriptor)         {} | ||||
| func (fd *File) ProtoInternal(pragma.DoNotImplement)           {} | ||||
|  | ||||
| func (fd *File) lazyInit() *FileL2 { | ||||
| 	if atomic.LoadUint32(&fd.once) == 0 { | ||||
| 		fd.lazyInitOnce() | ||||
| 	} | ||||
| 	return fd.L2 | ||||
| } | ||||
|  | ||||
| func (fd *File) lazyInitOnce() { | ||||
| 	fd.mu.Lock() | ||||
| 	if fd.L2 == nil { | ||||
| 		fd.lazyRawInit() // recursively initializes all L2 structures | ||||
| 	} | ||||
| 	atomic.StoreUint32(&fd.once, 1) | ||||
| 	fd.mu.Unlock() | ||||
| } | ||||
|  | ||||
| // GoPackagePath is a pseudo-internal API for determining the Go package path | ||||
| // that this file descriptor is declared in. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and may be | ||||
| // removed in the future without warning. | ||||
| func (fd *File) GoPackagePath() string { | ||||
| 	return fd.builder.GoPackagePath | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	Enum struct { | ||||
| 		Base | ||||
| 		L1 EnumL1 | ||||
| 		L2 *EnumL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	EnumL1 struct { | ||||
| 		eagerValues bool // controls whether EnumL2.Values is already populated | ||||
|  | ||||
| 		EditionFeatures EditionFeatures | ||||
| 	} | ||||
| 	EnumL2 struct { | ||||
| 		Options        func() protoreflect.ProtoMessage | ||||
| 		Values         EnumValues | ||||
| 		ReservedNames  Names | ||||
| 		ReservedRanges EnumRanges | ||||
| 	} | ||||
|  | ||||
| 	EnumValue struct { | ||||
| 		Base | ||||
| 		L1 EnumValueL1 | ||||
| 	} | ||||
| 	EnumValueL1 struct { | ||||
| 		Options func() protoreflect.ProtoMessage | ||||
| 		Number  protoreflect.EnumNumber | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (ed *Enum) Options() protoreflect.ProtoMessage { | ||||
| 	if f := ed.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Enum | ||||
| } | ||||
| func (ed *Enum) Values() protoreflect.EnumValueDescriptors { | ||||
| 	if ed.L1.eagerValues { | ||||
| 		return &ed.L2.Values | ||||
| 	} | ||||
| 	return &ed.lazyInit().Values | ||||
| } | ||||
| func (ed *Enum) ReservedNames() protoreflect.Names       { return &ed.lazyInit().ReservedNames } | ||||
| func (ed *Enum) ReservedRanges() protoreflect.EnumRanges { return &ed.lazyInit().ReservedRanges } | ||||
| func (ed *Enum) Format(s fmt.State, r rune)              { descfmt.FormatDesc(s, r, ed) } | ||||
| func (ed *Enum) ProtoType(protoreflect.EnumDescriptor)   {} | ||||
| func (ed *Enum) lazyInit() *EnumL2 { | ||||
| 	ed.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return ed.L2 | ||||
| } | ||||
| func (ed *Enum) IsClosed() bool { | ||||
| 	return !ed.L1.EditionFeatures.IsOpenEnum | ||||
| } | ||||
|  | ||||
| func (ed *EnumValue) Options() protoreflect.ProtoMessage { | ||||
| 	if f := ed.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.EnumValue | ||||
| } | ||||
| func (ed *EnumValue) Number() protoreflect.EnumNumber            { return ed.L1.Number } | ||||
| func (ed *EnumValue) Format(s fmt.State, r rune)                 { descfmt.FormatDesc(s, r, ed) } | ||||
| func (ed *EnumValue) ProtoType(protoreflect.EnumValueDescriptor) {} | ||||
|  | ||||
| type ( | ||||
| 	Message struct { | ||||
| 		Base | ||||
| 		L1 MessageL1 | ||||
| 		L2 *MessageL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	MessageL1 struct { | ||||
| 		Enums        Enums | ||||
| 		Messages     Messages | ||||
| 		Extensions   Extensions | ||||
| 		IsMapEntry   bool // promoted from google.protobuf.MessageOptions | ||||
| 		IsMessageSet bool // promoted from google.protobuf.MessageOptions | ||||
|  | ||||
| 		EditionFeatures EditionFeatures | ||||
| 	} | ||||
| 	MessageL2 struct { | ||||
| 		Options               func() protoreflect.ProtoMessage | ||||
| 		Fields                Fields | ||||
| 		Oneofs                Oneofs | ||||
| 		ReservedNames         Names | ||||
| 		ReservedRanges        FieldRanges | ||||
| 		RequiredNumbers       FieldNumbers // must be consistent with Fields.Cardinality | ||||
| 		ExtensionRanges       FieldRanges | ||||
| 		ExtensionRangeOptions []func() protoreflect.ProtoMessage // must be same length as ExtensionRanges | ||||
| 	} | ||||
|  | ||||
| 	Field struct { | ||||
| 		Base | ||||
| 		L1 FieldL1 | ||||
| 	} | ||||
| 	FieldL1 struct { | ||||
| 		Options          func() protoreflect.ProtoMessage | ||||
| 		Number           protoreflect.FieldNumber | ||||
| 		Cardinality      protoreflect.Cardinality // must be consistent with Message.RequiredNumbers | ||||
| 		Kind             protoreflect.Kind | ||||
| 		StringName       stringName | ||||
| 		IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto | ||||
| 		IsWeak           bool // promoted from google.protobuf.FieldOptions | ||||
| 		Default          defaultValue | ||||
| 		ContainingOneof  protoreflect.OneofDescriptor // must be consistent with Message.Oneofs.Fields | ||||
| 		Enum             protoreflect.EnumDescriptor | ||||
| 		Message          protoreflect.MessageDescriptor | ||||
|  | ||||
| 		EditionFeatures EditionFeatures | ||||
| 	} | ||||
|  | ||||
| 	Oneof struct { | ||||
| 		Base | ||||
| 		L1 OneofL1 | ||||
| 	} | ||||
| 	OneofL1 struct { | ||||
| 		Options func() protoreflect.ProtoMessage | ||||
| 		Fields  OneofFields // must be consistent with Message.Fields.ContainingOneof | ||||
|  | ||||
| 		EditionFeatures EditionFeatures | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (md *Message) Options() protoreflect.ProtoMessage { | ||||
| 	if f := md.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Message | ||||
| } | ||||
| func (md *Message) IsMapEntry() bool                           { return md.L1.IsMapEntry } | ||||
| func (md *Message) Fields() protoreflect.FieldDescriptors      { return &md.lazyInit().Fields } | ||||
| func (md *Message) Oneofs() protoreflect.OneofDescriptors      { return &md.lazyInit().Oneofs } | ||||
| func (md *Message) ReservedNames() protoreflect.Names          { return &md.lazyInit().ReservedNames } | ||||
| func (md *Message) ReservedRanges() protoreflect.FieldRanges   { return &md.lazyInit().ReservedRanges } | ||||
| func (md *Message) RequiredNumbers() protoreflect.FieldNumbers { return &md.lazyInit().RequiredNumbers } | ||||
| func (md *Message) ExtensionRanges() protoreflect.FieldRanges  { return &md.lazyInit().ExtensionRanges } | ||||
| func (md *Message) ExtensionRangeOptions(i int) protoreflect.ProtoMessage { | ||||
| 	if f := md.lazyInit().ExtensionRangeOptions[i]; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.ExtensionRange | ||||
| } | ||||
| func (md *Message) Enums() protoreflect.EnumDescriptors           { return &md.L1.Enums } | ||||
| func (md *Message) Messages() protoreflect.MessageDescriptors     { return &md.L1.Messages } | ||||
| func (md *Message) Extensions() protoreflect.ExtensionDescriptors { return &md.L1.Extensions } | ||||
| func (md *Message) ProtoType(protoreflect.MessageDescriptor)      {} | ||||
| func (md *Message) Format(s fmt.State, r rune)                    { descfmt.FormatDesc(s, r, md) } | ||||
| func (md *Message) lazyInit() *MessageL2 { | ||||
| 	md.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return md.L2 | ||||
| } | ||||
|  | ||||
| // IsMessageSet is a pseudo-internal API for checking whether a message | ||||
| // should serialize in the proto1 message format. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and may be | ||||
| // removed in the future without warning. | ||||
| func (md *Message) IsMessageSet() bool { | ||||
| 	return md.L1.IsMessageSet | ||||
| } | ||||
|  | ||||
| func (fd *Field) Options() protoreflect.ProtoMessage { | ||||
| 	if f := fd.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Field | ||||
| } | ||||
| func (fd *Field) Number() protoreflect.FieldNumber      { return fd.L1.Number } | ||||
| func (fd *Field) Cardinality() protoreflect.Cardinality { return fd.L1.Cardinality } | ||||
| func (fd *Field) Kind() protoreflect.Kind { | ||||
| 	return fd.L1.Kind | ||||
| } | ||||
| func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON } | ||||
| func (fd *Field) JSONName() string  { return fd.L1.StringName.getJSON(fd) } | ||||
| func (fd *Field) TextName() string  { return fd.L1.StringName.getText(fd) } | ||||
| func (fd *Field) HasPresence() bool { | ||||
| 	if fd.L1.Cardinality == protoreflect.Repeated { | ||||
| 		return false | ||||
| 	} | ||||
| 	return fd.IsExtension() || fd.L1.EditionFeatures.IsFieldPresence || fd.L1.Message != nil || fd.L1.ContainingOneof != nil | ||||
| } | ||||
| func (fd *Field) HasOptionalKeyword() bool { | ||||
| 	return (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional | ||||
| } | ||||
| func (fd *Field) IsPacked() bool { | ||||
| 	if fd.L1.Cardinality != protoreflect.Repeated { | ||||
| 		return false | ||||
| 	} | ||||
| 	switch fd.L1.Kind { | ||||
| 	case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 		return false | ||||
| 	} | ||||
| 	return fd.L1.EditionFeatures.IsPacked | ||||
| } | ||||
| func (fd *Field) IsExtension() bool { return false } | ||||
| func (fd *Field) IsWeak() bool      { return fd.L1.IsWeak } | ||||
| func (fd *Field) IsList() bool      { return fd.Cardinality() == protoreflect.Repeated && !fd.IsMap() } | ||||
| func (fd *Field) IsMap() bool       { return fd.Message() != nil && fd.Message().IsMapEntry() } | ||||
| func (fd *Field) MapKey() protoreflect.FieldDescriptor { | ||||
| 	if !fd.IsMap() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number) | ||||
| } | ||||
| func (fd *Field) MapValue() protoreflect.FieldDescriptor { | ||||
| 	if !fd.IsMap() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number) | ||||
| } | ||||
| func (fd *Field) HasDefault() bool                                   { return fd.L1.Default.has } | ||||
| func (fd *Field) Default() protoreflect.Value                        { return fd.L1.Default.get(fd) } | ||||
| func (fd *Field) DefaultEnumValue() protoreflect.EnumValueDescriptor { return fd.L1.Default.enum } | ||||
| func (fd *Field) ContainingOneof() protoreflect.OneofDescriptor      { return fd.L1.ContainingOneof } | ||||
| func (fd *Field) ContainingMessage() protoreflect.MessageDescriptor { | ||||
| 	return fd.L0.Parent.(protoreflect.MessageDescriptor) | ||||
| } | ||||
| func (fd *Field) Enum() protoreflect.EnumDescriptor { | ||||
| 	return fd.L1.Enum | ||||
| } | ||||
| func (fd *Field) Message() protoreflect.MessageDescriptor { | ||||
| 	if fd.L1.IsWeak { | ||||
| 		if d, _ := protoregistry.GlobalFiles.FindDescriptorByName(fd.L1.Message.FullName()); d != nil { | ||||
| 			return d.(protoreflect.MessageDescriptor) | ||||
| 		} | ||||
| 	} | ||||
| 	return fd.L1.Message | ||||
| } | ||||
| func (fd *Field) IsMapEntry() bool { | ||||
| 	parent, ok := fd.L0.Parent.(protoreflect.MessageDescriptor) | ||||
| 	return ok && parent.IsMapEntry() | ||||
| } | ||||
| func (fd *Field) Format(s fmt.State, r rune)             { descfmt.FormatDesc(s, r, fd) } | ||||
| func (fd *Field) ProtoType(protoreflect.FieldDescriptor) {} | ||||
|  | ||||
| // EnforceUTF8 is a pseudo-internal API to determine whether to enforce UTF-8 | ||||
| // validation for the string field. This exists for Google-internal use only | ||||
| // since proto3 did not enforce UTF-8 validity prior to the open-source release. | ||||
| // If this method does not exist, the default is to enforce valid UTF-8. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and may be | ||||
| // removed in the future without warning. | ||||
| func (fd *Field) EnforceUTF8() bool { | ||||
| 	return fd.L1.EditionFeatures.IsUTF8Validated | ||||
| } | ||||
|  | ||||
| func (od *Oneof) IsSynthetic() bool { | ||||
| 	return od.L0.ParentFile.L1.Syntax == protoreflect.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() | ||||
| } | ||||
| func (od *Oneof) Options() protoreflect.ProtoMessage { | ||||
| 	if f := od.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Oneof | ||||
| } | ||||
| func (od *Oneof) Fields() protoreflect.FieldDescriptors  { return &od.L1.Fields } | ||||
| func (od *Oneof) Format(s fmt.State, r rune)             { descfmt.FormatDesc(s, r, od) } | ||||
| func (od *Oneof) ProtoType(protoreflect.OneofDescriptor) {} | ||||
|  | ||||
| type ( | ||||
| 	Extension struct { | ||||
| 		Base | ||||
| 		L1 ExtensionL1 | ||||
| 		L2 *ExtensionL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	ExtensionL1 struct { | ||||
| 		Number          protoreflect.FieldNumber | ||||
| 		Extendee        protoreflect.MessageDescriptor | ||||
| 		Cardinality     protoreflect.Cardinality | ||||
| 		Kind            protoreflect.Kind | ||||
| 		EditionFeatures EditionFeatures | ||||
| 	} | ||||
| 	ExtensionL2 struct { | ||||
| 		Options          func() protoreflect.ProtoMessage | ||||
| 		StringName       stringName | ||||
| 		IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto | ||||
| 		Default          defaultValue | ||||
| 		Enum             protoreflect.EnumDescriptor | ||||
| 		Message          protoreflect.MessageDescriptor | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (xd *Extension) Options() protoreflect.ProtoMessage { | ||||
| 	if f := xd.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Field | ||||
| } | ||||
| func (xd *Extension) Number() protoreflect.FieldNumber      { return xd.L1.Number } | ||||
| func (xd *Extension) Cardinality() protoreflect.Cardinality { return xd.L1.Cardinality } | ||||
| func (xd *Extension) Kind() protoreflect.Kind               { return xd.L1.Kind } | ||||
| func (xd *Extension) HasJSONName() bool                     { return xd.lazyInit().StringName.hasJSON } | ||||
| func (xd *Extension) JSONName() string                      { return xd.lazyInit().StringName.getJSON(xd) } | ||||
| func (xd *Extension) TextName() string                      { return xd.lazyInit().StringName.getText(xd) } | ||||
| func (xd *Extension) HasPresence() bool                     { return xd.L1.Cardinality != protoreflect.Repeated } | ||||
| func (xd *Extension) HasOptionalKeyword() bool { | ||||
| 	return (xd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && xd.L1.Cardinality == protoreflect.Optional) || xd.lazyInit().IsProto3Optional | ||||
| } | ||||
| func (xd *Extension) IsPacked() bool { | ||||
| 	if xd.L1.Cardinality != protoreflect.Repeated { | ||||
| 		return false | ||||
| 	} | ||||
| 	switch xd.L1.Kind { | ||||
| 	case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 		return false | ||||
| 	} | ||||
| 	return xd.L1.EditionFeatures.IsPacked | ||||
| } | ||||
| func (xd *Extension) IsExtension() bool                      { return true } | ||||
| func (xd *Extension) IsWeak() bool                           { return false } | ||||
| func (xd *Extension) IsList() bool                           { return xd.Cardinality() == protoreflect.Repeated } | ||||
| func (xd *Extension) IsMap() bool                            { return false } | ||||
| func (xd *Extension) MapKey() protoreflect.FieldDescriptor   { return nil } | ||||
| func (xd *Extension) MapValue() protoreflect.FieldDescriptor { return nil } | ||||
| func (xd *Extension) HasDefault() bool                       { return xd.lazyInit().Default.has } | ||||
| func (xd *Extension) Default() protoreflect.Value            { return xd.lazyInit().Default.get(xd) } | ||||
| func (xd *Extension) DefaultEnumValue() protoreflect.EnumValueDescriptor { | ||||
| 	return xd.lazyInit().Default.enum | ||||
| } | ||||
| func (xd *Extension) ContainingOneof() protoreflect.OneofDescriptor     { return nil } | ||||
| func (xd *Extension) ContainingMessage() protoreflect.MessageDescriptor { return xd.L1.Extendee } | ||||
| func (xd *Extension) Enum() protoreflect.EnumDescriptor                 { return xd.lazyInit().Enum } | ||||
| func (xd *Extension) Message() protoreflect.MessageDescriptor           { return xd.lazyInit().Message } | ||||
| func (xd *Extension) Format(s fmt.State, r rune)                        { descfmt.FormatDesc(s, r, xd) } | ||||
| func (xd *Extension) ProtoType(protoreflect.FieldDescriptor)            {} | ||||
| func (xd *Extension) ProtoInternal(pragma.DoNotImplement)               {} | ||||
| func (xd *Extension) lazyInit() *ExtensionL2 { | ||||
| 	xd.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return xd.L2 | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	Service struct { | ||||
| 		Base | ||||
| 		L1 ServiceL1 | ||||
| 		L2 *ServiceL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	ServiceL1 struct{} | ||||
| 	ServiceL2 struct { | ||||
| 		Options func() protoreflect.ProtoMessage | ||||
| 		Methods Methods | ||||
| 	} | ||||
|  | ||||
| 	Method struct { | ||||
| 		Base | ||||
| 		L1 MethodL1 | ||||
| 	} | ||||
| 	MethodL1 struct { | ||||
| 		Options           func() protoreflect.ProtoMessage | ||||
| 		Input             protoreflect.MessageDescriptor | ||||
| 		Output            protoreflect.MessageDescriptor | ||||
| 		IsStreamingClient bool | ||||
| 		IsStreamingServer bool | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (sd *Service) Options() protoreflect.ProtoMessage { | ||||
| 	if f := sd.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Service | ||||
| } | ||||
| func (sd *Service) Methods() protoreflect.MethodDescriptors  { return &sd.lazyInit().Methods } | ||||
| func (sd *Service) Format(s fmt.State, r rune)               { descfmt.FormatDesc(s, r, sd) } | ||||
| func (sd *Service) ProtoType(protoreflect.ServiceDescriptor) {} | ||||
| func (sd *Service) ProtoInternal(pragma.DoNotImplement)      {} | ||||
| func (sd *Service) lazyInit() *ServiceL2 { | ||||
| 	sd.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return sd.L2 | ||||
| } | ||||
|  | ||||
| func (md *Method) Options() protoreflect.ProtoMessage { | ||||
| 	if f := md.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Method | ||||
| } | ||||
| func (md *Method) Input() protoreflect.MessageDescriptor   { return md.L1.Input } | ||||
| func (md *Method) Output() protoreflect.MessageDescriptor  { return md.L1.Output } | ||||
| func (md *Method) IsStreamingClient() bool                 { return md.L1.IsStreamingClient } | ||||
| func (md *Method) IsStreamingServer() bool                 { return md.L1.IsStreamingServer } | ||||
| func (md *Method) Format(s fmt.State, r rune)              { descfmt.FormatDesc(s, r, md) } | ||||
| func (md *Method) ProtoType(protoreflect.MethodDescriptor) {} | ||||
| func (md *Method) ProtoInternal(pragma.DoNotImplement)     {} | ||||
|  | ||||
| // Surrogate files are can be used to create standalone descriptors | ||||
| // where the syntax is only information derived from the parent file. | ||||
| var ( | ||||
| 	SurrogateProto2      = &File{L1: FileL1{Syntax: protoreflect.Proto2}, L2: &FileL2{}} | ||||
| 	SurrogateProto3      = &File{L1: FileL1{Syntax: protoreflect.Proto3}, L2: &FileL2{}} | ||||
| 	SurrogateEdition2023 = &File{L1: FileL1{Syntax: protoreflect.Editions, Edition: Edition2023}, L2: &FileL2{}} | ||||
| ) | ||||
|  | ||||
| type ( | ||||
| 	Base struct { | ||||
| 		L0 BaseL0 | ||||
| 	} | ||||
| 	BaseL0 struct { | ||||
| 		FullName   protoreflect.FullName // must be populated | ||||
| 		ParentFile *File                 // must be populated | ||||
| 		Parent     protoreflect.Descriptor | ||||
| 		Index      int | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (d *Base) Name() protoreflect.Name         { return d.L0.FullName.Name() } | ||||
| func (d *Base) FullName() protoreflect.FullName { return d.L0.FullName } | ||||
| func (d *Base) ParentFile() protoreflect.FileDescriptor { | ||||
| 	if d.L0.ParentFile == SurrogateProto2 || d.L0.ParentFile == SurrogateProto3 { | ||||
| 		return nil // surrogate files are not real parents | ||||
| 	} | ||||
| 	return d.L0.ParentFile | ||||
| } | ||||
| func (d *Base) Parent() protoreflect.Descriptor     { return d.L0.Parent } | ||||
| func (d *Base) Index() int                          { return d.L0.Index } | ||||
| func (d *Base) Syntax() protoreflect.Syntax         { return d.L0.ParentFile.Syntax() } | ||||
| func (d *Base) IsPlaceholder() bool                 { return false } | ||||
| func (d *Base) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| type stringName struct { | ||||
| 	hasJSON  bool | ||||
| 	once     sync.Once | ||||
| 	nameJSON string | ||||
| 	nameText string | ||||
| } | ||||
|  | ||||
| // InitJSON initializes the name. It is exported for use by other internal packages. | ||||
| func (s *stringName) InitJSON(name string) { | ||||
| 	s.hasJSON = true | ||||
| 	s.nameJSON = name | ||||
| } | ||||
|  | ||||
| // Returns true if this field is structured like the synthetic field of a proto2 | ||||
| // group. This allows us to expand our treatment of delimited fields without | ||||
| // breaking proto2 files that have been upgraded to editions. | ||||
| func isGroupLike(fd protoreflect.FieldDescriptor) bool { | ||||
| 	// Groups are always group types. | ||||
| 	if fd.Kind() != protoreflect.GroupKind { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	// Group fields are always the lowercase type name. | ||||
| 	if strings.ToLower(string(fd.Message().Name())) != string(fd.Name()) { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	// Groups could only be defined in the same file they're used. | ||||
| 	if fd.Message().ParentFile() != fd.ParentFile() { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	// Group messages are always defined in the same scope as the field.  File | ||||
| 	// level extensions will compare NULL == NULL here, which is why the file | ||||
| 	// comparison above is necessary to ensure both come from the same file. | ||||
| 	if fd.IsExtension() { | ||||
| 		return fd.Parent() == fd.Message().Parent() | ||||
| 	} | ||||
| 	return fd.ContainingMessage() == fd.Message().Parent() | ||||
| } | ||||
|  | ||||
| func (s *stringName) lazyInit(fd protoreflect.FieldDescriptor) *stringName { | ||||
| 	s.once.Do(func() { | ||||
| 		if fd.IsExtension() { | ||||
| 			// For extensions, JSON and text are formatted the same way. | ||||
| 			var name string | ||||
| 			if messageset.IsMessageSetExtension(fd) { | ||||
| 				name = string("[" + fd.FullName().Parent() + "]") | ||||
| 			} else { | ||||
| 				name = string("[" + fd.FullName() + "]") | ||||
| 			} | ||||
| 			s.nameJSON = name | ||||
| 			s.nameText = name | ||||
| 		} else { | ||||
| 			// Format the JSON name. | ||||
| 			if !s.hasJSON { | ||||
| 				s.nameJSON = strs.JSONCamelCase(string(fd.Name())) | ||||
| 			} | ||||
|  | ||||
| 			// Format the text name. | ||||
| 			s.nameText = string(fd.Name()) | ||||
| 			if isGroupLike(fd) { | ||||
| 				s.nameText = string(fd.Message().Name()) | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| func (s *stringName) getJSON(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } | ||||
| func (s *stringName) getText(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameText } | ||||
|  | ||||
| func DefaultValue(v protoreflect.Value, ev protoreflect.EnumValueDescriptor) defaultValue { | ||||
| 	dv := defaultValue{has: v.IsValid(), val: v, enum: ev} | ||||
| 	if b, ok := v.Interface().([]byte); ok { | ||||
| 		// Store a copy of the default bytes, so that we can detect | ||||
| 		// accidental mutations of the original value. | ||||
| 		dv.bytes = append([]byte(nil), b...) | ||||
| 	} | ||||
| 	return dv | ||||
| } | ||||
|  | ||||
| func unmarshalDefault(b []byte, k protoreflect.Kind, pf *File, ed protoreflect.EnumDescriptor) defaultValue { | ||||
| 	var evs protoreflect.EnumValueDescriptors | ||||
| 	if k == protoreflect.EnumKind { | ||||
| 		// If the enum is declared within the same file, be careful not to | ||||
| 		// blindly call the Values method, lest we bind ourselves in a deadlock. | ||||
| 		if e, ok := ed.(*Enum); ok && e.L0.ParentFile == pf { | ||||
| 			evs = &e.L2.Values | ||||
| 		} else { | ||||
| 			evs = ed.Values() | ||||
| 		} | ||||
|  | ||||
| 		// If we are unable to resolve the enum dependency, use a placeholder | ||||
| 		// enum value since we will not be able to parse the default value. | ||||
| 		if ed.IsPlaceholder() && protoreflect.Name(b).IsValid() { | ||||
| 			v := protoreflect.ValueOfEnum(0) | ||||
| 			ev := PlaceholderEnumValue(ed.FullName().Parent().Append(protoreflect.Name(b))) | ||||
| 			return DefaultValue(v, ev) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	v, ev, err := defval.Unmarshal(string(b), k, evs, defval.Descriptor) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return DefaultValue(v, ev) | ||||
| } | ||||
|  | ||||
| type defaultValue struct { | ||||
| 	has   bool | ||||
| 	val   protoreflect.Value | ||||
| 	enum  protoreflect.EnumValueDescriptor | ||||
| 	bytes []byte | ||||
| } | ||||
|  | ||||
| func (dv *defaultValue) get(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||
| 	// Return the zero value as the default if unpopulated. | ||||
| 	if !dv.has { | ||||
| 		if fd.Cardinality() == protoreflect.Repeated { | ||||
| 			return protoreflect.Value{} | ||||
| 		} | ||||
| 		switch fd.Kind() { | ||||
| 		case protoreflect.BoolKind: | ||||
| 			return protoreflect.ValueOfBool(false) | ||||
| 		case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: | ||||
| 			return protoreflect.ValueOfInt32(0) | ||||
| 		case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: | ||||
| 			return protoreflect.ValueOfInt64(0) | ||||
| 		case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: | ||||
| 			return protoreflect.ValueOfUint32(0) | ||||
| 		case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: | ||||
| 			return protoreflect.ValueOfUint64(0) | ||||
| 		case protoreflect.FloatKind: | ||||
| 			return protoreflect.ValueOfFloat32(0) | ||||
| 		case protoreflect.DoubleKind: | ||||
| 			return protoreflect.ValueOfFloat64(0) | ||||
| 		case protoreflect.StringKind: | ||||
| 			return protoreflect.ValueOfString("") | ||||
| 		case protoreflect.BytesKind: | ||||
| 			return protoreflect.ValueOfBytes(nil) | ||||
| 		case protoreflect.EnumKind: | ||||
| 			if evs := fd.Enum().Values(); evs.Len() > 0 { | ||||
| 				return protoreflect.ValueOfEnum(evs.Get(0).Number()) | ||||
| 			} | ||||
| 			return protoreflect.ValueOfEnum(0) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(dv.bytes) > 0 && !bytes.Equal(dv.bytes, dv.val.Bytes()) { | ||||
| 		// TODO: Avoid panic if we're running with the race detector | ||||
| 		// and instead spawn a goroutine that periodically resets | ||||
| 		// this value back to the original to induce a race. | ||||
| 		panic(fmt.Sprintf("detected mutation on the default bytes for %v", fd.FullName())) | ||||
| 	} | ||||
| 	return dv.val | ||||
| } | ||||
							
								
								
									
										558
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										558
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,558 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // fileRaw is a data struct used when initializing a file descriptor from | ||||
| // a raw FileDescriptorProto. | ||||
| type fileRaw struct { | ||||
| 	builder       Builder | ||||
| 	allEnums      []Enum | ||||
| 	allMessages   []Message | ||||
| 	allExtensions []Extension | ||||
| 	allServices   []Service | ||||
| } | ||||
|  | ||||
| func newRawFile(db Builder) *File { | ||||
| 	fd := &File{fileRaw: fileRaw{builder: db}} | ||||
| 	fd.initDecls(db.NumEnums, db.NumMessages, db.NumExtensions, db.NumServices) | ||||
| 	fd.unmarshalSeed(db.RawDescriptor) | ||||
|  | ||||
| 	// Extended message targets are eagerly resolved since registration | ||||
| 	// needs this information at program init time. | ||||
| 	for i := range fd.allExtensions { | ||||
| 		xd := &fd.allExtensions[i] | ||||
| 		xd.L1.Extendee = fd.resolveMessageDependency(xd.L1.Extendee, listExtTargets, int32(i)) | ||||
| 	} | ||||
|  | ||||
| 	fd.checkDecls() | ||||
| 	return fd | ||||
| } | ||||
|  | ||||
| // initDecls pre-allocates slices for the exact number of enums, messages | ||||
| // (including map entries), extensions, and services declared in the proto file. | ||||
| // This is done to avoid regrowing the slice, which would change the address | ||||
| // for any previously seen declaration. | ||||
| // | ||||
| // The alloc methods "allocates" slices by pulling from the capacity. | ||||
| func (fd *File) initDecls(numEnums, numMessages, numExtensions, numServices int32) { | ||||
| 	fd.allEnums = make([]Enum, 0, numEnums) | ||||
| 	fd.allMessages = make([]Message, 0, numMessages) | ||||
| 	fd.allExtensions = make([]Extension, 0, numExtensions) | ||||
| 	fd.allServices = make([]Service, 0, numServices) | ||||
| } | ||||
|  | ||||
| func (fd *File) allocEnums(n int) []Enum { | ||||
| 	total := len(fd.allEnums) | ||||
| 	es := fd.allEnums[total : total+n] | ||||
| 	fd.allEnums = fd.allEnums[:total+n] | ||||
| 	return es | ||||
| } | ||||
| func (fd *File) allocMessages(n int) []Message { | ||||
| 	total := len(fd.allMessages) | ||||
| 	ms := fd.allMessages[total : total+n] | ||||
| 	fd.allMessages = fd.allMessages[:total+n] | ||||
| 	return ms | ||||
| } | ||||
| func (fd *File) allocExtensions(n int) []Extension { | ||||
| 	total := len(fd.allExtensions) | ||||
| 	xs := fd.allExtensions[total : total+n] | ||||
| 	fd.allExtensions = fd.allExtensions[:total+n] | ||||
| 	return xs | ||||
| } | ||||
| func (fd *File) allocServices(n int) []Service { | ||||
| 	total := len(fd.allServices) | ||||
| 	xs := fd.allServices[total : total+n] | ||||
| 	fd.allServices = fd.allServices[:total+n] | ||||
| 	return xs | ||||
| } | ||||
|  | ||||
| // checkDecls performs a sanity check that the expected number of expected | ||||
| // declarations matches the number that were found in the descriptor proto. | ||||
| func (fd *File) checkDecls() { | ||||
| 	switch { | ||||
| 	case len(fd.allEnums) != cap(fd.allEnums): | ||||
| 	case len(fd.allMessages) != cap(fd.allMessages): | ||||
| 	case len(fd.allExtensions) != cap(fd.allExtensions): | ||||
| 	case len(fd.allServices) != cap(fd.allServices): | ||||
| 	default: | ||||
| 		return | ||||
| 	} | ||||
| 	panic("mismatching cardinality") | ||||
| } | ||||
|  | ||||
| func (fd *File) unmarshalSeed(b []byte) { | ||||
| 	sb := getBuilder() | ||||
| 	defer putBuilder(sb) | ||||
|  | ||||
| 	var prevField protoreflect.FieldNumber | ||||
| 	var numEnums, numMessages, numExtensions, numServices int | ||||
| 	var posEnums, posMessages, posExtensions, posServices int | ||||
| 	var options []byte | ||||
| 	b0 := b | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileDescriptorProto_Syntax_field_number: | ||||
| 				switch string(v) { | ||||
| 				case "proto2": | ||||
| 					fd.L1.Syntax = protoreflect.Proto2 | ||||
| 					fd.L1.Edition = EditionProto2 | ||||
| 				case "proto3": | ||||
| 					fd.L1.Syntax = protoreflect.Proto3 | ||||
| 					fd.L1.Edition = EditionProto3 | ||||
| 				case "editions": | ||||
| 					fd.L1.Syntax = protoreflect.Editions | ||||
| 				default: | ||||
| 					panic("invalid syntax") | ||||
| 				} | ||||
| 			case genid.FileDescriptorProto_Name_field_number: | ||||
| 				fd.L1.Path = sb.MakeString(v) | ||||
| 			case genid.FileDescriptorProto_Package_field_number: | ||||
| 				fd.L1.Package = protoreflect.FullName(sb.MakeString(v)) | ||||
| 			case genid.FileDescriptorProto_Options_field_number: | ||||
| 				options = v | ||||
| 			case genid.FileDescriptorProto_EnumType_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_EnumType_field_number { | ||||
| 					if numEnums > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posEnums = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numEnums++ | ||||
| 			case genid.FileDescriptorProto_MessageType_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_MessageType_field_number { | ||||
| 					if numMessages > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posMessages = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numMessages++ | ||||
| 			case genid.FileDescriptorProto_Extension_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_Extension_field_number { | ||||
| 					if numExtensions > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posExtensions = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numExtensions++ | ||||
| 			case genid.FileDescriptorProto_Service_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_Service_field_number { | ||||
| 					if numServices > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posServices = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numServices++ | ||||
| 			} | ||||
| 			prevField = num | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileDescriptorProto_Edition_field_number: | ||||
| 				fd.L1.Edition = Edition(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 			prevField = -1 // ignore known field numbers of unknown wire type | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// If syntax is missing, it is assumed to be proto2. | ||||
| 	if fd.L1.Syntax == 0 { | ||||
| 		fd.L1.Syntax = protoreflect.Proto2 | ||||
| 		fd.L1.Edition = EditionProto2 | ||||
| 	} | ||||
|  | ||||
| 	fd.L1.EditionFeatures = getFeaturesFor(fd.L1.Edition) | ||||
|  | ||||
| 	// Parse editions features from options if any | ||||
| 	if options != nil { | ||||
| 		fd.unmarshalSeedOptions(options) | ||||
| 	} | ||||
|  | ||||
| 	// Must allocate all declarations before parsing each descriptor type | ||||
| 	// to ensure we handled all descriptors in "flattened ordering". | ||||
| 	if numEnums > 0 { | ||||
| 		fd.L1.Enums.List = fd.allocEnums(numEnums) | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		fd.L1.Messages.List = fd.allocMessages(numMessages) | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		fd.L1.Extensions.List = fd.allocExtensions(numExtensions) | ||||
| 	} | ||||
| 	if numServices > 0 { | ||||
| 		fd.L1.Services.List = fd.allocServices(numServices) | ||||
| 	} | ||||
|  | ||||
| 	if numEnums > 0 { | ||||
| 		b := b0[posEnums:] | ||||
| 		for i := range fd.L1.Enums.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Enums.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		b := b0[posMessages:] | ||||
| 		for i := range fd.L1.Messages.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Messages.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		b := b0[posExtensions:] | ||||
| 		for i := range fd.L1.Extensions.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Extensions.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numServices > 0 { | ||||
| 		b := b0[posServices:] | ||||
| 		for i := range fd.L1.Services.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Services.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (fd *File) unmarshalSeedOptions(b []byte) { | ||||
| 	for b := b; len(b) > 0; { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileOptions_Features_field_number: | ||||
| 				if fd.Syntax() != protoreflect.Editions { | ||||
| 					panic(fmt.Sprintf("invalid descriptor: using edition features in a proto with syntax %s", fd.Syntax())) | ||||
| 				} | ||||
| 				fd.L1.EditionFeatures = unmarshalFeatureSet(v, fd.L1.EditionFeatures) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	ed.L0.ParentFile = pf | ||||
| 	ed.L0.Parent = pd | ||||
| 	ed.L0.Index = i | ||||
| 	ed.L1.EditionFeatures = featuresFromParentDesc(ed.Parent()) | ||||
|  | ||||
| 	var numValues int | ||||
| 	for b := b; len(b) > 0; { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_Name_field_number: | ||||
| 				ed.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.EnumDescriptorProto_Value_field_number: | ||||
| 				numValues++ | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Only construct enum value descriptors for top-level enums since | ||||
| 	// they are needed for registration. | ||||
| 	if pd != pf { | ||||
| 		return | ||||
| 	} | ||||
| 	ed.L1.eagerValues = true | ||||
| 	ed.L2 = new(EnumL2) | ||||
| 	ed.L2.Values.List = make([]EnumValue, numValues) | ||||
| 	for i := 0; len(b) > 0; { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_Value_field_number: | ||||
| 				ed.L2.Values.List[i].unmarshalFull(v, sb, pf, ed, i) | ||||
| 				i++ | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	md.L0.ParentFile = pf | ||||
| 	md.L0.Parent = pd | ||||
| 	md.L0.Index = i | ||||
| 	md.L1.EditionFeatures = featuresFromParentDesc(md.Parent()) | ||||
|  | ||||
| 	var prevField protoreflect.FieldNumber | ||||
| 	var numEnums, numMessages, numExtensions int | ||||
| 	var posEnums, posMessages, posExtensions int | ||||
| 	b0 := b | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_Name_field_number: | ||||
| 				md.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.DescriptorProto_EnumType_field_number: | ||||
| 				if prevField != genid.DescriptorProto_EnumType_field_number { | ||||
| 					if numEnums > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posEnums = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numEnums++ | ||||
| 			case genid.DescriptorProto_NestedType_field_number: | ||||
| 				if prevField != genid.DescriptorProto_NestedType_field_number { | ||||
| 					if numMessages > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posMessages = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numMessages++ | ||||
| 			case genid.DescriptorProto_Extension_field_number: | ||||
| 				if prevField != genid.DescriptorProto_Extension_field_number { | ||||
| 					if numExtensions > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posExtensions = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numExtensions++ | ||||
| 			case genid.DescriptorProto_Options_field_number: | ||||
| 				md.unmarshalSeedOptions(v) | ||||
| 			} | ||||
| 			prevField = num | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 			prevField = -1 // ignore known field numbers of unknown wire type | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Must allocate all declarations before parsing each descriptor type | ||||
| 	// to ensure we handled all descriptors in "flattened ordering". | ||||
| 	if numEnums > 0 { | ||||
| 		md.L1.Enums.List = pf.allocEnums(numEnums) | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		md.L1.Messages.List = pf.allocMessages(numMessages) | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		md.L1.Extensions.List = pf.allocExtensions(numExtensions) | ||||
| 	} | ||||
|  | ||||
| 	if numEnums > 0 { | ||||
| 		b := b0[posEnums:] | ||||
| 		for i := range md.L1.Enums.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			md.L1.Enums.List[i].unmarshalSeed(v, sb, pf, md, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		b := b0[posMessages:] | ||||
| 		for i := range md.L1.Messages.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			md.L1.Messages.List[i].unmarshalSeed(v, sb, pf, md, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		b := b0[posExtensions:] | ||||
| 		for i := range md.L1.Extensions.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			md.L1.Extensions.List[i].unmarshalSeed(v, sb, pf, md, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalSeedOptions(b []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MessageOptions_MapEntry_field_number: | ||||
| 				md.L1.IsMapEntry = protowire.DecodeBool(v) | ||||
| 			case genid.MessageOptions_MessageSetWireFormat_field_number: | ||||
| 				md.L1.IsMessageSet = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MessageOptions_Features_field_number: | ||||
| 				md.L1.EditionFeatures = unmarshalFeatureSet(v, md.L1.EditionFeatures) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	xd.L0.ParentFile = pf | ||||
| 	xd.L0.Parent = pd | ||||
| 	xd.L0.Index = i | ||||
| 	xd.L1.EditionFeatures = featuresFromParentDesc(pd) | ||||
|  | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Number_field_number: | ||||
| 				xd.L1.Number = protoreflect.FieldNumber(v) | ||||
| 			case genid.FieldDescriptorProto_Label_field_number: | ||||
| 				xd.L1.Cardinality = protoreflect.Cardinality(v) | ||||
| 			case genid.FieldDescriptorProto_Type_field_number: | ||||
| 				xd.L1.Kind = protoreflect.Kind(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Name_field_number: | ||||
| 				xd.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.FieldDescriptorProto_Extendee_field_number: | ||||
| 				xd.L1.Extendee = PlaceholderMessage(makeFullName(sb, v)) | ||||
| 			case genid.FieldDescriptorProto_Options_field_number: | ||||
| 				xd.unmarshalOptions(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if xd.L1.Kind == protoreflect.MessageKind && xd.L1.EditionFeatures.IsDelimitedEncoded { | ||||
| 		xd.L1.Kind = protoreflect.GroupKind | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (xd *Extension) unmarshalOptions(b []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldOptions_Packed_field_number: | ||||
| 				xd.L1.EditionFeatures.IsPacked = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldOptions_Features_field_number: | ||||
| 				xd.L1.EditionFeatures = unmarshalFeatureSet(v, xd.L1.EditionFeatures) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	sd.L0.ParentFile = pf | ||||
| 	sd.L0.Parent = pd | ||||
| 	sd.L0.Index = i | ||||
|  | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.ServiceDescriptorProto_Name_field_number: | ||||
| 				sd.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var nameBuilderPool = sync.Pool{ | ||||
| 	New: func() any { return new(strs.Builder) }, | ||||
| } | ||||
|  | ||||
| func getBuilder() *strs.Builder { | ||||
| 	return nameBuilderPool.Get().(*strs.Builder) | ||||
| } | ||||
| func putBuilder(b *strs.Builder) { | ||||
| 	nameBuilderPool.Put(b) | ||||
| } | ||||
|  | ||||
| // makeFullName converts b to a protoreflect.FullName, | ||||
| // where b must start with a leading dot. | ||||
| func makeFullName(sb *strs.Builder, b []byte) protoreflect.FullName { | ||||
| 	if len(b) == 0 || b[0] != '.' { | ||||
| 		panic("name reference must be fully qualified") | ||||
| 	} | ||||
| 	return protoreflect.FullName(sb.MakeString(b[1:])) | ||||
| } | ||||
|  | ||||
| func appendFullName(sb *strs.Builder, prefix protoreflect.FullName, suffix []byte) protoreflect.FullName { | ||||
| 	return sb.AppendFullName(prefix, protoreflect.Name(strs.UnsafeString(suffix))) | ||||
| } | ||||
							
								
								
									
										701
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										701
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,701 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| func (fd *File) lazyRawInit() { | ||||
| 	fd.unmarshalFull(fd.builder.RawDescriptor) | ||||
| 	fd.resolveMessages() | ||||
| 	fd.resolveExtensions() | ||||
| 	fd.resolveServices() | ||||
| } | ||||
|  | ||||
| func (file *File) resolveMessages() { | ||||
| 	var depIdx int32 | ||||
| 	for i := range file.allMessages { | ||||
| 		md := &file.allMessages[i] | ||||
|  | ||||
| 		// Resolve message field dependencies. | ||||
| 		for j := range md.L2.Fields.List { | ||||
| 			fd := &md.L2.Fields.List[j] | ||||
|  | ||||
| 			// Weak fields are resolved upon actual use. | ||||
| 			if fd.L1.IsWeak { | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			// Resolve message field dependency. | ||||
| 			switch fd.L1.Kind { | ||||
| 			case protoreflect.EnumKind: | ||||
| 				fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx) | ||||
| 				depIdx++ | ||||
| 			case protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 				fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx) | ||||
| 				depIdx++ | ||||
| 				if fd.L1.Kind == protoreflect.GroupKind && (fd.IsMap() || fd.IsMapEntry()) { | ||||
| 					// A map field might inherit delimited encoding from a file-wide default feature. | ||||
| 					// But maps never actually use delimited encoding. (At least for now...) | ||||
| 					fd.L1.Kind = protoreflect.MessageKind | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// Default is resolved here since it depends on Enum being resolved. | ||||
| 			if v := fd.L1.Default.val; v.IsValid() { | ||||
| 				fd.L1.Default = unmarshalDefault(v.Bytes(), fd.L1.Kind, file, fd.L1.Enum) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (file *File) resolveExtensions() { | ||||
| 	var depIdx int32 | ||||
| 	for i := range file.allExtensions { | ||||
| 		xd := &file.allExtensions[i] | ||||
|  | ||||
| 		// Resolve extension field dependency. | ||||
| 		switch xd.L1.Kind { | ||||
| 		case protoreflect.EnumKind: | ||||
| 			xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx) | ||||
| 			depIdx++ | ||||
| 		case protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 			xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx) | ||||
| 			depIdx++ | ||||
| 		} | ||||
|  | ||||
| 		// Default is resolved here since it depends on Enum being resolved. | ||||
| 		if v := xd.L2.Default.val; v.IsValid() { | ||||
| 			xd.L2.Default = unmarshalDefault(v.Bytes(), xd.L1.Kind, file, xd.L2.Enum) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (file *File) resolveServices() { | ||||
| 	var depIdx int32 | ||||
| 	for i := range file.allServices { | ||||
| 		sd := &file.allServices[i] | ||||
|  | ||||
| 		// Resolve method dependencies. | ||||
| 		for j := range sd.L2.Methods.List { | ||||
| 			md := &sd.L2.Methods.List[j] | ||||
| 			md.L1.Input = file.resolveMessageDependency(md.L1.Input, listMethInDeps, depIdx) | ||||
| 			md.L1.Output = file.resolveMessageDependency(md.L1.Output, listMethOutDeps, depIdx) | ||||
| 			depIdx++ | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (file *File) resolveEnumDependency(ed protoreflect.EnumDescriptor, i, j int32) protoreflect.EnumDescriptor { | ||||
| 	r := file.builder.FileRegistry | ||||
| 	if r, ok := r.(resolverByIndex); ok { | ||||
| 		if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil { | ||||
| 			return ed2 | ||||
| 		} | ||||
| 	} | ||||
| 	for i := range file.allEnums { | ||||
| 		if ed2 := &file.allEnums[i]; ed2.L0.FullName == ed.FullName() { | ||||
| 			return ed2 | ||||
| 		} | ||||
| 	} | ||||
| 	if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil { | ||||
| 		return d.(protoreflect.EnumDescriptor) | ||||
| 	} | ||||
| 	return ed | ||||
| } | ||||
|  | ||||
| func (file *File) resolveMessageDependency(md protoreflect.MessageDescriptor, i, j int32) protoreflect.MessageDescriptor { | ||||
| 	r := file.builder.FileRegistry | ||||
| 	if r, ok := r.(resolverByIndex); ok { | ||||
| 		if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil { | ||||
| 			return md2 | ||||
| 		} | ||||
| 	} | ||||
| 	for i := range file.allMessages { | ||||
| 		if md2 := &file.allMessages[i]; md2.L0.FullName == md.FullName() { | ||||
| 			return md2 | ||||
| 		} | ||||
| 	} | ||||
| 	if d, _ := r.FindDescriptorByName(md.FullName()); d != nil { | ||||
| 		return d.(protoreflect.MessageDescriptor) | ||||
| 	} | ||||
| 	return md | ||||
| } | ||||
|  | ||||
| func (fd *File) unmarshalFull(b []byte) { | ||||
| 	sb := getBuilder() | ||||
| 	defer putBuilder(sb) | ||||
|  | ||||
| 	var enumIdx, messageIdx, extensionIdx, serviceIdx int | ||||
| 	var rawOptions []byte | ||||
| 	fd.L2 = new(FileL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileDescriptorProto_PublicDependency_field_number: | ||||
| 				fd.L2.Imports[v].IsPublic = true | ||||
| 			case genid.FileDescriptorProto_WeakDependency_field_number: | ||||
| 				fd.L2.Imports[v].IsWeak = true | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileDescriptorProto_Dependency_field_number: | ||||
| 				path := sb.MakeString(v) | ||||
| 				imp, _ := fd.builder.FileRegistry.FindFileByPath(path) | ||||
| 				if imp == nil { | ||||
| 					imp = PlaceholderFile(path) | ||||
| 				} | ||||
| 				fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp}) | ||||
| 			case genid.FileDescriptorProto_EnumType_field_number: | ||||
| 				fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) | ||||
| 				enumIdx++ | ||||
| 			case genid.FileDescriptorProto_MessageType_field_number: | ||||
| 				fd.L1.Messages.List[messageIdx].unmarshalFull(v, sb) | ||||
| 				messageIdx++ | ||||
| 			case genid.FileDescriptorProto_Extension_field_number: | ||||
| 				fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb) | ||||
| 				extensionIdx++ | ||||
| 			case genid.FileDescriptorProto_Service_field_number: | ||||
| 				fd.L1.Services.List[serviceIdx].unmarshalFull(v, sb) | ||||
| 				serviceIdx++ | ||||
| 			case genid.FileDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	fd.L2.Options = fd.builder.optionsUnmarshaler(&descopts.File, rawOptions) | ||||
| } | ||||
|  | ||||
| func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawValues [][]byte | ||||
| 	var rawOptions []byte | ||||
| 	if !ed.L1.eagerValues { | ||||
| 		ed.L2 = new(EnumL2) | ||||
| 	} | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_Value_field_number: | ||||
| 				rawValues = append(rawValues, v) | ||||
| 			case genid.EnumDescriptorProto_ReservedName_field_number: | ||||
| 				ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) | ||||
| 			case genid.EnumDescriptorProto_ReservedRange_field_number: | ||||
| 				ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v)) | ||||
| 			case genid.EnumDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if !ed.L1.eagerValues && len(rawValues) > 0 { | ||||
| 		ed.L2.Values.List = make([]EnumValue, len(rawValues)) | ||||
| 		for i, b := range rawValues { | ||||
| 			ed.L2.Values.List[i].unmarshalFull(b, sb, ed.L0.ParentFile, ed, i) | ||||
| 		} | ||||
| 	} | ||||
| 	ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions) | ||||
| } | ||||
|  | ||||
| func unmarshalEnumReservedRange(b []byte) (r [2]protoreflect.EnumNumber) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number: | ||||
| 				r[0] = protoreflect.EnumNumber(v) | ||||
| 			case genid.EnumDescriptorProto_EnumReservedRange_End_field_number: | ||||
| 				r[1] = protoreflect.EnumNumber(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	return r | ||||
| } | ||||
|  | ||||
| func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	vd.L0.ParentFile = pf | ||||
| 	vd.L0.Parent = pd | ||||
| 	vd.L0.Index = i | ||||
|  | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumValueDescriptorProto_Number_field_number: | ||||
| 				vd.L1.Number = protoreflect.EnumNumber(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumValueDescriptorProto_Name_field_number: | ||||
| 				// NOTE: Enum values are in the same scope as the enum parent. | ||||
| 				vd.L0.FullName = appendFullName(sb, pd.Parent().FullName(), v) | ||||
| 			case genid.EnumValueDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	vd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.EnumValue, rawOptions) | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawFields, rawOneofs [][]byte | ||||
| 	var enumIdx, messageIdx, extensionIdx int | ||||
| 	var rawOptions []byte | ||||
| 	md.L2 = new(MessageL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_Field_field_number: | ||||
| 				rawFields = append(rawFields, v) | ||||
| 			case genid.DescriptorProto_OneofDecl_field_number: | ||||
| 				rawOneofs = append(rawOneofs, v) | ||||
| 			case genid.DescriptorProto_ReservedName_field_number: | ||||
| 				md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) | ||||
| 			case genid.DescriptorProto_ReservedRange_field_number: | ||||
| 				md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v)) | ||||
| 			case genid.DescriptorProto_ExtensionRange_field_number: | ||||
| 				r, rawOptions := unmarshalMessageExtensionRange(v) | ||||
| 				opts := md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, rawOptions) | ||||
| 				md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r) | ||||
| 				md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts) | ||||
| 			case genid.DescriptorProto_EnumType_field_number: | ||||
| 				md.L1.Enums.List[enumIdx].unmarshalFull(v, sb) | ||||
| 				enumIdx++ | ||||
| 			case genid.DescriptorProto_NestedType_field_number: | ||||
| 				md.L1.Messages.List[messageIdx].unmarshalFull(v, sb) | ||||
| 				messageIdx++ | ||||
| 			case genid.DescriptorProto_Extension_field_number: | ||||
| 				md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb) | ||||
| 				extensionIdx++ | ||||
| 			case genid.DescriptorProto_Options_field_number: | ||||
| 				md.unmarshalOptions(v) | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if len(rawFields) > 0 || len(rawOneofs) > 0 { | ||||
| 		md.L2.Fields.List = make([]Field, len(rawFields)) | ||||
| 		md.L2.Oneofs.List = make([]Oneof, len(rawOneofs)) | ||||
| 		for i, b := range rawFields { | ||||
| 			fd := &md.L2.Fields.List[i] | ||||
| 			fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i) | ||||
| 			if fd.L1.Cardinality == protoreflect.Required { | ||||
| 				md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number) | ||||
| 			} | ||||
| 		} | ||||
| 		for i, b := range rawOneofs { | ||||
| 			od := &md.L2.Oneofs.List[i] | ||||
| 			od.unmarshalFull(b, sb, md.L0.ParentFile, md, i) | ||||
| 		} | ||||
| 	} | ||||
| 	md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions) | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalOptions(b []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MessageOptions_MapEntry_field_number: | ||||
| 				md.L1.IsMapEntry = protowire.DecodeBool(v) | ||||
| 			case genid.MessageOptions_MessageSetWireFormat_field_number: | ||||
| 				md.L1.IsMessageSet = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_ReservedRange_Start_field_number: | ||||
| 				r[0] = protoreflect.FieldNumber(v) | ||||
| 			case genid.DescriptorProto_ReservedRange_End_field_number: | ||||
| 				r[1] = protoreflect.FieldNumber(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	return r | ||||
| } | ||||
|  | ||||
| func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_ExtensionRange_Start_field_number: | ||||
| 				r[0] = protoreflect.FieldNumber(v) | ||||
| 			case genid.DescriptorProto_ExtensionRange_End_field_number: | ||||
| 				r[1] = protoreflect.FieldNumber(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_ExtensionRange_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	return r, rawOptions | ||||
| } | ||||
|  | ||||
| func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	fd.L0.ParentFile = pf | ||||
| 	fd.L0.Parent = pd | ||||
| 	fd.L0.Index = i | ||||
| 	fd.L1.EditionFeatures = featuresFromParentDesc(fd.Parent()) | ||||
|  | ||||
| 	var rawTypeName []byte | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Number_field_number: | ||||
| 				fd.L1.Number = protoreflect.FieldNumber(v) | ||||
| 			case genid.FieldDescriptorProto_Label_field_number: | ||||
| 				fd.L1.Cardinality = protoreflect.Cardinality(v) | ||||
| 			case genid.FieldDescriptorProto_Type_field_number: | ||||
| 				fd.L1.Kind = protoreflect.Kind(v) | ||||
| 			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. | ||||
| 				od := &pd.(*Message).L2.Oneofs.List[v] | ||||
| 				od.L1.Fields.List = append(od.L1.Fields.List, fd) | ||||
| 				if fd.L1.ContainingOneof != nil { | ||||
| 					panic("oneof type already set") | ||||
| 				} | ||||
| 				fd.L1.ContainingOneof = od | ||||
| 			case genid.FieldDescriptorProto_Proto3Optional_field_number: | ||||
| 				fd.L1.IsProto3Optional = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Name_field_number: | ||||
| 				fd.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.FieldDescriptorProto_JsonName_field_number: | ||||
| 				fd.L1.StringName.InitJSON(sb.MakeString(v)) | ||||
| 			case genid.FieldDescriptorProto_DefaultValue_field_number: | ||||
| 				fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages | ||||
| 			case genid.FieldDescriptorProto_TypeName_field_number: | ||||
| 				rawTypeName = v | ||||
| 			case genid.FieldDescriptorProto_Options_field_number: | ||||
| 				fd.unmarshalOptions(v) | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if fd.L1.Kind == protoreflect.MessageKind && fd.L1.EditionFeatures.IsDelimitedEncoded { | ||||
| 		fd.L1.Kind = protoreflect.GroupKind | ||||
| 	} | ||||
| 	if fd.L1.EditionFeatures.IsLegacyRequired { | ||||
| 		fd.L1.Cardinality = protoreflect.Required | ||||
| 	} | ||||
| 	if rawTypeName != nil { | ||||
| 		name := makeFullName(sb, rawTypeName) | ||||
| 		switch fd.L1.Kind { | ||||
| 		case protoreflect.EnumKind: | ||||
| 			fd.L1.Enum = PlaceholderEnum(name) | ||||
| 		case protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 			fd.L1.Message = PlaceholderMessage(name) | ||||
| 		} | ||||
| 	} | ||||
| 	fd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Field, rawOptions) | ||||
| } | ||||
|  | ||||
| func (fd *Field) unmarshalOptions(b []byte) { | ||||
| 	const FieldOptions_EnforceUTF8 = 13 | ||||
|  | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldOptions_Packed_field_number: | ||||
| 				fd.L1.EditionFeatures.IsPacked = protowire.DecodeBool(v) | ||||
| 			case genid.FieldOptions_Weak_field_number: | ||||
| 				fd.L1.IsWeak = protowire.DecodeBool(v) | ||||
| 			case FieldOptions_EnforceUTF8: | ||||
| 				fd.L1.EditionFeatures.IsUTF8Validated = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldOptions_Features_field_number: | ||||
| 				fd.L1.EditionFeatures = unmarshalFeatureSet(v, fd.L1.EditionFeatures) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	od.L0.ParentFile = pf | ||||
| 	od.L0.Parent = pd | ||||
| 	od.L0.Index = i | ||||
|  | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.OneofDescriptorProto_Name_field_number: | ||||
| 				od.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.OneofDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	od.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Oneof, rawOptions) | ||||
| } | ||||
|  | ||||
| func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawTypeName []byte | ||||
| 	var rawOptions []byte | ||||
| 	xd.L2 = new(ExtensionL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Proto3Optional_field_number: | ||||
| 				xd.L2.IsProto3Optional = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_JsonName_field_number: | ||||
| 				xd.L2.StringName.InitJSON(sb.MakeString(v)) | ||||
| 			case genid.FieldDescriptorProto_DefaultValue_field_number: | ||||
| 				xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions | ||||
| 			case genid.FieldDescriptorProto_TypeName_field_number: | ||||
| 				rawTypeName = v | ||||
| 			case genid.FieldDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if rawTypeName != nil { | ||||
| 		name := makeFullName(sb, rawTypeName) | ||||
| 		switch xd.L1.Kind { | ||||
| 		case protoreflect.EnumKind: | ||||
| 			xd.L2.Enum = PlaceholderEnum(name) | ||||
| 		case protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 			xd.L2.Message = PlaceholderMessage(name) | ||||
| 		} | ||||
| 	} | ||||
| 	xd.L2.Options = xd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Field, rawOptions) | ||||
| } | ||||
|  | ||||
| func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawMethods [][]byte | ||||
| 	var rawOptions []byte | ||||
| 	sd.L2 = new(ServiceL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.ServiceDescriptorProto_Method_field_number: | ||||
| 				rawMethods = append(rawMethods, v) | ||||
| 			case genid.ServiceDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if len(rawMethods) > 0 { | ||||
| 		sd.L2.Methods.List = make([]Method, len(rawMethods)) | ||||
| 		for i, b := range rawMethods { | ||||
| 			sd.L2.Methods.List[i].unmarshalFull(b, sb, sd.L0.ParentFile, sd, i) | ||||
| 		} | ||||
| 	} | ||||
| 	sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions) | ||||
| } | ||||
|  | ||||
| func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { | ||||
| 	md.L0.ParentFile = pf | ||||
| 	md.L0.Parent = pd | ||||
| 	md.L0.Index = i | ||||
|  | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MethodDescriptorProto_ClientStreaming_field_number: | ||||
| 				md.L1.IsStreamingClient = protowire.DecodeBool(v) | ||||
| 			case genid.MethodDescriptorProto_ServerStreaming_field_number: | ||||
| 				md.L1.IsStreamingServer = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MethodDescriptorProto_Name_field_number: | ||||
| 				md.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.MethodDescriptorProto_InputType_field_number: | ||||
| 				md.L1.Input = PlaceholderMessage(makeFullName(sb, v)) | ||||
| 			case genid.MethodDescriptorProto_OutputType_field_number: | ||||
| 				md.L1.Output = PlaceholderMessage(makeFullName(sb, v)) | ||||
| 			case genid.MethodDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	md.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Method, rawOptions) | ||||
| } | ||||
|  | ||||
| // appendOptions appends src to dst, where the returned slice is never nil. | ||||
| // This is necessary to distinguish between empty and unpopulated options. | ||||
| func appendOptions(dst, src []byte) []byte { | ||||
| 	if dst == nil { | ||||
| 		dst = []byte{} | ||||
| 	} | ||||
| 	return append(dst, src...) | ||||
| } | ||||
|  | ||||
| // 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 (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage { | ||||
| 	if b == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	var opts protoreflect.ProtoMessage | ||||
| 	var once sync.Once | ||||
| 	return func() protoreflect.ProtoMessage { | ||||
| 		once.Do(func() { | ||||
| 			if *p == nil { | ||||
| 				panic("Descriptor.Options called without importing the descriptor package") | ||||
| 			} | ||||
| 			opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage) | ||||
| 			if err := (proto.UnmarshalOptions{ | ||||
| 				AllowPartial: true, | ||||
| 				Resolver:     db.TypeResolver, | ||||
| 			}).Unmarshal(b, opts); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		}) | ||||
| 		return opts | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										457
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										457
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,457 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"sort" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/descfmt" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type FileImports []protoreflect.FileImport | ||||
|  | ||||
| func (p *FileImports) Len() int                            { return len(*p) } | ||||
| func (p *FileImports) Get(i int) protoreflect.FileImport   { return (*p)[i] } | ||||
| func (p *FileImports) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *FileImports) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| type Names struct { | ||||
| 	List []protoreflect.Name | ||||
| 	once sync.Once | ||||
| 	has  map[protoreflect.Name]int // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Names) Len() int                            { return len(p.List) } | ||||
| func (p *Names) Get(i int) protoreflect.Name         { return p.List[i] } | ||||
| func (p *Names) Has(s protoreflect.Name) bool        { return p.lazyInit().has[s] > 0 } | ||||
| func (p *Names) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *Names) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Names) lazyInit() *Names { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.has = make(map[protoreflect.Name]int, len(p.List)) | ||||
| 			for _, s := range p.List { | ||||
| 				p.has[s] = p.has[s] + 1 | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // CheckValid reports any errors with the set of names with an error message | ||||
| // that completes the sentence: "ranges is invalid because it has ..." | ||||
| func (p *Names) CheckValid() error { | ||||
| 	for s, n := range p.lazyInit().has { | ||||
| 		switch { | ||||
| 		case n > 1: | ||||
| 			return errors.New("duplicate name: %q", s) | ||||
| 		case false && !s.IsValid(): | ||||
| 			// NOTE: The C++ implementation does not validate the identifier. | ||||
| 			// See https://github.com/protocolbuffers/protobuf/issues/6335. | ||||
| 			return errors.New("invalid name: %q", s) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type EnumRanges struct { | ||||
| 	List   [][2]protoreflect.EnumNumber // start inclusive; end inclusive | ||||
| 	once   sync.Once | ||||
| 	sorted [][2]protoreflect.EnumNumber // protected by once | ||||
| } | ||||
|  | ||||
| func (p *EnumRanges) Len() int                             { return len(p.List) } | ||||
| func (p *EnumRanges) Get(i int) [2]protoreflect.EnumNumber { return p.List[i] } | ||||
| func (p *EnumRanges) Has(n protoreflect.EnumNumber) bool { | ||||
| 	for ls := p.lazyInit().sorted; len(ls) > 0; { | ||||
| 		i := len(ls) / 2 | ||||
| 		switch r := enumRange(ls[i]); { | ||||
| 		case n < r.Start(): | ||||
| 			ls = ls[:i] // search lower | ||||
| 		case n > r.End(): | ||||
| 			ls = ls[i+1:] // search upper | ||||
| 		default: | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| func (p *EnumRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *EnumRanges) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *EnumRanges) lazyInit() *EnumRanges { | ||||
| 	p.once.Do(func() { | ||||
| 		p.sorted = append(p.sorted, p.List...) | ||||
| 		sort.Slice(p.sorted, func(i, j int) bool { | ||||
| 			return p.sorted[i][0] < p.sorted[j][0] | ||||
| 		}) | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // CheckValid reports any errors with the set of names with an error message | ||||
| // that completes the sentence: "ranges is invalid because it has ..." | ||||
| func (p *EnumRanges) CheckValid() error { | ||||
| 	var rp enumRange | ||||
| 	for i, r := range p.lazyInit().sorted { | ||||
| 		r := enumRange(r) | ||||
| 		switch { | ||||
| 		case !(r.Start() <= r.End()): | ||||
| 			return errors.New("invalid range: %v", r) | ||||
| 		case !(rp.End() < r.Start()) && i > 0: | ||||
| 			return errors.New("overlapping ranges: %v with %v", rp, r) | ||||
| 		} | ||||
| 		rp = r | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type enumRange [2]protoreflect.EnumNumber | ||||
|  | ||||
| func (r enumRange) Start() protoreflect.EnumNumber { return r[0] } // inclusive | ||||
| func (r enumRange) End() protoreflect.EnumNumber   { return r[1] } // inclusive | ||||
| func (r enumRange) String() string { | ||||
| 	if r.Start() == r.End() { | ||||
| 		return fmt.Sprintf("%d", r.Start()) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%d to %d", r.Start(), r.End()) | ||||
| } | ||||
|  | ||||
| type FieldRanges struct { | ||||
| 	List   [][2]protoreflect.FieldNumber // start inclusive; end exclusive | ||||
| 	once   sync.Once | ||||
| 	sorted [][2]protoreflect.FieldNumber // protected by once | ||||
| } | ||||
|  | ||||
| func (p *FieldRanges) Len() int                              { return len(p.List) } | ||||
| func (p *FieldRanges) Get(i int) [2]protoreflect.FieldNumber { return p.List[i] } | ||||
| func (p *FieldRanges) Has(n protoreflect.FieldNumber) bool { | ||||
| 	for ls := p.lazyInit().sorted; len(ls) > 0; { | ||||
| 		i := len(ls) / 2 | ||||
| 		switch r := fieldRange(ls[i]); { | ||||
| 		case n < r.Start(): | ||||
| 			ls = ls[:i] // search lower | ||||
| 		case n > r.End(): | ||||
| 			ls = ls[i+1:] // search upper | ||||
| 		default: | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| func (p *FieldRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *FieldRanges) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *FieldRanges) lazyInit() *FieldRanges { | ||||
| 	p.once.Do(func() { | ||||
| 		p.sorted = append(p.sorted, p.List...) | ||||
| 		sort.Slice(p.sorted, func(i, j int) bool { | ||||
| 			return p.sorted[i][0] < p.sorted[j][0] | ||||
| 		}) | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // CheckValid reports any errors with the set of ranges with an error message | ||||
| // that completes the sentence: "ranges is invalid because it has ..." | ||||
| func (p *FieldRanges) CheckValid(isMessageSet bool) error { | ||||
| 	var rp fieldRange | ||||
| 	for i, r := range p.lazyInit().sorted { | ||||
| 		r := fieldRange(r) | ||||
| 		switch { | ||||
| 		case !isValidFieldNumber(r.Start(), isMessageSet): | ||||
| 			return errors.New("invalid field number: %d", r.Start()) | ||||
| 		case !isValidFieldNumber(r.End(), isMessageSet): | ||||
| 			return errors.New("invalid field number: %d", r.End()) | ||||
| 		case !(r.Start() <= r.End()): | ||||
| 			return errors.New("invalid range: %v", r) | ||||
| 		case !(rp.End() < r.Start()) && i > 0: | ||||
| 			return errors.New("overlapping ranges: %v with %v", rp, r) | ||||
| 		} | ||||
| 		rp = r | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // isValidFieldNumber reports whether the field number is valid. | ||||
| // Unlike the FieldNumber.IsValid method, it allows ranges that cover the | ||||
| // reserved number range. | ||||
| func isValidFieldNumber(n protoreflect.FieldNumber, isMessageSet bool) bool { | ||||
| 	return protowire.MinValidNumber <= n && (n <= protowire.MaxValidNumber || isMessageSet) | ||||
| } | ||||
|  | ||||
| // CheckOverlap reports an error if p and q overlap. | ||||
| func (p *FieldRanges) CheckOverlap(q *FieldRanges) error { | ||||
| 	rps := p.lazyInit().sorted | ||||
| 	rqs := q.lazyInit().sorted | ||||
| 	for pi, qi := 0, 0; pi < len(rps) && qi < len(rqs); { | ||||
| 		rp := fieldRange(rps[pi]) | ||||
| 		rq := fieldRange(rqs[qi]) | ||||
| 		if !(rp.End() < rq.Start() || rq.End() < rp.Start()) { | ||||
| 			return errors.New("overlapping ranges: %v with %v", rp, rq) | ||||
| 		} | ||||
| 		if rp.Start() < rq.Start() { | ||||
| 			pi++ | ||||
| 		} else { | ||||
| 			qi++ | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type fieldRange [2]protoreflect.FieldNumber | ||||
|  | ||||
| func (r fieldRange) Start() protoreflect.FieldNumber { return r[0] }     // inclusive | ||||
| func (r fieldRange) End() protoreflect.FieldNumber   { return r[1] - 1 } // inclusive | ||||
| func (r fieldRange) String() string { | ||||
| 	if r.Start() == r.End() { | ||||
| 		return fmt.Sprintf("%d", r.Start()) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%d to %d", r.Start(), r.End()) | ||||
| } | ||||
|  | ||||
| type FieldNumbers struct { | ||||
| 	List []protoreflect.FieldNumber | ||||
| 	once sync.Once | ||||
| 	has  map[protoreflect.FieldNumber]struct{} // protected by once | ||||
| } | ||||
|  | ||||
| func (p *FieldNumbers) Len() int                           { return len(p.List) } | ||||
| func (p *FieldNumbers) Get(i int) protoreflect.FieldNumber { return p.List[i] } | ||||
| func (p *FieldNumbers) Has(n protoreflect.FieldNumber) bool { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.has = make(map[protoreflect.FieldNumber]struct{}, len(p.List)) | ||||
| 			for _, n := range p.List { | ||||
| 				p.has[n] = struct{}{} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	_, ok := p.has[n] | ||||
| 	return ok | ||||
| } | ||||
| func (p *FieldNumbers) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *FieldNumbers) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| type OneofFields struct { | ||||
| 	List   []protoreflect.FieldDescriptor | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]protoreflect.FieldDescriptor        // protected by once | ||||
| 	byJSON map[string]protoreflect.FieldDescriptor                   // protected by once | ||||
| 	byText map[string]protoreflect.FieldDescriptor                   // protected by once | ||||
| 	byNum  map[protoreflect.FieldNumber]protoreflect.FieldDescriptor // protected by once | ||||
| } | ||||
|  | ||||
| func (p *OneofFields) Len() int                               { return len(p.List) } | ||||
| func (p *OneofFields) Get(i int) protoreflect.FieldDescriptor { return p.List[i] } | ||||
| func (p *OneofFields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor { | ||||
| 	return p.lazyInit().byName[s] | ||||
| } | ||||
| func (p *OneofFields) ByJSONName(s string) protoreflect.FieldDescriptor { | ||||
| 	return p.lazyInit().byJSON[s] | ||||
| } | ||||
| func (p *OneofFields) ByTextName(s string) protoreflect.FieldDescriptor { | ||||
| 	return p.lazyInit().byText[s] | ||||
| } | ||||
| func (p *OneofFields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor { | ||||
| 	return p.lazyInit().byNum[n] | ||||
| } | ||||
| func (p *OneofFields) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| func (p *OneofFields) lazyInit() *OneofFields { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]protoreflect.FieldDescriptor, len(p.List)) | ||||
| 			p.byJSON = make(map[string]protoreflect.FieldDescriptor, len(p.List)) | ||||
| 			p.byText = make(map[string]protoreflect.FieldDescriptor, len(p.List)) | ||||
| 			p.byNum = make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor, len(p.List)) | ||||
| 			for _, f := range p.List { | ||||
| 				// Field names and numbers are guaranteed to be unique. | ||||
| 				p.byName[f.Name()] = f | ||||
| 				p.byJSON[f.JSONName()] = f | ||||
| 				p.byText[f.TextName()] = f | ||||
| 				p.byNum[f.Number()] = f | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type SourceLocations struct { | ||||
| 	// List is a list of SourceLocations. | ||||
| 	// The SourceLocation.Next field does not need to be populated | ||||
| 	// as it will be lazily populated upon first need. | ||||
| 	List []protoreflect.SourceLocation | ||||
|  | ||||
| 	// File is the parent file descriptor that these locations are relative to. | ||||
| 	// If non-nil, ByDescriptor verifies that the provided descriptor | ||||
| 	// is a child of this file descriptor. | ||||
| 	File protoreflect.FileDescriptor | ||||
|  | ||||
| 	once   sync.Once | ||||
| 	byPath map[pathKey]int | ||||
| } | ||||
|  | ||||
| func (p *SourceLocations) Len() int                              { return len(p.List) } | ||||
| func (p *SourceLocations) Get(i int) protoreflect.SourceLocation { return p.lazyInit().List[i] } | ||||
| func (p *SourceLocations) byKey(k pathKey) protoreflect.SourceLocation { | ||||
| 	if i, ok := p.lazyInit().byPath[k]; ok { | ||||
| 		return p.List[i] | ||||
| 	} | ||||
| 	return protoreflect.SourceLocation{} | ||||
| } | ||||
| func (p *SourceLocations) ByPath(path protoreflect.SourcePath) protoreflect.SourceLocation { | ||||
| 	return p.byKey(newPathKey(path)) | ||||
| } | ||||
| func (p *SourceLocations) ByDescriptor(desc protoreflect.Descriptor) protoreflect.SourceLocation { | ||||
| 	if p.File != nil && desc != nil && p.File != desc.ParentFile() { | ||||
| 		return protoreflect.SourceLocation{} // mismatching parent files | ||||
| 	} | ||||
| 	var pathArr [16]int32 | ||||
| 	path := pathArr[:0] | ||||
| 	for { | ||||
| 		switch desc.(type) { | ||||
| 		case protoreflect.FileDescriptor: | ||||
| 			// Reverse the path since it was constructed in reverse. | ||||
| 			for i, j := 0, len(path)-1; i < j; i, j = i+1, j-1 { | ||||
| 				path[i], path[j] = path[j], path[i] | ||||
| 			} | ||||
| 			return p.byKey(newPathKey(path)) | ||||
| 		case protoreflect.MessageDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case protoreflect.FileDescriptor: | ||||
| 				path = append(path, int32(genid.FileDescriptorProto_MessageType_field_number)) | ||||
| 			case protoreflect.MessageDescriptor: | ||||
| 				path = append(path, int32(genid.DescriptorProto_NestedType_field_number)) | ||||
| 			default: | ||||
| 				return protoreflect.SourceLocation{} | ||||
| 			} | ||||
| 		case protoreflect.FieldDescriptor: | ||||
| 			isExtension := desc.(protoreflect.FieldDescriptor).IsExtension() | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			if isExtension { | ||||
| 				switch desc.(type) { | ||||
| 				case protoreflect.FileDescriptor: | ||||
| 					path = append(path, int32(genid.FileDescriptorProto_Extension_field_number)) | ||||
| 				case protoreflect.MessageDescriptor: | ||||
| 					path = append(path, int32(genid.DescriptorProto_Extension_field_number)) | ||||
| 				default: | ||||
| 					return protoreflect.SourceLocation{} | ||||
| 				} | ||||
| 			} else { | ||||
| 				switch desc.(type) { | ||||
| 				case protoreflect.MessageDescriptor: | ||||
| 					path = append(path, int32(genid.DescriptorProto_Field_field_number)) | ||||
| 				default: | ||||
| 					return protoreflect.SourceLocation{} | ||||
| 				} | ||||
| 			} | ||||
| 		case protoreflect.OneofDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case protoreflect.MessageDescriptor: | ||||
| 				path = append(path, int32(genid.DescriptorProto_OneofDecl_field_number)) | ||||
| 			default: | ||||
| 				return protoreflect.SourceLocation{} | ||||
| 			} | ||||
| 		case protoreflect.EnumDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case protoreflect.FileDescriptor: | ||||
| 				path = append(path, int32(genid.FileDescriptorProto_EnumType_field_number)) | ||||
| 			case protoreflect.MessageDescriptor: | ||||
| 				path = append(path, int32(genid.DescriptorProto_EnumType_field_number)) | ||||
| 			default: | ||||
| 				return protoreflect.SourceLocation{} | ||||
| 			} | ||||
| 		case protoreflect.EnumValueDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case protoreflect.EnumDescriptor: | ||||
| 				path = append(path, int32(genid.EnumDescriptorProto_Value_field_number)) | ||||
| 			default: | ||||
| 				return protoreflect.SourceLocation{} | ||||
| 			} | ||||
| 		case protoreflect.ServiceDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case protoreflect.FileDescriptor: | ||||
| 				path = append(path, int32(genid.FileDescriptorProto_Service_field_number)) | ||||
| 			default: | ||||
| 				return protoreflect.SourceLocation{} | ||||
| 			} | ||||
| 		case protoreflect.MethodDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case protoreflect.ServiceDescriptor: | ||||
| 				path = append(path, int32(genid.ServiceDescriptorProto_Method_field_number)) | ||||
| 			default: | ||||
| 				return protoreflect.SourceLocation{} | ||||
| 			} | ||||
| 		default: | ||||
| 			return protoreflect.SourceLocation{} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| func (p *SourceLocations) lazyInit() *SourceLocations { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			// Collect all the indexes for a given path. | ||||
| 			pathIdxs := make(map[pathKey][]int, len(p.List)) | ||||
| 			for i, l := range p.List { | ||||
| 				k := newPathKey(l.Path) | ||||
| 				pathIdxs[k] = append(pathIdxs[k], i) | ||||
| 			} | ||||
|  | ||||
| 			// Update the next index for all locations. | ||||
| 			p.byPath = make(map[pathKey]int, len(p.List)) | ||||
| 			for k, idxs := range pathIdxs { | ||||
| 				for i := 0; i < len(idxs)-1; i++ { | ||||
| 					p.List[idxs[i]].Next = idxs[i+1] | ||||
| 				} | ||||
| 				p.List[idxs[len(idxs)-1]].Next = 0 | ||||
| 				p.byPath[k] = idxs[0] // record the first location for this path | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
| func (p *SourceLocations) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| // pathKey is a comparable representation of protoreflect.SourcePath. | ||||
| type pathKey struct { | ||||
| 	arr [16]uint8 // first n-1 path segments; last element is the length | ||||
| 	str string    // used if the path does not fit in arr | ||||
| } | ||||
|  | ||||
| func newPathKey(p protoreflect.SourcePath) (k pathKey) { | ||||
| 	if len(p) < len(k.arr) { | ||||
| 		for i, ps := range p { | ||||
| 			if ps < 0 || math.MaxUint8 <= ps { | ||||
| 				return pathKey{str: p.String()} | ||||
| 			} | ||||
| 			k.arr[i] = uint8(ps) | ||||
| 		} | ||||
| 		k.arr[len(k.arr)-1] = uint8(len(p)) | ||||
| 		return k | ||||
| 	} | ||||
| 	return pathKey{str: p.String()} | ||||
| } | ||||
							
								
								
									
										367
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										367
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,367 @@ | ||||
| // Copyright 2018 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // Code generated by generate-types. DO NOT EDIT. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/descfmt" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type Enums struct { | ||||
| 	List   []Enum | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Enum // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Enums) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Enums) Get(i int) protoreflect.EnumDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Enums) ByName(s protoreflect.Name) protoreflect.EnumDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Enums) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Enums) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Enums) lazyInit() *Enums { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Enum, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type EnumValues struct { | ||||
| 	List   []EnumValue | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*EnumValue       // protected by once | ||||
| 	byNum  map[protoreflect.EnumNumber]*EnumValue // protected by once | ||||
| } | ||||
|  | ||||
| func (p *EnumValues) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *EnumValues) Get(i int) protoreflect.EnumValueDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *EnumValues) ByName(s protoreflect.Name) protoreflect.EnumValueDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *EnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor { | ||||
| 	if d := p.lazyInit().byNum[n]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *EnumValues) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *EnumValues) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *EnumValues) lazyInit() *EnumValues { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*EnumValue, len(p.List)) | ||||
| 			p.byNum = make(map[protoreflect.EnumNumber]*EnumValue, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 				if _, ok := p.byNum[d.Number()]; !ok { | ||||
| 					p.byNum[d.Number()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Messages struct { | ||||
| 	List   []Message | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Message // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Messages) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Messages) Get(i int) protoreflect.MessageDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Messages) ByName(s protoreflect.Name) protoreflect.MessageDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Messages) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Messages) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Messages) lazyInit() *Messages { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Message, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Fields struct { | ||||
| 	List   []Field | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Field        // protected by once | ||||
| 	byJSON map[string]*Field                   // protected by once | ||||
| 	byText map[string]*Field                   // protected by once | ||||
| 	byNum  map[protoreflect.FieldNumber]*Field // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Fields) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Fields) Get(i int) protoreflect.FieldDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Fields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) ByJSONName(s string) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byJSON[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) ByTextName(s string) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byText[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byNum[n]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Fields) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Fields) lazyInit() *Fields { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Field, len(p.List)) | ||||
| 			p.byJSON = make(map[string]*Field, len(p.List)) | ||||
| 			p.byText = make(map[string]*Field, len(p.List)) | ||||
| 			p.byNum = make(map[protoreflect.FieldNumber]*Field, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 				if _, ok := p.byJSON[d.JSONName()]; !ok { | ||||
| 					p.byJSON[d.JSONName()] = d | ||||
| 				} | ||||
| 				if _, ok := p.byText[d.TextName()]; !ok { | ||||
| 					p.byText[d.TextName()] = d | ||||
| 				} | ||||
| 				if isGroupLike(d) { | ||||
| 					lowerJSONName := strings.ToLower(d.JSONName()) | ||||
| 					if _, ok := p.byJSON[lowerJSONName]; !ok { | ||||
| 						p.byJSON[lowerJSONName] = d | ||||
| 					} | ||||
| 					lowerTextName := strings.ToLower(d.TextName()) | ||||
| 					if _, ok := p.byText[lowerTextName]; !ok { | ||||
| 						p.byText[lowerTextName] = d | ||||
| 					} | ||||
| 				} | ||||
| 				if _, ok := p.byNum[d.Number()]; !ok { | ||||
| 					p.byNum[d.Number()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Oneofs struct { | ||||
| 	List   []Oneof | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Oneof // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Oneofs) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Oneofs) Get(i int) protoreflect.OneofDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Oneofs) ByName(s protoreflect.Name) protoreflect.OneofDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Oneofs) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Oneofs) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Oneofs) lazyInit() *Oneofs { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Oneof, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Extensions struct { | ||||
| 	List   []Extension | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Extension // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Extensions) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Extensions) Get(i int) protoreflect.ExtensionDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Extensions) ByName(s protoreflect.Name) protoreflect.ExtensionDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Extensions) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Extensions) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Extensions) lazyInit() *Extensions { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Extension, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Services struct { | ||||
| 	List   []Service | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Service // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Services) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Services) Get(i int) protoreflect.ServiceDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Services) ByName(s protoreflect.Name) protoreflect.ServiceDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Services) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Services) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Services) lazyInit() *Services { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Service, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Methods struct { | ||||
| 	List   []Method | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Method // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Methods) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Methods) Get(i int) protoreflect.MethodDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Methods) ByName(s protoreflect.Name) protoreflect.MethodDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Methods) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Methods) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Methods) lazyInit() *Methods { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Method, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
							
								
								
									
										156
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/editions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/editions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| // Copyright 2024 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/editiondefaults" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| var defaultsCache = make(map[Edition]EditionFeatures) | ||||
| var defaultsKeys = []Edition{} | ||||
|  | ||||
| func init() { | ||||
| 	unmarshalEditionDefaults(editiondefaults.Defaults) | ||||
| 	SurrogateProto2.L1.EditionFeatures = getFeaturesFor(EditionProto2) | ||||
| 	SurrogateProto3.L1.EditionFeatures = getFeaturesFor(EditionProto3) | ||||
| 	SurrogateEdition2023.L1.EditionFeatures = getFeaturesFor(Edition2023) | ||||
| } | ||||
|  | ||||
| func unmarshalGoFeature(b []byte, parent EditionFeatures) EditionFeatures { | ||||
| 	for len(b) > 0 { | ||||
| 		num, _, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch num { | ||||
| 		case genid.GoFeatures_LegacyUnmarshalJsonEnum_field_number: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			parent.GenerateLegacyUnmarshalJSON = protowire.DecodeBool(v) | ||||
| 		default: | ||||
| 			panic(fmt.Sprintf("unkown field number %d while unmarshalling GoFeatures", num)) | ||||
| 		} | ||||
| 	} | ||||
| 	return parent | ||||
| } | ||||
|  | ||||
| func unmarshalFeatureSet(b []byte, parent EditionFeatures) EditionFeatures { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FeatureSet_FieldPresence_field_number: | ||||
| 				parent.IsFieldPresence = v == genid.FeatureSet_EXPLICIT_enum_value || v == genid.FeatureSet_LEGACY_REQUIRED_enum_value | ||||
| 				parent.IsLegacyRequired = v == genid.FeatureSet_LEGACY_REQUIRED_enum_value | ||||
| 			case genid.FeatureSet_EnumType_field_number: | ||||
| 				parent.IsOpenEnum = v == genid.FeatureSet_OPEN_enum_value | ||||
| 			case genid.FeatureSet_RepeatedFieldEncoding_field_number: | ||||
| 				parent.IsPacked = v == genid.FeatureSet_PACKED_enum_value | ||||
| 			case genid.FeatureSet_Utf8Validation_field_number: | ||||
| 				parent.IsUTF8Validated = v == genid.FeatureSet_VERIFY_enum_value | ||||
| 			case genid.FeatureSet_MessageEncoding_field_number: | ||||
| 				parent.IsDelimitedEncoded = v == genid.FeatureSet_DELIMITED_enum_value | ||||
| 			case genid.FeatureSet_JsonFormat_field_number: | ||||
| 				parent.IsJSONCompliant = v == genid.FeatureSet_ALLOW_enum_value | ||||
| 			default: | ||||
| 				panic(fmt.Sprintf("unkown field number %d while unmarshalling FeatureSet", num)) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.GoFeatures_LegacyUnmarshalJsonEnum_field_number: | ||||
| 				parent = unmarshalGoFeature(v, parent) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return parent | ||||
| } | ||||
|  | ||||
| func featuresFromParentDesc(parentDesc protoreflect.Descriptor) EditionFeatures { | ||||
| 	var parentFS EditionFeatures | ||||
| 	switch p := parentDesc.(type) { | ||||
| 	case *File: | ||||
| 		parentFS = p.L1.EditionFeatures | ||||
| 	case *Message: | ||||
| 		parentFS = p.L1.EditionFeatures | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("unknown parent type %T", parentDesc)) | ||||
| 	} | ||||
| 	return parentFS | ||||
| } | ||||
|  | ||||
| func unmarshalEditionDefault(b []byte) { | ||||
| 	var ed Edition | ||||
| 	var fs EditionFeatures | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number: | ||||
| 				ed = Edition(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_number: | ||||
| 				fs = unmarshalFeatureSet(v, fs) | ||||
| 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_number: | ||||
| 				fs = unmarshalFeatureSet(v, fs) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	defaultsCache[ed] = fs | ||||
| 	defaultsKeys = append(defaultsKeys, ed) | ||||
| } | ||||
|  | ||||
| func unmarshalEditionDefaults(b []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, _, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch num { | ||||
| 		case genid.FeatureSetDefaults_Defaults_field_number: | ||||
| 			def, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			unmarshalEditionDefault(def) | ||||
| 		case genid.FeatureSetDefaults_MinimumEdition_field_number, | ||||
| 			genid.FeatureSetDefaults_MaximumEdition_field_number: | ||||
| 			// We don't care about the minimum and maximum editions. If the | ||||
| 			// edition we are looking for later on is not in the cache we know | ||||
| 			// it is outside of the range between minimum and maximum edition. | ||||
| 			_, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 		default: | ||||
| 			panic(fmt.Sprintf("unkown field number %d while unmarshalling EditionDefault", num)) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func getFeaturesFor(ed Edition) EditionFeatures { | ||||
| 	match := EditionUnknown | ||||
| 	for _, key := range defaultsKeys { | ||||
| 		if key > ed { | ||||
| 			break | ||||
| 		} | ||||
| 		match = key | ||||
| 	} | ||||
| 	if match == EditionUnknown { | ||||
| 		panic(fmt.Sprintf("unsupported edition: %v", ed)) | ||||
| 	} | ||||
| 	return defaultsCache[match] | ||||
| } | ||||
							
								
								
									
										110
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	emptyNames           = new(Names) | ||||
| 	emptyEnumRanges      = new(EnumRanges) | ||||
| 	emptyFieldRanges     = new(FieldRanges) | ||||
| 	emptyFieldNumbers    = new(FieldNumbers) | ||||
| 	emptySourceLocations = new(SourceLocations) | ||||
|  | ||||
| 	emptyFiles      = new(FileImports) | ||||
| 	emptyMessages   = new(Messages) | ||||
| 	emptyFields     = new(Fields) | ||||
| 	emptyOneofs     = new(Oneofs) | ||||
| 	emptyEnums      = new(Enums) | ||||
| 	emptyEnumValues = new(EnumValues) | ||||
| 	emptyExtensions = new(Extensions) | ||||
| 	emptyServices   = new(Services) | ||||
| ) | ||||
|  | ||||
| // PlaceholderFile is a placeholder, representing only the file path. | ||||
| type PlaceholderFile string | ||||
|  | ||||
| func (f PlaceholderFile) ParentFile() protoreflect.FileDescriptor       { return f } | ||||
| func (f PlaceholderFile) Parent() protoreflect.Descriptor               { return nil } | ||||
| func (f PlaceholderFile) Index() int                                    { return 0 } | ||||
| func (f PlaceholderFile) Syntax() protoreflect.Syntax                   { return 0 } | ||||
| func (f PlaceholderFile) Name() protoreflect.Name                       { return "" } | ||||
| func (f PlaceholderFile) FullName() protoreflect.FullName               { return "" } | ||||
| func (f PlaceholderFile) IsPlaceholder() bool                           { return true } | ||||
| func (f PlaceholderFile) Options() protoreflect.ProtoMessage            { return descopts.File } | ||||
| func (f PlaceholderFile) Path() string                                  { return string(f) } | ||||
| func (f PlaceholderFile) Package() protoreflect.FullName                { return "" } | ||||
| func (f PlaceholderFile) Imports() protoreflect.FileImports             { return emptyFiles } | ||||
| func (f PlaceholderFile) Messages() protoreflect.MessageDescriptors     { return emptyMessages } | ||||
| func (f PlaceholderFile) Enums() protoreflect.EnumDescriptors           { return emptyEnums } | ||||
| func (f PlaceholderFile) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } | ||||
| func (f PlaceholderFile) Services() protoreflect.ServiceDescriptors     { return emptyServices } | ||||
| func (f PlaceholderFile) SourceLocations() protoreflect.SourceLocations { return emptySourceLocations } | ||||
| func (f PlaceholderFile) ProtoType(protoreflect.FileDescriptor)         { return } | ||||
| func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement)           { return } | ||||
|  | ||||
| // PlaceholderEnum is a placeholder, representing only the full name. | ||||
| type PlaceholderEnum protoreflect.FullName | ||||
|  | ||||
| func (e PlaceholderEnum) ParentFile() protoreflect.FileDescriptor   { return nil } | ||||
| func (e PlaceholderEnum) Parent() protoreflect.Descriptor           { return nil } | ||||
| func (e PlaceholderEnum) Index() int                                { return 0 } | ||||
| func (e PlaceholderEnum) Syntax() protoreflect.Syntax               { return 0 } | ||||
| func (e PlaceholderEnum) Name() protoreflect.Name                   { return protoreflect.FullName(e).Name() } | ||||
| func (e PlaceholderEnum) FullName() protoreflect.FullName           { return protoreflect.FullName(e) } | ||||
| func (e PlaceholderEnum) IsPlaceholder() bool                       { return true } | ||||
| func (e PlaceholderEnum) Options() protoreflect.ProtoMessage        { return descopts.Enum } | ||||
| func (e PlaceholderEnum) Values() protoreflect.EnumValueDescriptors { return emptyEnumValues } | ||||
| func (e PlaceholderEnum) ReservedNames() protoreflect.Names         { return emptyNames } | ||||
| func (e PlaceholderEnum) ReservedRanges() protoreflect.EnumRanges   { return emptyEnumRanges } | ||||
| func (e PlaceholderEnum) IsClosed() bool                            { return false } | ||||
| func (e PlaceholderEnum) ProtoType(protoreflect.EnumDescriptor)     { return } | ||||
| func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement)       { return } | ||||
|  | ||||
| // PlaceholderEnumValue is a placeholder, representing only the full name. | ||||
| type PlaceholderEnumValue protoreflect.FullName | ||||
|  | ||||
| func (e PlaceholderEnumValue) ParentFile() protoreflect.FileDescriptor    { return nil } | ||||
| func (e PlaceholderEnumValue) Parent() protoreflect.Descriptor            { return nil } | ||||
| func (e PlaceholderEnumValue) Index() int                                 { return 0 } | ||||
| func (e PlaceholderEnumValue) Syntax() protoreflect.Syntax                { return 0 } | ||||
| func (e PlaceholderEnumValue) Name() protoreflect.Name                    { return protoreflect.FullName(e).Name() } | ||||
| func (e PlaceholderEnumValue) FullName() protoreflect.FullName            { return protoreflect.FullName(e) } | ||||
| func (e PlaceholderEnumValue) IsPlaceholder() bool                        { return true } | ||||
| func (e PlaceholderEnumValue) Options() protoreflect.ProtoMessage         { return descopts.EnumValue } | ||||
| func (e PlaceholderEnumValue) Number() protoreflect.EnumNumber            { return 0 } | ||||
| func (e PlaceholderEnumValue) ProtoType(protoreflect.EnumValueDescriptor) { return } | ||||
| func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement)        { return } | ||||
|  | ||||
| // PlaceholderMessage is a placeholder, representing only the full name. | ||||
| type PlaceholderMessage protoreflect.FullName | ||||
|  | ||||
| func (m PlaceholderMessage) ParentFile() protoreflect.FileDescriptor    { return nil } | ||||
| func (m PlaceholderMessage) Parent() protoreflect.Descriptor            { return nil } | ||||
| func (m PlaceholderMessage) Index() int                                 { return 0 } | ||||
| func (m PlaceholderMessage) Syntax() protoreflect.Syntax                { return 0 } | ||||
| func (m PlaceholderMessage) Name() protoreflect.Name                    { return protoreflect.FullName(m).Name() } | ||||
| func (m PlaceholderMessage) FullName() protoreflect.FullName            { return protoreflect.FullName(m) } | ||||
| func (m PlaceholderMessage) IsPlaceholder() bool                        { return true } | ||||
| func (m PlaceholderMessage) Options() protoreflect.ProtoMessage         { return descopts.Message } | ||||
| func (m PlaceholderMessage) IsMapEntry() bool                           { return false } | ||||
| func (m PlaceholderMessage) Fields() protoreflect.FieldDescriptors      { return emptyFields } | ||||
| func (m PlaceholderMessage) Oneofs() protoreflect.OneofDescriptors      { return emptyOneofs } | ||||
| func (m PlaceholderMessage) ReservedNames() protoreflect.Names          { return emptyNames } | ||||
| func (m PlaceholderMessage) ReservedRanges() protoreflect.FieldRanges   { return emptyFieldRanges } | ||||
| func (m PlaceholderMessage) RequiredNumbers() protoreflect.FieldNumbers { return emptyFieldNumbers } | ||||
| func (m PlaceholderMessage) ExtensionRanges() protoreflect.FieldRanges  { return emptyFieldRanges } | ||||
| func (m PlaceholderMessage) ExtensionRangeOptions(int) protoreflect.ProtoMessage { | ||||
| 	panic("index out of range") | ||||
| } | ||||
| func (m PlaceholderMessage) Messages() protoreflect.MessageDescriptors     { return emptyMessages } | ||||
| func (m PlaceholderMessage) Enums() protoreflect.EnumDescriptors           { return emptyEnums } | ||||
| func (m PlaceholderMessage) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } | ||||
| func (m PlaceholderMessage) ProtoType(protoreflect.MessageDescriptor)      { return } | ||||
| func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement)           { return } | ||||
		Reference in New Issue
	
	Block a user
	 anthonyrawlins
					anthonyrawlins