reflect/protoreflect: add KnownFields.WhichOneof

Add a method that provides efficiently querying for which member field
in a oneof is actually set. This is useful when dealing with oneofs
with many member fields.

Change-Id: I918b566c432f8bdd24dcecbb5501d231ffefef29
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/170580
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/message_field.go b/internal/impl/message_field.go
index 0ef8b12..581481c 100644
--- a/internal/impl/message_field.go
+++ b/internal/impl/message_field.go
@@ -290,3 +290,23 @@
 	}
 	return pv
 }
+
+type oneofInfo struct {
+	which func(pointer) pref.FieldNumber
+}
+
+func makeOneofInfo(od pref.OneofDescriptor, fs reflect.StructField, wrappersByType map[reflect.Type]pref.FieldNumber) *oneofInfo {
+	fieldOffset := offsetOf(fs)
+	return &oneofInfo{
+		which: func(p pointer) pref.FieldNumber {
+			if p.IsNil() {
+				return 0
+			}
+			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
+			if rv.IsNil() {
+				return 0
+			}
+			return wrappersByType[rv.Elem().Type().Elem()]
+		},
+	}
+}