mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-04-17 11:42:38 +00:00
reflect/protoregistry: remove Files.Find{Enum,Message,Extension,Service}ByName
This is a breaking change. The replacement is the Files.FindDescriptorByName method, which is more flexible as it handles all descriptor types. Change-Id: I2ccd544a7630396a2428b1d41f836c5246070912 Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/183700 Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
parent
1ffc47f77e
commit
e407ee162b
@ -40,8 +40,7 @@ type DescBuilder struct {
|
||||
// If nil, it uses protoregistry.GlobalFiles.
|
||||
FileRegistry interface {
|
||||
FindFileByPath(string) (protoreflect.FileDescriptor, error)
|
||||
FindEnumByName(pref.FullName) (pref.EnumDescriptor, error)
|
||||
FindMessageByName(pref.FullName) (pref.MessageDescriptor, error)
|
||||
FindDescriptorByName(pref.FullName) (pref.Descriptor, error)
|
||||
Register(...pref.FileDescriptor) error
|
||||
}
|
||||
}
|
||||
|
@ -33,8 +33,8 @@ func (file *File) resolveMessages() {
|
||||
// Weak fields are only resolved by name.
|
||||
if fd.L1.IsWeak {
|
||||
r := file.builder.FileRegistry
|
||||
if md, _ := r.FindMessageByName(fd.L1.Message.FullName()); md != nil {
|
||||
fd.L1.Message = md
|
||||
if d, _ := r.FindDescriptorByName(fd.L1.Message.FullName()); d != nil {
|
||||
fd.L1.Message = d.(pref.MessageDescriptor)
|
||||
}
|
||||
continue
|
||||
}
|
||||
@ -106,8 +106,8 @@ func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref
|
||||
return ed2
|
||||
}
|
||||
}
|
||||
if ed2, _ := r.FindEnumByName(ed.FullName()); ed2 != nil {
|
||||
return ed2
|
||||
if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil {
|
||||
return d.(pref.EnumDescriptor)
|
||||
}
|
||||
return ed
|
||||
}
|
||||
@ -124,8 +124,8 @@ func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32
|
||||
return md2
|
||||
}
|
||||
}
|
||||
if md2, _ := r.FindMessageByName(md.FullName()); md2 != nil {
|
||||
return md2
|
||||
if d, _ := r.FindDescriptorByName(md.FullName()); d != nil {
|
||||
return d.(pref.MessageDescriptor)
|
||||
}
|
||||
return md
|
||||
}
|
||||
|
@ -274,8 +274,7 @@ type (
|
||||
}
|
||||
fileRegistry interface {
|
||||
FindFileByPath(string) (pref.FileDescriptor, error)
|
||||
FindEnumByName(pref.FullName) (pref.EnumDescriptor, error)
|
||||
FindMessageByName(pref.FullName) (pref.MessageDescriptor, error)
|
||||
FindDescriptorByName(pref.FullName) (pref.Descriptor, error)
|
||||
Register(...pref.FileDescriptor) error
|
||||
}
|
||||
)
|
||||
|
@ -22,10 +22,7 @@ import (
|
||||
// It is implemented by protoregistry.Files.
|
||||
type Resolver interface {
|
||||
FindFileByPath(string) (protoreflect.FileDescriptor, error)
|
||||
FindEnumByName(protoreflect.FullName) (protoreflect.EnumDescriptor, error)
|
||||
FindMessageByName(protoreflect.FullName) (protoreflect.MessageDescriptor, error)
|
||||
|
||||
// TODO: use FindDescriptorByName instead.
|
||||
FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error)
|
||||
}
|
||||
|
||||
// TODO: Should we be responsible for validating other parts of the descriptor
|
||||
@ -460,24 +457,11 @@ func (r resolver) FindFileByPath(s string) (protoreflect.FileDescriptor, error)
|
||||
return r.remote.FindFileByPath(s)
|
||||
}
|
||||
|
||||
func (r resolver) FindEnumByName(s protoreflect.FullName) (protoreflect.EnumDescriptor, error) {
|
||||
func (r resolver) FindDescriptorByName(s protoreflect.FullName) (protoreflect.Descriptor, error) {
|
||||
if d, ok := r.local[s]; ok {
|
||||
if ed, ok := d.(protoreflect.EnumDescriptor); ok {
|
||||
return ed, nil
|
||||
}
|
||||
return nil, errors.New("found wrong type")
|
||||
return d, nil
|
||||
}
|
||||
return r.remote.FindEnumByName(s)
|
||||
}
|
||||
|
||||
func (r resolver) FindMessageByName(s protoreflect.FullName) (protoreflect.MessageDescriptor, error) {
|
||||
if d, ok := r.local[s]; ok {
|
||||
if md, ok := d.(protoreflect.MessageDescriptor); ok {
|
||||
return md, nil
|
||||
}
|
||||
return nil, errors.New("found wrong type")
|
||||
}
|
||||
return r.remote.FindMessageByName(s)
|
||||
return r.remote.FindDescriptorByName(s)
|
||||
}
|
||||
|
||||
type importSet map[string]bool
|
||||
@ -513,11 +497,33 @@ func (is importSet) check(d protoreflect.Descriptor) error {
|
||||
// scoping rules.
|
||||
|
||||
func findEnumDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.EnumDescriptor, error) {
|
||||
d, err := findDescriptor(s, isWeak, imps, r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if ed, ok := d.(protoreflect.EnumDescriptor); ok {
|
||||
return ed, nil
|
||||
}
|
||||
return nil, errors.New("invalid descriptor type")
|
||||
}
|
||||
|
||||
func findMessageDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.MessageDescriptor, error) {
|
||||
d, err := findDescriptor(s, isWeak, imps, r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if md, ok := d.(protoreflect.MessageDescriptor); ok {
|
||||
return md, nil
|
||||
}
|
||||
return nil, errors.New("invalid descriptor type")
|
||||
}
|
||||
|
||||
func findDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.Descriptor, error) {
|
||||
if !strings.HasPrefix(s, ".") {
|
||||
return nil, errors.New("identifier name must be fully qualified with a leading dot: %v", s)
|
||||
}
|
||||
name := protoreflect.FullName(strings.TrimPrefix(s, "."))
|
||||
ed, err := r.FindEnumByName(name)
|
||||
d, err := r.FindDescriptorByName(name)
|
||||
if err != nil {
|
||||
if err == protoregistry.NotFound {
|
||||
if isWeak {
|
||||
@ -529,31 +535,8 @@ func findEnumDescriptor(s string, isWeak bool, imps importSet, r Resolver) (prot
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
if err := imps.check(ed); err != nil {
|
||||
if err := imps.check(d); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ed, nil
|
||||
}
|
||||
|
||||
func findMessageDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.MessageDescriptor, error) {
|
||||
if !strings.HasPrefix(s, ".") {
|
||||
return nil, errors.New("identifier name must be fully qualified with a leading dot: %v", s)
|
||||
}
|
||||
name := protoreflect.FullName(strings.TrimPrefix(s, "."))
|
||||
md, err := r.FindMessageByName(name)
|
||||
if err != nil {
|
||||
if err == protoregistry.NotFound {
|
||||
if isWeak {
|
||||
return filedesc.PlaceholderMessage(name), nil
|
||||
}
|
||||
// TODO: This should be an error.
|
||||
return filedesc.PlaceholderMessage(name), nil
|
||||
// return nil, errors.New("could not resolve message: %v", name)
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
if err := imps.check(md); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return md, nil
|
||||
return d, nil
|
||||
}
|
||||
|
@ -218,61 +218,6 @@ func (s *nameSuffix) Pop() (name protoreflect.Name) {
|
||||
return name
|
||||
}
|
||||
|
||||
// FindEnumByName looks up an enum by the enum's full name.
|
||||
//
|
||||
// This returns (nil, NotFound) if not found.
|
||||
//
|
||||
// Deprecated: Use FindDescriptorByName instead.
|
||||
func (r *Files) FindEnumByName(name protoreflect.FullName) (protoreflect.EnumDescriptor, error) {
|
||||
d, _ := r.FindDescriptorByName(name)
|
||||
if d, ok := d.(protoreflect.EnumDescriptor); ok {
|
||||
return d, nil
|
||||
}
|
||||
return nil, NotFound
|
||||
}
|
||||
|
||||
// FindMessageByName looks up a message by the message's full name.
|
||||
//
|
||||
// This returns (nil, NotFound) if not found.
|
||||
//
|
||||
// Deprecated: Use FindDescriptorByName instead.
|
||||
func (r *Files) FindMessageByName(name protoreflect.FullName) (protoreflect.MessageDescriptor, error) {
|
||||
d, _ := r.FindDescriptorByName(name)
|
||||
if d, ok := d.(protoreflect.MessageDescriptor); ok {
|
||||
return d, nil
|
||||
}
|
||||
return nil, NotFound
|
||||
}
|
||||
|
||||
// FindExtensionByName looks up an extension field by the field's full name.
|
||||
// Note that this is the full name of the field as determined by
|
||||
// where the extension is declared and is unrelated to the full name of the
|
||||
// message being extended.
|
||||
//
|
||||
// This returns (nil, NotFound) if not found.
|
||||
//
|
||||
// Deprecated: Use FindDescriptorByName instead.
|
||||
func (r *Files) FindExtensionByName(name protoreflect.FullName) (protoreflect.ExtensionDescriptor, error) {
|
||||
d, _ := r.FindDescriptorByName(name)
|
||||
if d, ok := d.(protoreflect.ExtensionDescriptor); ok {
|
||||
return d, nil
|
||||
}
|
||||
return nil, NotFound
|
||||
}
|
||||
|
||||
// FindServiceByName looks up a service by the service's full name.
|
||||
//
|
||||
// This returns (nil, NotFound) if not found.
|
||||
//
|
||||
// Deprecated: Use FindDescriptorByName instead.
|
||||
func (r *Files) FindServiceByName(name protoreflect.FullName) (protoreflect.ServiceDescriptor, error) {
|
||||
d, _ := r.FindDescriptorByName(name)
|
||||
if d, ok := d.(protoreflect.ServiceDescriptor); ok {
|
||||
return d, nil
|
||||
}
|
||||
return nil, NotFound
|
||||
}
|
||||
|
||||
// FindFileByPath looks up a file by the path.
|
||||
//
|
||||
// This returns (nil, NotFound) if not found.
|
||||
|
Loading…
x
Reference in New Issue
Block a user