internal: simplify ExtensionInfo initialization

This CL:
* Make the meaning of impl/ExtensionInfo.goType consistent. Before,
it was sometimes a T and other times a []T depending on the current
state of initialization. Change it so that it is the constructor's
responsibility to pass in a []T if it is repeated.
* Make internal/filetype responsible for constructing a []T for
repeated extension fields.
* Makes filedesc/Extension.Cardinality one of the eagerly initialized
pieces of information since it is useful to internal/filetype.
* Unify ExtensionInfo.desc and ExtensionInfo.tdesc.ExtensionField,
which held the same information.
* Remove the internal implementation for impl.X.ExtensionDescFromType
since we are dropping support for this from v1.

Change-Id: Ie95c4de66cd674c1d886da4f63b133b7d763c7ef
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/195777
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/filedesc/desc.go b/internal/filedesc/desc.go
index 86f24f0..0ee518e 100644
--- a/internal/filedesc/desc.go
+++ b/internal/filedesc/desc.go
@@ -355,18 +355,18 @@
 		L2 *ExtensionL2 // protected by fileDesc.once
 	}
 	ExtensionL1 struct {
-		Number   pref.FieldNumber
-		Extendee pref.MessageDescriptor
-		Kind     pref.Kind
+		Number      pref.FieldNumber
+		Extendee    pref.MessageDescriptor
+		Cardinality pref.Cardinality
+		Kind        pref.Kind
 	}
 	ExtensionL2 struct {
-		Options     func() pref.ProtoMessage
-		Cardinality pref.Cardinality
-		JSONName    jsonName
-		IsPacked    bool // promoted from google.protobuf.FieldOptions
-		Default     defaultValue
-		Enum        pref.EnumDescriptor
-		Message     pref.MessageDescriptor
+		Options  func() pref.ProtoMessage
+		JSONName jsonName
+		IsPacked bool // promoted from google.protobuf.FieldOptions
+		Default  defaultValue
+		Enum     pref.EnumDescriptor
+		Message  pref.MessageDescriptor
 	}
 )
 
@@ -377,7 +377,7 @@
 	return descopts.Field
 }
 func (xd *Extension) Number() pref.FieldNumber                   { return xd.L1.Number }
-func (xd *Extension) Cardinality() pref.Cardinality              { return xd.lazyInit().Cardinality }
+func (xd *Extension) Cardinality() pref.Cardinality              { return xd.L1.Cardinality }
 func (xd *Extension) Kind() pref.Kind                            { return xd.L1.Kind }
 func (xd *Extension) HasJSONName() bool                          { return xd.lazyInit().JSONName.has }
 func (xd *Extension) JSONName() string                           { return xd.lazyInit().JSONName.get(xd) }
diff --git a/internal/filedesc/desc_init.go b/internal/filedesc/desc_init.go
index 90357bc..1b6daf0 100644
--- a/internal/filedesc/desc_init.go
+++ b/internal/filedesc/desc_init.go
@@ -379,6 +379,8 @@
 			switch num {
 			case fieldnum.FieldDescriptorProto_Number:
 				xd.L1.Number = pref.FieldNumber(v)
+			case fieldnum.FieldDescriptorProto_Label:
+				xd.L1.Cardinality = pref.Cardinality(v)
 			case fieldnum.FieldDescriptorProto_Type:
 				xd.L1.Kind = pref.Kind(v)
 			}
diff --git a/internal/filedesc/desc_lazy.go b/internal/filedesc/desc_lazy.go
index a9f9002..b989092 100644
--- a/internal/filedesc/desc_lazy.go
+++ b/internal/filedesc/desc_lazy.go
@@ -537,13 +537,6 @@
 		num, typ, n := wire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
-			b = b[m:]
-			switch num {
-			case fieldnum.FieldDescriptorProto_Label:
-				xd.L2.Cardinality = pref.Cardinality(v)
-			}
 		case wire.BytesType:
 			v, m := wire.ConsumeBytes(b)
 			b = b[m:]