From c6e93d30a160cad421a73cb48eb46cd48f1287b9 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Thu, 7 Mar 2019 14:44:05 +0300 Subject: [PATCH] Fix Kotlin property names conflicting with C keywords. (#2747) --- .../kotlin/backend/konan/objcexport/ObjCExportNamer.kt | 7 +++++-- backend.native/tests/framework/values/values.kt | 2 ++ backend.native/tests/framework/values/values.swift | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt index ac9d7fe259a..8c2a89e6777 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt @@ -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() { + 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 : Mapping() { + private open inner class GlobalNameMapping : Mapping() { 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() { diff --git a/backend.native/tests/framework/values/values.kt b/backend.native/tests/framework/values/values.kt index d6006f89e30..24a5f816347 100644 --- a/backend.native/tests/framework/values/values.kt +++ b/backend.native/tests/framework/values/values.kt @@ -278,3 +278,5 @@ class Deeply { } } } + +data class CKeywords(val float: Float, val `enum`: Int, var goto: Boolean) diff --git a/backend.native/tests/framework/values/values.swift b/backend.native/tests/framework/values/values.swift index ffd9d8a7657..348b4390eaa 100644 --- a/backend.native/tests/framework/values/values.swift +++ b/backend.native/tests/framework/values/values.swift @@ -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 --------