all: cleanup protoimpl calls

Use MessageV1, MessageV2, and MessageReflect directly.

Change-Id: Ifb44e2cc2dcb52a44894b52d2e932558e275aecd
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/219558
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/go.mod b/go.mod
index 3e995cf..55179c0 100644
--- a/go.mod
+++ b/go.mod
@@ -4,5 +4,5 @@
 
 require (
 	github.com/google/go-cmp v0.4.0
-	google.golang.org/protobuf v0.0.0-20200224223749-2dabbe471100
+	google.golang.org/protobuf v0.0.0-20200225203307-f6cf4925a90e
 )
diff --git a/go.sum b/go.sum
index 4578aaf..243c022 100644
--- a/go.sum
+++ b/go.sum
@@ -8,5 +8,5 @@
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200224223749-2dabbe471100 h1:i1uRQ2Eod1FWX6jGO/l8K0oMIwtCWeEmeDtLy5YABYc=
-google.golang.org/protobuf v0.0.0-20200224223749-2dabbe471100/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v0.0.0-20200225203307-f6cf4925a90e h1:wrJFqPhiw6ByHbcNMcv/+6kk7HQLewtkSxANqkwtQ/0=
+google.golang.org/protobuf v0.0.0-20200225203307-f6cf4925a90e/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
diff --git a/jsonpb/decode.go b/jsonpb/decode.go
index 492b8c1..6faa5fe 100644
--- a/jsonpb/decode.go
+++ b/jsonpb/decode.go
@@ -20,7 +20,6 @@
 	protoV2 "google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
-	"google.golang.org/protobuf/runtime/protoimpl"
 )
 
 const wrapJSONUnmarshalV2 = false
@@ -87,7 +86,7 @@
 		return jsu.UnmarshalJSONPB(u, raw)
 	}
 
-	mr := protoimpl.X.MessageOf(m)
+	mr := proto.MessageReflect(m)
 
 	// NOTE: For historical reasons, a top-level null is treated as a noop.
 	// This is incorrect, but kept for compatibility.
@@ -109,7 +108,7 @@
 			mr = mr.New()
 
 			// Use a defer to copy all unmarshaled fields into the original message.
-			dst := protoimpl.X.MessageOf(m)
+			dst := proto.MessageReflect(m)
 			defer mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 				dst.Set(fd, v)
 				return true
@@ -140,7 +139,7 @@
 		return nil
 	}
 
-	if jsu, ok := protoimpl.X.ProtoMessageV1Of(m.Interface()).(JSONPBUnmarshaler); ok {
+	if jsu, ok := proto.MessageV1(m.Interface()).(JSONPBUnmarshaler); ok {
 		return jsu.UnmarshalJSONPB(u, in)
 	}
 
@@ -167,7 +166,7 @@
 			if err != nil {
 				return err
 			}
-			m2 = protoimpl.X.MessageOf(mi)
+			m2 = proto.MessageReflect(mi)
 		} else {
 			mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL)
 			if err != nil {
diff --git a/jsonpb/encode.go b/jsonpb/encode.go
index 3cb4a68..c5b80bc 100644
--- a/jsonpb/encode.go
+++ b/jsonpb/encode.go
@@ -21,7 +21,6 @@
 	protoV2 "google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
-	"google.golang.org/protobuf/runtime/protoimpl"
 )
 
 const wrapJSONMarshalV2 = false
@@ -105,10 +104,10 @@
 		if jm.AnyResolver != nil {
 			opts.Resolver = anyResolver{jm.AnyResolver}
 		}
