reflect/protoreflect: add HasJSONName, ReservedRanges, and ReservedNames
These properties of descriptors are currently missing and makes it impossible
to convert a FileDescriptorProto into one of the structured Go representations
and convert it back to a proto message without loss of information.
Furthermore, ReservedRanges and ReservedNames has semantic importance
to text serialization.
Change-Id: Ic33c30020ad51912b143156b95f47a4fb8da3503
Reviewed-on: https://go-review.googlesource.com/c/153019
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/reflect/protodesc/protodesc.go b/reflect/protodesc/protodesc.go
index 65cbf87..2467a92 100644
--- a/reflect/protodesc/protodesc.go
+++ b/reflect/protodesc/protodesc.go
@@ -58,7 +58,7 @@
func NewFile(fd *descriptorpb.FileDescriptorProto, r *protoregistry.Files) (protoreflect.FileDescriptor, error) {
var f prototype.File
switch fd.GetSyntax() {
- case "", "proto2":
+ case "proto2", "":
f.Syntax = protoreflect.Proto2
case "proto3":
f.Syntax = protoreflect.Proto3
@@ -172,6 +172,15 @@
Options: od.Options,
})
}
+ for _, s := range md.GetReservedName() {
+ m.ReservedNames = append(m.ReservedNames, protoreflect.Name(s))
+ }
+ for _, rr := range md.GetReservedRange() {
+ m.ReservedRanges = append(m.ReservedRanges, [2]protoreflect.FieldNumber{
+ protoreflect.FieldNumber(rr.GetStart()),
+ protoreflect.FieldNumber(rr.GetEnd()),
+ })
+ }
for _, xr := range md.GetExtensionRange() {
m.ExtensionRanges = append(m.ExtensionRanges, [2]protoreflect.FieldNumber{
protoreflect.FieldNumber(xr.GetStart()),
@@ -210,6 +219,15 @@
Options: vd.Options,
})
}
+ for _, s := range ed.GetReservedName() {
+ e.ReservedNames = append(e.ReservedNames, protoreflect.Name(s))
+ }
+ for _, rr := range ed.GetReservedRange() {
+ e.ReservedRanges = append(e.ReservedRanges, [2]protoreflect.EnumNumber{
+ protoreflect.EnumNumber(rr.GetStart()),
+ protoreflect.EnumNumber(rr.GetEnd()),
+ })
+ }
es = append(es, e)
}
return es, nil