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