reflect/protoreflect: add Descriptor specific methods
Added methods:
Enum.Descriptor
Message.Descriptor
EnumType.Descriptor
MessageType.Descriptor
ExtensionType.Descriptor
Message.New
All functionality is switched over to use those methods instead of
implicitly relying on the fact that {Enum,Message}Type implicitly
implement the associated descriptor interface.
This CL does not yet remove {Enum,Message}.Type or prevent
{Enum,Message,Extension}Type from implementating a descriptor.
That is a subsequent CL.
The Message.New method is also added to replace functionality
that will be lost when the Type methods are removed.
Change-Id: I7fefde1673bbd40bfdac489aca05cec9a6c98eb1
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/174918
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/encoding/jsonpb/decode.go b/encoding/jsonpb/decode.go
index 0a08e4f..7e142c5 100644
--- a/encoding/jsonpb/decode.go
+++ b/encoding/jsonpb/decode.go
@@ -135,7 +135,7 @@
func (o UnmarshalOptions) unmarshalMessage(m pref.Message, skipTypeURL bool) error {
var nerr errors.NonFatal
- if isCustomType(m.Type().FullName()) {
+ if isCustomType(m.Descriptor().FullName()) {
return o.unmarshalCustomType(m)
}
@@ -160,9 +160,9 @@
var seenNums set.Ints
var seenOneofs set.Ints
- msgType := m.Type()
+ messageDesc := m.Descriptor()
knownFields := m.KnownFields()
- fieldDescs := msgType.Fields()
+ fieldDescs := messageDesc.Fields()
xtTypes := knownFields.ExtensionTypes()
Loop:
@@ -208,7 +208,9 @@
xtTypes.Register(xt)
}
}
- fd = xt
+ if xt != nil {
+ fd = xt.Descriptor()
+ }
} else {
// The name can either be the JSON name or the proto field name.
fd = fieldDescs.ByJSONName(name)
@@ -225,13 +227,13 @@
}
continue
}
- return newError("%v contains unknown field %s", msgType.FullName(), jval)
+ return newError("%v contains unknown field %s", messageDesc.FullName(), jval)
}
// Do not allow duplicate fields.
num := uint64(fd.Number())
if seenNums.Has(num) {
- return newError("%v contains repeated field %s", msgType.FullName(), jval)
+ return newError("%v contains repeated field %s", messageDesc.FullName(), jval)
}
seenNums.Set(num)