From 4663ebc85242a9e20b6f8fd3239b1ede3b73b199 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Wed, 13 Nov 2019 17:28:51 -0800 Subject: [PATCH] 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 --- cmd/protoc-gen-go/internal_gengo/main.go | 37 ++++++++++--------- internal/genname/name.go | 25 +++++++++++++ internal/impl/message.go | 9 +++-- .../testprotos/fieldtrack/fieldtrack.pb.go | 24 ++++++------ internal/testprotos/test/test.pb.go | 24 ++++++------ 5 files changed, 75 insertions(+), 44 deletions(-) create mode 100644 internal/genname/name.go diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go index 90486483..e8b22074 100644 --- a/cmd/protoc-gen-go/internal_gengo/main.go +++ b/cmd/protoc-gen-go/internal_gengo/main.go @@ -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() diff --git a/internal/genname/name.go b/internal/genname/name.go new file mode 100644 index 00000000..f45509fb --- /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 786f4349..e464beff 100644 --- a/internal/impl/message.go +++ b/internal/impl/message.go @@ -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) } diff --git a/internal/testprotos/fieldtrack/fieldtrack.pb.go b/internal/testprotos/fieldtrack/fieldtrack.pb.go index c784e848..63e0c1c4 100644 --- a/internal/testprotos/fieldtrack/fieldtrack.pb.go +++ b/internal/testprotos/fieldtrack/fieldtrack.pb.go @@ -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: diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go index 800551fe..59a68492 100644 --- a/internal/testprotos/test/test.pb.go +++ b/internal/testprotos/test/test.pb.go @@ -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: