reflect/prototype: initial commit

Add the prototype package which provides constructors for
protoreflect.{Enum,Message,Extension}Type.

Switch all usages of the internal/prototype equivalent to the new package.
Switch all custom implementions of {Enum,Message}Type to the new package.

Change-Id: Ia9dae6fed4f2b90e55c123627044a7faf098c4b1
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/178438
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/legacy_hook.go b/internal/impl/legacy_hook.go
index f3ffe63..98eaf2f 100644
--- a/internal/impl/legacy_hook.go
+++ b/internal/impl/legacy_hook.go
@@ -4,14 +4,39 @@
 
 package impl
 
-import pvalue "google.golang.org/protobuf/internal/value"
+import (
+	"reflect"
+
+	pvalue "google.golang.org/protobuf/internal/value"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+	piface "google.golang.org/protobuf/runtime/protoiface"
+)
 
 // TODO: Add a default LegacyWrapper that panics with a more helpful message?
-var legacyWrapper pvalue.LegacyWrapper
+var legacyWrapper LegacyWrapper
 
 // RegisterLegacyWrapper registers a set of constructor functions that are
 // called when a legacy enum or message is encountered that does not natively
 // support the protobuf reflection APIs.
-func RegisterLegacyWrapper(w pvalue.LegacyWrapper) {
+func RegisterLegacyWrapper(w LegacyWrapper) {
 	legacyWrapper = w
 }
+
+// LegacyWrapper is a set of wrapper methods that wraps legacy v1 Go types
+// to implement the v2 reflection APIs.
+type LegacyWrapper interface {
+	NewConverter(reflect.Type, pref.Kind) pvalue.Converter
+
+	EnumOf(interface{}) pref.Enum
+	EnumTypeOf(interface{}) pref.EnumType
+	EnumDescriptorOf(interface{}) pref.EnumDescriptor
+
+	MessageOf(interface{}) pref.Message
+	MessageTypeOf(interface{}) pref.MessageType
+	MessageDescriptorOf(interface{}) pref.MessageDescriptor
+
+	// TODO: Remove these eventually.
+	// See the TODOs in internal/impl/legacy_extension.go.
+	ExtensionDescFromType(pref.ExtensionType) *piface.ExtensionDescV1
+	ExtensionTypeFromDesc(*piface.ExtensionDescV1) pref.ExtensionType
+}