Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 101ecdb

Browse files
authoredFeb 12, 2025··
Support reading raw extension fields in a MessageSet. (#1755)
If an encoder doesn't know about the bit, they this is how the fields would be encoded, and there has been a push upstream to support this including a new conformance test that looks for it. - Support this in the parsing loop. - Remove the conformance failure not that is passes. - Add some tests (includes proto file changes and regeneration)
1 parent eb17584 commit 101ecdb

File tree

6 files changed

+417
-32
lines changed

6 files changed

+417
-32
lines changed
 

‎Protos/SwiftProtobufTests/unittest_mset.proto

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,21 @@ message TestMessageSetContainer {
4545
optional swift_proto_testing.wire_format.TestMessageSet message_set = 1;
4646
}
4747

48+
// A message without the message_set_wire_format option but still supports
49+
// extensions.
50+
message MessageEx {
51+
extensions 4 to max;
52+
}
53+
4854
message TestMessageSetExtension1 {
4955
extend swift_proto_testing.wire_format.TestMessageSet {
5056
optional TestMessageSetExtension1 message_set_extension = 1545008;
5157
}
58+
// Also extend a non-MessageSet with the same field number. This will allow us
59+
// to test parsing a normal extension into a MessageSet.
60+
extend MessageEx {
61+
optional TestMessageSetExtension1 doppelganger_message_set_extension = 1545008;
62+
}
5263
optional int32 i = 15;
5364
optional swift_proto_testing.wire_format.TestMessageSet recursive = 16;
5465
optional string test_aliasing = 17 [ctype = STRING_PIECE];
@@ -61,6 +72,16 @@ message TestMessageSetExtension2 {
6172
optional string str = 25;
6273
}
6374

75+
// This isn't on swift_proto_testing.wire_format.TestMessageSet, so it will be unknown
76+
// when parsing there.
77+
message TestMessageSetExtension3 {
78+
extend MessageEx {
79+
optional TestMessageSetExtension3 doppelganger_message_set_extension = 1547770;
80+
}
81+
optional int32 x = 26;
82+
}
83+
84+
6485
// MessageSet wire format is equivalent to this.
6586
message RawMessageSet {
6687
repeated group Item = 1 {

‎Reference/SwiftProtobufTests/unittest_mset.pb.swift

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,20 @@ struct SwiftProtoTesting_TestMessageSetContainer: Sendable {
7979
fileprivate var _messageSet: SwiftProtoTesting_WireFormat_TestMessageSet? = nil
8080
}
8181

82+
/// A message without the message_set_wire_format option but still supports
83+
/// extensions.
84+
struct SwiftProtoTesting_MessageEx: SwiftProtobuf.ExtensibleMessage, Sendable {
85+
// SwiftProtobuf.Message conformance is added in an extension below. See the
86+
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
87+
// methods supported on all messages.
88+
89+
var unknownFields = SwiftProtobuf.UnknownStorage()
90+
91+
init() {}
92+
93+
var _protobuf_extensionFieldValues = SwiftProtobuf.ExtensionFieldValueSet()
94+
}
95+
8296
struct SwiftProtoTesting_TestMessageSetExtension1: Sendable {
8397
// SwiftProtobuf.Message conformance is added in an extension below. See the
8498
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
@@ -141,6 +155,29 @@ struct SwiftProtoTesting_TestMessageSetExtension2: Sendable {
141155
fileprivate var _str: String? = nil
142156
}
143157

158+
/// This isn't on swift_proto_testing.wire_format.TestMessageSet, so it will be unknown
159+
/// when parsing there.
160+
struct SwiftProtoTesting_TestMessageSetExtension3: Sendable {
161+
// SwiftProtobuf.Message conformance is added in an extension below. See the
162+
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
163+
// methods supported on all messages.
164+
165+
var x: Int32 {
166+
get {return _x ?? 0}
167+
set {_x = newValue}
168+
}
169+
/// Returns true if `x` has been explicitly set.
170+
var hasX: Bool {return self._x != nil}
171+
/// Clears the value of `x`. Subsequent reads from it will return its default value.
172+
mutating func clearX() {self._x = nil}
173+
174+
var unknownFields = SwiftProtobuf.UnknownStorage()
175+
176+
init() {}
177+
178+
fileprivate var _x: Int32? = nil
179+
}
180+
144181
/// MessageSet wire format is equivalent to this.
145182
struct SwiftProtoTesting_RawMessageSet: Sendable {
146183
// SwiftProtobuf.Message conformance is added in an extension below. See the
@@ -222,6 +259,39 @@ struct SwiftProtoTesting_RawBreakableMessageSet: Sendable {
222259
// declaration. To avoid naming collisions, the names are prefixed with the name of
223260
// the scope where the extend directive occurs.
224261

262+
extension SwiftProtoTesting_MessageEx {
263+
264+
var SwiftProtoTesting_TestMessageSetExtension1_doppelgangerMessageSetExtension: SwiftProtoTesting_TestMessageSetExtension1 {
265+
get {return getExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension) ?? SwiftProtoTesting_TestMessageSetExtension1()}
266+
set {setExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension, value: newValue)}
267+
}
268+
/// Returns true if extension `SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension`
269+
/// has been explicitly set.
270+
var hasSwiftProtoTesting_TestMessageSetExtension1_doppelgangerMessageSetExtension: Bool {
271+
return hasExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension)
272+
}
273+
/// Clears the value of extension `SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension`.
274+
/// Subsequent reads from it will return its default value.
275+
mutating func clearSwiftProtoTesting_TestMessageSetExtension1_doppelgangerMessageSetExtension() {
276+
clearExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension)
277+
}
278+
279+
var SwiftProtoTesting_TestMessageSetExtension3_doppelgangerMessageSetExtension: SwiftProtoTesting_TestMessageSetExtension3 {
280+
get {return getExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension) ?? SwiftProtoTesting_TestMessageSetExtension3()}
281+
set {setExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension, value: newValue)}
282+
}
283+
/// Returns true if extension `SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension`
284+
/// has been explicitly set.
285+
var hasSwiftProtoTesting_TestMessageSetExtension3_doppelgangerMessageSetExtension: Bool {
286+
return hasExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension)
287+
}
288+
/// Clears the value of extension `SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension`.
289+
/// Subsequent reads from it will return its default value.
290+
mutating func clearSwiftProtoTesting_TestMessageSetExtension3_doppelgangerMessageSetExtension() {
291+
clearExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension)
292+
}
293+
}
294+
225295
extension SwiftProtoTesting_WireFormat_TestMessageSet {
226296

227297
var SwiftProtoTesting_TestMessageSetExtension1_messageSetExtension: SwiftProtoTesting_TestMessageSetExtension1 {
@@ -264,7 +334,9 @@ extension SwiftProtoTesting_WireFormat_TestMessageSet {
264334
/// a larger `SwiftProtobuf.SimpleExtensionMap`.
265335
let SwiftProtoTesting_UnittestMset_Extensions: SwiftProtobuf.SimpleExtensionMap = [
266336
SwiftProtoTesting_TestMessageSetExtension1.Extensions.message_set_extension,
267-
SwiftProtoTesting_TestMessageSetExtension2.Extensions.message_set_extension
337+
SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension,
338+
SwiftProtoTesting_TestMessageSetExtension2.Extensions.message_set_extension,
339+
SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension
268340
]
269341

270342
// Extension Objects - The only reason these might be needed is when manually
@@ -277,6 +349,11 @@ extension SwiftProtoTesting_TestMessageSetExtension1 {
277349
_protobuf_fieldNumber: 1545008,
278350
fieldName: "swift_proto_testing.TestMessageSetExtension1"
279351
)
352+
353+
static let doppelganger_message_set_extension = SwiftProtobuf.MessageExtension<SwiftProtobuf.OptionalMessageExtensionField<SwiftProtoTesting_TestMessageSetExtension1>, SwiftProtoTesting_MessageEx>(
354+
_protobuf_fieldNumber: 1545008,
355+
fieldName: "swift_proto_testing.TestMessageSetExtension1.doppelganger_message_set_extension"
356+
)
280357
}
281358
}
282359

@@ -289,6 +366,15 @@ extension SwiftProtoTesting_TestMessageSetExtension2 {
289366
}
290367
}
291368

369+
extension SwiftProtoTesting_TestMessageSetExtension3 {
370+
enum Extensions {
371+
static let doppelganger_message_set_extension = SwiftProtobuf.MessageExtension<SwiftProtobuf.OptionalMessageExtensionField<SwiftProtoTesting_TestMessageSetExtension3>, SwiftProtoTesting_MessageEx>(
372+
_protobuf_fieldNumber: 1547770,
373+
fieldName: "swift_proto_testing.TestMessageSetExtension3.doppelganger_message_set_extension"
374+
)
375+
}
376+
}
377+
292378
// MARK: - Code below here is support for the SwiftProtobuf runtime.
293379

294380
fileprivate let _protobuf_package = "swift_proto_testing"
@@ -334,6 +420,35 @@ extension SwiftProtoTesting_TestMessageSetContainer: SwiftProtobuf.Message, Swif
334420
}
335421
}
336422

423+
extension SwiftProtoTesting_MessageEx: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
424+
static let protoMessageName: String = _protobuf_package + ".MessageEx"
425+
static let _protobuf_nameMap = SwiftProtobuf._NameMap()
426+
427+
public var isInitialized: Bool {
428+
if !_protobuf_extensionFieldValues.isInitialized {return false}
429+
return true
430+
}
431+
432+
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
433+
while let fieldNumber = try decoder.nextFieldNumber() {
434+
if (4 <= fieldNumber && fieldNumber < 536870912) {
435+
try decoder.decodeExtensionField(values: &_protobuf_extensionFieldValues, messageType: SwiftProtoTesting_MessageEx.self, fieldNumber: fieldNumber)
436+
}
437+
}
438+
}
439+
440+
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
441+
try visitor.visitExtensionFields(fields: _protobuf_extensionFieldValues, start: 4, end: 536870912)
442+
try unknownFields.traverse(visitor: &visitor)
443+
}
444+
445+
static func ==(lhs: SwiftProtoTesting_MessageEx, rhs: SwiftProtoTesting_MessageEx) -> Bool {
446+
if lhs.unknownFields != rhs.unknownFields {return false}
447+
if lhs._protobuf_extensionFieldValues != rhs._protobuf_extensionFieldValues {return false}
448+
return true
449+
}
450+
}
451+
337452
extension SwiftProtoTesting_TestMessageSetExtension1: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
338453
static let protoMessageName: String = _protobuf_package + ".TestMessageSetExtension1"
339454
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
@@ -423,6 +538,42 @@ extension SwiftProtoTesting_TestMessageSetExtension2: SwiftProtobuf.Message, Swi
423538
}
424539
}
425540

541+
extension SwiftProtoTesting_TestMessageSetExtension3: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
542+
static let protoMessageName: String = _protobuf_package + ".TestMessageSetExtension3"
543+
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
544+
26: .same(proto: "x"),
545+
]
546+
547+
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
548+
while let fieldNumber = try decoder.nextFieldNumber() {
549+
// The use of inline closures is to circumvent an issue where the compiler
550+
// allocates stack space for every case branch when no optimizations are
551+
// enabled. https://github.com/apple/swift-protobuf/issues/1034
552+
switch fieldNumber {
553+
case 26: try { try decoder.decodeSingularInt32Field(value: &self._x) }()
554+
default: break
555+
}
556+
}
557+
}
558+
559+
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
560+
// The use of inline closures is to circumvent an issue where the compiler
561+
// allocates stack space for every if/case branch local when no optimizations
562+
// are enabled. https://github.com/apple/swift-protobuf/issues/1034 and
563+
// https://github.com/apple/swift-protobuf/issues/1182
564+
try { if let v = self._x {
565+
try visitor.visitSingularInt32Field(value: v, fieldNumber: 26)
566+
} }()
567+
try unknownFields.traverse(visitor: &visitor)
568+
}
569+
570+
static func ==(lhs: SwiftProtoTesting_TestMessageSetExtension3, rhs: SwiftProtoTesting_TestMessageSetExtension3) -> Bool {
571+
if lhs._x != rhs._x {return false}
572+
if lhs.unknownFields != rhs.unknownFields {return false}
573+
return true
574+
}
575+
}
576+
426577
extension SwiftProtoTesting_RawMessageSet: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
427578
static let protoMessageName: String = _protobuf_package + ".RawMessageSet"
428579
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.SubmessageEncoding.NotUnknown.ProtobufOutput # Output was not equivalent to reference message: added: message_set_correct.(protobuf_test_messages.proto2.TestAllTypesProto2.Ext
1+
# Nothing failing.

‎Sources/SwiftProtobuf/BinaryDecoder.swift

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,39 +1113,52 @@ internal struct BinaryDecoder: Decoder {
11131113
values: inout ExtensionFieldValueSet,
11141114
messageType: any Message.Type
11151115
) throws {
1116-
// Spin looking for the Item group, everything else will end up in unknown fields.
1116+
// Anything not in an acceptable form will go into unknown fields
11171117
while let fieldNumber = try self.nextFieldNumber() {
1118-
guard fieldNumber == WireFormat.MessageSet.FieldNumbers.item && fieldWireFormat == WireFormat.startGroup
1119-
else {
1120-
continue
1121-
}
1122-
1123-
// This is similar to decodeFullGroup
1124-
1125-
try incrementRecursionDepth()
1126-
var subDecoder = self
1127-
subDecoder.groupFieldNumber = fieldNumber
1128-
subDecoder.consumed = true
1118+
// Normal MessageSet wire format (nested in a group)
1119+
if fieldNumber == WireFormat.MessageSet.FieldNumbers.item && fieldWireFormat == WireFormat.startGroup {
1120+
// This is similar to decodeFullGroup
1121+
1122+
try incrementRecursionDepth()
1123+
var subDecoder = self
1124+
subDecoder.groupFieldNumber = fieldNumber
1125+
subDecoder.consumed = true
1126+
1127+
let itemResult = try subDecoder.decodeMessageSetItem(
1128+
values: &values,
1129+
messageType: messageType
1130+
)
1131+
switch itemResult {
1132+
case .success:
1133+
// Advance over what was parsed.
1134+
consume(length: available - subDecoder.available)
1135+
consumed = true
1136+
case .handleAsUnknown:
1137+
// Nothing to do.
1138+
break
11291139

1130-
let itemResult = try subDecoder.decodeMessageSetItem(
1131-
values: &values,
1132-
messageType: messageType
1133-
)
1134-
switch itemResult {
1135-
case .success:
1136-
// Advance over what was parsed.
1137-
consume(length: available - subDecoder.available)
1138-
consumed = true
1139-
case .handleAsUnknown:
1140-
// Nothing to do.
1141-
break
1140+
case .malformed:
1141+
throw BinaryDecodingError.malformedProtobuf
1142+
}
11421143

1143-
case .malformed:
1144-
throw BinaryDecodingError.malformedProtobuf
1144+
assert(recursionBudget == subDecoder.recursionBudget)
1145+
decrementRecursionDepth()
1146+
} else if fieldWireFormat == WireFormat.lengthDelimited,
1147+
let ext = extensions?[messageType, fieldNumber]
1148+
{
1149+
// This was a raw extension field, this is possible if some encoder doesn't
1150+
// know the MessageSet wire format. Since we know the extension, promote it.
1151+
// _upb_Decoder_FindField() has this same basic logic.
1152+
try decodeExtensionField(
1153+
values: &values,
1154+
messageType: messageType,
1155+
fieldNumber: fieldNumber,
1156+
messageExtension: ext
1157+
)
1158+
if !consumed {
1159+
throw BinaryDecodingError.malformedProtobuf
1160+
}
11451161
}
1146-
1147-
assert(recursionBudget == subDecoder.recursionBudget)
1148-
decrementRecursionDepth()
11491162
}
11501163
}
11511164

‎Tests/SwiftProtobufTests/Test_MessageSet.swift

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,55 @@ final class Test_MessageSet: XCTestCase {
353353
validator.validate(message: msg)
354354
}
355355

356+
func testParse_FieldEncoding() {
357+
let extMsg1 = SwiftProtoTesting_TestMessageSetExtension1.with { $0.i = 123 }
358+
let extMsg3 = SwiftProtoTesting_TestMessageSetExtension3.with { $0.x = 10 }
359+
360+
let msgEx = SwiftProtoTesting_MessageEx.with {
361+
$0.SwiftProtoTesting_TestMessageSetExtension1_doppelgangerMessageSetExtension = extMsg1
362+
$0.SwiftProtoTesting_TestMessageSetExtension3_doppelgangerMessageSetExtension = extMsg3
363+
}
364+
365+
let serialized: Data
366+
do {
367+
serialized = try msgEx.serializedBytes()
368+
} catch let e {
369+
XCTFail("Failed to serialize: \(e)")
370+
return
371+
}
372+
373+
let msg: SwiftProtoTesting_WireFormat_TestMessageSet
374+
do {
375+
msg = try SwiftProtoTesting_WireFormat_TestMessageSet(
376+
serializedBytes: serialized,
377+
extensions: SwiftProtoTesting_UnittestMset_Extensions
378+
)
379+
} catch let e {
380+
XCTFail("Failed to parse: \(e)")
381+
return
382+
}
383+
384+
// One comes in as a known field, other comes in as unknown field (not promoted to the
385+
// group form).
386+
XCTAssertTrue(msg.hasSwiftProtoTesting_TestMessageSetExtension1_messageSetExtension)
387+
XCTAssertFalse(msg.hasSwiftProtoTesting_TestMessageSetExtension2_messageSetExtension)
388+
389+
let expectedUnknowns = Data([
390+
210, 223, 243, 5, // Length delimted field 1547770
391+
3, // Length (varint)
392+
208, 1, // Varint field 26 ("x") in message
393+
10, // Value of X
394+
])
395+
XCTAssertEqual(msg.unknownFields.data, expectedUnknowns)
396+
397+
var validator = ExtensionValidator()
398+
validator.expectedMessages = [
399+
(SwiftProtoTesting_TestMessageSetExtension1.Extensions.message_set_extension.fieldNumber, false)
400+
]
401+
validator.expectedUnknowns = [expectedUnknowns]
402+
validator.validate(message: msg)
403+
}
404+
356405
fileprivate struct ExtensionValidator: PBTestVisitor {
357406
// Values are field number and if we should recurse.
358407
var expectedMessages = [(Int, Bool)]()

‎Tests/SwiftProtobufTests/unittest_mset.pb.swift

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,20 @@ struct SwiftProtoTesting_TestMessageSetContainer: Sendable {
7979
fileprivate var _messageSet: SwiftProtoTesting_WireFormat_TestMessageSet? = nil
8080
}
8181

82+
/// A message without the message_set_wire_format option but still supports
83+
/// extensions.
84+
struct SwiftProtoTesting_MessageEx: SwiftProtobuf.ExtensibleMessage, Sendable {
85+
// SwiftProtobuf.Message conformance is added in an extension below. See the
86+
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
87+
// methods supported on all messages.
88+
89+
var unknownFields = SwiftProtobuf.UnknownStorage()
90+
91+
init() {}
92+
93+
var _protobuf_extensionFieldValues = SwiftProtobuf.ExtensionFieldValueSet()
94+
}
95+
8296
struct SwiftProtoTesting_TestMessageSetExtension1: Sendable {
8397
// SwiftProtobuf.Message conformance is added in an extension below. See the
8498
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
@@ -141,6 +155,29 @@ struct SwiftProtoTesting_TestMessageSetExtension2: Sendable {
141155
fileprivate var _str: String? = nil
142156
}
143157

158+
/// This isn't on swift_proto_testing.wire_format.TestMessageSet, so it will be unknown
159+
/// when parsing there.
160+
struct SwiftProtoTesting_TestMessageSetExtension3: Sendable {
161+
// SwiftProtobuf.Message conformance is added in an extension below. See the
162+
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
163+
// methods supported on all messages.
164+
165+
var x: Int32 {
166+
get {return _x ?? 0}
167+
set {_x = newValue}
168+
}
169+
/// Returns true if `x` has been explicitly set.
170+
var hasX: Bool {return self._x != nil}
171+
/// Clears the value of `x`. Subsequent reads from it will return its default value.
172+
mutating func clearX() {self._x = nil}
173+
174+
var unknownFields = SwiftProtobuf.UnknownStorage()
175+
176+
init() {}
177+
178+
fileprivate var _x: Int32? = nil
179+
}
180+
144181
/// MessageSet wire format is equivalent to this.
145182
struct SwiftProtoTesting_RawMessageSet: Sendable {
146183
// SwiftProtobuf.Message conformance is added in an extension below. See the
@@ -222,6 +259,39 @@ struct SwiftProtoTesting_RawBreakableMessageSet: Sendable {
222259
// declaration. To avoid naming collisions, the names are prefixed with the name of
223260
// the scope where the extend directive occurs.
224261

262+
extension SwiftProtoTesting_MessageEx {
263+
264+
var SwiftProtoTesting_TestMessageSetExtension1_doppelgangerMessageSetExtension: SwiftProtoTesting_TestMessageSetExtension1 {
265+
get {return getExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension) ?? SwiftProtoTesting_TestMessageSetExtension1()}
266+
set {setExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension, value: newValue)}
267+
}
268+
/// Returns true if extension `SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension`
269+
/// has been explicitly set.
270+
var hasSwiftProtoTesting_TestMessageSetExtension1_doppelgangerMessageSetExtension: Bool {
271+
return hasExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension)
272+
}
273+
/// Clears the value of extension `SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension`.
274+
/// Subsequent reads from it will return its default value.
275+
mutating func clearSwiftProtoTesting_TestMessageSetExtension1_doppelgangerMessageSetExtension() {
276+
clearExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension)
277+
}
278+
279+
var SwiftProtoTesting_TestMessageSetExtension3_doppelgangerMessageSetExtension: SwiftProtoTesting_TestMessageSetExtension3 {
280+
get {return getExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension) ?? SwiftProtoTesting_TestMessageSetExtension3()}
281+
set {setExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension, value: newValue)}
282+
}
283+
/// Returns true if extension `SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension`
284+
/// has been explicitly set.
285+
var hasSwiftProtoTesting_TestMessageSetExtension3_doppelgangerMessageSetExtension: Bool {
286+
return hasExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension)
287+
}
288+
/// Clears the value of extension `SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension`.
289+
/// Subsequent reads from it will return its default value.
290+
mutating func clearSwiftProtoTesting_TestMessageSetExtension3_doppelgangerMessageSetExtension() {
291+
clearExtensionValue(ext: SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension)
292+
}
293+
}
294+
225295
extension SwiftProtoTesting_WireFormat_TestMessageSet {
226296

227297
var SwiftProtoTesting_TestMessageSetExtension1_messageSetExtension: SwiftProtoTesting_TestMessageSetExtension1 {
@@ -264,7 +334,9 @@ extension SwiftProtoTesting_WireFormat_TestMessageSet {
264334
/// a larger `SwiftProtobuf.SimpleExtensionMap`.
265335
let SwiftProtoTesting_UnittestMset_Extensions: SwiftProtobuf.SimpleExtensionMap = [
266336
SwiftProtoTesting_TestMessageSetExtension1.Extensions.message_set_extension,
267-
SwiftProtoTesting_TestMessageSetExtension2.Extensions.message_set_extension
337+
SwiftProtoTesting_TestMessageSetExtension1.Extensions.doppelganger_message_set_extension,
338+
SwiftProtoTesting_TestMessageSetExtension2.Extensions.message_set_extension,
339+
SwiftProtoTesting_TestMessageSetExtension3.Extensions.doppelganger_message_set_extension
268340
]
269341

270342
// Extension Objects - The only reason these might be needed is when manually
@@ -277,6 +349,11 @@ extension SwiftProtoTesting_TestMessageSetExtension1 {
277349
_protobuf_fieldNumber: 1545008,
278350
fieldName: "swift_proto_testing.TestMessageSetExtension1"
279351
)
352+
353+
static let doppelganger_message_set_extension = SwiftProtobuf.MessageExtension<SwiftProtobuf.OptionalMessageExtensionField<SwiftProtoTesting_TestMessageSetExtension1>, SwiftProtoTesting_MessageEx>(
354+
_protobuf_fieldNumber: 1545008,
355+
fieldName: "swift_proto_testing.TestMessageSetExtension1.doppelganger_message_set_extension"
356+
)
280357
}
281358
}
282359

@@ -289,6 +366,15 @@ extension SwiftProtoTesting_TestMessageSetExtension2 {
289366
}
290367
}
291368

