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/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index bfa6e1b..0979ec0 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -6,7 +6,6 @@
 
 import (
 	"reflect"
-	"sync"
 
 	"google.golang.org/protobuf/internal/encoding/messageset"
 	ptag "google.golang.org/protobuf/internal/encoding/tag"
@@ -16,36 +15,6 @@
 	piface "google.golang.org/protobuf/runtime/protoiface"
 )
 
-var legacyExtensionInfoCache sync.Map // map[protoreflect.ExtensionType]*ExtensionInfo
-
-// legacyExtensionDescFromType converts a protoreflect.ExtensionType to an
-// ExtensionInfo. The returned ExtensionInfo must not be mutated.
-func legacyExtensionDescFromType(xt pref.ExtensionType) *ExtensionInfo {
-	// Fast-path: check whether this is an ExtensionInfo.
-	if xt, ok := xt.(*ExtensionInfo); ok {
-		return xt
-	}
-
-	// Fast-path: check the cache for whether this ExtensionType has already
-	// been converted to an ExtensionInfo.
-	if d, ok := legacyExtensionInfoCache.Load(xt); ok {
-		return d.(*ExtensionInfo)
-	}
-
-	tt := xt.GoType()
-	if xt.TypeDescriptor().Cardinality() == pref.Repeated {
-		tt = tt.Elem().Elem()
-	}
-	xi := &ExtensionInfo{}
-	InitExtensionInfo(xi, xt.TypeDescriptor().Descriptor(), tt)
-	xi.lazyInit() // populate legacy fields
-
-	if xi, ok := legacyExtensionInfoCache.LoadOrStore(xt, xi); ok {
-		return xi.(*ExtensionInfo)
-	}
-	return xi
-}
-
 func (xi *ExtensionInfo) initToLegacy() {
 	xd := xi.desc
 	var parent piface.MessageV1
@@ -134,7 +103,7 @@
 	xd.L0.ParentFile = filedesc.SurrogateProto2
 	xd.L0.FullName = pref.FullName(xi.Name)
 	xd.L1.Number = pref.FieldNumber(xi.Field)
-	xd.L2.Cardinality = fd.L1.Cardinality
+	xd.L1.Cardinality = fd.L1.Cardinality
 	xd.L1.Kind = fd.L1.Kind
 	xd.L2.IsPacked = fd.L1.IsPacked
 	xd.L2.Default = fd.L1.Default
@@ -151,6 +120,6 @@
 	if isOptional {
 		tt = tt.Elem()
 	}
-	xi.desc = xd
 	xi.goType = tt
+	xi.desc = extensionTypeDescriptor{xd, xi}
 }