internal/impl: add MessageState to every generated message

We define MessageState, which is essentially an atomically set *MessageInfo.
By nesting this as the first field in every generated message, we can
implement the reflective methods on a *MessageState when obtained by
unsafe casting a concrete message pointer as a *MessageState.
The MessageInfo held by MessageState provides additional Go type information
to interpret the memory that comes after the contents of the MessageState.

Since we are nesting a MessageState in every message,
the memory use of every message instance grows by 8B.

On average, the body of ProtoReflect grows from 133B to 202B (+50%).
However, this is offset by XXX_Methods, which is 108B and
will be removed in a future CL. Taking into account the eventual removal
of XXX_Methods, this is a net reduction of 25%.

name          old time/op    new time/op    delta
Name/Value-4    70.3ns ± 2%    17.5ns ± 6%   -75.08%  (p=0.000 n=10+10)
Name/Nil-4      70.6ns ± 3%    33.4ns ± 2%   -52.66%  (p=0.000 n=10+10)

name          old alloc/op   new alloc/op   delta
Name/Value-4     16.0B ± 0%      0.0B       -100.00%  (p=0.000 n=10+10)
Name/Nil-4       16.0B ± 0%      0.0B       -100.00%  (p=0.000 n=10+10)

name          old allocs/op  new allocs/op  delta
Name/Value-4      1.00 ± 0%      0.00       -100.00%  (p=0.000 n=10+10)
Name/Nil-4        1.00 ± 0%      0.00       -100.00%  (p=0.000 n=10+10)

Change-Id: I92bd58dc681c57c92612fd5ba7fc066aea34e95a
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/185460
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go
index f8c7e8c..fe2efba 100644
--- a/internal/testprotos/test/test.pb.go
+++ b/internal/testprotos/test/test.pb.go
@@ -222,6 +222,7 @@
 }
 
 type TestAllTypes struct {
+	state                  protoimpl.MessageState
 	OptionalInt32          *int32                                 `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty"`
 	OptionalInt64          *int64                                 `protobuf:"varint,2,opt,name=optional_int64,json=optionalInt64" json:"optional_int64,omitempty"`
 	OptionalUint32         *uint32                                `protobuf:"varint,3,opt,name=optional_uint32,json=optionalUint32" json:"optional_uint32,omitempty"`
@@ -327,10 +328,18 @@
 func (*TestAllTypes) ProtoMessage() {}
 
 func (x *TestAllTypes) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[0].Methods()
 }
 
@@ -1035,6 +1044,7 @@
 
 // Deprecated: Do not use.
 type TestDeprecatedMessage struct {
+	state           protoimpl.MessageState
 	DeprecatedInt32 *int32 `protobuf:"varint,1,opt,name=deprecated_int32,json=deprecatedInt32" json:"deprecated_int32,omitempty"` // Deprecated: Do not use.
 	// Types that are valid to be assigned to DeprecatedOneof:
 	//	*TestDeprecatedMessage_DeprecatedOneofField
@@ -1054,10 +1064,18 @@
 func (*TestDeprecatedMessage) ProtoMessage() {}
 
 func (x *TestDeprecatedMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[1].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestDeprecatedMessage) XXX_Methods() *protoiface.Methods {
+func (x *TestDeprecatedMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[1].Methods()
 }
 
@@ -1100,6 +1118,7 @@
 func (*TestDeprecatedMessage_DeprecatedOneofField) isTestDeprecatedMessage_DeprecatedOneof() {}
 
 type ForeignMessage struct {
+	state         protoimpl.MessageState
 	C             *int32 `protobuf:"varint,1,opt,name=c" json:"c,omitempty"`
 	D             *int32 `protobuf:"varint,2,opt,name=d" json:"d,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1117,10 +1136,18 @@
 func (*ForeignMessage) ProtoMessage() {}
 
 func (x *ForeignMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[2].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ForeignMessage) XXX_Methods() *protoiface.Methods {
+func (x *ForeignMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[2].Methods()
 }
 
@@ -1144,6 +1171,7 @@
 }
 
 type TestReservedFields struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1159,10 +1187,18 @@
 func (*TestReservedFields) ProtoMessage() {}
 
 func (x *TestReservedFields) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[3].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestReservedFields) XXX_Methods() *protoiface.Methods {
+func (x *TestReservedFields) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[3].Methods()
 }
 
@@ -1172,6 +1208,7 @@
 }
 
 type TestAllExtensions struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -1188,10 +1225,18 @@
 func (*TestAllExtensions) ProtoMessage() {}
 
 func (x *TestAllExtensions) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[4].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllExtensions) XXX_Methods() *protoiface.Methods {
+func (x *TestAllExtensions) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[4].Methods()
 }
 
@@ -1210,6 +1255,7 @@
 }
 
 type OptionalGroupExtension struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,17,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1226,10 +1272,18 @@
 func (*OptionalGroupExtension) ProtoMessage() {}
 
 func (x *OptionalGroupExtension) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[5].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *OptionalGroupExtension) XXX_Methods() *protoiface.Methods {
+func (x *OptionalGroupExtension) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[5].Methods()
 }
 
@@ -1246,6 +1300,7 @@
 }
 
 type RepeatedGroupExtension struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,47,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1262,10 +1317,18 @@
 func (*RepeatedGroupExtension) ProtoMessage() {}
 
 func (x *RepeatedGroupExtension) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[6].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *RepeatedGroupExtension) XXX_Methods() *protoiface.Methods {
+func (x *RepeatedGroupExtension) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[6].Methods()
 }
 
@@ -1282,6 +1345,7 @@
 }
 
 type TestNestedExtension struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1297,10 +1361,18 @@
 func (*TestNestedExtension) ProtoMessage() {}
 
 func (x *TestNestedExtension) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[7].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestNestedExtension) XXX_Methods() *protoiface.Methods {
+func (x *TestNestedExtension) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[7].Methods()
 }
 
@@ -1310,6 +1382,7 @@
 }
 
 type TestRequired struct {
+	state         protoimpl.MessageState
 	RequiredField *int32 `protobuf:"varint,1,req,name=required_field,json=requiredField" json:"required_field,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1326,10 +1399,18 @@
 func (*TestRequired) ProtoMessage() {}
 
 func (x *TestRequired) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[8].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequired) XXX_Methods() *protoiface.Methods {
+func (x *TestRequired) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[8].Methods()
 }
 
@@ -1346,6 +1427,7 @@
 }
 
 type TestRequiredForeign struct {
+	state           protoimpl.MessageState
 	OptionalMessage *TestRequired           `protobuf:"bytes,1,opt,name=optional_message,json=optionalMessage" json:"optional_message,omitempty"`
 	RepeatedMessage []*TestRequired         `protobuf:"bytes,2,rep,name=repeated_message,json=repeatedMessage" json:"repeated_message,omitempty"`
 	MapMessage      map[int32]*TestRequired `protobuf:"bytes,3,rep,name=map_message,json=mapMessage" json:"map_message,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
@@ -1367,10 +1449,18 @@
 func (*TestRequiredForeign) ProtoMessage() {}
 
 func (x *TestRequiredForeign) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[9].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredForeign) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredForeign) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[9].Methods()
 }
 
@@ -1425,6 +1515,7 @@
 func (*TestRequiredForeign_OneofMessage) isTestRequiredForeign_OneofField() {}
 
 type TestRequiredGroupFields struct {
+	state         protoimpl.MessageState
 	Optionalgroup *TestRequiredGroupFields_OptionalGroup   `protobuf:"group,1,opt,name=OptionalGroup,json=optionalgroup" json:"optionalgroup,omitempty"`
 	Repeatedgroup []*TestRequiredGroupFields_RepeatedGroup `protobuf:"group,3,rep,name=RepeatedGroup,json=repeatedgroup" json:"repeatedgroup,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1442,10 +1533,18 @@
 func (*TestRequiredGroupFields) ProtoMessage() {}
 
 func (x *TestRequiredGroupFields) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[10].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredGroupFields) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredGroupFields) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[10].Methods()
 }
 
@@ -1469,6 +1568,7 @@
 }
 
 type TestWeak struct {
+	state         protoimpl.MessageState
 	WeakMessage   *weak.WeakImportMessage `protobuf:"bytes,1,opt,weak=goproto.proto.test.weak.WeakImportMessage,name=weak_message,json=weakMessage" json:"weak_message,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1485,10 +1585,18 @@
 func (*TestWeak) ProtoMessage() {}
 
 func (x *TestWeak) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[11].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestWeak) XXX_Methods() *protoiface.Methods {
+func (x *TestWeak) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[11].Methods()
 }
 
@@ -1506,6 +1614,7 @@
 
 // Test that RPC services work.
 type FooRequest struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1521,10 +1630,18 @@
 func (*FooRequest) ProtoMessage() {}
 
 func (x *FooRequest) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[12].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FooRequest) XXX_Methods() *protoiface.Methods {
+func (x *FooRequest) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[12].Methods()
 }
 
@@ -1534,6 +1651,7 @@
 }
 
 type FooResponse struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1549,10 +1667,18 @@
 func (*FooResponse) ProtoMessage() {}
 
 func (x *FooResponse) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[13].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FooResponse) XXX_Methods() *protoiface.Methods {
+func (x *FooResponse) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[13].Methods()
 }
 
@@ -1562,6 +1688,7 @@
 }
 
 type TestAllTypes_NestedMessage struct {
+	state         protoimpl.MessageState
 	A             *int32        `protobuf:"varint,1,opt,name=a" json:"a,omitempty"`
 	Corecursive   *TestAllTypes `protobuf:"bytes,2,opt,name=corecursive" json:"corecursive,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1579,10 +1706,18 @@
 func (*TestAllTypes_NestedMessage) ProtoMessage() {}
 
 func (x *TestAllTypes_NestedMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[14].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes_NestedMessage) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes_NestedMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[14].Methods()
 }
 
@@ -1606,6 +1741,7 @@
 }
 
 type TestAllTypes_OptionalGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,17,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1622,10 +1758,18 @@
 func (*TestAllTypes_OptionalGroup) ProtoMessage() {}
 
 func (x *TestAllTypes_OptionalGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[15].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes_OptionalGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes_OptionalGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[15].Methods()
 }
 
@@ -1642,6 +1786,7 @@
 }
 
 type TestAllTypes_RepeatedGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,47,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1658,10 +1803,18 @@
 func (*TestAllTypes_RepeatedGroup) ProtoMessage() {}
 
 func (x *TestAllTypes_RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[16].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes_RepeatedGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes_RepeatedGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[16].Methods()
 }
 
@@ -1678,6 +1831,7 @@
 }
 
 type TestRequiredGroupFields_OptionalGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,2,req,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1694,10 +1848,18 @@
 func (*TestRequiredGroupFields_OptionalGroup) ProtoMessage() {}
 
 func (x *TestRequiredGroupFields_OptionalGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[35].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredGroupFields_OptionalGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredGroupFields_OptionalGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[35].Methods()
 }
 
@@ -1714,6 +1876,7 @@
 }
 
 type TestRequiredGroupFields_RepeatedGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,4,req,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1730,10 +1893,18 @@
 func (*TestRequiredGroupFields_RepeatedGroup) ProtoMessage() {}
 
 func (x *TestRequiredGroupFields_RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[36].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredGroupFields_RepeatedGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredGroupFields_RepeatedGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[36].Methods()
 }
 
