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>
This commit is contained in:
Joe Tsai 2019-11-13 17:28:51 -08:00
parent ce413af0b3
commit 4663ebc852
5 changed files with 75 additions and 44 deletions

View File

@ -20,6 +20,7 @@ import (
"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 genMessageFields(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) {
}
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 @@ func genMessageField(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, fie
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 @@ func genMessageGetterMethods(gen *protogen.Plugin, g *protogen.GeneratedFile, f
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 @@ func genMessageSetterMethods(gen *protogen.Plugin, g *protogen.GeneratedFile, f
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()

25
internal/genname/name.go Normal file
View File

@ -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_"
)

View File

@ -12,6 +12,7 @@ import (
"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 @@ func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo {
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)
}

View File

@ -20,7 +20,7 @@ import (
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) GetMapStringMessage() map[string]*test.TestAllTypes_Nes
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) GetWeakMessage1() protoiface.MessageV1 {
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 @@ func (x *TestFieldTrack) GetWeakMessage2() protoiface.MessageV1 {
//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 @@ func (x *TestFieldTrack) SetWeakMessage1(v protoiface.MessageV1) {
//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 @@ func file_fieldtrack_fieldtrack_proto_init() {
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.weakFields
case 3:
return &v.unknownFields
default:

View File

@ -1648,7 +1648,7 @@ func (x *TestRequiredGroupFields) GetRepeatedgroup() []*TestRequiredGroupFields_
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 (*TestWeak) Descriptor() ([]byte, []int) {
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) GetWeakMessage1() protoiface.MessageV1 {
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) GetWeakMessage2() protoiface.MessageV1 {
}
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 @@ func file_test_test_proto_init() {
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.weakFields
case 3:
return &v.unknownFields
default: