Source File
registry.go
Belonging Package
google.golang.org/protobuf/reflect/protoregistry
package protoregistry
import (
)
var ignoreConflict = func( protoreflect.Descriptor, error) bool {
log.Printf(""+
"WARNING: %v\n"+
"A future release will panic on registration conflicts. See:\n"+
"https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict\n"+
"\n", )
return true
}
var globalMutex sync.RWMutex
var GlobalFiles *Files = new(Files)
var GlobalTypes *Types = new(Types)
descsByName map[protoreflect.FullName]interface{}
filesByPath map[string]protoreflect.FileDescriptor
}
type packageDescriptor struct {
files []protoreflect.FileDescriptor
}
func ( *Files) ( protoreflect.FileDescriptor) error {
if == GlobalFiles {
globalMutex.Lock()
defer globalMutex.Unlock()
}
if .descsByName == nil {
.descsByName = map[protoreflect.FullName]interface{}{
"": &packageDescriptor{},
}
.filesByPath = make(map[string]protoreflect.FileDescriptor)
}
:= .Path()
var string
const = "google.golang.org/genproto"
const = "cb27e3aa (May 26th, 2020)"
switch {
case "google/protobuf/field_mask.proto":
= + "/protobuf/field_mask"
case "google/protobuf/api.proto":
= + "/protobuf/api"
case "google/protobuf/type.proto":
= + "/protobuf/ptype"
case "google/protobuf/source_context.proto":
= + "/protobuf/source_context"
}
if == GlobalFiles && != "" {
:= strings.TrimSuffix(strings.TrimPrefix(, "google/protobuf/"), ".proto")
= strings.Replace(, "_", "", -1) + "pb"
:= "google.golang.org/protobuf/types/known/" +
panic(fmt.Sprintf(""+
"duplicate registration of %q\n"+
"\n"+
"The generated definition for this file has moved:\n"+
"\tfrom: %q\n"+
"\tto: %q\n"+
"A dependency on the %q module must\n"+
"be at version %v or higher.\n"+
"\n"+
"Upgrade the dependency by running:\n"+
"\tgo get -u %v\n",
, , , , , ))
}
:= errors.New("file %q is already registered", .Path())
= amendErrorWithCaller(, , )
if == GlobalFiles && ignoreConflict(, ) {
= nil
}
return
}
for := .Package(); != ""; = .Parent() {
switch := .descsByName[]; .(type) {
case nil, *packageDescriptor:
default:
:= errors.New("file %q has a package name conflict over %v", .Path(), )
= amendErrorWithCaller(, , )
if == GlobalFiles && ignoreConflict(, ) {
= nil
}
return
}
}
var error
var bool
rangeTopLevelDescriptors(, func( protoreflect.Descriptor) {
if := .descsByName[.FullName()]; != nil {
= true
= errors.New("file %q has a name conflict over %v", .Path(), .FullName())
= amendErrorWithCaller(, , )
if == GlobalFiles && ignoreConflict(, ) {
= nil
}
}
})
if {
return
}
for := .Package(); != ""; = .Parent() {
if .descsByName[] == nil {
.descsByName[] = &packageDescriptor{}
}
}
:= .descsByName[.Package()].(*packageDescriptor)
.files = append(.files, )
rangeTopLevelDescriptors(, func( protoreflect.Descriptor) {
.descsByName[.FullName()] =
})
.filesByPath[] =
return nil
}
func ( *Files) ( protoreflect.FullName) (protoreflect.Descriptor, error) {
if == nil {
return nil, NotFound
}
if == GlobalFiles {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
:=
:= nameSuffix("")
for != "" {
if , := .descsByName[]; {
switch d := .(type) {
case protoreflect.EnumDescriptor:
if .FullName() == {
return , nil
}
case protoreflect.EnumValueDescriptor:
if .FullName() == {
return , nil
}
case protoreflect.MessageDescriptor:
if .FullName() == {
return , nil
}
if := findDescriptorInMessage(, ); != nil && .FullName() == {
return , nil
}
case protoreflect.ExtensionDescriptor:
if .FullName() == {
return , nil
}
case protoreflect.ServiceDescriptor:
if .FullName() == {
return , nil
}
if := .Methods().ByName(.Pop()); != nil && .FullName() == {
return , nil
}
}
return nil, NotFound
}
= .Parent()
= nameSuffix([len()+len("."):])
}
return nil, NotFound
}
func ( protoreflect.MessageDescriptor, nameSuffix) protoreflect.Descriptor {
:= .Pop()
if == "" {
if := .Enums().ByName(); != nil {
return
}
for := .Enums().Len() - 1; >= 0; -- {
if := .Enums().Get().Values().ByName(); != nil {
return
}
}
if := .Extensions().ByName(); != nil {
return
}
if := .Fields().ByName(); != nil {
return
}
if := .Oneofs().ByName(); != nil {
return
}
}
if := .Messages().ByName(); != nil {
if == "" {
return
}
return (, )
}
return nil
}
type nameSuffix string
func ( *nameSuffix) () ( protoreflect.Name) {
if := strings.IndexByte(string(*), '.'); >= 0 {
, * = protoreflect.Name((*)[:]), (*)[+1:]
} else {
, * = protoreflect.Name((*)), ""
}
return
}
func ( *Files) ( string) (protoreflect.FileDescriptor, error) {
if == nil {
return nil, NotFound
}
if == GlobalFiles {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
if , := .filesByPath[]; {
return , nil
}
return nil, NotFound
}
func ( *Files) () int {
if == nil {
return 0
}
if == GlobalFiles {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
return len(.filesByPath)
}
func ( *Files) ( func(protoreflect.FileDescriptor) bool) {
if == nil {
return
}
if == GlobalFiles {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
for , := range .filesByPath {
if !() {
return
}
}
}
func ( *Files) ( protoreflect.FullName) int {
if == nil {
return 0
}
if == GlobalFiles {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
, := .descsByName[].(*packageDescriptor)
if ! {
return 0
}
return len(.files)
}
func ( *Files) ( protoreflect.FullName, func(protoreflect.FileDescriptor) bool) {
if == nil {
return
}
if == GlobalFiles {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
, := .descsByName[].(*packageDescriptor)
if ! {
return
}
for , := range .files {
if !() {
return
}
}
}
func ( protoreflect.FileDescriptor, func(protoreflect.Descriptor)) {
:= .Enums()
for := .Len() - 1; >= 0; -- {
(.Get())
:= .Get().Values()
for := .Len() - 1; >= 0; -- {
(.Get())
}
}
:= .Messages()
for := .Len() - 1; >= 0; -- {
(.Get())
}
:= .Extensions()
for := .Len() - 1; >= 0; -- {
(.Get())
}
:= .Services()
for := .Len() - 1; >= 0; -- {
(.Get())
}
}
FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error)
FindMessageByURL(url string) (protoreflect.MessageType, error)
}
FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error)
FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error)
}
var (
_ MessageTypeResolver = (*Types)(nil)
_ ExtensionTypeResolver = (*Types)(nil)
)
type Types struct {
typesByName typesByName
extensionsByMessage extensionsByMessage
numEnums int
numMessages int
numExtensions int
}
type (
typesByName map[protoreflect.FullName]interface{}
extensionsByMessage map[protoreflect.FullName]extensionsByNumber
extensionsByNumber map[protoreflect.FieldNumber]protoreflect.ExtensionType
)
:= .Descriptor()
if == GlobalTypes {
globalMutex.Lock()
defer globalMutex.Unlock()
}
if := .register("message", , ); != nil {
return
}
.numMessages++
return nil
}
:= .Descriptor()
if == GlobalTypes {
globalMutex.Lock()
defer globalMutex.Unlock()
}
if := .register("enum", , ); != nil {
return
}
.numEnums++
return nil
}
:= .TypeDescriptor()
if == GlobalTypes {
globalMutex.Lock()
defer globalMutex.Unlock()
}
:= .Number()
:= .ContainingMessage().FullName()
if := .extensionsByMessage[][]; != nil {
:= errors.New("extension number %d is already registered on message %v", , )
= amendErrorWithCaller(, , )
if !( == GlobalTypes && ignoreConflict(, )) {
return
}
}
if := .register("extension", , ); != nil {
return
}
if .extensionsByMessage == nil {
.extensionsByMessage = make(extensionsByMessage)
}
if .extensionsByMessage[] == nil {
.extensionsByMessage[] = make(extensionsByNumber)
}
.extensionsByMessage[][] =
.numExtensions++
return nil
}
func ( *Types) ( string, protoreflect.Descriptor, interface{}) error {
:= .FullName()
:= .typesByName[]
if != nil {
:= errors.New("%v %v is already registered", , )
= amendErrorWithCaller(, , )
if !( == GlobalTypes && ignoreConflict(, )) {
return
}
}
if .typesByName == nil {
.typesByName = make(typesByName)
}
.typesByName[] =
return nil
}
func ( *Types) ( protoreflect.FullName) (protoreflect.EnumType, error) {
if == nil {
return nil, NotFound
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
if := .typesByName[]; != nil {
if , := .(protoreflect.EnumType); != nil {
return , nil
}
return nil, errors.New("found wrong type: got %v, want enum", typeName())
}
return nil, NotFound
}
return .FindMessageByURL(string())
}
func ( *Types) ( string) (protoreflect.MessageType, error) {
if == nil {
return nil, NotFound
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
:= protoreflect.FullName()
if := strings.LastIndexByte(, '/'); >= 0 {
= [+len("/"):]
}
if := .typesByName[]; != nil {
if , := .(protoreflect.MessageType); != nil {
return , nil
}
return nil, errors.New("found wrong type: got %v, want message", typeName())
}
return nil, NotFound
}
func ( *Types) ( protoreflect.FullName) (protoreflect.ExtensionType, error) {
if == nil {
return nil, NotFound
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
if := .typesByName[]; != nil {
if , := .(protoreflect.ExtensionType); != nil {
return , nil
}
return nil, errors.New("found wrong type: got %v, want extension", typeName())
}
return nil, NotFound
}
func ( *Types) ( protoreflect.FullName, protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
if == nil {
return nil, NotFound
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
if , := .extensionsByMessage[][]; {
return , nil
}
return nil, NotFound
}
func ( *Types) () int {
if == nil {
return 0
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
return .numEnums
}
func ( *Types) ( func(protoreflect.EnumType) bool) {
if == nil {
return
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
for , := range .typesByName {
if , := .(protoreflect.EnumType); {
if !() {
return
}
}
}
}
func ( *Types) () int {
if == nil {
return 0
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
return .numMessages
}
func ( *Types) ( func(protoreflect.MessageType) bool) {
if == nil {
return
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
for , := range .typesByName {
if , := .(protoreflect.MessageType); {
if !() {
return
}
}
}
}
func ( *Types) () int {
if == nil {
return 0
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
return .numExtensions
}
func ( *Types) ( func(protoreflect.ExtensionType) bool) {
if == nil {
return
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
for , := range .typesByName {
if , := .(protoreflect.ExtensionType); {
if !() {
return
}
}
}
}
func ( *Types) ( protoreflect.FullName) int {
if == nil {
return 0
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
return len(.extensionsByMessage[])
}
func ( *Types) ( protoreflect.FullName, func(protoreflect.ExtensionType) bool) {
if == nil {
return
}
if == GlobalTypes {
globalMutex.RLock()
defer globalMutex.RUnlock()
}
for , := range .extensionsByMessage[] {
if !() {
return
}
}
}
func ( interface{}) string {
switch .(type) {
case protoreflect.EnumType:
return "enum"
case protoreflect.MessageType:
return "message"
case protoreflect.ExtensionType:
return "extension"
default:
return fmt.Sprintf("%T", )
}
}
func ( error, , interface{}) error {
:= goPackage()
:= goPackage()
if == "" || == "" || == {
return
}
return errors.New("%s\n\tpreviously from: %q\n\tcurrently from: %q", , , )
}
func ( interface{}) string {
switch d := .(type) {
case protoreflect.EnumType:
= .Descriptor()
case protoreflect.MessageType:
= .Descriptor()
case protoreflect.ExtensionType:
= .TypeDescriptor()
}
if , := .(protoreflect.Descriptor); {
= .ParentFile()
}
if , := .(interface{ () string }); {
return .()
}
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. |