reflect/protoreflect: put Value and MapKey types next to their methods

The Value and MayKey types are defined in value.go, but the methods on
these types are defined in value_union.go. It's not immediately clear
to the reader of the code that these types have methods, or where they
are defined.

Move the type definitions to value_union.go to keep the entire type in a
single place.

Change-Id: I7b3f3fc219a24a3b0236c2c3335e5d46f9086d25
Reviewed-on: https://go-review.googlesource.com/134997
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/reflect/protoreflect/value.go b/reflect/protoreflect/value.go
index 94fe3f5..7744876 100644
--- a/reflect/protoreflect/value.go
+++ b/reflect/protoreflect/value.go
@@ -312,72 +312,6 @@
 
 // Mutable is a mutable reference, where mutate operations also affect
 // the backing store. Possible Mutable types: Vector, Map, or Message.
-type Mutable interface{ ProtoMutable() }
-
-// Value is a union where only one Go type may be set at a time.
-// The Value is used to represent all possible values a field may take.
-// The following shows what Go type is used to represent each proto Kind:
-//
-//	+------------+-------------------------------------+
-//	| Go type    | Protobuf kind                       |
-//	+------------+-------------------------------------+
-//	| bool       | BoolKind                            |
-//	| int32      | Int32Kind, Sint32Kind, Sfixed32Kind |
-//	| int64      | Int64Kind, Sint64Kind, Sfixed64Kind |
-//	| uint32     | Uint32Kind, Fixed32Kind             |
-//	| uint64     | Uint64Kind, Fixed64Kind             |
-//	| float32    | FloatKind                           |
-//	| float64    | DoubleKind                          |
-//	| string     | StringKind                          |
-//	| []byte     | BytesKind                           |
-//	| EnumNumber | EnumKind                            |
-//	+------------+-------------------------------------+
-//	| Message    | MessageKind, GroupKind              |
-//	| Vector     |                                     |
-//	| Map        |                                     |
-//	+------------+-------------------------------------+
-//
-// Multiple protobuf Kinds may be represented by a single Go type if the type
-// can losslessly represent the information for the proto kind. For example,
-// Int64Kind, Sint64Kind, and Sfixed64Kind all represent int64,
-// but use different integer encoding methods.
-//
-// The Vector or Map types are used if the FieldDescriptor.Cardinality of the
-// corresponding field is Repeated and a Map if and only if
-// FieldDescriptor.IsMap is true.
-//
-// Converting to/from a Value and a concrete Go value panics on type mismatch.
-// For example, ValueOf("hello").Int() panics because this attempts to
-// retrieve an int64 from a string.
-type Value value
-
-// Null is an unpopulated Value.
-//
-// Since Value is incomparable, call Value.IsNull instead to test whether
-// a Value is empty.
-//
-// It is equivalent to Value{} or ValueOf(nil).
-var Null Value
-
-// MapKey is used to index maps, where the Go type of the MapKey must match
-// the specified key Kind (see MessageDescriptor.IsMapEntry).
-// The following shows what Go type is used to represent each proto Kind:
-//
-//	+---------+-------------------------------------+
-//	| Go type | Protobuf kind                       |
-//	+---------+-------------------------------------+
-//	| bool    | BoolKind                            |
-//	| int32   | Int32Kind, Sint32Kind, Sfixed32Kind |
-//	| int64   | Int64Kind, Sint64Kind, Sfixed64Kind |
-//	| uint32  | Uint32Kind, Fixed32Kind             |
-//	| uint64  | Uint64Kind, Fixed64Kind             |
-//	| string  | StringKind                          |
-//	+---------+-------------------------------------+
-//
-// A MapKey is constructed and accessed through a Value:
-//	k := ValueOf("hash").MapKey() // convert string to MapKey
-//	s := k.String()               // convert MapKey to string
-//
-// The MapKey is a strict subset of valid types used in Value;
-// converting a Value to a MapKey with an invalid type panics.
-type MapKey value
+type Mutable interface {
+	ProtoMutable()
+}
diff --git a/reflect/protoreflect/value_union.go b/reflect/protoreflect/value_union.go
index ba82d31..351b606 100644
--- a/reflect/protoreflect/value_union.go
+++ b/reflect/protoreflect/value_union.go
@@ -10,6 +10,51 @@
 	"reflect"
 )
 
