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)
 	}