|
|
@@ -141,76 +141,3 @@ type legacyExtensionEntry struct {
|
|
|
val interface{}
|
|
|
raw []byte
|
|
|
}
|
|
|
-
|
|
|
-// TODO: The legacyExtensionInterfaceOf and legacyExtensionValueOf converters
|
|
|
-// exist since the current storage representation in the v1 data structures use
|
|
|
-// *T for scalars and []T for repeated fields, but the v2 API operates on
|
|
|
-// T for scalars and *[]T for repeated fields.
|
|
|
-//
|
|
|
-// Instead of maintaining this technical debt in the v2 repository,
|
|
|
-// we can offload this into the v1 implementation such that it uses a
|
|
|
-// storage representation that is appropriate for v2, and uses the these
|
|
|
-// functions to present the illusion that that the underlying storage
|
|
|
-// is still *T and []T.
|
|
|
-//
|
|
|
-// See https://github.com/golang/protobuf/pull/746
|
|
|
-const hasPR746 = true
|
|
|
-
|
|
|
-// legacyExtensionInterfaceOf converts a protoreflect.Value to the
|
|
|
-// storage representation used in v1 extension data structures.
|
|
|
-//
|
|
|
-// In particular, it represents scalars (except []byte) a pointer to the value,
|
|
|
-// and repeated fields as the a slice value itself.
|
|
|
-func legacyExtensionInterfaceOf(pv pref.Value, t pref.ExtensionType) interface{} {
|
|
|
- v := t.InterfaceOf(pv)
|
|
|
- if !hasPR746 {
|
|
|
- switch rv := reflect.ValueOf(v); rv.Kind() {
|
|
|
- case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
|
|
|
- // Represent primitive types as a pointer to the value.
|
|
|
- rv2 := reflect.New(rv.Type())
|
|
|
- rv2.Elem().Set(rv)
|
|
|
- v = rv2.Interface()
|
|
|
- case reflect.Ptr:
|
|
|
- // Represent pointer to slice types as the value itself.
|
|
|
- switch rv.Type().Elem().Kind() {
|
|
|
- case reflect.Slice:
|
|
|
- if rv.IsNil() {
|
|
|
- v = reflect.Zero(rv.Type().Elem()).Interface()
|
|
|
- } else {
|
|
|
- v = rv.Elem().Interface()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return v
|
|
|
-}
|
|
|
-
|
|
|
-// legacyExtensionValueOf converts the storage representation of a value in
|
|
|
-// the v1 extension data structures to a protoreflect.Value.
|
|
|
-//
|
|
|
-// In particular, it represents scalars as the value itself,
|
|
|
-// and repeated fields as a pointer to the slice value.
|
|
|
-func legacyExtensionValueOf(v interface{}, t pref.ExtensionType) pref.Value {
|
|
|
- if !hasPR746 {
|
|
|
- switch rv := reflect.ValueOf(v); rv.Kind() {
|
|
|
- case reflect.Ptr:
|
|
|
- // Represent slice types as the value itself.
|
|
|
- switch rv.Type().Elem().Kind() {
|
|
|
- case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
|
|
|
- if rv.IsNil() {
|
|
|
- v = reflect.Zero(rv.Type().Elem()).Interface()
|
|
|
- } else {
|
|
|
- v = rv.Elem().Interface()
|
|
|
- }
|
|
|
- }
|
|
|
- case reflect.Slice:
|
|
|
- // Represent slice types (except []byte) as a pointer to the value.
|
|
|
- if rv.Type().Elem().Kind() != reflect.Uint8 {
|
|
|
- rv2 := reflect.New(rv.Type())
|
|
|
- rv2.Elem().Set(rv)
|
|
|
- v = rv2.Interface()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return t.ValueOf(v)
|
|
|
-}
|