369+
extension SwiftProtoTesting_TestMessageSetExtension3 {
370+
enum Extensions {
371+
static let doppelganger_message_set_extension = SwiftProtobuf.MessageExtension<SwiftProtobuf.OptionalMessageExtensionField<SwiftProtoTesting_TestMessageSetExtension3>, SwiftProtoTesting_MessageEx>(
372+
_protobuf_fieldNumber: 1547770,
373+
fieldName: "swift_proto_testing.TestMessageSetExtension3.doppelganger_message_set_extension"
374+
)
375+
}
376+
}
377+
292378
// MARK: - Code below here is support for the SwiftProtobuf runtime.
293379

294380
fileprivate let _protobuf_package = "swift_proto_testing"
@@ -334,6 +420,35 @@ extension SwiftProtoTesting_TestMessageSetContainer: SwiftProtobuf.Message, Swif
334420
}
335421
}
336422

423+
extension SwiftProtoTesting_MessageEx: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
424+
static let protoMessageName: String = _protobuf_package + ".MessageEx"
425+
static let _protobuf_nameMap = SwiftProtobuf._NameMap()
426+
427+
public var isInitialized: Bool {
428+
if !_protobuf_extensionFieldValues.isInitialized {return false}
429+
return true
430+
}
431+
432+
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
433+
while let fieldNumber = try decoder.nextFieldNumber() {
434+
if (4 <= fieldNumber && fieldNumber < 536870912) {
435+
try decoder.decodeExtensionField(values: &_protobuf_extensionFieldValues, messageType: SwiftProtoTesting_MessageEx.self, fieldNumber: fieldNumber)
436+
}
437+
}
438+
}
439+
440+
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
441+
try visitor.visitExtensionFields(fields: _protobuf_extensionFieldValues, start: 4, end: 536870912)
442+
try unknownFields.traverse(visitor: &visitor)
443+
}
444+
445+
static func ==(lhs: SwiftProtoTesting_MessageEx, rhs: SwiftProtoTesting_MessageEx) -> Bool {
446+
if lhs.unknownFields != rhs.unknownFields {return false}
447+
if lhs._protobuf_extensionFieldValues != rhs._protobuf_extensionFieldValues {return false}
448+
return true
449+
}
450+
}
451+
337452
extension SwiftProtoTesting_TestMessageSetExtension1: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
338453
static let protoMessageName: String = _protobuf_package + ".TestMessageSetExtension1"
339454
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
@@ -423,6 +538,42 @@ extension SwiftProtoTesting_TestMessageSetExtension2: SwiftProtobuf.Message, Swi
423538
}
424539
}
425540

541+
extension SwiftProtoTesting_TestMessageSetExtension3: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
542+
static let protoMessageName: String = _protobuf_package + ".TestMessageSetExtension3"
543+
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
544+
26: .same(proto: "x"),
545+
]
546+
547+
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
548+
while let fieldNumber = try decoder.nextFieldNumber() {
549+
// The use of inline closures is to circumvent an issue where the compiler
550+
// allocates stack space for every case branch when no optimizations are
551+
// enabled. https://github.com/apple/swift-protobuf/issues/1034
552+
switch fieldNumber {
553+
case 26: try { try decoder.decodeSingularInt32Field(value: &self._x) }()
554+
default: break
555+
}
556+
}
557+
}
558+
559+
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
560+
// The use of inline closures is to circumvent an issue where the compiler
561+
// allocates stack space for every if/case branch local when no optimizations
562+
// are enabled. https://github.com/apple/swift-protobuf/issues/1034 and
563+
// https://github.com/apple/swift-protobuf/issues/1182
564+
try { if let v = self._x {
565+
try visitor.visitSingularInt32Field(value: v, fieldNumber: 26)
566+
} }()
567+
try unknownFields.traverse(visitor: &visitor)
568+
}
569+
570+
static func ==(lhs: SwiftProtoTesting_TestMessageSetExtension3, rhs: SwiftProtoTesting_TestMessageSetExtension3) -> Bool {
571+
if lhs._x != rhs._x {return false}
572+
if lhs.unknownFields != rhs.unknownFields {return false}
573+
return true
574+
}
575+
}
576+
426577
extension SwiftProtoTesting_RawMessageSet: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
427578
static let protoMessageName: String = _protobuf_package + ".RawMessageSet"
428579
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [

0 commit comments

Comments
 (0)
Please sign in to comment.