diff --git a/gogoproto/gogo.pb.go b/gogoproto/gogo.pb.go index 1e91766aee..cf22ea778a 100644 --- a/gogoproto/gogo.pb.go +++ b/gogoproto/gogo.pb.go @@ -363,6 +363,15 @@ var E_GoprotoUnkeyedAll = &proto.ExtensionDesc{ Filename: "gogo.proto", } +var E_InternalStructFieldTags = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*string)(nil), + Field: 64036, + Name: "gogoproto.internal_struct_field_tags", + Tag: "bytes,63036,rep,name=internal_struct_field_tags", + Filename: "gogo.proto", +} + var E_GoprotoGetters = &proto.ExtensionDesc{ ExtendedType: (*descriptor.MessageOptions)(nil), ExtensionType: (*bool)(nil), diff --git a/gogoproto/gogo.proto b/gogoproto/gogo.proto index b80c85653f..cbdfaaa9a4 100644 --- a/gogoproto/gogo.proto +++ b/gogoproto/gogo.proto @@ -87,6 +87,8 @@ extend google.protobuf.FileOptions { optional bool goproto_sizecache_all = 63034; optional bool goproto_unkeyed_all = 63035; + + optional string internal_struct_field_tags = 63036; } extend google.protobuf.MessageOptions { @@ -124,6 +126,7 @@ extend google.protobuf.MessageOptions { optional bool goproto_sizecache = 64034; optional bool goproto_unkeyed = 64035; + } extend google.protobuf.FieldOptions { diff --git a/gogoproto/helper.go b/gogoproto/helper.go index 390d4e4be6..6b73f00bb9 100644 --- a/gogoproto/helper.go +++ b/gogoproto/helper.go @@ -287,6 +287,18 @@ func GetMoreTags(field *google_protobuf.FieldDescriptorProto) *string { } return nil } +func GetInternalStructFieldTags(file *google_protobuf.FileDescriptorProto) *string { + if file == nil { + return nil + } + if file.Options != nil { + v, err := proto.GetExtension(file.Options, E_InternalStructFieldTags) + if err == nil && v.(*string) != nil { + return (v.(*string)) + } + } + return nil +} type EnableFunc func(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool diff --git a/protoc-gen-gogo/generator/generator.go b/protoc-gen-gogo/generator/generator.go index 879939ea48..d0eb2d00d4 100644 --- a/protoc-gen-gogo/generator/generator.go +++ b/protoc-gen-gogo/generator/generator.go @@ -2494,8 +2494,15 @@ func (g *Generator) generateGet(mc *msgCtx, protoField *descriptor.FieldDescript // generateInternalStructFields just adds the XXX_ fields to the message struct. func (g *Generator) generateInternalStructFields(mc *msgCtx, topLevelFields []topLevelField) { + internalStructFieldTags := gogoproto.GetInternalStructFieldTags(g.file.FileDescriptorProto) + + resolvedInternaltags := "" + if internalStructFieldTags != nil { + resolvedInternaltags = ", " + *internalStructFieldTags + } + if gogoproto.HasUnkeyed(g.file.FileDescriptorProto, mc.message.DescriptorProto) { - g.P("XXX_NoUnkeyedLiteral\tstruct{} `json:\"-\"`") // prevent unkeyed struct literals + g.P("XXX_NoUnkeyedLiteral\tstruct{} `json:\"-\"`" + resolvedInternaltags) // prevent unkeyed struct literals } if len(mc.message.ExtensionRange) > 0 { if gogoproto.HasExtensionsMap(g.file.FileDescriptorProto, mc.message.DescriptorProto) { @@ -2503,16 +2510,16 @@ func (g *Generator) generateInternalStructFields(mc *msgCtx, topLevelFields []to if opts := mc.message.Options; opts != nil && opts.GetMessageSetWireFormat() { messageset = "protobuf_messageset:\"1\" " } - g.P(g.Pkg["proto"], ".XXX_InternalExtensions `", messageset, "json:\"-\"`") + g.P(g.Pkg["proto"], ".XXX_InternalExtensions `", messageset, "json:\"-\"`"+resolvedInternaltags) } else { - g.P("XXX_extensions\t\t[]byte `protobuf:\"bytes,0,opt\" json:\"-\"`") + g.P("XXX_extensions\t\t[]byte `protobuf:\"bytes,0,opt\" json:\"-\"`" + resolvedInternaltags) } } if gogoproto.HasUnrecognized(g.file.FileDescriptorProto, mc.message.DescriptorProto) { - g.P("XXX_unrecognized\t[]byte `json:\"-\"`") + g.P("XXX_unrecognized\t[]byte `json:\"-\"`" + resolvedInternaltags) } if gogoproto.HasSizecache(g.file.FileDescriptorProto, mc.message.DescriptorProto) { - g.P("XXX_sizecache\tint32 `json:\"-\"`") + g.P("XXX_sizecache\tint32 `json:\"-\"`" + resolvedInternaltags) } } diff --git a/test/tags/tags.proto b/test/tags/tags.proto index 3f82b2382b..3677f2b1fb 100644 --- a/test/tags/tags.proto +++ b/test/tags/tags.proto @@ -33,6 +33,7 @@ package tags; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; option (gogoproto.populate_all) = true; +option (gogoproto.internal_struct_field_tags) = "xml:\"-\""; message Outside { optional Inside Inside = 1 [(gogoproto.embed) = true, (gogoproto.jsontag) = ""]; diff --git a/test/tags/tags_test.go b/test/tags/tags_test.go index ca472a4ef7..9b3ca48b3d 100644 --- a/test/tags/tags_test.go +++ b/test/tags/tags_test.go @@ -72,3 +72,17 @@ func TestTags(t *testing.T) { } } } + +func TestHiddenTags(t *testing.T) { + var tests = []string{ + "XXX_NoUnkeyedLiteral", "XXX_unrecognized", "XXX_sizecache", + } + + for _, tt := range tests { + tv := reflect.ValueOf(Inside{}).Type() + f, _ := tv.FieldByName(tt) + if xmltag := f.Tag.Get("xml"); xmltag != "-" { + t.Fatalf("proto %q type: xml tag %s != %s", tv.Name(), xmltag, "-") + } + } +}