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>
diff --git a/reflect/protodesc/protodesc.go b/reflect/protodesc/protodesc.go
index 4135ade..187eb8b 100644
--- a/reflect/protodesc/protodesc.go
+++ b/reflect/protodesc/protodesc.go
@@ -13,11 +13,18 @@
 	"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 @@
 //
 // 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 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 @@
 	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 @@
 	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 @@
 	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 @@
 // 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 @@
 	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)
 	}
diff --git a/reflect/protodesc/toproto.go b/reflect/protodesc/toproto.go
index 99bcaea..772b65a 100644
--- a/reflect/protodesc/toproto.go
+++ b/reflect/protodesc/toproto.go
@@ -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 (