internal/value: rename the Unwrap method as ProtoUnwrap

Add a Proto prefix before the Unwrap method to reduce the probability that
it would ever conflict with a method of the same name that a
custom implementation of Enum, Message, List, or Map may have.

Change-Id: I628bf8335583f2747ab4589f3e6ff82e4501ce98
Reviewed-on: https://go-review.googlesource.com/c/151817
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/internal/impl/legacy_enum.go b/internal/impl/legacy_enum.go
index bba130d..497b842 100644
--- a/internal/impl/legacy_enum.go
+++ b/internal/impl/legacy_enum.go
@@ -63,7 +63,7 @@
 func (e *legacyEnumWrapper) ProtoReflect() pref.Enum {
 	return e
 }
-func (e *legacyEnumWrapper) Unwrap() interface{} {
+func (e *legacyEnumWrapper) ProtoUnwrap() interface{} {
 	v := reflect.New(e.goTyp).Elem()
 	v.SetInt(int64(e.num))
 	return v.Interface()
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index 86d1bac..d87892f 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -318,7 +318,7 @@
 		// Both of those type satisfy the value.Unwrapper interface.
 		xt2.typ = t
 		xt2.new = func() interface{} {
-			return xt.New().(pvalue.Unwrapper).Unwrap()
+			return xt.New().(pvalue.Unwrapper).ProtoUnwrap()
 		}
 		xt2.valueOf = func(v interface{}) pref.Value {
 			if reflect.TypeOf(v) != xt2.typ {
@@ -331,7 +331,7 @@
 			}
 		}
 		xt2.interfaceOf = func(v pref.Value) interface{} {
-			return xt.InterfaceOf(v).(pvalue.Unwrapper).Unwrap()
+			return xt.InterfaceOf(v).(pvalue.Unwrapper).ProtoUnwrap()
 		}
 	} else {
 		// Custom extension type for repeated enums and messages.
@@ -346,7 +346,7 @@
 			return pref.ValueOf(pvalue.ListOf(v, conv))
 		}
 		xt2.interfaceOf = func(pv pref.Value) interface{} {
-			v := pv.List().(pvalue.Unwrapper).Unwrap()
+			v := pv.List().(pvalue.Unwrapper).ProtoUnwrap()
 			if reflect.TypeOf(v) != xt2.typ {
 				panic(fmt.Sprintf("invalid type: got %T, want %v", v, xt2.typ))
 			}
diff --git a/internal/impl/legacy_message.go b/internal/impl/legacy_message.go
index c0aaef4..6b53e2b 100644
--- a/internal/impl/legacy_message.go
+++ b/internal/impl/legacy_message.go
@@ -58,15 +58,15 @@
 func (m *legacyMessageWrapper) UnknownFields() pref.UnknownFields {
 	return m.mi.unknownFields((*messageDataType)(m))
 }
-func (m *legacyMessageWrapper) Unwrap() interface{} {
-	return m.p.asType(m.mi.goType.Elem()).Interface()
-}
 func (m *legacyMessageWrapper) Interface() pref.ProtoMessage {
 	return m
 }
 func (m *legacyMessageWrapper) ProtoReflect() pref.Message {
 	return m
 }
+func (m *legacyMessageWrapper) ProtoUnwrap() interface{} {
+	return m.p.asType(m.mi.goType.Elem()).Interface()
+}
 func (m *legacyMessageWrapper) ProtoMutable() {}
 
 var (
diff --git a/internal/impl/message_field.go b/internal/impl/message_field.go
index 75cf867..e92a7ca 100644
--- a/internal/impl/message_field.go
+++ b/internal/impl/message_field.go
@@ -119,7 +119,7 @@
 		},
 		set: func(p pointer, v pref.Value) {
 			rv := p.apply(fieldOffset).asType(fs.Type).Elem()
-			rv.Set(reflect.ValueOf(v.Map().(pvalue.Unwrapper).Unwrap()).Elem())
+			rv.Set(reflect.ValueOf(v.Map().(pvalue.Unwrapper).ProtoUnwrap()).Elem())
 		},
 		clear: func(p pointer) {
 			rv := p.apply(fieldOffset).asType(fs.Type).Elem()
@@ -151,7 +151,7 @@
 		},
 		set: func(p pointer, v pref.Value) {
 			rv := p.apply(fieldOffset).asType(fs.Type).Elem()
-			rv.Set(reflect.ValueOf(v.List().(pvalue.Unwrapper).Unwrap()).Elem())
+			rv.Set(reflect.ValueOf(v.List().(pvalue.Unwrapper).ProtoUnwrap()).Elem())
 		},
 		clear: func(p pointer) {
 			rv := p.apply(fieldOffset).asType(fs.Type).Elem()
diff --git a/internal/impl/message_test.go b/internal/impl/message_test.go
index 6d82456..eeb4e7a 100644
--- a/internal/impl/message_test.go
+++ b/internal/impl/message_test.go
@@ -1124,7 +1124,7 @@
 		return pv.Interface()
 	}),
 	cmp.Transformer("UnwrapGeneric", func(x pvalue.Unwrapper) interface{} {
-		return x.Unwrap()
+		return x.ProtoUnwrap()
 	}),
 	cmpopts.EquateNaNs(),
 	cmpopts.EquateEmpty(),
diff --git a/internal/value/convert.go b/internal/value/convert.go
index 6660d44..cc9d94d 100644
--- a/internal/value/convert.go
+++ b/internal/value/convert.go
@@ -17,7 +17,7 @@
 // Unwrapper unwraps the value to the underlying value.
 // This is implemented by List and Map.
 type Unwrapper interface {
-	Unwrap() interface{}
+	ProtoUnwrap() interface{}
 }
 
 var (
@@ -174,7 +174,7 @@
 					return pref.ValueOf(mvOf(v).ProtoReflect())
 				},
 				GoValueOf: func(v pref.Value) reflect.Value {
-					rv := reflect.ValueOf(v.Message().(Unwrapper).Unwrap())
+					rv := reflect.ValueOf(v.Message().(Unwrapper).ProtoUnwrap())
 					if rv.Type() != t {
 						panic(fmt.Sprintf("invalid type: got %v, want %v", rv.Type(), t))
 					}
diff --git a/internal/value/list.go b/internal/value/list.go
index ba82b30..dadb05f 100644
--- a/internal/value/list.go
+++ b/internal/value/list.go
@@ -10,7 +10,10 @@
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
 )
 
-func ListOf(p interface{}, c Converter) pref.List {
+func ListOf(p interface{}, c Converter) interface {
+	pref.List
+	Unwrapper
+} {
 	// TODO: Validate that p is a *[]T?
 	rv := reflect.ValueOf(p).Elem()
 	return listReflect{rv, c}
@@ -46,12 +49,7 @@
 func (ls listReflect) Truncate(i int) {
 	ls.v.Set(ls.v.Slice(0, i))
 }
-func (ls listReflect) Unwrap() interface{} {
+func (ls listReflect) ProtoUnwrap() interface{} {
 	return ls.v.Addr().Interface()
 }
 func (ls listReflect) ProtoMutable() {}
-
-var (
-	_ pref.List = listReflect{}
-	_ Unwrapper = listReflect{}
-)
diff --git a/internal/value/map.go b/internal/value/map.go
index db9656e..8505798 100644
--- a/internal/value/map.go
+++ b/internal/value/map.go
@@ -10,7 +10,10 @@
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
 )
 
-func MapOf(p interface{}, kc, kv Converter) pref.Map {
+func MapOf(p interface{}, kc, kv Converter) interface {
+	pref.Map
+	Unwrapper
+} {
 	// TODO: Validate that p is a *map[K]V?
 	rv := reflect.ValueOf(p).Elem()
 	return mapReflect{rv, kc, kv}
@@ -75,12 +78,7 @@
 		}
 	}
 }
-func (ms mapReflect) Unwrap() interface{} {
+func (ms mapReflect) ProtoUnwrap() interface{} {
 	return ms.v.Addr().Interface()
 }
 func (ms mapReflect) ProtoMutable() {}
-
-var (
-	_ pref.Map  = mapReflect{}
-	_ Unwrapper = mapReflect{}
-)
diff --git a/reflect/prototype/go_type.go b/reflect/prototype/go_type.go
index 94049f7..4420021 100644
--- a/reflect/prototype/go_type.go
+++ b/reflect/prototype/go_type.go
@@ -256,10 +256,7 @@
 				return protoreflect.ValueOf(value.ListOf(v, c))
 			}
 			t.interfaceOf = func(pv protoreflect.Value) interface{} {
-				// TODO: Can we assume that List implementations know how
-				// to unwrap themselves?
-				// Should this be part of the public API in protoreflect?
-				return pv.List().(value.Unwrapper).Unwrap()
+				return pv.List().(value.Unwrapper).ProtoUnwrap()
 			}
 		default:
 			panic(fmt.Sprintf("invalid cardinality: %v", t.Cardinality()))