@@ -3459,9 +3630,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_test_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes); i {
-			case 79:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 80:
+				return &v.sizeCache
+			case 81:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3469,9 +3642,11 @@
 		}
 		file_test_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestDeprecatedMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3479,9 +3654,11 @@
 		}
 		file_test_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ForeignMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3490,8 +3667,10 @@
 		file_test_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestReservedFields); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3500,10 +3679,12 @@
 		file_test_test_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllExtensions); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3511,9 +3692,11 @@
 		}
 		file_test_test_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*OptionalGroupExtension); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3521,9 +3704,11 @@
 		}
 		file_test_test_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*RepeatedGroupExtension); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3532,15 +3717,7 @@
 		file_test_test_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestNestedExtension); i {
 			case 0:
-				return &v.sizeCache
-			case 1:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_test_test_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestRequired); i {
+				return &v.state
 			case 1:
 				return &v.sizeCache
 			case 2:
@@ -3549,18 +3726,10 @@
 				return nil
 			}
 		}
-		file_test_test_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestRequiredForeign); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_test_test_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestRequiredGroupFields); i {
+		file_test_test_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestRequired); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -3569,11 +3738,37 @@
 				return nil
 			}
 		}
+		file_test_test_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestRequiredForeign); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_test_test_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestRequiredGroupFields); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_test_test_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestWeak); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3582,8 +3777,10 @@
 		file_test_test_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FooRequest); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3592,8 +3789,10 @@
 		file_test_test_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FooResponse); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3601,6 +3800,20 @@
 		}
 		file_test_test_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes_NestedMessage); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_test_test_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestAllTypes_OptionalGroup); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -3609,21 +3822,13 @@
 				return nil
 			}
 		}
-		file_test_test_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestAllTypes_OptionalGroup); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_test_test_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes_RepeatedGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3631,9 +3836,11 @@
 		}
 		file_test_test_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestRequiredGroupFields_OptionalGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3641,9 +3848,11 @@
 		}
 		file_test_test_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestRequiredGroupFields_RepeatedGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test/test_import.pb.go b/internal/testprotos/test/test_import.pb.go
index 170ac51..948ba78 100644
--- a/internal/testprotos/test/test_import.pb.go
+++ b/internal/testprotos/test/test_import.pb.go
@@ -66,6 +66,7 @@
 }
 
 type ImportMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -81,10 +82,18 @@
 func (*ImportMessage) ProtoMessage() {}
 
 func (x *ImportMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_import_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_test_import_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ImportMessage) XXX_Methods() *protoiface.Methods {
+func (x *ImportMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_import_proto_msgTypes[0].Methods()
 }
 
@@ -143,8 +152,10 @@
 		file_test_test_import_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ImportMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test/test_public.pb.go b/internal/testprotos/test/test_public.pb.go
index 01037d5..edef5f9 100644
--- a/internal/testprotos/test/test_public.pb.go
+++ b/internal/testprotos/test/test_public.pb.go
@@ -18,6 +18,7 @@
 )
 
 type PublicImportMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*PublicImportMessage) ProtoMessage() {}
 
 func (x *PublicImportMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_public_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_test_public_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *PublicImportMessage) XXX_Methods() *protoiface.Methods {
+func (x *PublicImportMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_public_proto_msgTypes[0].Methods()
 }
 
@@ -91,8 +100,10 @@
 		file_test_test_public_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*PublicImportMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test/weak/test_weak.pb.go b/internal/testprotos/test/weak/test_weak.pb.go
index 23c4c6b..365e22b 100644
--- a/internal/testprotos/test/weak/test_weak.pb.go
+++ b/internal/testprotos/test/weak/test_weak.pb.go
@@ -18,6 +18,7 @@
 )
 
 type WeakImportMessage struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,1,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -34,10 +35,18 @@
 func (*WeakImportMessage) ProtoMessage() {}
 
 func (x *WeakImportMessage) ProtoReflect() protoreflect.Message {
-	return file_test_weak_test_weak_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_weak_test_weak_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *WeakImportMessage) XXX_Methods() *protoiface.Methods {
+func (x *WeakImportMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_weak_test_weak_proto_msgTypes[0].Methods()
 }
 
@@ -100,9 +109,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_test_weak_test_weak_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*WeakImportMessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil