reflect/protodesc: use Resolver interface

CL/177044 switches the serialization APIs to take in a resolver interface.
This does the moral equivalent for protodesc.

This is technically a breaking change since the signature of NewFile changes.
However, it is unlikely that anything is affected by this.

Change-Id: I7b44d5c3d5570a17c052add4d229550e4a0ad163
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/182638
Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
Joe Tsai 2019-06-16 00:36:42 -07:00
parent 4a539f4e09
commit 5857a5ab4f
2 changed files with 16 additions and 8 deletions

View File

@ -13,11 +13,18 @@ import (
"google.golang.org/protobuf/internal/errors"
"google.golang.org/protobuf/internal/prototype"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/types/descriptorpb"
)
// Resolver is the resolver used by NewFile to resolve dependencies.
// 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: Should we be responsible for validating other parts of the descriptor
// that we don't directly use?
//
@ -45,7 +52,7 @@ import (
//
// The caller must relinquish full ownership of the input fd and must not
// access or mutate any fields.
func NewFile(fd *descriptorpb.FileDescriptorProto, r *protoregistry.Files) (protoreflect.FileDescriptor, error) {
func NewFile(fd *descriptorpb.FileDescriptorProto, r Resolver) (protoreflect.FileDescriptor, error) {
var f prototype.File
switch fd.GetSyntax() {
case "proto2", "":
@ -126,7 +133,7 @@ func addPublicImports(fd protoreflect.FileDescriptor, out importSet) {
}
}
func messagesFromDescriptorProto(mds []*descriptorpb.DescriptorProto, imps importSet, r *protoregistry.Files) (ms []prototype.Message, err error) {
func messagesFromDescriptorProto(mds []*descriptorpb.DescriptorProto, imps importSet, r Resolver) (ms []prototype.Message, err error) {
for _, md := range mds {
var m prototype.Message
m.Name = protoreflect.Name(md.GetName())
@ -244,7 +251,7 @@ func messagesFromDescriptorProto(mds []*descriptorpb.DescriptorProto, imps impor
return ms, nil
}
func enumsFromDescriptorProto(eds []*descriptorpb.EnumDescriptorProto, r *protoregistry.Files) (es []prototype.Enum, err error) {
func enumsFromDescriptorProto(eds []*descriptorpb.EnumDescriptorProto, r Resolver) (es []prototype.Enum, err error) {
for _, ed := range eds {
var e prototype.Enum
e.Name = protoreflect.Name(ed.GetName())
@ -280,7 +287,7 @@ func enumsFromDescriptorProto(eds []*descriptorpb.EnumDescriptorProto, r *protor
return es, nil
}
func extensionsFromDescriptorProto(xds []*descriptorpb.FieldDescriptorProto, imps importSet, r *protoregistry.Files) (xs []prototype.Extension, err error) {
func extensionsFromDescriptorProto(xds []*descriptorpb.FieldDescriptorProto, imps importSet, r Resolver) (xs []prototype.Extension, err error) {
for _, xd := range xds {
if xd.OneofIndex != nil {
return nil, errors.New("extension may not have oneof_index")
@ -322,7 +329,7 @@ func extensionsFromDescriptorProto(xds []*descriptorpb.FieldDescriptorProto, imp
return xs, nil
}
func servicesFromDescriptorProto(sds []*descriptorpb.ServiceDescriptorProto, imps importSet, r *protoregistry.Files) (ss []prototype.Service, err error) {
func servicesFromDescriptorProto(sds []*descriptorpb.ServiceDescriptorProto, imps importSet, r Resolver) (ss []prototype.Service, err error) {
for _, sd := range sds {
var s prototype.Service
s.Name = protoreflect.Name(sd.GetName())
@ -353,7 +360,7 @@ func servicesFromDescriptorProto(sds []*descriptorpb.ServiceDescriptorProto, imp
// simplifies our implementation as we won't need to implement C++'s namespace
// scoping rules.
func findMessageDescriptor(s string, imps importSet, r *protoregistry.Files) (protoreflect.MessageDescriptor, error) {
func findMessageDescriptor(s string, 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)
}
@ -368,7 +375,7 @@ func findMessageDescriptor(s string, imps importSet, r *protoregistry.Files) (pr
return md, nil
}
func findEnumDescriptor(s string, imps importSet, r *protoregistry.Files) (protoreflect.EnumDescriptor, error) {
func findEnumDescriptor(s string, 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)
}

View File

@ -1,6 +1,7 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package protodesc
import (