-		return opts.Marshal(protoimpl.X.MessageOf(m).Interface())
+		return opts.Marshal(proto.MessageReflect(m).Interface())
 	} else {
 		// Check for unpopulated required fields first.
-		m2 := protoimpl.X.MessageOf(m)
+		m2 := proto.MessageReflect(m)
 		if err := protoV2.CheckInitialized(m2.Interface()); err != nil {
 			return nil, err
 		}
@@ -129,7 +128,7 @@
 }
 
 func (w *jsonWriter) marshalMessage(m protoreflect.Message, indent, typeURL string) error {
-	if jsm, ok := protoimpl.X.ProtoMessageV1Of(m.Interface()).(JSONPBMarshaler); ok {
+	if jsm, ok := proto.MessageV1(m.Interface()).(JSONPBMarshaler); ok {
 		b, err := jsm.MarshalJSONPB(w.Marshaler)
 		if err != nil {
 			return err
@@ -321,7 +320,7 @@
 		if err != nil {
 			return err
 		}
-		m2 = protoimpl.X.MessageOf(mi)
+		m2 = proto.MessageReflect(mi)
 	} else {
 		mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL)
 		if err != nil {
diff --git a/proto/buffer.go b/proto/buffer.go
index e61a675..9aae5bc 100644
--- a/proto/buffer.go
+++ b/proto/buffer.go
@@ -130,7 +130,7 @@
 // DebugPrint dumps the encoded bytes of b with a header and footer including s
 // to stdout. This is only intended for debugging.
 func (*Buffer) DebugPrint(s string, b []byte) {
-	m := protoimpl.X.MessageOf(new(unknownFields))
+	m := MessageReflect(new(unknownFields))
 	m.SetUnknown(b)
 	b, _ = prototext.MarshalOptions{AllowPartial: true, Indent: "\t"}.Marshal(m.Interface())
 	fmt.Printf("==== %s ====\n%s==== %s ====\n", s, b, s)
diff --git a/proto/defaults.go b/proto/defaults.go
index 1c3a27e..d399bf0 100644
--- a/proto/defaults.go
+++ b/proto/defaults.go
@@ -6,7 +6,6 @@
 
 import (
 	"google.golang.org/protobuf/reflect/protoreflect"
-	"google.golang.org/protobuf/runtime/protoimpl"
 )
 
 // SetDefaults sets unpopulated scalar fields to their default values.
@@ -14,7 +13,7 @@
 // SetDefaults is recursively called upon any populated message fields.
 func SetDefaults(m Message) {
 	if m != nil {
-		setDefaults(protoimpl.X.MessageOf(m))
+		setDefaults(MessageReflect(m))
 	}
 }
 
diff --git a/proto/discard.go b/proto/discard.go
index 7c82e02..2187e87 100644
--- a/proto/discard.go
+++ b/proto/discard.go
@@ -6,7 +6,6 @@
 
 import (
 	"google.golang.org/protobuf/reflect/protoreflect"
-	"google.golang.org/protobuf/runtime/protoimpl"
 )
 
 // DiscardUnknown recursively discards all unknown fields from this message
@@ -19,7 +18,7 @@
 // explicitly clear the unknown fields after unmarshaling.
 func DiscardUnknown(m Message) {
 	if m != nil {
-		discardUnknown(protoimpl.X.MessageOf(m))
+		discardUnknown(MessageReflect(m))
 	}
 }
 
diff --git a/proto/extensions.go b/proto/extensions.go
index 53abf45..d78d258 100644
--- a/proto/extensions.go
+++ b/proto/extensions.go
@@ -43,7 +43,7 @@
 // HasExtension reports whether the extension field is present in m
 // either as an explicitly populated field or as an unknown field.
 func HasExtension(m Message, xt *ExtensionDesc) (has bool) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() {
 		return false
 	}
@@ -71,7 +71,7 @@
 // ClearExtension removes the the exntesion field from m
 // either as an explicitly populated field or as an unknown field.
 func ClearExtension(m Message, xt *ExtensionDesc) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() {
 		return
 	}
@@ -94,7 +94,7 @@
 // ClearAllExtensions clears all extensions from m.
 // This includes populated fields and unknown fields in the extension range.
 func ClearAllExtensions(m Message) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() {
 		return
 	}
@@ -118,7 +118,7 @@
 // If the descriptor is type incomplete (i.e., ExtensionDesc.ExtensionType is nil),
 // then GetExtension returns the raw encoded bytes for the extension field.
 func GetExtension(m Message, xt *ExtensionDesc) (interface{}, error) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 		return nil, errNotExtendable
 	}
@@ -200,7 +200,7 @@
 // corresponding with the provided list of extension descriptors, xts.
 // If an extension is missing in m, the corresponding value is nil.
 func GetExtensions(m Message, xts []*ExtensionDesc) ([]interface{}, error) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() {
 		return nil, errNotExtendable
 	}
@@ -221,7 +221,7 @@
 
 // SetExtension sets an extension field in m to the provided value.
 func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 		return errNotExtendable
 	}
@@ -252,7 +252,7 @@
 //
 // Deprecated: Use Message.ProtoReflect.SetUnknown instead.
 func SetRawExtension(m Message, fnum int32, b []byte) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() {
 		return
 	}
@@ -277,7 +277,7 @@
 // the ExtensionDesc.Field field is populated.
 // The order of the extension descriptors is undefined.
 func ExtensionDescs(m Message) ([]*ExtensionDesc, error) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 		return nil, errNotExtendable
 	}
diff --git a/proto/proto.go b/proto/proto.go
index 02c620e..5aee89c 100644
--- a/proto/proto.go
+++ b/proto/proto.go
@@ -127,14 +127,7 @@
 
 // Clone returns a deep copy of src.
 func Clone(src Message) Message {
-	srcMsg := protoimpl.X.MessageOf(src)
-	if srcMsg == nil || !srcMsg.IsValid() {
-		return src
-	}
-
-	dst := protoimpl.X.ProtoMessageV1Of(srcMsg.New().Interface())
-	Merge(dst, src)
-	return dst
+	return MessageV1(protoV2.Clone(MessageV2(src)))
 }
 
 // Merge merges src into dst, which must be messages of the same type.
@@ -146,15 +139,7 @@
 // the corresponding map field in dst, possibly replacing existing entries.
 // The unknown fields of src are appended to the unknown fields of dst.
 func Merge(dst, src Message) {
-	// TODO: Drop this type assertion if the aberrant wrapper in v2 calls this.
-	if m, ok := dst.(Merger); ok {
-		m.Merge(src)
-		return
-	}
-	protoV2.Merge(
-		protoimpl.X.ProtoMessageV2Of(dst),
-		protoimpl.X.ProtoMessageV2Of(src),
-	)
+	protoV2.Merge(MessageV2(dst), MessageV2(src))
 }
 
 // Equal reports whether two messages are equal.
@@ -173,10 +158,7 @@
 // Maps are equal if they have the same set of keys, where the pair of values
 // for each key is also equal.
 func Equal(x, y Message) bool {
-	return protoV2.Equal(
-		protoimpl.X.ProtoMessageV2Of(x),
-		protoimpl.X.ProtoMessageV2Of(y),
-	)
+	return protoV2.Equal(MessageV2(x), MessageV2(y))
 }
 
 func isMessageSet(md protoreflect.MessageDescriptor) bool {
diff --git a/proto/registry.go b/proto/registry.go
index 8c927ae..abab110 100644
--- a/proto/registry.go
+++ b/proto/registry.go
@@ -261,7 +261,7 @@
 }
 
 func messageGoType(mt protoreflect.MessageType) reflect.Type {
-	return reflect.TypeOf(protoimpl.X.ProtoMessageV1Of(mt.New().Interface()))
+	return reflect.TypeOf(MessageV1(mt.Zero().Interface()))
 }
 
 // MessageName returns the full protobuf name for the given message type.
diff --git a/proto/text_decode.go b/proto/text_decode.go
index 6216513..4a59310 100644
--- a/proto/text_decode.go
+++ b/proto/text_decode.go
@@ -17,7 +17,6 @@
 	protoV2 "google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
-	"google.golang.org/protobuf/runtime/protoimpl"
 )
 
 const wrapTextUnmarshalV2 = false
@@ -47,7 +46,7 @@
 	}
 
 	m.Reset()
-	mi := protoimpl.X.ProtoMessageV2Of(m)
+	mi := MessageV2(m)
 
 	if wrapTextUnmarshalV2 {
 		err := prototext.UnmarshalOptions{
diff --git a/proto/text_encode.go b/proto/text_encode.go
index 31f906d..e2a0ad3 100644
--- a/proto/text_encode.go
+++ b/proto/text_encode.go
@@ -18,7 +18,6 @@
 	"google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
-	"google.golang.org/protobuf/runtime/protoimpl"
 )
 
 const wrapTextMarshalV2 = false
@@ -47,7 +46,7 @@
 }
 
 func (tm *TextMarshaler) marshal(m Message) ([]byte, error) {
-	mr := protoimpl.X.MessageOf(m)
+	mr := MessageReflect(m)
 	if mr == nil || !mr.IsValid() {
 		return []byte("<nil>"), nil
 	}
diff --git a/proto/wire.go b/proto/wire.go
index 5e8b7ac..57abb57 100644
--- a/proto/wire.go
+++ b/proto/wire.go
@@ -7,7 +7,6 @@
 import (
 	protoV2 "google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/runtime/protoiface"
-	"google.golang.org/protobuf/runtime/protoimpl"
 )
 
 // Size returns the size in bytes of the wire-format encoding of m.
@@ -15,7 +14,7 @@
 	if m == nil {
 		return 0
 	}
-	mi := protoimpl.X.ProtoMessageV2Of(m)
+	mi := MessageV2(m)
 	return protoV2.Size(mi)
 }
 
