internal/filedesc, internal/filetype: initial commit

The internal/fileinit package is split apart into two packages:
* internal/filedesc constructs descriptors from the raw proto.
It is very similar to the previous internal/fileinit package.
* internal/filetype wraps descriptors with Go type information

Overview:
* The internal/fileinit package will be deleted in a future CL.
It is kept around since the v1 repo currently depends on it.
* The internal/prototype package is deleted. All former usages of it
are now using internal/filedesc instead. Most significantly,
the reflect/protodesc package was almost entirely re-written.
* The internal/impl package drops support for messages that do not
have a Descriptor method (pre-2016). This removes a significant amount
of technical debt.
filedesc.Builder to parse raw descriptors.
* The internal/encoding/defval package now handles enum values by name.

Change-Id: I3957bcc8588a70470fd6c7de1122216b80615ab7
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/182360
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/cmd/pbdump/pbdump_test.go b/internal/cmd/pbdump/pbdump_test.go
index 57ec1b5..a3f6998 100644
--- a/internal/cmd/pbdump/pbdump_test.go
+++ b/internal/cmd/pbdump/pbdump_test.go
@@ -9,13 +9,22 @@
 	"strings"
 	"testing"
 
-	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-cmp/cmp/cmpopts"
-
-	ptype "google.golang.org/protobuf/internal/prototype"
+	"google.golang.org/protobuf/encoding/prototext"
+	"google.golang.org/protobuf/proto"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+
+	"google.golang.org/protobuf/types/descriptorpb"
 )
 
+func mustMakeMessage(s string) *descriptorpb.DescriptorProto {
+	s = fmt.Sprintf(`name:"test.proto" syntax:"proto2" message_type:[{%s}]`, s)
+	pb := new(descriptorpb.FileDescriptorProto)
+	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
+		panic(err)
+	}
+	return pb.MessageType[0]
+}
+
 func TestFields(t *testing.T) {
 	type fieldsKind struct {
 		kind   pref.Kind
@@ -23,11 +32,11 @@
 	}
 	tests := []struct {
 		inFields []fieldsKind
-		wantMsg  ptype.Message
+		wantMsg  *descriptorpb.DescriptorProto
 		wantErr  string
 	}{{
 		inFields: []fieldsKind{{pref.MessageKind, ""}},
-		wantMsg:  ptype.Message{Name: "M"},
+		wantMsg:  mustMakeMessage(`name:"M"`),
 	}, {
 		inFields: []fieldsKind{{pref.MessageKind, "987654321"}},
 		wantErr:  "invalid field: 987654321",
@@ -52,44 +61,33 @@
 			{pref.MessageKind, "  10.20.30, 10.21   "},
 			{pref.GroupKind, "10"},
 		},
-		wantMsg: ptype.Message{
-			Name: "M",
-			Fields: []ptype.Field{
-				{Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.GroupKind, MessageType: ptype.PlaceholderMessage("M.M10")},
-			},
-			Messages: []ptype.Message{{
-				Name: "M10",
-				Fields: []ptype.Field{
-					{Name: "f20", Number: 20, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20")},
-					{Name: "f21", Number: 21, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M21")},
-				},
-				Messages: []ptype.Message{{
-					Name: "M20",
-					Fields: []ptype.Field{
-						{Name: "f30", Number: 30, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20.M30")},
-						{Name: "f31", Number: 31, Cardinality: pref.Repeated, Kind: pref.Int32Kind},
-					},
-					Messages: []ptype.Message{{
-						Name: "M30",
-					}},
+		wantMsg: mustMakeMessage(`
+			name: "M"
+			field: [
+				{name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_GROUP type_name:".M.M10"}
+			]
+			nested_type: [{
+				name: "M10"
+				field: [
+					{name:"f20" number:20 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".M.M10.M20"},
+					{name:"f21" number:21 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".M.M10.M21"}
+				]
+				nested_type: [{
+					name: "M20"
+					field:[
+						{name:"f30" number:30 label:LABEL_OPTIONAL type:TYPE_MESSAGE, type_name:".M.M10.M20.M30"},
+						{name:"f31" number:31 label:LABEL_REPEATED type:TYPE_INT32 options:{packed:true}}
+					]
+					nested_type: [{
+						name: "M30"
+					}]
 				}, {
-					Name: "M21",
-				}},
-			}},
-		},
+					name: "M21"
+				}]
+			}]
+		`),
 	}}
 
-	opts := cmp.Options{
-		cmp.Comparer(func(x, y pref.Descriptor) bool {
-			if x == nil || y == nil {
-				return x == nil && y == nil
-			}
-			return x.FullName() == y.FullName()
-		}),
-		cmpopts.IgnoreFields(ptype.Field{}, "Default"),
-		cmpopts.IgnoreFields(ptype.Field{}, "Options"),
-		cmpopts.IgnoreUnexported(ptype.Message{}, ptype.Field{}),
-	}
 	for _, tt := range tests {
 		t.Run("", func(t *testing.T) {
 			var fields fields
@@ -106,8 +104,8 @@
 				t.Errorf("all Set calls succeeded, want %v error", tt.wantErr)
 			}
 			gotMsg := fields.messageDescriptor("M")
-			if diff := cmp.Diff(tt.wantMsg, gotMsg, opts); diff != "" {
-				t.Errorf("messageDescriptor() mismatch (-want +got):\n%v", diff)
+			if !proto.Equal(gotMsg, tt.wantMsg) {
+				t.Errorf("messageDescriptor() mismatch:\ngot  %v\nwant %v", gotMsg, tt.wantMsg)
 			}
 			if _, err := fields.Descriptor(); err != nil {
 				t.Errorf("Descriptor() = %v, want nil error", err)