reflect: switch ExtensionType.New to return Value
This change preserves consistency with CL/157077,
where New returns a value closer to the reflective type.
Change-Id: I85bfdae24e1ce1a10c3c7b939420fa1043bff743
Reviewed-on: https://go-review.googlesource.com/c/157078
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/legacy/extension.go b/internal/legacy/extension.go
index 0a87a25..00db9ba 100644
--- a/internal/legacy/extension.go
+++ b/internal/legacy/extension.go
@@ -204,8 +204,8 @@
xt2 := &extensionType{ExtensionType: xt}
if xd.Cardinality() != pref.Repeated {
xt2.typ = t
- xt2.new = func() interface{} {
- return xt.New().(pvalue.Unwrapper).ProtoUnwrap()
+ xt2.new = func() pref.Value {
+ return xt.New()
}
xt2.valueOf = func(v interface{}) pref.Value {
if reflect.TypeOf(v) != xt2.typ {
@@ -222,8 +222,9 @@
}
} else {
xt2.typ = reflect.PtrTo(reflect.SliceOf(t))
- xt2.new = func() interface{} {
- return reflect.New(xt2.typ.Elem()).Interface()
+ xt2.new = func() pref.Value {
+ v := reflect.New(xt2.typ.Elem()).Interface()
+ return pref.ValueOf(pvalue.ListOf(v, conv))
}
xt2.valueOf = func(v interface{}) pref.Value {
if reflect.TypeOf(v) != xt2.typ {
@@ -245,13 +246,13 @@
type extensionType struct {
pref.ExtensionType
typ reflect.Type
- new func() interface{}
+ new func() pref.Value
valueOf func(interface{}) pref.Value
interfaceOf func(pref.Value) interface{}
}
func (x *extensionType) GoType() reflect.Type { return x.typ }
-func (x *extensionType) New() interface{} { return x.new() }
+func (x *extensionType) New() pref.Value { return x.new() }
func (x *extensionType) ValueOf(v interface{}) pref.Value { return x.valueOf(v) }
func (x *extensionType) InterfaceOf(v pref.Value) interface{} { return x.interfaceOf(v) }
func (x *extensionType) Format(s fmt.State, r rune) { pfmt.FormatDesc(s, r, x) }