Source File
registry.go
Belonging Package
github.com/golang/protobuf/proto
package proto
import (
)
type fileDescGZIP = []byte
var fileCache sync.Map // map[filePath]fileDescGZIP
func ( filePath) fileDescGZIP {
if , := fileCache.Load(); {
return .(fileDescGZIP)
}
var []byte
if , := protoregistry.GlobalFiles.FindFileByPath(); != nil {
if , := .(interface{ () []byte }); {
= .()
}
}
if len() > 0 {
, := fileCache.LoadOrStore(, protoimpl.X.CompressGZIP())
return .(fileDescGZIP)
}
return nil
}
type enumsByName = map[string]int32
type enumsByNumber = map[int32]string
var enumCache sync.Map // map[enumName]enumsByName
var numFilesCache sync.Map // map[protoreflect.FullName]int
func ( enumName, enumsByNumber, enumsByName) {
if , := enumCache.Load(); {
panic("proto: duplicate enum registered: " + )
}
enumCache.Store(, )
}
func ( enumName) enumsByName {
if , := enumCache.Load(); {
return .(enumsByName)
}
var protoreflect.FullName
if := strings.LastIndexByte(, '.'); >= 0 {
= protoreflect.FullName([:])
}
, := numFilesCache.Load()
, := .(int)
if protoregistry.GlobalFiles.NumFilesByPackage() == {
return nil // cache is up-to-date; was not found earlier
}
= 0
protoregistry.GlobalFiles.RangeFilesByPackage(, func( protoreflect.FileDescriptor) bool {
walkEnums(, func( protoreflect.EnumDescriptor) {
:= protoimpl.X.LegacyEnumName()
if , := enumCache.Load(); ! {
:= make(enumsByName)
:= .Values()
for := .Len() - 1; >= 0; -- {
:= .Get()
[string(.Name())] = int32(.Number())
}
enumCache.LoadOrStore(, )
}
})
++
return true
})
numFilesCache.Store(, )
if , := enumCache.Load(); {
return .(enumsByName)
}
return nil
}
func ( interface {
() protoreflect.EnumDescriptors
() protoreflect.MessageDescriptors
}, func(protoreflect.EnumDescriptor)) {
:= .()
for := .Len() - 1; >= 0; -- {
(.Get())
}
:= .()
for := .Len() - 1; >= 0; -- {
(.Get(), )
}
}
type messageName = string
var messageTypeCache sync.Map // map[messageName]reflect.Type
func ( Message, messageName) {
:= protoimpl.X.LegacyMessageTypeOf(, protoreflect.FullName())
if := protoregistry.GlobalTypes.RegisterMessage(); != nil {
panic()
}
messageTypeCache.Store(, reflect.TypeOf())
}
func ( messageName) reflect.Type {
if , := messageTypeCache.Load(); {
return .(reflect.Type)
}
var reflect.Type
if , := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName()); != nil {
= messageGoType()
}
if == nil {
, := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName())
if , := .(protoreflect.MessageDescriptor); != nil && .IsMapEntry() {
:= goTypeForField(.Fields().ByNumber(1))
:= goTypeForField(.Fields().ByNumber(2))
= reflect.MapOf(, )
}
}
if != nil {
, := messageTypeCache.LoadOrStore(, )
return .(reflect.Type)
}
return nil
}
func ( protoreflect.FieldDescriptor) reflect.Type {
switch := .Kind(); {
case protoreflect.EnumKind:
if , := protoregistry.GlobalTypes.FindEnumByName(.Enum().FullName()); != nil {
return enumGoType()
}
return reflect.TypeOf(protoreflect.EnumNumber(0))
case protoreflect.MessageKind, protoreflect.GroupKind:
if , := protoregistry.GlobalTypes.FindMessageByName(.Message().FullName()); != nil {
return messageGoType()
}
return reflect.TypeOf((*protoreflect.Message)(nil)).Elem()
default:
return reflect.TypeOf(.Default().Interface())
}
}
func ( protoreflect.EnumType) reflect.Type {
return reflect.TypeOf(.New(0))
}
func ( protoreflect.MessageType) reflect.Type {
return reflect.TypeOf(MessageV1(.Zero().Interface()))
}
func ( Message) messageName {
if == nil {
return ""
}
if , := .(interface{ () messageName }); {
return .()
}
return messageName(protoimpl.X.MessageDescriptorOf().FullName())
}
func ( *ExtensionDesc) {
if := protoregistry.GlobalTypes.RegisterExtension(); != nil {
panic()
}
}
type extensionsByNumber = map[int32]*ExtensionDesc
var extensionCache sync.Map // map[messageName]extensionsByNumber
:= MessageName()
, := extensionCache.Load()
, := .(extensionsByNumber)
if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName()) == len() {
return // cache is up-to-date
}
= make(extensionsByNumber)
protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(), func( protoreflect.ExtensionType) bool {
if , := .(*ExtensionDesc); {
[int32(.TypeDescriptor().Number())] =
}
return true
})
extensionCache.Store(, )
return
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |