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>
This commit is contained in:
Joe Tsai 2018-11-27 17:25:04 -08:00 committed by Joe Tsai
parent 25cc69d405
commit f18ab539ab
8 changed files with 125 additions and 244 deletions

4
go.mod
View File

@ -1,7 +1,7 @@
module github.com/golang/protobuf/v2
require (
github.com/golang/protobuf v1.2.1-0.20181127190454-8d0c54c12466
github.com/golang/protobuf v1.2.1-0.20181129223256-87f1426e5305
github.com/google/go-cmp v0.2.1-0.20181101181452-745b8ec83783
golang.org/x/tools v0.0.0-20180904205237-0aa4b8830f48
golang.org/x/tools v0.0.0-20180928181343-b3c0be4c978b
)

11
go.sum
View File

@ -1,11 +1,12 @@
github.com/golang/protobuf v1.2.1-0.20181127190454-8d0c54c12466 h1:Kz9p8XEhFbEfi4ka99LEEwIXF4jqyIdB5fuh7UbMFj4=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.1-0.20181127190454-8d0c54c12466/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
github.com/google/go-cmp v0.2.1-0.20181101181452-745b8ec83783 h1:wVZ6laEGf86tNDTpR5mxFyFIclJJiXCxuJhcQKnsOHk=
github.com/golang/protobuf v1.2.1-0.20181129223256-87f1426e5305 h1:L8Akf3H3kki1x1DO8Yb3O47G/DspWKG8l8FPNP+Figk=
github.com/golang/protobuf v1.2.1-0.20181129223256-87f1426e5305/go.mod h1:asK8yRb/+zxJTE0SbTESCku/4OjiDfbPwk4rEyIatUA=
github.com/golang/protobuf/v2 v2.0.0-20181127193627-d7e97bc71bcb/go.mod h1:MgUD+N3FwzDmj2CdMsT5ap7K7jx+c9cQDQ7fVhmH+Xw=
github.com/google/go-cmp v0.2.1-0.20181101181452-745b8ec83783/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/tools v0.0.0-20180904205237-0aa4b8830f48 h1:PIz+xUHW4G/jqfFWeKhQ96ZV/t2HDsXfWj923rV0bZY=
golang.org/x/tools v0.0.0-20180904205237-0aa4b8830f48/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180928181343-b3c0be4c978b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=

View File

@ -8,7 +8,7 @@ import (
"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 @@ func makeLegacyExtensionFieldsFunc(t reflect.Type) func(p *messageDataType) pref
}
}
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) Len() (n int) {
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 @@ func (p legacyExtensionFields) ExtensionTypes() pref.ExtensionFieldTypes {
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 @@ func (p legacyExtensionTypes) Register(t pref.ExtensionType) {
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 @@ func (p legacyExtensionTypes) Remove(t pref.ExtensionType) {
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) Remove(t pref.ExtensionType) {
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) ByName(s pref.FullName) (t pref.ExtensionType) {
}
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 (p legacyExtensionTypes) Range(f func(pref.ExtensionType) bool) {
})
}
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 @@ func legacyExtensionDescOf(t pref.ExtensionType, parent reflect.Type) *protoV1.E
}
// 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 legacyExtensionDescOf(t pref.ExtensionType, parent reflect.Type) *protoV1.E
}
}
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 @@ func legacyExtensionTypeOf(d *protoV1.ExtensionDesc) pref.ExtensionType {
type legacyExtensionType struct {
pref.ExtensionType
desc *protoV1.ExtensionDesc
desc *papi.ExtensionDesc
typ reflect.Type
new func() interface{}
valueOf func(interface{}) pref.Value

View File

@ -1,143 +0,0 @@
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package impl
import (
"reflect"
"sync"
"unsafe"
protoV1 "github.com/golang/protobuf/proto"
pref "github.com/golang/protobuf/v2/reflect/protoreflect"
)
// TODO: The logic in the file is a hack and should be in the v1 repository.
// We need to break the dependency on proto v1 since it is v1 that will
// eventually need to depend on v2.
// TODO: The v1 API currently exposes no exported functionality for interacting
// with the extension data structures. We will need to make changes in v1 so
// that v2 can access these data structures without relying on unsafe.
var (
extTypeA = reflect.TypeOf(map[int32]protoV1.Extension(nil))
extTypeB = reflect.TypeOf(protoV1.XXX_InternalExtensions{})
)
type legacyExtensionIface interface {
Len() int
Has(pref.FieldNumber) bool
Get(pref.FieldNumber) legacyExtensionEntry
Set(pref.FieldNumber, legacyExtensionEntry)
Clear(pref.FieldNumber)
Range(f func(pref.FieldNumber, legacyExtensionEntry) bool)
}
func makeLegacyExtensionMapFunc(t reflect.Type) func(*messageDataType) legacyExtensionIface {
fx1, _ := t.FieldByName("XXX_extensions")
fx2, _ := t.FieldByName("XXX_InternalExtensions")
switch {
case fx1.Type == extTypeA:
return func(p *messageDataType) legacyExtensionIface {
rv := p.p.asType(t).Elem()
return (*legacyExtensionMap)(unsafe.Pointer(rv.UnsafeAddr() + fx1.Offset))
}
case fx2.Type == extTypeB:
return func(p *messageDataType) legacyExtensionIface {
rv := p.p.asType(t).Elem()
return (*legacyExtensionSyncMap)(unsafe.Pointer(rv.UnsafeAddr() + fx2.Offset))
}
default:
return nil
}
}
// TODO: We currently don't do locking with legacyExtensionSyncMap.p.mu.
// The locking behavior was already obscure "feature" beforehand,
// and it is not obvious how it translates to the v2 API.
// The v2 API presents a Range method, which calls a user provided function,
// which may in turn call other methods on the map. In such a use case,
// acquiring a lock within each method would result in a reentrant deadlock.
// legacyExtensionSyncMap is identical to protoV1.XXX_InternalExtensions.
// It implements legacyExtensionIface.
type legacyExtensionSyncMap struct {
p *struct {
mu sync.Mutex
m legacyExtensionMap
}
}
func (m legacyExtensionSyncMap) Len() int {
if m.p == nil {
return 0
}
return m.p.m.Len()
}
func (m legacyExtensionSyncMap) Has(n pref.FieldNumber) bool {
return m.p.m.Has(n)
}
func (m legacyExtensionSyncMap) Get(n pref.FieldNumber) legacyExtensionEntry {
if m.p == nil {
return legacyExtensionEntry{}
}
return m.p.m.Get(n)
}
func (m *legacyExtensionSyncMap) Set(n pref.FieldNumber, x legacyExtensionEntry) {
if m.p == nil {
m.p = new(struct {
mu sync.Mutex
m legacyExtensionMap
})
}
m.p.m.Set(n, x)
}
func (m legacyExtensionSyncMap) Clear(n pref.FieldNumber) {
m.p.m.Clear(n)
}
func (m legacyExtensionSyncMap) Range(f func(pref.FieldNumber, legacyExtensionEntry) bool) {
if m.p == nil {
return
}
m.p.m.Range(f)
}
// legacyExtensionMap is identical to map[int32]protoV1.Extension.
// It implements legacyExtensionIface.
type legacyExtensionMap map[pref.FieldNumber]legacyExtensionEntry
func (m legacyExtensionMap) Len() int {
return len(m)
}
func (m legacyExtensionMap) Has(n pref.FieldNumber) bool {
_, ok := m[n]
return ok
}
func (m legacyExtensionMap) Get(n pref.FieldNumber) legacyExtensionEntry {
return m[n]
}
func (m *legacyExtensionMap) Set(n pref.FieldNumber, x legacyExtensionEntry) {
if *m == nil {
*m = make(map[pref.FieldNumber]legacyExtensionEntry)
}
(*m)[n] = x
}
func (m *legacyExtensionMap) Clear(n pref.FieldNumber) {
delete(*m, n)
}
func (m legacyExtensionMap) Range(f func(pref.FieldNumber, legacyExtensionEntry) bool) {
for n, x := range m {
if !f(n, x) {
return
}
}
}
// legacyExtensionEntry is identical to protoV1.Extension.
type legacyExtensionEntry struct {
desc *protoV1.ExtensionDesc
val interface{}
raw []byte
}

View File

@ -10,7 +10,7 @@ import (
"reflect"
"testing"
protoV1 "github.com/golang/protobuf/proto"
papi "github.com/golang/protobuf/protoapi"
pack "github.com/golang/protobuf/v2/internal/encoding/pack"
pragma "github.com/golang/protobuf/v2/internal/pragma"
scalar "github.com/golang/protobuf/v2/internal/scalar"
@ -445,14 +445,14 @@ func TestLegacyDescriptor(t *testing.T) {
type legacyTestMessage struct {
XXX_unrecognized []byte
protoV1.XXX_InternalExtensions
papi.XXX_InternalExtensions
}
func (*legacyTestMessage) Reset() {}
func (*legacyTestMessage) String() string { return "" }
func (*legacyTestMessage) ProtoMessage() {}
func (*legacyTestMessage) ExtensionRangeArray() []protoV1.ExtensionRange {
return []protoV1.ExtensionRange{{Start: 10, End: 20}, {Start: 40, End: 80}, {Start: 10000, End: 20000}}
func (*legacyTestMessage) ExtensionRangeArray() []papi.ExtensionRange {
return []papi.ExtensionRange{{Start: 10, End: 20}, {Start: 40, End: 80}, {Start: 10000, End: 20000}}
}
func TestLegacyUnknown(t *testing.T) {
@ -684,7 +684,7 @@ func TestLegacyUnknown(t *testing.T) {
func TestLegactExtensions(t *testing.T) {
extensions := []pref.ExtensionType{
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*bool)(nil),
Field: 10000,
@ -692,7 +692,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10000,opt,name=optional_bool,json=optionalBool,def=1",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*int32)(nil),
Field: 10001,
@ -700,7 +700,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10001,opt,name=optional_int32,json=optionalInt32,def=-12345",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*uint32)(nil),
Field: 10002,
@ -708,7 +708,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10002,opt,name=optional_uint32,json=optionalUint32,def=3200",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*float32)(nil),
Field: 10003,
@ -716,7 +716,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "fixed32,10003,opt,name=optional_float,json=optionalFloat,def=3.14159",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*string)(nil),
Field: 10004,
@ -724,7 +724,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "bytes,10004,opt,name=optional_string,json=optionalString,def=hello, \"world!\"\n",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]byte)(nil),
Field: 10005,
@ -732,7 +732,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "bytes,10005,opt,name=optional_bytes,json=optionalBytes,def=dead\\336\\255\\276\\357beef",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*proto2_20180125.Message_ChildEnum)(nil),
Field: 10006,
@ -740,7 +740,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10006,opt,name=optional_enum_v1,json=optionalEnumV1,enum=google.golang.org.proto2_20180125.Message_ChildEnum,def=0",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*proto2_20180125.Message_ChildMessage)(nil),
Field: 10007,
@ -748,7 +748,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "bytes,10007,opt,name=optional_message_v1,json=optionalMessageV1",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*EnumProto2)(nil),
Field: 10008,
@ -756,7 +756,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10008,opt,name=optional_enum_v2,json=optionalEnumV2,enum=EnumProto2,def=57005",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: (*EnumMessages)(nil),
Field: 10009,
@ -764,7 +764,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "bytes,10009,opt,name=optional_message_v2,json=optionalMessageV2",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]bool)(nil),
Field: 10010,
@ -772,7 +772,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10010,rep,name=repeated_bool,json=repeatedBool",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]int32)(nil),
Field: 10011,
@ -780,7 +780,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10011,rep,name=repeated_int32,json=repeatedInt32",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]uint32)(nil),
Field: 10012,
@ -788,7 +788,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10012,rep,name=repeated_uint32,json=repeatedUint32",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]float32)(nil),
Field: 10013,
@ -796,7 +796,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "fixed32,10013,rep,name=repeated_float,json=repeatedFloat",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]string)(nil),
Field: 10014,
@ -804,7 +804,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "bytes,10014,rep,name=repeated_string,json=repeatedString",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([][]byte)(nil),
Field: 10015,
@ -812,7 +812,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "bytes,10015,rep,name=repeated_bytes,json=repeatedBytes",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]proto2_20180125.Message_ChildEnum)(nil),
Field: 10016,
@ -820,7 +820,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10016,rep,name=repeated_enum_v1,json=repeatedEnumV1,enum=google.golang.org.proto2_20180125.Message_ChildEnum",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]*proto2_20180125.Message_ChildMessage)(nil),
Field: 10017,
@ -828,7 +828,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "bytes,10017,rep,name=repeated_message_v1,json=repeatedMessageV1",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]EnumProto2)(nil),
Field: 10018,
@ -836,7 +836,7 @@ func TestLegactExtensions(t *testing.T) {
Tag: "varint,10018,rep,name=repeated_enum_v2,json=repeatedEnumV2,enum=EnumProto2",
Filename: "fizz/buzz/test.proto",
}),
legacyExtensionTypeOf(&protoV1.ExtensionDesc{
legacyExtensionTypeOf(&papi.ExtensionDesc{
ExtendedType: (*legacyTestMessage)(nil),
ExtensionType: ([]*EnumMessages)(nil),
Field: 10019,

View File

@ -9,6 +9,7 @@ import (
"reflect"
"sort"
papi "github.com/golang/protobuf/protoapi"
"github.com/golang/protobuf/v2/internal/encoding/wire"
pref "github.com/golang/protobuf/v2/reflect/protoreflect"
)
@ -40,14 +41,14 @@ func makeLegacyUnknownFieldsFunc(t reflect.Type) func(p *messageDataType) pref.U
// and also the extension field map.
type legacyUnknownBytesAndExtensionMap struct {
u pref.UnknownFields
x legacyExtensionIface
x papi.ExtensionFields
r pref.FieldRanges
}
func (fs *legacyUnknownBytesAndExtensionMap) Len() int {
n := fs.u.Len()
fs.x.Range(func(_ pref.FieldNumber, x legacyExtensionEntry) bool {
if len(x.raw) > 0 {
fs.x.Range(func(_ pref.FieldNumber, x papi.ExtensionField) bool {
if len(x.Raw) > 0 {
n++
}
return true
@ -57,7 +58,7 @@ func (fs *legacyUnknownBytesAndExtensionMap) Len() int {
func (fs *legacyUnknownBytesAndExtensionMap) Get(num pref.FieldNumber) (raw pref.RawFields) {
if fs.r.Has(num) {
return fs.x.Get(num).raw
return fs.x.Get(num).Raw
}
return fs.u.Get(num)
}
@ -65,7 +66,7 @@ func (fs *legacyUnknownBytesAndExtensionMap) Get(num pref.FieldNumber) (raw pref
func (fs *legacyUnknownBytesAndExtensionMap) Set(num pref.FieldNumber, raw pref.RawFields) {
if fs.r.Has(num) {
x := fs.x.Get(num)
x.raw = raw
x.Raw = raw
fs.x.Set(num, x)
return
}
@ -91,9 +92,9 @@ func (fs *legacyUnknownBytesAndExtensionMap) Range(f func(pref.FieldNumber, pref
raw pref.RawFields
}
var xs []entry
fs.x.Range(func(n pref.FieldNumber, x legacyExtensionEntry) bool {
if len(x.raw) > 0 {
xs = append(xs, entry{n, x.raw})
fs.x.Range(func(n pref.FieldNumber, x papi.ExtensionField) bool {
if len(x.Raw) > 0 {
xs = append(xs, entry{n, x.Raw})
}
return true
})

View File

@ -765,8 +765,8 @@ func (m *OneofScalars) Interface() pref.ProtoMessage { return m }
func (m *OneofScalars) ProtoReflect() pref.Message { return m }
func (m *OneofScalars) ProtoMutable() {}
func (*OneofScalars) XXX_OneofFuncs() (func(protoV1.Message, *protoV1.Buffer) error, func(protoV1.Message, int, int, *protoV1.Buffer) (bool, error), func(protoV1.Message) int, []interface{}) {
return nil, nil, nil, []interface{}{
func (*OneofScalars) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*OneofScalars_Bool)(nil),
(*OneofScalars_Int32)(nil),
(*OneofScalars_Int64)(nil),
@ -985,8 +985,8 @@ func (m *EnumMessages) Interface() pref.ProtoMessage { return m }
func (m *EnumMessages) ProtoReflect() pref.Message { return m }
func (m *EnumMessages) ProtoMutable() {}
func (*EnumMessages) XXX_OneofFuncs() (func(protoV1.Message, *protoV1.Buffer) error, func(protoV1.Message, int, int, *protoV1.Buffer) (bool, error), func(protoV1.Message) int, []interface{}) {
return nil, nil, nil, []interface{}{
func (*EnumMessages) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*EnumMessages_OneofE2)(nil),
(*EnumMessages_OneofE3)(nil),
(*EnumMessages_OneofM2)(nil),

View File

@ -10,6 +10,7 @@ import (
"fmt"
"reflect"
papi "github.com/golang/protobuf/protoapi"
pref "github.com/golang/protobuf/v2/reflect/protoreflect"
)
@ -19,13 +20,6 @@ type Unwrapper interface {
Unwrap() interface{}
}
// messageV1 is the protoV1.Message interface.
type messageV1 = interface {
Reset()
String() string
ProtoMessage()
}
var (
boolType = reflect.TypeOf(bool(false))
int32Type = reflect.TypeOf(int32(0))
@ -38,7 +32,7 @@ var (
bytesType = reflect.TypeOf([]byte(nil))
enumIfaceV2 = reflect.TypeOf((*pref.ProtoEnum)(nil)).Elem()
messageIfaceV1 = reflect.TypeOf((*messageV1)(nil)).Elem()
messageIfaceV1 = reflect.TypeOf((*papi.Message)(nil)).Elem()
messageIfaceV2 = reflect.TypeOf((*pref.ProtoMessage)(nil)).Elem()
byteType = reflect.TypeOf(byte(0))