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