@@ -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