Skip to content

Commit 3280f7e

Browse files
committed
[swift] Properly disambiguate OneOf enum if it has the same name as enclosing type.
1 parent ce68971 commit 3280f7e

File tree

3 files changed

+387
-29
lines changed

3 files changed

+387
-29
lines changed

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

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ class SwiftGenerator private constructor(
626626
addStatement("var %N: %T = %L", field.safeName, localType, initializer)
627627
}
628628
type.oneOfs.forEach { oneOf ->
629-
val enumName = oneOfEnumNames.getValue(oneOf)
629+
val enumName = oneOfSafeDeclaredTypeName(oneOf, type, oneOfEnumNames)
630630
addStatement("var %N: %T = nil", oneOf.name, enumName.makeOptional())
631631
}
632632
if (type.declaredFieldsAndOneOfFields.isNotEmpty()) {
@@ -1063,7 +1063,7 @@ class SwiftGenerator private constructor(
10631063
}
10641064
if (includeOneOfs) {
10651065
type.oneOfs.forEach { oneOf ->
1066-
val enumName = oneOfEnumNames.getValue(oneOf).makeOptional()
1066+
val enumName = oneOfSafeDeclaredTypeName(oneOf, type, oneOfEnumNames)
10671067
addParameter(
10681068
ParameterSpec.builder(oneOf.name, enumName)
10691069
.defaultValue("nil")
@@ -1360,7 +1360,7 @@ class SwiftGenerator private constructor(
13601360
}
13611361

13621362
type.oneOfs.forEach { oneOf ->
1363-
val enumName = oneOfEnumNames.getValue(oneOf)
1363+
val enumName = oneOfSafeDeclaredTypeName(oneOf, type, oneOfEnumNames)
13641364

13651365
addProperty(
13661366
PropertySpec.varBuilder(oneOf.name, enumName.makeOptional(), PUBLIC)
@@ -1515,7 +1515,7 @@ class SwiftGenerator private constructor(
15151515
}
15161516

15171517
type.oneOfs.forEach { oneOf ->
1518-
val enumName = oneOfEnumNames.getValue(oneOf)
1518+
val enumName = oneOfSafeDeclaredTypeName(oneOf, type, oneOfEnumNames)
15191519

15201520
addProperty(
15211521
PropertySpec.varBuilder(oneOf.name, enumName.makeOptional(), PUBLIC)
@@ -1560,7 +1560,7 @@ class SwiftGenerator private constructor(
15601560
fileMembers: MutableList<FileMemberSpec>,
15611561
) {
15621562
type.oneOfs.forEach { oneOf ->
1563-
val enumName = oneOfEnumNames.getValue(oneOf)
1563+
val enumName = oneOfSafeDeclaredTypeName(oneOf, type, oneOfEnumNames)
15641564

15651565
// TODO use a NameAllocator
15661566
val writer = if (oneOf.fields.any { it.name == "protoWriter" }) "_protoWriter" else "protoWriter"
@@ -1649,6 +1649,27 @@ class SwiftGenerator private constructor(
16491649
}
16501650
}
16511651

1652+
private fun oneOfSafeDeclaredTypeName(
1653+
oneOf: OneOf,
1654+
type: MessageType,
1655+
oneOfEnumNames: Map<OneOf, DeclaredTypeName>,
1656+
): DeclaredTypeName {
1657+
var currentType: ProtoType? = type.type
1658+
1659+
while (currentType != null) {
1660+
val simpleName = currentType.simpleName
1661+
if (oneOf.name.equals(simpleName, ignoreCase = true)) {
1662+
val oneOfTypeName = oneOfEnumNames.getValue(oneOf)
1663+
return oneOfTypeName.peerType("${oneOfTypeName.simpleName}_OneOf")
1664+
}
1665+
1666+
val enclosingName = currentType.enclosingTypeOrPackage ?: break
1667+
currentType = schema.getType(enclosingName)?.type
1668+
}
1669+
1670+
return oneOfEnumNames.getValue(oneOf)
1671+
}
1672+
16521673
private val ProtoType.encoding: String?
16531674
get() = when (this) {
16541675
ProtoType.SINT32, ProtoType.SINT64 -> "signed"

0 commit comments

Comments
 (0)