internal/genid: add new package for generated identifiers

The genid package unifies the genname, fieldnum, and detectknown
packages into a single package.

Whenever possible use the generated constants rather than
hard-coded literals. This makes it easier to search the entire
module for special logic that deal with well-known types.

Change-Id: I13beff1f4149444a0c0b9e607ebf759657f000f4
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/235301
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/internal/msgfmt/format.go b/internal/msgfmt/format.go
index c2c856f..3ea2745 100644
--- a/internal/msgfmt/format.go
+++ b/internal/msgfmt/format.go
@@ -18,8 +18,8 @@
 	"time"
 
 	"google.golang.org/protobuf/encoding/protowire"
-	"google.golang.org/protobuf/internal/detectknown"
 	"google.golang.org/protobuf/internal/detrand"
+	"google.golang.org/protobuf/internal/genid"
 	"google.golang.org/protobuf/internal/mapsort"
 	"google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protoreflect"
@@ -104,21 +104,21 @@
 func appendKnownMessage(b []byte, m protoreflect.Message) []byte {
 	md := m.Descriptor()
 	fds := md.Fields()
-	switch detectknown.Which(md.FullName()) {
-	case detectknown.AnyProto:
+	switch genid.WhichFile(md.FullName()) {
+	case genid.Any_file:
 		var msgVal protoreflect.Message
-		url := m.Get(fds.ByName("type_url")).String()
+		url := m.Get(fds.ByName(genid.Any_TypeUrl_field_name)).String()
 		if v := reflect.ValueOf(m); v.Type().ConvertibleTo(protocmpMessageType) {
 			// For protocmp.Message, directly obtain the sub-message value
 			// which is stored in structured form, rather than as raw bytes.
 			m2 := v.Convert(protocmpMessageType).Interface().(map[string]interface{})
-			v, ok := m2["value"].(proto.Message)
+			v, ok := m2[string(genid.Any_Value_field_name)].(proto.Message)
 			if !ok {
 				return nil
 			}
 			msgVal = v.ProtoReflect()
 		} else {
-			val := m.Get(fds.ByName("value")).Bytes()
+			val := m.Get(fds.ByName(genid.Any_Value_field_name)).Bytes()
 			mt, err := protoregistry.GlobalTypes.FindMessageByURL(url)
 			if err != nil {
 				return nil
@@ -137,9 +137,9 @@
 		b = append(b, '}')
 		return b
 
-	case detectknown.TimestampProto:
-		secs := m.Get(fds.ByName("seconds")).Int()
-		nanos := m.Get(fds.ByName("nanos")).Int()
+	case genid.Timestamp_file:
+		secs := m.Get(fds.ByName(genid.Timestamp_Seconds_field_name)).Int()
+		nanos := m.Get(fds.ByName(genid.Timestamp_Nanos_field_name)).Int()
 		if nanos < 0 || nanos >= 1e9 {
 			return nil
 		}
@@ -150,9 +150,9 @@
 		x = strings.TrimSuffix(x, ".000")
 		return append(b, x+"Z"...)
 
-	case detectknown.DurationProto:
-		secs := m.Get(fds.ByName("seconds")).Int()
-		nanos := m.Get(fds.ByName("nanos")).Int()
+	case genid.Duration_file:
+		secs := m.Get(fds.ByName(genid.Duration_Seconds_field_name)).Int()
+		nanos := m.Get(fds.ByName(genid.Duration_Nanos_field_name)).Int()
 		if nanos <= -1e9 || nanos >= 1e9 || (secs > 0 && nanos < 0) || (secs < 0 && nanos > 0) {
 			return nil
 		}
@@ -162,8 +162,8 @@
 		x = strings.TrimSuffix(x, ".000")
 		return append(b, x+"s"...)
 
-	case detectknown.WrappersProto:
-		fd := fds.ByName("value")
+	case genid.Wrappers_file:
+		fd := fds.ByName(genid.WrapperValue_Value_field_name)
 		return appendValue(b, m.Get(fd), fd)
 	}