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/testing/prototest/prototest.go b/testing/prototest/prototest.go
index f3a1a9f..058ef24 100644
--- a/testing/prototest/prototest.go
+++ b/testing/prototest/prototest.go
@@ -26,10 +26,10 @@
for i := 0; i < md.Fields().Len(); i++ {
fd := md.Fields().Get(i)
switch {
+ case fd.IsList():
+ testFieldList(t, m, fd)
case fd.IsMap():
testFieldMap(t, m, fd)
- case fd.Cardinality() == pref.Repeated:
- testFieldList(t, m, fd)
case fd.Kind() == pref.FloatKind || fd.Kind() == pref.DoubleKind:
testFieldFloat(t, m, fd)
}
@@ -105,7 +105,7 @@
if fd.Cardinality() == pref.Repeated {
wantHas = false
}
- if fd.Oneof() != nil {
+ if fd.ContainingOneof() != nil {
wantHas = true
}
}
@@ -122,12 +122,12 @@
t.Errorf("after clearing %q:\nHas(%v) = %v, want %v", name, num, got, want)
}
switch {
- case fd.IsMap():
- if got := known.Get(num); got.Map().Len() != 0 {
+ case fd.IsList():
+ if got := known.Get(num); got.List().Len() != 0 {
t.Errorf("after clearing %q:\nGet(%v) = %v, want empty list", name, num, formatValue(got))
}
- case fd.Cardinality() == pref.Repeated:
- if got := known.Get(num); got.List().Len() != 0 {
+ case fd.IsMap():
+ if got := known.Get(num); got.Map().Len() != 0 {
t.Errorf("after clearing %q:\nGet(%v) = %v, want empty list", name, num, formatValue(got))
}
default:
@@ -421,6 +421,16 @@
func newValue(m pref.Message, fd pref.FieldDescriptor, n seed, stack []pref.MessageDescriptor) pref.Value {
num := fd.Number()
switch {
+ case fd.IsList():
+ list := m.New().KnownFields().Get(num).List()
+ if n == 0 {
+ return pref.ValueOf(list)
+ }
+ list.Append(newListElement(fd, list, 0, stack))
+ list.Append(newListElement(fd, list, minVal, stack))
+ list.Append(newListElement(fd, list, maxVal, stack))
+ list.Append(newListElement(fd, list, n, stack))
+ return pref.ValueOf(list)
case fd.IsMap():
mapv := m.New().KnownFields().Get(num).Map()
if n == 0 {
@@ -431,16 +441,6 @@
mapv.Set(newMapKey(fd, maxVal), newMapValue(fd, mapv, maxVal, stack))
mapv.Set(newMapKey(fd, n), newMapValue(fd, mapv, 10*n, stack))
return pref.ValueOf(mapv)
- case fd.Cardinality() == pref.Repeated:
- list := m.New().KnownFields().Get(num).List()
- if n == 0 {
- return pref.ValueOf(list)
- }
- list.Append(newListElement(fd, list, 0, stack))
- list.Append(newListElement(fd, list, minVal, stack))
- list.Append(newListElement(fd, list, maxVal, stack))
- list.Append(newListElement(fd, list, n, stack))
- return pref.ValueOf(list)
case fd.Message() != nil:
return populateMessage(m.KnownFields().NewMessage(num), n, stack)
default:
@@ -456,12 +456,12 @@
}
func newMapKey(fd pref.FieldDescriptor, n seed) pref.MapKey {
- kd := fd.Message().Fields().ByNumber(1)
+ kd := fd.MapKey()
return newScalarValue(kd, n).MapKey()
}
func newMapValue(fd pref.FieldDescriptor, mapv pref.Map, n seed, stack []pref.MessageDescriptor) pref.Value {
- vd := fd.Message().Fields().ByNumber(2)
+ vd := fd.MapValue()
if vd.Message() == nil {
return newScalarValue(vd, n)
}