Fix Kotlin property names conflicting with C keywords. (#2747)

This commit is contained in:
Nikolay Igotti
2019-03-07 14:44:05 +03:00
committed by GitHub
parent 364b7ae72a
commit c6e93d30a1
3 changed files with 8 additions and 2 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.backend.konan.objcexport
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.backend.konan.cKeywords
import org.jetbrains.kotlin.backend.konan.descriptors.isArray
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
@@ -105,11 +106,13 @@ internal class ObjCExportNamerImpl(
}
private val propertyNames = object : Mapping<PropertyDescriptor, String>() {
override fun reserved(name: String) = name in cKeywords
override fun conflict(first: PropertyDescriptor, second: PropertyDescriptor): Boolean =
!mapper.canHaveSameName(first, second)
}
private inner open class GlobalNameMapping<in T : Any, N> : Mapping<T, N>() {
private open inner class GlobalNameMapping<in T : Any, N> : Mapping<T, N>() {
final override fun conflict(first: T, second: T): Boolean = true
}
@@ -131,7 +134,7 @@ internal class ObjCExportNamerImpl(
"useStoredAccessor"
)
override fun reserved(name: String) = name in reserved
override fun reserved(name: String) = (name in reserved) || (name in cKeywords)
}
private val objectInstanceSelectors = object : ClassPropertyNameMapping<ClassDescriptor>() {
@@ -278,3 +278,5 @@ class Deeply {
}
}
}
data class CKeywords(val float: Float, val `enum`: Int, var goto: Boolean)
@@ -493,6 +493,7 @@ func testPureSwiftClasses() throws {
func testNames() throws {
try assertEquals(actual: ValuesKt.PROPERTY_NAME_MUST_NOT_BE_ALTERED_BY_SWIFT, expected: 111)
try assertEquals(actual: Deeply.NestedType().thirtyTwo, expected: 32)
try assertEquals(actual: CKeywords(float: 1.0, enum : 42, goto: true).goto_, expected: true)
}
// -------- Execution of the test --------