proto: support message_set_wire_format

MessageSets are a deprecated proto1 feature, long since superseded by
extensions. Add disabled-by-default support behind flags.Proto1Legacy.

Change-Id: I7d3ace07f3b0efd59673034f3dc633b908345a88
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/185538
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/codec_message.go b/internal/impl/codec_message.go
index 2b8b047..e43c812 100644
--- a/internal/impl/codec_message.go
+++ b/internal/impl/codec_message.go
@@ -5,9 +5,11 @@
 package impl
 
 import (
+	"fmt"
 	"reflect"
 	"sort"
 
+	"google.golang.org/protobuf/internal/encoding/messageset"
 	"google.golang.org/protobuf/internal/encoding/wire"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	piface "google.golang.org/protobuf/runtime/protoiface"
@@ -77,6 +79,21 @@
 		mi.orderedCoderFields = append(mi.orderedCoderFields, cf)
 		mi.coderFields[cf.num] = cf
 	}
+	if messageset.IsMessageSet(mi.PBType.Descriptor()) {
+		if !mi.extensionOffset.IsValid() {
+			panic(fmt.Sprintf("%v: MessageSet with no extensions field", mi.PBType.FullName()))
+		}
+		cf := &coderFieldInfo{
+			num:       messageset.FieldItem,
+			offset:    si.extensionOffset,
+			isPointer: true,
+			funcs:     makeMessageSetFieldCoder(mi),
+		}
+		mi.orderedCoderFields = append(mi.orderedCoderFields, cf)
+		mi.coderFields[cf.num] = cf
+		// Invalidate the extension offset, since the field codec handles extensions.
+		mi.extensionOffset = invalidOffset
+	}
 	sort.Slice(mi.orderedCoderFields, func(i, j int) bool {
 		return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num
 	})