reflect/protoreflect: add helper methods to FieldDescriptor
Added API:
FieldDescriptor.IsExtension
FieldDescriptor.IsList
FieldDescriptor.MapKey
FieldDescriptor.MapValue
FieldDescriptor.ContainingOneof
FieldDescriptor.ContainingMessage
Deprecated API (to be removed in subsequent CL):
FieldDescriptor.Oneof
FieldDescriptor.Extendee
These methods help cleanup several common usage patterns.
Change-Id: I9a3ffabc2edb2173c536509b22f330f98bba7cf3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/176977
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/proto/isinit.go b/proto/isinit.go
index 199f181..01f956d 100644
--- a/proto/isinit.go
+++ b/proto/isinit.go
@@ -53,20 +53,14 @@
return true
}
if field.IsMap() {
- if md.Fields().ByNumber(2).Message() == nil {
+ if field.MapValue().Message() == nil {
return true
}
}
// Recurse into the field
stack := append(stack, field.Name())
switch {
- case field.IsMap():
- v.Map().Range(func(key pref.MapKey, v pref.Value) bool {
- stack := append(stack, "[", key, "].")
- err = isInitialized(v.Message(), stack)
- return err == nil
- })
- case field.Cardinality() == pref.Repeated:
+ case field.IsList():
for i, list := 0, v.List(); i < list.Len(); i++ {
stack := append(stack, "[", i, "].")
err = isInitialized(list.Get(i).Message(), stack)
@@ -74,6 +68,12 @@
break
}
}
+ case field.IsMap():
+ v.Map().Range(func(key pref.MapKey, v pref.Value) bool {
+ stack := append(stack, "[", key, "].")
+ err = isInitialized(v.Message(), stack)
+ return err == nil
+ })
default:
stack := append(stack, ".")
err = isInitialized(v.Message(), stack)