all: make use of the protoapi package in v1

The new v1 protoapi package enables:
* Referencing types in the protoapi package instead of protoV1, which further
reduces the number of situations where we need to depend on protoV1.
This is for the goal of eventually breaking all cases where the v2 implementation
relies on v1, so that in the near future, proto v1 can rely on proto v2 instead.
* Removes the need for legacy_extension_hack.go since that functionality has now
been exported into the protoapi package.

Change-Id: If71002d9ec711bfabfe494636829df9abf19e23e
Reviewed-on: https://go-review.googlesource.com/c/151403
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index a7a28cf..86d1bac 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -8,7 +8,7 @@
 	"fmt"
 	"reflect"
 
-	protoV1 "github.com/golang/protobuf/proto"
+	papi "github.com/golang/protobuf/protoapi"
 	ptag "github.com/golang/protobuf/v2/internal/encoding/tag"
 	pvalue "github.com/golang/protobuf/v2/internal/value"
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
@@ -25,14 +25,40 @@
 	}
 }
 
+var (
+	extTypeA = reflect.TypeOf(map[int32]papi.ExtensionField(nil))
+	extTypeB = reflect.TypeOf(papi.XXX_InternalExtensions{})
+)
+
+func makeLegacyExtensionMapFunc(t reflect.Type) func(*messageDataType) papi.ExtensionFields {
+	fx1, _ := t.FieldByName("XXX_extensions")
+	fx2, _ := t.FieldByName("XXX_InternalExtensions")
+	switch {
+	case fx1.Type == extTypeA:
+		fieldOffset := offsetOf(fx1)
+		return func(p *messageDataType) papi.ExtensionFields {
+			v := p.p.apply(fieldOffset).asType(fx1.Type).Interface()
+			return papi.ExtensionFieldsOf(v)
+		}
+	case fx2.Type == extTypeB:
+		fieldOffset := offsetOf(fx2)
+		return func(p *messageDataType) papi.ExtensionFields {
+			v := p.p.apply(fieldOffset).asType(fx2.Type).Interface()
+			return papi.ExtensionFieldsOf(v)
+		}
+	default:
+		return nil
+	}
+}
+
 type legacyExtensionFields struct {
 	mi *MessageType
-	x  legacyExtensionIface
+	x  papi.ExtensionFields
 }
 
 func (p legacyExtensionFields) Len() (n int) {
-	p.x.Range(func(num pref.FieldNumber, _ legacyExtensionEntry) bool {
-		if p.Has(num) {
+	p.x.Range(func(num pref.FieldNumber, _ papi.ExtensionField) bool {
+		if p.Has(pref.FieldNumber(num)) {
 			n++
 		}
 		return true
@@ -42,73 +68,73 @@
 
 func (p legacyExtensionFields) Has(n pref.FieldNumber) bool {
 	x := p.x.Get(n)
-	if x.val == nil {
+	if x.Value == nil {
 		return false
 	}
-	t := legacyExtensionTypeOf(x.desc)
+	t := legacyExtensionTypeOf(x.Desc)
 	if t.Cardinality() == pref.Repeated {
-		return t.ValueOf(x.val).List().Len() > 0
+		return t.ValueOf(x.Value).List().Len() > 0
 	}
 	return true
 }
 
 func (p legacyExtensionFields) Get(n pref.FieldNumber) pref.Value {
 	x := p.x.Get(n)
-	if x.desc == nil {
+	if x.Desc == nil {
 		return pref.Value{}
 	}
-	t := legacyExtensionTypeOf(x.desc)
-	if x.val == nil {
-		// NOTE: x.val is never nil for Lists since they are always populated
+	t := legacyExtensionTypeOf(x.Desc)
+	if x.Value == nil {
+		// NOTE: x.Value is never nil for Lists since they are always populated
 		// during ExtensionFieldTypes.Register.
 		if t.Kind() == pref.MessageKind || t.Kind() == pref.GroupKind {
 			return pref.Value{}
 		}
 		return t.Default()
 	}
-	return t.ValueOf(x.val)
+	return t.ValueOf(x.Value)
 }
 
 func (p legacyExtensionFields) Set(n pref.FieldNumber, v pref.Value) {
 	x := p.x.Get(n)
-	if x.desc == nil {
+	if x.Desc == nil {
 		panic("no extension descriptor registered")
 	}
-	t := legacyExtensionTypeOf(x.desc)
-	x.val = t.InterfaceOf(v)
+	t := legacyExtensionTypeOf(x.Desc)
+	x.Value = t.InterfaceOf(v)
 	p.x.Set(n, x)
 }
 
 func (p legacyExtensionFields) Clear(n pref.FieldNumber) {
 	x := p.x.Get(n)
-	if x.desc == nil {
+	if x.Desc == nil {
 		return
 	}
-	t := legacyExtensionTypeOf(x.desc)
+	t := legacyExtensionTypeOf(x.Desc)
 	if t.Cardinality() == pref.Repeated {
-		t.ValueOf(x.val).List().Truncate(0)
+		t.ValueOf(x.Value).List().Truncate(0)
 		return
 	}
-	x.val = nil
+	x.Value = nil
 	p.x.Set(n, x)
 }
 
 func (p legacyExtensionFields) Mutable(n pref.FieldNumber) pref.Mutable {
 	x := p.x.Get(n)
-	if x.desc == nil {
+	if x.Desc == nil {
 		panic("no extension descriptor registered")
 	}
-	t := legacyExtensionTypeOf(x.desc)
-	if x.val == nil {
+	t := legacyExtensionTypeOf(x.Desc)
+	if x.Value == nil {
 		v := t.ValueOf(t.New())
-		x.val = t.InterfaceOf(v)
+		x.Value = t.InterfaceOf(v)
 		p.x.Set(n, x)
 	}
-	return t.ValueOf(x.val).Interface().(pref.Mutable)
+	return t.ValueOf(x.Value).Interface().(pref.Mutable)
 }
 
 func (p legacyExtensionFields) Range(f func(pref.FieldNumber, pref.Value) bool) {
-	p.x.Range(func(n pref.FieldNumber, x legacyExtensionEntry) bool {
+	p.x.Range(func(n pref.FieldNumber, x papi.ExtensionField) bool {
 		if p.Has(n) {
 			return f(n, p.Get(n))
 		}
@@ -123,8 +149,8 @@
 type legacyExtensionTypes legacyExtensionFields
 
 func (p legacyExtensionTypes) Len() (n int) {
-	p.x.Range(func(_ pref.FieldNumber, x legacyExtensionEntry) bool {
-		if x.desc != nil {
+	p.x.Range(func(_ pref.FieldNumber, x papi.ExtensionField) bool {
+		if x.Desc != nil {
 			n++
 		}
 		return true
@@ -140,14 +166,14 @@
 		panic("invalid extension field number")
 	}
 	x := p.x.Get(t.Number())
-	if x.desc != nil {
+	if x.Desc != nil {
 		panic("extension descriptor already registered")
 	}
-	x.desc = legacyExtensionDescOf(t, p.mi.goType)
+	x.Desc = legacyExtensionDescOf(t, p.mi.goType)
 	if t.Cardinality() == pref.Repeated {
 		// If the field is repeated, initialize the entry with an empty list
 		// so that future Get operations can return a mutable and concrete list.
-		x.val = t.InterfaceOf(t.ValueOf(t.New()))
+		x.Value = t.InterfaceOf(t.ValueOf(t.New()))
 	}
 	p.x.Set(t.Number(), x)
 }
@@ -159,16 +185,16 @@
 	x := p.x.Get(t.Number())
 	if t.Cardinality() == pref.Repeated {
 		// Treat an empty repeated field as unpopulated.
-		v := reflect.ValueOf(x.val)
-		if x.val == nil || v.IsNil() || v.Elem().Len() == 0 {
-			x.val = nil
+		v := reflect.ValueOf(x.Value)
+		if x.Value == nil || v.IsNil() || v.Elem().Len() == 0 {
+			x.Value = nil
 		}
 	}
-	if x.val != nil {
+	if x.Value != nil {
 		panic("value for extension descriptor still populated")
 	}
-	x.desc = nil
-	if len(x.raw) == 0 {
+	x.Desc = nil
+	if len(x.Raw) == 0 {
 		p.x.Clear(t.Number())
 	} else {
 		p.x.Set(t.Number(), x)
@@ -177,16 +203,16 @@
 
 func (p legacyExtensionTypes) ByNumber(n pref.FieldNumber) pref.ExtensionType {
 	x := p.x.Get(n)
-	if x.desc != nil {
-		return legacyExtensionTypeOf(x.desc)
+	if x.Desc != nil {
+		return legacyExtensionTypeOf(x.Desc)
 	}
 	return nil
 }
 
 func (p legacyExtensionTypes) ByName(s pref.FullName) (t pref.ExtensionType) {
-	p.x.Range(func(_ pref.FieldNumber, x legacyExtensionEntry) bool {
-		if x.desc != nil && x.desc.Name == string(s) {
-			t = legacyExtensionTypeOf(x.desc)
+	p.x.Range(func(_ pref.FieldNumber, x papi.ExtensionField) bool {
+		if x.Desc != nil && x.Desc.Name == string(s) {
+			t = legacyExtensionTypeOf(x.Desc)
 			return false
 		}
 		return true
@@ -195,9 +221,9 @@
 }
 
 func (p legacyExtensionTypes) Range(f func(pref.ExtensionType) bool) {
-	p.x.Range(func(_ pref.FieldNumber, x legacyExtensionEntry) bool {
-		if x.desc != nil {
-			if !f(legacyExtensionTypeOf(x.desc)) {
+	p.x.Range(func(_ pref.FieldNumber, x papi.ExtensionField) bool {
+		if x.Desc != nil {
+			if !f(legacyExtensionTypeOf(x.Desc)) {
 				return false
 			}
 		}
@@ -205,7 +231,7 @@
 	})
 }
 
-func legacyExtensionDescOf(t pref.ExtensionType, parent reflect.Type) *protoV1.ExtensionDesc {
+func legacyExtensionDescOf(t pref.ExtensionType, parent reflect.Type) *papi.ExtensionDesc {
 	if t, ok := t.(*legacyExtensionType); ok {
 		return t.desc
 	}
@@ -235,8 +261,8 @@
 	}
 
 	// Construct and return a v1 ExtensionDesc.
-	return &protoV1.ExtensionDesc{
-		ExtendedType:  reflect.Zero(parent).Interface().(protoV1.Message),
+	return &papi.ExtensionDesc{
+		ExtendedType:  reflect.Zero(parent).Interface().(papi.Message),
 		ExtensionType: reflect.Zero(extType).Interface(),
 		Field:         int32(t.Number()),
 		Name:          string(t.FullName()),
@@ -244,8 +270,10 @@
 	}
 }
 
-func legacyExtensionTypeOf(d *protoV1.ExtensionDesc) pref.ExtensionType {
-	// TODO: Add a field to protoV1.ExtensionDesc to contain a v2 descriptor.
+func legacyExtensionTypeOf(d *papi.ExtensionDesc) pref.ExtensionType {
+	if d.Type != nil {
+		return d.Type
+	}
 
 	// Derive basic field information from the struct tag.
 	t := reflect.TypeOf(d.ExtensionType)
@@ -330,7 +358,7 @@
 
 type legacyExtensionType struct {
 	pref.ExtensionType
-	desc        *protoV1.ExtensionDesc
+	desc        *papi.ExtensionDesc
 	typ         reflect.Type
 	new         func() interface{}
 	valueOf     func(interface{}) pref.Value