internal/legacy: remove dependency on descriptor.proto

We jump through many hoops to avoid generated protos depending on
internal/legacy. Break the cycle in the other direction: Remove
the dependency on descriptor.proto from internal/legacy by
using a hand-written parser for the few descriptor fields we need.

Still to do: Remove the descriptor.proto dependency from
internal/encoding/tag.

Change-Id: I5fd99a2170470ba8530eb2679b6dde899821bf3e
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/171457
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/legacy/enum.go b/internal/legacy/enum.go
index 831b94c..0ee397f 100644
--- a/internal/legacy/enum.go
+++ b/internal/legacy/enum.go
@@ -13,8 +13,6 @@
 	ptype "github.com/golang/protobuf/v2/internal/prototype"
 	pvalue "github.com/golang/protobuf/v2/internal/value"
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
-
-	descriptorpb "github.com/golang/protobuf/v2/types/descriptor"
 )
 
 // wrapEnum wraps v as a protoreflect.Enum,
@@ -107,7 +105,7 @@
 	}
 	if ed, ok := ev.(enumV1); ok {
 		b, idxs := ed.EnumDescriptor()
-		fd := LoadFileDesc(b)
+		fd := loadFileDesc(b)
 
 		// Derive syntax.
 		switch fd.GetSyntax() {
@@ -118,7 +116,7 @@
 		}
 
 		// Derive the full name and correct enum descriptor.
-		var ed *descriptorpb.EnumDescriptorProto
+		var ed *enumDescriptorProto
 		e.FullName = pref.FullName(fd.GetPackage())
 		if len(idxs) == 1 {
 			ed = fd.EnumType[idxs[0]]
@@ -135,7 +133,7 @@
 		}
 
 		// Derive the enum values.
-		for _, vd := range ed.GetValue() {
+		for _, vd := range ed.Value {
 			e.Values = append(e.Values, ptype.EnumValue{
 				Name:   pref.Name(vd.GetName()),
 				Number: pref.EnumNumber(vd.GetNumber()),