@@ -34,7 +33,7 @@
 	if m == nil {
 		return nil, ErrNil
 	}
-	mi := protoimpl.X.ProtoMessageV2Of(m)
+	mi := MessageV2(m)
 	nbuf, err := protoV2.MarshalOptions{
 		Deterministic: deterministic,
 		AllowPartial:  true,
@@ -61,7 +60,7 @@
 
 // UnmarshalMerge parses a wire-format message in b and places the decoded results in m.
 func UnmarshalMerge(b []byte, m Message) error {
-	mi := protoimpl.X.ProtoMessageV2Of(m)
+	mi := MessageV2(m)
 	out, err := protoV2.UnmarshalOptions{
 		AllowPartial: true,
 		Merge:        true,
diff --git a/ptypes/any.go b/ptypes/any.go
index 9e0f110..e729dcf 100644
--- a/ptypes/any.go
+++ b/ptypes/any.go
@@ -11,7 +11,6 @@
 	"github.com/golang/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
-	"google.golang.org/protobuf/runtime/protoimpl"
 
 	anypb "github.com/golang/protobuf/ptypes/any"
 )
@@ -68,7 +67,7 @@
 	if err != nil {
 		return nil, err
 	}
-	return protoimpl.X.ProtoMessageV1Of(mt.New().Interface()), nil
+	return proto.MessageV1(mt.New().Interface()), nil
 }
 
 // UnmarshalAny unmarshals the encoded value contained in the anypb.Any message
@@ -141,7 +140,7 @@
 	if m.Message == nil {
 		return nil
 	}
-	return dynamicAny{protoimpl.X.MessageOf(m.Message)}
+	return dynamicAny{proto.MessageReflect(m.Message)}
 }
 
 type dynamicAny struct{ protoreflect.Message }
@@ -153,7 +152,7 @@
 	return dynamicAnyType{m.Message.Type()}.New()
 }
 func (m dynamicAny) Interface() protoreflect.ProtoMessage {
-	return DynamicAny{protoimpl.X.ProtoMessageV1Of(m.Message.Interface())}
+	return DynamicAny{proto.MessageV1(m.Message.Interface())}
 }
 
 type dynamicAnyType struct{ protoreflect.MessageType }