internal/impl: clean up Value codecs

Remove the Go type from consideration when creating Value codecs, as it
is unnecessary. Value codecs convert between wire form and Values,
while Converters convert between Values and the Go type.

Change-Id: Iaa4bc7db81ad0a29dabd42c2229e6f33a0c91c67
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/193457
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/cmd/generate-types/impl.go b/internal/cmd/generate-types/impl.go
index 3cf9cae..cc05e0f 100644
--- a/internal/cmd/generate-types/impl.go
+++ b/internal/cmd/generate-types/impl.go
@@ -457,12 +457,12 @@
 	unmarshal: consume{{.Name}}Value,
 }
 
-{{if or (eq .Name "Bytes") (eq .Name "String")}}
+{{if (eq .Name "String")}}
 // append{{.Name}}ValueValidateUTF8 encodes a {{.GoType}} value as a {{.Name}}.
 func append{{.Name}}ValueValidateUTF8(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
 	b = wire.AppendVarint(b, wiretag)
 	{{template "AppendValue" .}}
-	if !utf8.Valid{{if eq .Name "String"}}String{{end}}({{.FromValue}}) {
+	if !utf8.ValidString({{.FromValue}}) {
 		return b, errInvalidUTF8{}
 	}
 	return b, nil
@@ -477,7 +477,7 @@
 	if n < 0 {
 		return protoreflect.Value{}, 0, wire.ParseError(n)
 	}
-	if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
+	if !utf8.ValidString(v) {
 		return protoreflect.Value{}, 0, errInvalidUTF8{}
 	}
 	return {{.ToValue}}, n, nil
diff --git a/internal/impl/codec_extension.go b/internal/impl/codec_extension.go
index 442628e..c06cafd 100644
--- a/internal/impl/codec_extension.go
+++ b/internal/impl/codec_extension.go
@@ -39,7 +39,7 @@
 	e = &extensionFieldInfo{
 		wiretag: wiretag,
 		tagsize: wire.SizeVarint(wiretag),
-		funcs:   encoderFuncsForValue(xd, xt.GoType()),
+		funcs:   encoderFuncsForValue(xd),
 	}
 	// Does the unmarshal function need a value passed to it?
 	// This is true for composite types, where we pass in a message, list, or map to fill in,
diff --git a/internal/impl/codec_gen.go b/internal/impl/codec_gen.go
index 3d47dcc..7d089f6 100644
--- a/internal/impl/codec_gen.go
+++ b/internal/impl/codec_gen.go
@@ -4720,37 +4720,6 @@
 	unmarshal: consumeBytesValue,
 }
 
-// appendBytesValueValidateUTF8 encodes a []byte value as a Bytes.
-func appendBytesValueValidateUTF8(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendBytes(b, v.Bytes())
-	if !utf8.Valid(v.Bytes()) {
-		return b, errInvalidUTF8{}
-	}
-	return b, nil
-}
-
-// consumeBytesValueValidateUTF8 decodes a []byte value as a Bytes.
-func consumeBytesValueValidateUTF8(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (protoreflect.Value, int, error) {
-	if wtyp != wire.BytesType {
-		return protoreflect.Value{}, 0, errUnknown
-	}
-	v, n := wire.ConsumeBytes(b)
-	if n < 0 {
-		return protoreflect.Value{}, 0, wire.ParseError(n)
-	}
-	if !utf8.Valid(v) {
-		return protoreflect.Value{}, 0, errInvalidUTF8{}
-	}
-	return protoreflect.ValueOfBytes(append(([]byte)(nil), v...)), n, nil
-}
-
-var coderBytesValueValidateUTF8 = valueCoderFuncs{
-	size:      sizeBytesValue,
-	marshal:   appendBytesValueValidateUTF8,
-	unmarshal: consumeBytesValueValidateUTF8,
-}
-
 // sizeBytesSliceValue returns the size of wire encoding a [][]byte value as a repeated Bytes.
 func sizeBytesSliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
 	list := listv.List()
diff --git a/internal/impl/codec_map.go b/internal/impl/codec_map.go
index 00d6511..8b85c69 100644
--- a/internal/impl/codec_map.go
+++ b/internal/impl/codec_map.go
@@ -28,8 +28,8 @@
 	valField := fd.MapValue()
 	keyWiretag := wire.EncodeTag(1, wireTypes[keyField.Kind()])
 	valWiretag := wire.EncodeTag(2, wireTypes[valField.Kind()])
-	keyFuncs := encoderFuncsForValue(keyField, ft.Key())
-	valFuncs := encoderFuncsForValue(valField, ft.Elem())
+	keyFuncs := encoderFuncsForValue(keyField)
+	valFuncs := encoderFuncsForValue(valField)
 	conv := NewConverter(ft, fd)
 
 	mapi := &mapInfo{
diff --git a/internal/impl/codec_tables.go b/internal/impl/codec_tables.go
index a332922..77fc4c0 100644
--- a/internal/impl/codec_tables.go
+++ b/internal/impl/codec_tables.go
@@ -426,244 +426,126 @@
 	panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
 }
 
-// encoderFuncsForValue returns interface{} value functions for a field, used for
+// encoderFuncsForValue returns value functions for a field, used for
 // extension values and map encoding.
-func encoderFuncsForValue(fd pref.FieldDescriptor, ft reflect.Type) valueCoderFuncs {
+func encoderFuncsForValue(fd pref.FieldDescriptor) valueCoderFuncs {
 	switch {
 	case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
-		if ft.Kind() == reflect.Ptr {
-			ft = ft.Elem()
-		}
-		if ft.Kind() != reflect.Slice {
-			break
-		}
-		ft := ft.Elem()
 		switch fd.Kind() {
 		case pref.BoolKind:
-			if ft.Kind() == reflect.Bool {
-				return coderBoolSliceValue
-			}
+			return coderBoolSliceValue
 		case pref.EnumKind:
-			if ft.Kind() == reflect.Int32 {
-				return coderEnumSliceValue
-			}
+			return coderEnumSliceValue
 		case pref.Int32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderInt32SliceValue
-			}
+			return coderInt32SliceValue
 		case pref.Sint32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderSint32SliceValue
-			}
+			return coderSint32SliceValue
 		case pref.Uint32Kind:
-			if ft.Kind() == reflect.Uint32 {
-				return coderUint32SliceValue
-			}
+			return coderUint32SliceValue
 		case pref.Int64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderInt64SliceValue
-			}
+			return coderInt64SliceValue
 		case pref.Sint64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderSint64SliceValue
-			}
+			return coderSint64SliceValue
 		case pref.Uint64Kind:
-			if ft.Kind() == reflect.Uint64 {
-				return coderUint64SliceValue
-			}
+			return coderUint64SliceValue
 		case pref.Sfixed32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderSfixed32SliceValue
-			}
+			return coderSfixed32SliceValue
 		case pref.Fixed32Kind:
-			if ft.Kind() == reflect.Uint32 {
-				return coderFixed32SliceValue
-			}
+			return coderFixed32SliceValue
 		case pref.FloatKind:
-			if ft.Kind() == reflect.Float32 {
-				return coderFloatSliceValue
-			}
+			return coderFloatSliceValue
 		case pref.Sfixed64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderSfixed64SliceValue
-			}
+			return coderSfixed64SliceValue
 		case pref.Fixed64Kind:
-			if ft.Kind() == reflect.Uint64 {
-				return coderFixed64SliceValue
-			}
+			return coderFixed64SliceValue
 		case pref.DoubleKind:
-			if ft.Kind() == reflect.Float64 {
-				return coderDoubleSliceValue
-			}
+			return coderDoubleSliceValue
 		case pref.StringKind:
-			if ft.Kind() == reflect.String {
-				return coderStringSliceValue
-			}
-			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
-				return coderBytesSliceValue
-			}
+			// We don't have a UTF-8 validating coder for repeated string fields.
+			// Value coders are used for extensions and maps.
+			// Extensions are never proto3, and maps never contain lists.
+			return coderStringSliceValue
 		case pref.BytesKind:
-			if ft.Kind() == reflect.String {
-				return coderStringSliceValue
-			}
-			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
-				return coderBytesSliceValue
-			}
+			return coderBytesSliceValue
 		case pref.MessageKind:
 			return coderMessageSliceValue
 		case pref.GroupKind:
 			return coderGroupSliceValue
 		}
 	case fd.Cardinality() == pref.Repeated && fd.IsPacked():
-		if ft.Kind() == reflect.Ptr {
-			ft = ft.Elem()
-		}
-		if ft.Kind() != reflect.Slice {
-			break
-		}
-		ft := ft.Elem()
 		switch fd.Kind() {
 		case pref.BoolKind:
-			if ft.Kind() == reflect.Bool {
-				return coderBoolPackedSliceValue
-			}
+			return coderBoolPackedSliceValue
 		case pref.EnumKind:
-			if ft.Kind() == reflect.Int32 {
-				return coderEnumPackedSliceValue
-			}
+			return coderEnumPackedSliceValue
 		case pref.Int32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderInt32PackedSliceValue
-			}
+			return coderInt32PackedSliceValue
 		case pref.Sint32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderSint32PackedSliceValue
-			}
+			return coderSint32PackedSliceValue
 		case pref.Uint32Kind:
-			if ft.Kind() == reflect.Uint32 {
-				return coderUint32PackedSliceValue
-			}
+			return coderUint32PackedSliceValue
 		case pref.Int64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderInt64PackedSliceValue
-			}
+			return coderInt64PackedSliceValue
 		case pref.Sint64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderSint64PackedSliceValue
-			}
+			return coderSint64PackedSliceValue
 		case pref.Uint64Kind:
-			if ft.Kind() == reflect.Uint64 {
-				return coderUint64PackedSliceValue
-			}
+			return coderUint64PackedSliceValue
 		case pref.Sfixed32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderSfixed32PackedSliceValue
-			}
+			return coderSfixed32PackedSliceValue
 		case pref.Fixed32Kind:
-			if ft.Kind() == reflect.Uint32 {
-				return coderFixed32PackedSliceValue
-			}
+			return coderFixed32PackedSliceValue
 		case pref.FloatKind:
-			if ft.Kind() == reflect.Float32 {
-				return coderFloatPackedSliceValue
-			}
+			return coderFloatPackedSliceValue
 		case pref.Sfixed64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderSfixed64PackedSliceValue
-			}
+			return coderSfixed64PackedSliceValue
 		case pref.Fixed64Kind:
-			if ft.Kind() == reflect.Uint64 {
-				return coderFixed64PackedSliceValue
-			}
+			return coderFixed64PackedSliceValue
 		case pref.DoubleKind:
-			if ft.Kind() == reflect.Float64 {
-				return coderDoublePackedSliceValue
-			}
+			return coderDoublePackedSliceValue
 		}
 	default:
 		switch fd.Kind() {
 		default:
 		case pref.BoolKind:
-			if ft.Kind() == reflect.Bool {
-				return coderBoolValue
-			}
+			return coderBoolValue
 		case pref.EnumKind:
-			if ft.Kind() == reflect.Int32 {
-				return coderEnumValue
-			}
+			return coderEnumValue
 		case pref.Int32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderInt32Value
-			}
+			return coderInt32Value
 		case pref.Sint32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderSint32Value
-			}
+			return coderSint32Value
 		case pref.Uint32Kind:
-			if ft.Kind() == reflect.Uint32 {
-				return coderUint32Value
-			}
+			return coderUint32Value
 		case pref.Int64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderInt64Value
-			}
+			return coderInt64Value
 		case pref.Sint64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderSint64Value
-			}
+			return coderSint64Value
 		case pref.Uint64Kind:
-			if ft.Kind() == reflect.Uint64 {
-				return coderUint64Value
-			}
+			return coderUint64Value
 		case pref.Sfixed32Kind:
-			if ft.Kind() == reflect.Int32 {
-				return coderSfixed32Value
-			}
+			return coderSfixed32Value
 		case pref.Fixed32Kind:
-			if ft.Kind() == reflect.Uint32 {
-				return coderFixed32Value
-			}
+			return coderFixed32Value
 		case pref.FloatKind:
-			if ft.Kind() == reflect.Float32 {
-				return coderFloatValue
-			}
+			return coderFloatValue
 		case pref.Sfixed64Kind:
-			if ft.Kind() == reflect.Int64 {
-				return coderSfixed64Value
-			}
+			return coderSfixed64Value
 		case pref.Fixed64Kind:
-			if ft.Kind() == reflect.Uint64 {
-				return coderFixed64Value
-			}
+			return coderFixed64Value
 		case pref.DoubleKind:
-			if ft.Kind() == reflect.Float64 {
-				return coderDoubleValue
-			}
+			return coderDoubleValue
 		case pref.StringKind:
-			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
+			if strs.EnforceUTF8(fd) {
 				return coderStringValueValidateUTF8
 			}
-			if ft.Kind() == reflect.String {
-				return coderStringValue
-			}
-			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
-				return coderBytesValueValidateUTF8
-			}
-			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
-				return coderBytesValue
-			}
+			return coderStringValue
 		case pref.BytesKind:
-			if ft.Kind() == reflect.String {
-				return coderStringValue
-			}
-			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
-				return coderBytesValue
-			}
+			return coderBytesValue
 		case pref.MessageKind:
 			return coderMessageValue
 		case pref.GroupKind:
 			return coderGroupValue
 		}
 	}
-	panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
+	panic(fmt.Errorf("invalid field: no encoder for %v %v %v", fd.FullName(), fd.Cardinality(), fd.Kind()))
 }