cmd/protoc-gen-go: generate descriptor proto using v2 textpb
Changes:
* Modify protoc-gen-go to use a helper from internal/impl
to print the message as text.
* Add a helper function to internal/impl that calls v2 textpb.
* Modify encoding/textpb to avoid depending on descriptor proto,
which would cause an import cycle.
* Modify internal/fileinit to populate a pseudo-internal
method on MessageDescriptor to check whether the message should
use the message set wire format. We avoid adding this to the
main MessageDescriptor interface since message sets are a
deprecated proto1 feature that we should avoid promoting.
Change-Id: Ibaf79a563af695756f11ddc4db69b38e25a8f1a7
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/168439
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index fc9cb45..b3f7bcf 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -441,7 +441,11 @@
// Reset
g.P("func (m *", message.GoIdent, ") Reset() { *m = ", message.GoIdent, "{} }")
// String
- g.P("func (m *", message.GoIdent, ") String() string { return ", f.protoPackage().Ident("CompactTextString"), "(m) }")
+ if isDescriptor(f.File) {
+ g.P("func (m *", message.GoIdent, ") String() string { return ", protoimplPackage.Ident("X"), ".MessageStringOf(m) }")
+ } else {
+ g.P("func (m *", message.GoIdent, ") String() string { return ", f.protoPackage().Ident("CompactTextString"), "(m) }")
+ }
// ProtoMessage
g.P("func (*", message.GoIdent, ") ProtoMessage() {}")
// Descriptor
diff --git a/encoding/textpb/encode.go b/encoding/textpb/encode.go
index 9f1da09..ebc33b7 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -15,8 +15,6 @@
"github.com/golang/protobuf/v2/proto"
pref "github.com/golang/protobuf/v2/reflect/protoreflect"
"github.com/golang/protobuf/v2/reflect/protoregistry"
-
- descpb "github.com/golang/protobuf/v2/types/descriptor"
)
// Marshal writes the given proto.Message in textproto format using default options.
@@ -342,15 +340,8 @@
if xt.FullName().Parent() != mt.FullName() {
return false
}
- xmt := xt.ExtendedType()
- if xmt.Fields().Len() != 0 {
- return false
- }
- opt := xmt.Options().(*descpb.MessageOptions)
- if opt == nil {
- return false
- }
- return opt.GetMessageSetWireFormat()
+ xmt, ok := xt.ExtendedType().(interface{ IsMessageSet() bool })
+ return ok && xmt.IsMessageSet()
}
// appendUnknown parses the given []byte and appends field(s) into the given fields slice.
diff --git a/internal/fileinit/desc.go b/internal/fileinit/desc.go
index dbfe377..6d3b1b4 100644
--- a/internal/fileinit/desc.go
+++ b/internal/fileinit/desc.go
@@ -292,6 +292,7 @@
new func() pref.Message
isMapEntry bool
+ isMessageSet bool
fields fieldDescs
oneofs oneofDescs
resvNames names
@@ -352,6 +353,12 @@
return md.lazy
}
+// IsMessageSet is a pseudo-internal API for checking whether a message
+// should serialize in the proto1 message format.
+func (md *messageDesc) IsMessageSet() bool {
+ return md.lazyInit().isMessageSet
+}
+
func (fd *fieldDesc) Options() pref.OptionsMessage {
return unmarshalOptions(ptype.X.FieldOptions(), fd.options)
}
diff --git a/internal/fileinit/desc_lazy.go b/internal/fileinit/desc_lazy.go
index 0ff208a..ffcad72 100644
--- a/internal/fileinit/desc_lazy.go
+++ b/internal/fileinit/desc_lazy.go
@@ -560,6 +560,8 @@
switch num {
case descfield.MessageOptions_MapEntry:
md.lazy.isMapEntry = wire.DecodeBool(v)
+ case descfield.MessageOptions_MessageSetWireFormat:
+ md.lazy.isMessageSet = wire.DecodeBool(v)
}
default:
m := wire.ConsumeFieldValue(num, typ, b)
diff --git a/internal/impl/export.go b/internal/impl/export.go
index 6e54939..12ce51b 100644
--- a/internal/impl/export.go
+++ b/internal/impl/export.go
@@ -7,6 +7,7 @@
import (
"strconv"
+ "github.com/golang/protobuf/v2/encoding/textpb"
ptype "github.com/golang/protobuf/v2/internal/prototype"
pref "github.com/golang/protobuf/v2/reflect/protoreflect"
)
@@ -86,3 +87,10 @@
}
return legacyWrapper.ExtensionTypeOf(d, t)
}
+
+// MessageStringOf returns the message value as a string,
+// which is the message serialized in the protobuf text format.
+func (Export) MessageStringOf(m pref.ProtoMessage) string {
+ b, _ := textpb.MarshalOptions{Compact: true}.Marshal(m)
+ return string(b)
+}
diff --git a/types/descriptor/descriptor.pb.go b/types/descriptor/descriptor.pb.go
index d9f8019..484f1f2 100644
--- a/types/descriptor/descriptor.pb.go
+++ b/types/descriptor/descriptor.pb.go
@@ -403,7 +403,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[0].MessageOf(m)
}
func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} }
-func (m *FileDescriptorSet) String() string { return protoapi.CompactTextString(m) }
+func (m *FileDescriptorSet) String() string { return protoimpl.X.MessageStringOf(m) }
func (*FileDescriptorSet) ProtoMessage() {}
// Deprecated: Use FileDescriptorSet.ProtoReflect.Type instead.
@@ -452,7 +452,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[1].MessageOf(m)
}
func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} }
-func (m *FileDescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *FileDescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*FileDescriptorProto) ProtoMessage() {}
// Deprecated: Use FileDescriptorProto.ProtoReflect.Type instead.
@@ -567,7 +567,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[2].MessageOf(m)
}
func (m *DescriptorProto) Reset() { *m = DescriptorProto{} }
-func (m *DescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *DescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*DescriptorProto) ProtoMessage() {}
// Deprecated: Use DescriptorProto.ProtoReflect.Type instead.
@@ -658,7 +658,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[3].MessageOf(m)
}
func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} }
-func (m *ExtensionRangeOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *ExtensionRangeOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*ExtensionRangeOptions) ProtoMessage() {}
// Deprecated: Use ExtensionRangeOptions.ProtoReflect.Type instead.
@@ -723,7 +723,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[4].MessageOf(m)
}
func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} }
-func (m *FieldDescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *FieldDescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*FieldDescriptorProto) ProtoMessage() {}
// Deprecated: Use FieldDescriptorProto.ProtoReflect.Type instead.
@@ -814,7 +814,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[5].MessageOf(m)
}
func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} }
-func (m *OneofDescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *OneofDescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*OneofDescriptorProto) ProtoMessage() {}
// Deprecated: Use OneofDescriptorProto.ProtoReflect.Type instead.
@@ -857,7 +857,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[6].MessageOf(m)
}
func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} }
-func (m *EnumDescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *EnumDescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*EnumDescriptorProto) ProtoMessage() {}
// Deprecated: Use EnumDescriptorProto.ProtoReflect.Type instead.
@@ -914,7 +914,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[7].MessageOf(m)
}
func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} }
-func (m *EnumValueDescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *EnumValueDescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*EnumValueDescriptorProto) ProtoMessage() {}
// Deprecated: Use EnumValueDescriptorProto.ProtoReflect.Type instead.
@@ -957,7 +957,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[8].MessageOf(m)
}
func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} }
-func (m *ServiceDescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *ServiceDescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*ServiceDescriptorProto) ProtoMessage() {}
// Deprecated: Use ServiceDescriptorProto.ProtoReflect.Type instead.
@@ -1007,7 +1007,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[9].MessageOf(m)
}
func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} }
-func (m *MethodDescriptorProto) String() string { return protoapi.CompactTextString(m) }
+func (m *MethodDescriptorProto) String() string { return protoimpl.X.MessageStringOf(m) }
func (*MethodDescriptorProto) ProtoMessage() {}
// Deprecated: Use MethodDescriptorProto.ProtoReflect.Type instead.
@@ -1155,7 +1155,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[10].MessageOf(m)
}
func (m *FileOptions) Reset() { *m = FileOptions{} }
-func (m *FileOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *FileOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*FileOptions) ProtoMessage() {}
// Deprecated: Use FileOptions.ProtoReflect.Type instead.
@@ -1393,7 +1393,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[11].MessageOf(m)
}
func (m *MessageOptions) Reset() { *m = MessageOptions{} }
-func (m *MessageOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *MessageOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*MessageOptions) ProtoMessage() {}
// Deprecated: Use MessageOptions.ProtoReflect.Type instead.
@@ -1521,7 +1521,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[12].MessageOf(m)
}
func (m *FieldOptions) Reset() { *m = FieldOptions{} }
-func (m *FieldOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *FieldOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*FieldOptions) ProtoMessage() {}
// Deprecated: Use FieldOptions.ProtoReflect.Type instead.
@@ -1606,7 +1606,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[13].MessageOf(m)
}
func (m *OneofOptions) Reset() { *m = OneofOptions{} }
-func (m *OneofOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *OneofOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*OneofOptions) ProtoMessage() {}
// Deprecated: Use OneofOptions.ProtoReflect.Type instead.
@@ -1651,7 +1651,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[14].MessageOf(m)
}
func (m *EnumOptions) Reset() { *m = EnumOptions{} }
-func (m *EnumOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *EnumOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*EnumOptions) ProtoMessage() {}
// Deprecated: Use EnumOptions.ProtoReflect.Type instead.
@@ -1709,7 +1709,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[15].MessageOf(m)
}
func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} }
-func (m *EnumValueOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *EnumValueOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*EnumValueOptions) ProtoMessage() {}
// Deprecated: Use EnumValueOptions.ProtoReflect.Type instead.
@@ -1760,7 +1760,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[16].MessageOf(m)
}
func (m *ServiceOptions) Reset() { *m = ServiceOptions{} }
-func (m *ServiceOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *ServiceOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*ServiceOptions) ProtoMessage() {}
// Deprecated: Use ServiceOptions.ProtoReflect.Type instead.
@@ -1812,7 +1812,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[17].MessageOf(m)
}
func (m *MethodOptions) Reset() { *m = MethodOptions{} }
-func (m *MethodOptions) String() string { return protoapi.CompactTextString(m) }
+func (m *MethodOptions) String() string { return protoimpl.X.MessageStringOf(m) }
func (*MethodOptions) ProtoMessage() {}
// Deprecated: Use MethodOptions.ProtoReflect.Type instead.
@@ -1878,7 +1878,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[18].MessageOf(m)
}
func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} }
-func (m *UninterpretedOption) String() string { return protoapi.CompactTextString(m) }
+func (m *UninterpretedOption) String() string { return protoimpl.X.MessageStringOf(m) }
func (*UninterpretedOption) ProtoMessage() {}
// Deprecated: Use UninterpretedOption.ProtoReflect.Type instead.
@@ -1991,7 +1991,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[19].MessageOf(m)
}
func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} }
-func (m *SourceCodeInfo) String() string { return protoapi.CompactTextString(m) }
+func (m *SourceCodeInfo) String() string { return protoimpl.X.MessageStringOf(m) }
func (*SourceCodeInfo) ProtoMessage() {}
// Deprecated: Use SourceCodeInfo.ProtoReflect.Type instead.
@@ -2022,7 +2022,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[20].MessageOf(m)
}
func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} }
-func (m *GeneratedCodeInfo) String() string { return protoapi.CompactTextString(m) }
+func (m *GeneratedCodeInfo) String() string { return protoimpl.X.MessageStringOf(m) }
func (*GeneratedCodeInfo) ProtoMessage() {}
// Deprecated: Use GeneratedCodeInfo.ProtoReflect.Type instead.
@@ -2050,7 +2050,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[21].MessageOf(m)
}
func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} }
-func (m *DescriptorProto_ExtensionRange) String() string { return protoapi.CompactTextString(m) }
+func (m *DescriptorProto_ExtensionRange) String() string { return protoimpl.X.MessageStringOf(m) }
func (*DescriptorProto_ExtensionRange) ProtoMessage() {}
// Deprecated: Use DescriptorProto_ExtensionRange.ProtoReflect.Type instead.
@@ -2094,7 +2094,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[22].MessageOf(m)
}
func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} }
-func (m *DescriptorProto_ReservedRange) String() string { return protoapi.CompactTextString(m) }
+func (m *DescriptorProto_ReservedRange) String() string { return protoimpl.X.MessageStringOf(m) }
func (*DescriptorProto_ReservedRange) ProtoMessage() {}
// Deprecated: Use DescriptorProto_ReservedRange.ProtoReflect.Type instead.
@@ -2134,7 +2134,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[23].MessageOf(m)
}
func (m *EnumDescriptorProto_EnumReservedRange) Reset() { *m = EnumDescriptorProto_EnumReservedRange{} }
-func (m *EnumDescriptorProto_EnumReservedRange) String() string { return protoapi.CompactTextString(m) }
+func (m *EnumDescriptorProto_EnumReservedRange) String() string { return protoimpl.X.MessageStringOf(m) }
func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {}
// Deprecated: Use EnumDescriptorProto_EnumReservedRange.ProtoReflect.Type instead.
@@ -2173,7 +2173,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[24].MessageOf(m)
}
func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} }
-func (m *UninterpretedOption_NamePart) String() string { return protoapi.CompactTextString(m) }
+func (m *UninterpretedOption_NamePart) String() string { return protoimpl.X.MessageStringOf(m) }
func (*UninterpretedOption_NamePart) ProtoMessage() {}
// Deprecated: Use UninterpretedOption_NamePart.ProtoReflect.Type instead.
@@ -2285,7 +2285,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[25].MessageOf(m)
}
func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} }
-func (m *SourceCodeInfo_Location) String() string { return protoapi.CompactTextString(m) }
+func (m *SourceCodeInfo_Location) String() string { return protoimpl.X.MessageStringOf(m) }
func (*SourceCodeInfo_Location) ProtoMessage() {}
// Deprecated: Use SourceCodeInfo_Location.ProtoReflect.Type instead.
@@ -2350,7 +2350,7 @@
return xxx_File_google_protobuf_descriptor_proto_messageTypes[26].MessageOf(m)
}
func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} }
-func (m *GeneratedCodeInfo_Annotation) String() string { return protoapi.CompactTextString(m) }
+func (m *GeneratedCodeInfo_Annotation) String() string { return protoimpl.X.MessageStringOf(m) }
func (*GeneratedCodeInfo_Annotation) ProtoMessage() {}
// Deprecated: Use GeneratedCodeInfo_Annotation.ProtoReflect.Type instead.