internal/genname: centralize the definitions for generated names

Both the generator and the runtime need to agree upon the names of
specialized Go struct fields. Centralize that information in an
internal genname package.

In the mean time, also change the XXX_weak field name to match
the name used internally at Google.

Change-Id: I026bf354418c363482e5902f21aa5e0cacae24b0
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/207080
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index 9048648..e8b2207 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -20,6 +20,7 @@
 	"google.golang.org/protobuf/internal/encoding/messageset"
 	"google.golang.org/protobuf/internal/encoding/tag"
 	"google.golang.org/protobuf/internal/fieldnum"
+	"google.golang.org/protobuf/internal/genname"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/runtime/protoimpl"
 
@@ -398,19 +399,19 @@
 }
 
 func genMessageInternalFields(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, sf *structFields) {
-	g.P("state ", protoimplPackage.Ident("MessageState"))
-	sf.append("state")
-	g.P("sizeCache", " ", protoimplPackage.Ident("SizeCache"))
-	sf.append("sizeCache")
+	g.P(genname.State, " ", protoimplPackage.Ident("MessageState"))
+	sf.append(genname.State)
+	g.P(genname.SizeCache, " ", protoimplPackage.Ident("SizeCache"))
+	sf.append(genname.SizeCache)
 	if m.HasWeak {
-		g.P("XXX_weak", " ", protoimplPackage.Ident("WeakFields"), jsonIgnoreTags)
-		sf.append("XXX_weak")
+		g.P(genname.WeakFields, " ", protoimplPackage.Ident("WeakFields"), jsonIgnoreTags)
+		sf.append(genname.WeakFields)
 	}
-	g.P("unknownFields", " ", protoimplPackage.Ident("UnknownFields"))
-	sf.append("unknownFields")
+	g.P(genname.UnknownFields, " ", protoimplPackage.Ident("UnknownFields"))
+	sf.append(genname.UnknownFields)
 	if m.Desc.ExtensionRanges().Len() > 0 {
-		g.P("extensionFields", " ", protoimplPackage.Ident("ExtensionFields"))
-		sf.append("extensionFields")
+		g.P(genname.ExtensionFields, " ", protoimplPackage.Ident("ExtensionFields"))
+		sf.append(genname.ExtensionFields)
 	}
 	if sf.count > 0 {
 		g.P()
@@ -471,7 +472,7 @@
 
 	name := field.GoName
 	if field.Desc.IsWeak() {
-		name = "XXX_weak_" + name
+		name = genname.WeakFieldPrefix + name
 	}
 	g.Annotate(m.GoIdent.GoName+"."+name, field.Location)
 	leadingComments := appendDeprecationSuffix(field.Comments.Leading,
@@ -627,8 +628,8 @@
 		case field.Desc.IsWeak():
 			g.P(leadingComments, "func (x *", m.GoIdent, ") Get", field.GoName, "() ", protoifacePackage.Ident("MessageV1"), "{")
 			g.P("if x != nil {")
-			g.P("v := x.XXX_weak[", field.Desc.Number(), "]")
-			g.P("_ = x.XXX_weak_" + field.GoName) // for field-tracking
+			g.P("v := x.", genname.WeakFields, "[", field.Desc.Number(), "]")
+			g.P("_ = x.", genname.WeakFieldPrefix+field.GoName) // for field-tracking
 			g.P("if v != nil {")
 			g.P("return v")
 			g.P("}")
@@ -674,14 +675,14 @@
 		leadingComments := appendDeprecationSuffix("",
 			field.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated())
 		g.P(leadingComments, "func (x *", m.GoIdent, ") Set", field.GoName, "(v ", protoifacePackage.Ident("MessageV1"), ") {")
-		g.P("if x.XXX_weak == nil {")
-		g.P("x.XXX_weak = make(", protoimplPackage.Ident("WeakFields"), ")")
+		g.P("if x.", genname.WeakFields, " == nil {")
+		g.P("x.", genname.WeakFields, " = make(", protoimplPackage.Ident("WeakFields"), ")")
 		g.P("}")
 		g.P("if v == nil {")
-		g.P("delete(x.XXX_weak, ", field.Desc.Number(), ")")
+		g.P("delete(x.", genname.WeakFields, ", ", field.Desc.Number(), ")")
 		g.P("} else {")
-		g.P("x.XXX_weak[", field.Desc.Number(), "] = v")
-		g.P("x.XXX_weak_"+field.GoName, " = struct{}{}") // for field-tracking
+		g.P("x.", genname.WeakFields, "[", field.Desc.Number(), "] = v")
+		g.P("x.", genname.WeakFieldPrefix+field.GoName, " = struct{}{}") // for field-tracking
 		g.P("}")
 		g.P("}")
 		g.P()
diff --git a/internal/genname/name.go b/internal/genname/name.go
new file mode 100644
index 0000000..f45509f
--- /dev/null
+++ b/internal/genname/name.go
@@ -0,0 +1,25 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package genname contains constants for generated names.
+package genname
+
+const (
+	State = "state"
+
+	SizeCache  = "sizeCache"
+	SizeCacheA = "XXX_sizecache"
+
+	WeakFields  = "weakFields"
+	WeakFieldsA = "XXX_weak"
+
+	UnknownFields  = "unknownFields"
+	UnknownFieldsA = "XXX_unrecognized"
+
+	ExtensionFields  = "extensionFields"
+	ExtensionFieldsA = "XXX_InternalExtensions"
+	ExtensionFieldsB = "XXX_extensions"
+
+	WeakFieldPrefix = "XXX_weak_"
+)
diff --git a/internal/impl/message.go b/internal/impl/message.go
index 786f434..e464bef 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -12,6 +12,7 @@
 	"sync"
 	"sync/atomic"
 
+	"google.golang.org/protobuf/internal/genname"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	piface "google.golang.org/protobuf/runtime/protoiface"
@@ -135,19 +136,19 @@
 fieldLoop:
 	for i := 0; i < t.NumField(); i++ {
 		switch f := t.Field(i); f.Name {
-		case "sizeCache", "XXX_sizecache":
+		case genname.SizeCache, genname.SizeCacheA:
 			if f.Type == sizecacheType {
 				si.sizecacheOffset = offsetOf(f, mi.Exporter)
 			}
-		case "weakFields", "XXX_weak":
+		case genname.WeakFields, genname.WeakFieldsA:
 			if f.Type == weakFieldsType {
 				si.weakOffset = offsetOf(f, mi.Exporter)
 			}
-		case "unknownFields", "XXX_unrecognized":
+		case genname.UnknownFields, genname.UnknownFieldsA:
 			if f.Type == unknownFieldsType {
 				si.unknownOffset = offsetOf(f, mi.Exporter)
 			}
-		case "extensionFields", "XXX_InternalExtensions", "XXX_extensions":
+		case genname.ExtensionFields, genname.ExtensionFieldsA, genname.ExtensionFieldsB:
 			if f.Type == extensionFieldsType {
 				si.extensionOffset = offsetOf(f, mi.Exporter)
 			}
diff --git a/internal/testprotos/fieldtrack/fieldtrack.pb.go b/internal/testprotos/fieldtrack/fieldtrack.pb.go
index c784e84..63e0c1c 100644
--- a/internal/testprotos/fieldtrack/fieldtrack.pb.go
+++ b/internal/testprotos/fieldtrack/fieldtrack.pb.go
@@ -20,7 +20,7 @@
 type TestFieldTrack struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
-	XXX_weak      protoimpl.WeakFields `json:"-"`
+	weakFields    protoimpl.WeakFields `json:"-"`
 	unknownFields protoimpl.UnknownFields
 
 	OptionalInt32         *int32                                      `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty" go:"track"`
@@ -573,7 +573,7 @@
 
 func (x *TestFieldTrack) GetWeakMessage1() protoiface.MessageV1 {
 	if x != nil {
-		v := x.XXX_weak[100]
+		v := x.weakFields[100]
 		_ = x.XXX_weak_WeakMessage1
 		if v != nil {
 			return v
@@ -586,7 +586,7 @@
 
 func (x *TestFieldTrack) GetWeakMessage2() protoiface.MessageV1 {
 	if x != nil {
-		v := x.XXX_weak[101]
+		v := x.weakFields[101]
 		_ = x.XXX_weak_WeakMessage2
 		if v != nil {
 			return v
@@ -598,13 +598,13 @@
 //go:nointerface
 
 func (x *TestFieldTrack) SetWeakMessage1(v protoiface.MessageV1) {
-	if x.XXX_weak == nil {
-		x.XXX_weak = make(protoimpl.WeakFields)
+	if x.weakFields == nil {
+		x.weakFields = make(protoimpl.WeakFields)
 	}
 	if v == nil {
-		delete(x.XXX_weak, 100)
+		delete(x.weakFields, 100)
 	} else {
-		x.XXX_weak[100] = v
+		x.weakFields[100] = v
 		x.XXX_weak_WeakMessage1 = struct{}{}
 	}
 }
@@ -612,13 +612,13 @@
 //go:nointerface
 
 func (x *TestFieldTrack) SetWeakMessage2(v protoiface.MessageV1) {
-	if x.XXX_weak == nil {
-		x.XXX_weak = make(protoimpl.WeakFields)
+	if x.weakFields == nil {
+		x.weakFields = make(protoimpl.WeakFields)
 	}
 	if v == nil {
-		delete(x.XXX_weak, 101)
+		delete(x.weakFields, 101)
 	} else {
-		x.XXX_weak[101] = v
+		x.weakFields[101] = v
 		x.XXX_weak_WeakMessage2 = struct{}{}
 	}
 }
@@ -1016,6 +1016,8 @@
 				return &v.state
 			case 1:
 				return &v.sizeCache
+			case 2:
+				return &v.weakFields
 			case 3:
 				return &v.unknownFields
 			default:
diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go
index 800551f..59a6849 100644
--- a/internal/testprotos/test/test.pb.go
+++ b/internal/testprotos/test/test.pb.go
@@ -1648,7 +1648,7 @@
 type TestWeak struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
-	XXX_weak      protoimpl.WeakFields `json:"-"`
+	weakFields    protoimpl.WeakFields `json:"-"`
 	unknownFields protoimpl.UnknownFields
 
 	XXX_weak_WeakMessage1 struct{} `protobuf:"bytes,1,opt,name=weak_message1,json=weakMessage1,weak=goproto.proto.test.weak.WeakImportMessage1" json:"weak_message1,omitempty"`
@@ -1689,7 +1689,7 @@
 
 func (x *TestWeak) GetWeakMessage1() protoiface.MessageV1 {
 	if x != nil {
-		v := x.XXX_weak[1]
+		v := x.weakFields[1]
 		_ = x.XXX_weak_WeakMessage1
 		if v != nil {
 			return v
@@ -1700,7 +1700,7 @@
 
 func (x *TestWeak) GetWeakMessage2() protoiface.MessageV1 {
 	if x != nil {
-		v := x.XXX_weak[2]
+		v := x.weakFields[2]
 		_ = x.XXX_weak_WeakMessage2
 		if v != nil {
 			return v
@@ -1710,25 +1710,25 @@
 }
 
 func (x *TestWeak) SetWeakMessage1(v protoiface.MessageV1) {
-	if x.XXX_weak == nil {
-		x.XXX_weak = make(protoimpl.WeakFields)
+	if x.weakFields == nil {
+		x.weakFields = make(protoimpl.WeakFields)
 	}
 	if v == nil {
-		delete(x.XXX_weak, 1)
+		delete(x.weakFields, 1)
 	} else {
-		x.XXX_weak[1] = v
+		x.weakFields[1] = v
 		x.XXX_weak_WeakMessage1 = struct{}{}
 	}
 }
 
 func (x *TestWeak) SetWeakMessage2(v protoiface.MessageV1) {
-	if x.XXX_weak == nil {
-		x.XXX_weak = make(protoimpl.WeakFields)
+	if x.weakFields == nil {
+		x.weakFields = make(protoimpl.WeakFields)
 	}
 	if v == nil {
-		delete(x.XXX_weak, 2)
+		delete(x.weakFields, 2)
 	} else {
-		x.XXX_weak[2] = v
+		x.weakFields[2] = v
 		x.XXX_weak_WeakMessage2 = struct{}{}
 	}
 }
@@ -4919,6 +4919,8 @@
 				return &v.state
 			case 1:
 				return &v.sizeCache
+			case 2:
+				return &v.weakFields
 			case 3:
 				return &v.unknownFields
 			default: