Kaynağa Gözat

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>
Joe Tsai 6 yıl önce
ebeveyn
işleme
e407ee162b

+ 1 - 2
internal/filedesc/build.go

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

+ 6 - 6
internal/filedesc/desc_lazy.go

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

+ 1 - 2
internal/filetype/build.go

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

+ 25 - 42
reflect/protodesc/protodesc.go

@@ -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) {
-	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 r.remote.FindEnumByName(s)
-}
-
-func (r resolver) FindMessageByName(s protoreflect.FullName) (protoreflect.MessageDescriptor, error) {
+func (r resolver) FindDescriptorByName(s protoreflect.FullName) (protoreflect.Descriptor, 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 d, nil
 	}
-	return r.remote.FindMessageByName(s)
+	return r.remote.FindDescriptorByName(s)
 }
 
 type importSet map[string]bool
@@ -513,47 +497,46 @@ func (is importSet) check(d protoreflect.Descriptor) error {
 // scoping rules.
 
 func findEnumDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.EnumDescriptor, 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 := findDescriptor(s, isWeak, imps, r)
 	if err != nil {
-		if err == protoregistry.NotFound {
-			if isWeak {
-				return filedesc.PlaceholderEnum(name), nil
-			}
-			// TODO: This should be an error.
-			return filedesc.PlaceholderEnum(name), nil
-			// return nil, errors.New("could not resolve enum: %v", name)
-		}
 		return nil, err
 	}
-	if err := imps.check(ed); err != nil {
-		return nil, err
+	if ed, ok := d.(protoreflect.EnumDescriptor); ok {
+		return ed, nil
 	}
-	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, "."))
-	md, err := r.FindMessageByName(name)
+	d, err := r.FindDescriptorByName(name)
 	if err != nil {
 		if err == protoregistry.NotFound {
 			if isWeak {
-				return filedesc.PlaceholderMessage(name), nil
+				return filedesc.PlaceholderEnum(name), nil
 			}
 			// TODO: This should be an error.
-			return filedesc.PlaceholderMessage(name), nil
-			// return nil, errors.New("could not resolve message: %v", name)
+			return filedesc.PlaceholderEnum(name), nil
+			// return nil, errors.New("could not resolve enum: %v", name)
 		}
 		return nil, err
 	}
-	if err := imps.check(md); err != nil {
+	if err := imps.check(d); err != nil {
 		return nil, err
 	}
-	return md, nil
+	return d, nil
 }

+ 0 - 55
reflect/protoregistry/registry.go

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