Skip to content

Commit 6c98721

Browse files
authored
Merge pull request #3360 from square/self_oneof_edge_case
[swift] Fix edge case for oneof field named `self`
2 parents eb0ef97 + d53af59 commit 6c98721

File tree

3 files changed

+84
-6
lines changed

3 files changed

+84
-6
lines changed

wire-swift-generator/src/main/java/com/squareup/wire/swift/SwiftGenerator.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -910,24 +910,27 @@ class SwiftGenerator private constructor(
910910

911911
val typeName = field.typeName.makeNonOptional()
912912

913+
val safeName = field.safeName
914+
val fieldName = if (safeName == "self") "self_" else safeName
915+
913916
if (index == 0) {
914917
beginControlFlow(
915918
"if",
916919
"let %1N = try container.decodeIfPresent(%2T.self, forKey: %3S)",
917-
field.safeName,
920+
fieldName,
918921
typeName,
919922
keyName,
920923
)
921924
} else {
922925
nextControlFlow(
923926
"else if",
924927
"let %1N = try container.decodeIfPresent(%2T.self, forKey: %3S)",
925-
field.safeName,
928+
fieldName,
926929
typeName,
927930
keyName,
928931
)
929932
}
930-
addStatement("self.%1N = .%2N(%2N)", oneOf.name, field.safeName)
933+
addStatement("self.%1N = .%2N(%3N)", oneOf.name, field.safeName, fieldName)
931934
}
932935
nextControlFlow("else", "")
933936
addStatement("self.%N = nil", oneOf.name)
@@ -1803,6 +1806,7 @@ class SwiftGenerator private constructor(
18031806
return when (this.simpleName) {
18041807
"Type" -> "Type_"
18051808
"Error" -> "Error_"
1809+
"Self" -> "Self_"
18061810
else -> this.simpleName
18071811
}
18081812
}

wire-tests-swift/no-manifest/src/main/swift/Screen.swift

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ extension Screen : Proto2Codable {
5454
case 1: screen = .screen_oneof_string(try protoReader.decode(String.self))
5555
case 2: screen = .screen_oneof_int32(try protoReader.decode(Int32.self))
5656
case 3: screen = .screen_oneof_sub_message(try protoReader.decode(Screen.SubMessage.self))
57-
case 4: view = .view_oneof_string(try protoReader.decode(String.self))
57+
case 4: screen = .`self`(try protoReader.decode(Screen.Self_.self))
58+
case 5: view = .view_oneof_string(try protoReader.decode(String.self))
5859
default: try protoReader.readUnknownField(tag: tag)
5960
}
6061
}
@@ -93,6 +94,8 @@ extension Screen : Codable {
9394
self.screen = .screen_oneof_sub_message(screen_oneof_sub_message)
9495
} else if let screen_oneof_sub_message = try container.decodeIfPresent(Screen.SubMessage.self, forKey: "screen_oneof_sub_message") {
9596
self.screen = .screen_oneof_sub_message(screen_oneof_sub_message)
97+
} else if let self_ = try container.decodeIfPresent(Screen.Self_.self, forKey: "self") {
98+
self.screen = .`self`(self_)
9699
} else {
97100
self.screen = nil
98101
}
@@ -113,6 +116,7 @@ extension Screen : Codable {
113116
case .screen_oneof_string(let screen_oneof_string): try container.encode(screen_oneof_string, forKey: preferCamelCase ? "screenOneofString" : "screen_oneof_string")
114117
case .screen_oneof_int32(let screen_oneof_int32): try container.encode(screen_oneof_int32, forKey: preferCamelCase ? "screenOneofInt32" : "screen_oneof_int32")
115118
case .screen_oneof_sub_message(let screen_oneof_sub_message): try container.encode(screen_oneof_sub_message, forKey: preferCamelCase ? "screenOneofSubMessage" : "screen_oneof_sub_message")
119+
case .`self`(let `self`): try container.encode(`self`, forKey: "self")
116120
case Optional.none: break
117121
}
118122
switch self.view {
@@ -134,12 +138,14 @@ extension Screen {
134138
case screen_oneof_string(String)
135139
case screen_oneof_int32(Int32)
136140
case screen_oneof_sub_message(Screen.SubMessage)
141+
case `self`(Screen.Self_)
137142

138143
fileprivate func encode(to protoWriter: ProtoWriter) throws {
139144
switch self {
140145
case .screen_oneof_string(let screen_oneof_string): try protoWriter.encode(tag: 1, value: screen_oneof_string)
141146
case .screen_oneof_int32(let screen_oneof_int32): try protoWriter.encode(tag: 2, value: screen_oneof_int32)
142147
case .screen_oneof_sub_message(let screen_oneof_sub_message): try protoWriter.encode(tag: 3, value: screen_oneof_sub_message)
148+
case .`self`(let `self`): try protoWriter.encode(tag: 4, value: `self`)
143149
}
144150
}
145151

@@ -151,12 +157,21 @@ extension Screen {
151157

152158
fileprivate func encode(to protoWriter: ProtoWriter) throws {
153159
switch self {
154-
case .view_oneof_string(let view_oneof_string): try protoWriter.encode(tag: 4, value: view_oneof_string)
160+
case .view_oneof_string(let view_oneof_string): try protoWriter.encode(tag: 5, value: view_oneof_string)
155161
}
156162
}
157163

158164
}
159165

166+
public struct Self_ {
167+
168+
public var unknownFields: UnknownFields = .init()
169+
170+
public init() {
171+
}
172+
173+
}
174+
160175
public struct SubMessage {
161176

162177
@ProtoDefaulted
@@ -199,6 +214,62 @@ extension Screen.View : Hashable {
199214
extension Screen.View : Sendable {
200215
}
201216

217+
#if !WIRE_REMOVE_EQUATABLE
218+
extension Screen.Self_ : Equatable {
219+
}
220+
#endif
221+
222+
#if !WIRE_REMOVE_HASHABLE
223+
extension Screen.Self_ : Hashable {
224+
}
225+
#endif
226+
227+
extension Screen.Self_ : Sendable {
228+
}
229+
230+
extension Screen.Self_ : ProtoDefaultedValue {
231+
232+
public static var defaultedValue: Self {
233+
.init()
234+
}
235+
}
236+
237+
extension Screen.Self_ : ProtoMessage {
238+
239+
public static func protoMessageTypeURL() -> String {
240+
return "type.googleapis.com/squareup.protos.kotlin.swift_modules.Screen.Self"
241+
}
242+
243+
}
244+
245+
extension Screen.Self_ : Proto2Codable {
246+
247+
public init(from protoReader: ProtoReader) throws {
248+
let token = try protoReader.beginMessage()
249+
while let tag = try protoReader.nextTag(token: token) {
250+
switch tag {
251+
default: try protoReader.readUnknownField(tag: tag)
252+
}
253+
}
254+
self.unknownFields = try protoReader.endMessage(token: token)
255+
256+
}
257+
258+
public func encode(to protoWriter: ProtoWriter) throws {
259+
try protoWriter.writeUnknownFields(unknownFields)
260+
}
261+
262+
}
263+
264+
#if !WIRE_REMOVE_CODABLE
265+
extension Screen.Self_ : Codable {
266+
267+
public enum CodingKeys : CodingKey {
268+
}
269+
270+
}
271+
#endif
272+
202273
#if !WIRE_REMOVE_EQUATABLE
203274
extension Screen.SubMessage : Equatable {
204275
}

wire-tests/src/commonTest/proto/kotlin/swift_edge_cases.proto

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,15 @@ message Screen {
3838
string screen_oneof_string = 1;
3939
int32 screen_oneof_int32 = 2;
4040
SubMessage screen_oneof_sub_message = 3;
41+
Self self = 4;
4142
}
4243

4344
oneof view {
44-
string view_oneof_string = 4;
45+
string view_oneof_string = 5;
4546
}
4647

48+
message Self {}
49+
4750
message SubMessage {
4851
optional string string = 1;
4952

0 commit comments

Comments
 (0)