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:
Joe Tsai 2019-06-24 16:19:06 -07:00 committed by Joe Tsai
parent 1ffc47f77e
commit e407ee162b
5 changed files with 37 additions and 111 deletions

View File

@ -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
}
}

View File

@ -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
}

View File

@ -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
}
)

View File

@ -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
}

View File

@ -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.