+// Value is a union where only one Go type may be set at a time.
+// The Value is used to represent all possible values a field may take.
+// The following shows what Go type is used to represent each proto Kind:
+//
+//	+------------+-------------------------------------+
+//	| Go type    | Protobuf kind                       |
+//	+------------+-------------------------------------+
+//	| bool       | BoolKind                            |
+//	| int32      | Int32Kind, Sint32Kind, Sfixed32Kind |
+//	| int64      | Int64Kind, Sint64Kind, Sfixed64Kind |
+//	| uint32     | Uint32Kind, Fixed32Kind             |
+//	| uint64     | Uint64Kind, Fixed64Kind             |
+//	| float32    | FloatKind                           |
+//	| float64    | DoubleKind                          |
+//	| string     | StringKind                          |
+//	| []byte     | BytesKind                           |
+//	| EnumNumber | EnumKind                            |
+//	+------------+-------------------------------------+
+//	| Message    | MessageKind, GroupKind              |
+//	| Vector     |                                     |
+//	| Map        |                                     |
+//	+------------+-------------------------------------+
+//
+// Multiple protobuf Kinds may be represented by a single Go type if the type
+// can losslessly represent the information for the proto kind. For example,
+// Int64Kind, Sint64Kind, and Sfixed64Kind all represent int64,
+// but use different integer encoding methods.
+//
+// The Vector or Map types are used if the FieldDescriptor.Cardinality of the
+// corresponding field is Repeated and a Map if and only if
+// FieldDescriptor.IsMap is true.
+//
+// Converting to/from a Value and a concrete Go value panics on type mismatch.
+// For example, ValueOf("hello").Int() panics because this attempts to
+// retrieve an int64 from a string.
+type Value value
+
+// Null is an unpopulated Value.
+//
+// Since Value is incomparable, call Value.IsNull instead to test whether
+// a Value is empty.
+//
+// It is equivalent to Value{} or ValueOf(nil).
+var Null Value
+
 // The protoreflect API uses a custom Value union type instead of interface{}
 // to keep the future open for performance optimizations. Using an interface{}
 // always incurs an allocation for primitives (e.g., int64) since it needs to
@@ -214,6 +259,29 @@
 	panic("proto: invalid map key type")
 }
 
+// MapKey is used to index maps, where the Go type of the MapKey must match
+// the specified key Kind (see MessageDescriptor.IsMapEntry).
+// The following shows what Go type is used to represent each proto Kind:
+//
+//	+---------+-------------------------------------+
+//	| Go type | Protobuf kind                       |
+//	+---------+-------------------------------------+
+//	| bool    | BoolKind                            |
+//	| int32   | Int32Kind, Sint32Kind, Sfixed32Kind |
+//	| int64   | Int64Kind, Sint64Kind, Sfixed64Kind |
+//	| uint32  | Uint32Kind, Fixed32Kind             |
+//	| uint64  | Uint64Kind, Fixed64Kind             |
+//	| string  | StringKind                          |
+//	+---------+-------------------------------------+
+//
+// A MapKey is constructed and accessed through a Value:
+//	k := ValueOf("hash").MapKey() // convert string to MapKey
+//	s := k.String()               // convert MapKey to string
+//
+// The MapKey is a strict subset of valid types used in Value;
+// converting a Value to a MapKey with an invalid type panics.
+type MapKey value
+
 // IsNull reports whether v is empty (has no value).
 func (k MapKey) IsNull() bool {
 	return Value(k).IsNull()