From 48c9986b081becda456244cae793af4c0d04acd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Doln=C3=ADk?= Date: Wed, 15 Nov 2023 12:17:23 +0100 Subject: [PATCH] Fix translation for ObjCProtocol 2. --- .../kir/descriptor/ExtraDescriptorBuiltins.kt | 4 --- .../touchlab/skie/oir/builtin/OirBuiltins.kt | 5 ---- .../co/touchlab/skie/oir/element/OirClass.kt | 4 +-- .../skie/oir/type/SpecialReferenceOirType.kt | 12 +++++++- .../oir/type/translation/OirTypeTranslator.kt | 2 +- ...ixOirFunctionSignaturesForApiNotesPhase.kt | 1 + .../touchlab/skie/sir/type/SpecialSirType.kt | 3 ++ .../sir/type/translation/SirTypeTranslator.kt | 1 + .../io/outfoxx/swiftpoet/ProtocolTypeName.kt | 30 +++++++++++++++++++ 9 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/io/outfoxx/swiftpoet/ProtocolTypeName.kt diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/kir/descriptor/ExtraDescriptorBuiltins.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/kir/descriptor/ExtraDescriptorBuiltins.kt index 2acfcdb4..1f985f02 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/kir/descriptor/ExtraDescriptorBuiltins.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/kir/descriptor/ExtraDescriptorBuiltins.kt @@ -14,10 +14,6 @@ class ExtraDescriptorBuiltins( private val Darwin = getModule("") - private val stdlib = getModule("") - - val Protocol: ClassDescriptor = getClass("kotlinx.cinterop.ObjCProtocol", stdlib) - val NSObject: ClassDescriptor = getClass("platform.darwin.NSObject", Darwin) val NSCopying: ClassDescriptor = getClass("platform.Foundation.NSCopyingProtocol", Foundation) diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/builtin/OirBuiltins.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/builtin/OirBuiltins.kt index a89ff5ca..488b3bdb 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/builtin/OirBuiltins.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/builtin/OirBuiltins.kt @@ -15,11 +15,6 @@ class OirBuiltins( private val Foundation: OirModule.External = oirProvider.getExternalModule("Foundation") - val Protocol: OirClass = oirProvider.getExternalClass(extraDescriptorBuiltins.Protocol, Foundation).apply { - name = "Protocol" - kind = OirClass.Kind.Class - } - val NSObject: OirClass = oirProvider.getExternalClass(extraDescriptorBuiltins.NSObject, Foundation) val NSError: OirClass = oirProvider.getExternalClass(extraDescriptorBuiltins.NSError).apply { diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/element/OirClass.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/element/OirClass.kt index 0f194603..dcdbc2e2 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/element/OirClass.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/element/OirClass.kt @@ -5,9 +5,9 @@ import co.touchlab.skie.oir.type.OirType import co.touchlab.skie.sir.element.SirClass class OirClass( - override var name: String, + override val name: String, override val parent: OirTopLevelDeclarationParent, - var kind: Kind, + val kind: Kind, ) : OirTypeDeclaration, OirCallableDeclarationParent { lateinit var originalSirClass: SirClass diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/SpecialReferenceOirType.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/SpecialReferenceOirType.kt index 19de8d28..dd940c66 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/SpecialReferenceOirType.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/SpecialReferenceOirType.kt @@ -1,6 +1,6 @@ package co.touchlab.skie.oir.type -sealed class SpecialReferenceOirType(private val name: String) : NonNullReferenceOirType() { +sealed class SpecialReferenceOirType(val name: String) : NonNullReferenceOirType() { object Id : SpecialReferenceOirType("id") @@ -8,6 +8,16 @@ sealed class SpecialReferenceOirType(private val name: String) : NonNullReferenc object Class : SpecialReferenceOirType("Class") + object Protocol : SpecialReferenceOirType("Protocol") { + + override fun render(attrsAndName: String, needsNonnullAttribute: Boolean): String = + buildString { + append(name) + append(" *") + appendAttrsAndName(attrsAndName) + } + } + override fun render(attrsAndName: String, needsNonnullAttribute: Boolean): String = name.withAttrsAndName(attrsAndName.plusNonnullAttributeIfNeeded(needsNonnullAttribute)) } diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/translation/OirTypeTranslator.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/translation/OirTypeTranslator.kt index a9132cd5..7bd4c870 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/translation/OirTypeTranslator.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/oir/type/translation/OirTypeTranslator.kt @@ -150,7 +150,7 @@ class OirTypeTranslator( // TODO: more precise types can be used. if (descriptor.isObjCMetaClass()) return SpecialReferenceOirType.Class - if (descriptor.isObjCProtocolClass()) return oirBuiltins.Protocol.defaultType + if (descriptor.isObjCProtocolClass()) return SpecialReferenceOirType.Protocol if (descriptor.isExternalObjCClass() || descriptor.isObjCForwardDeclaration()) { return oirProvider.getExternalClass(descriptor).defaultType diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/oir/FixOirFunctionSignaturesForApiNotesPhase.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/oir/FixOirFunctionSignaturesForApiNotesPhase.kt index 3fdc6e8e..3c7d8586 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/oir/FixOirFunctionSignaturesForApiNotesPhase.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/oir/FixOirFunctionSignaturesForApiNotesPhase.kt @@ -111,6 +111,7 @@ class FixOirFunctionSignaturesForApiNotesPhase( } is TypeDefOirType -> this.declaration.name in reservedIdentifiers is NullableReferenceOirType -> this.nonNullType.collidesWith(reservedIdentifiers) + is SpecialReferenceOirType -> this.name in reservedIdentifiers else -> this.renderWithoutAttributes() in reservedIdentifiers } diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/SpecialSirType.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/SpecialSirType.kt index 200c775e..eed328fe 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/SpecialSirType.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/SpecialSirType.kt @@ -2,6 +2,7 @@ package co.touchlab.skie.sir.type import co.touchlab.skie.sir.element.SirTypeParameter import io.outfoxx.swiftpoet.AnyTypeName +import io.outfoxx.swiftpoet.ProtocolTypeName import io.outfoxx.swiftpoet.SelfTypeName import io.outfoxx.swiftpoet.TypeName @@ -36,4 +37,6 @@ sealed class SpecialSirType( object Self : SpecialSirType(SelfTypeName.INSTANCE) object Any : SpecialSirType(AnyTypeName.INSTANCE) + + object Protocol : SpecialSirType(ProtocolTypeName.INSTANCE) } diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/translation/SirTypeTranslator.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/translation/SirTypeTranslator.kt index 206b1418..9fbaf900 100644 --- a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/translation/SirTypeTranslator.kt +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/translation/SirTypeTranslator.kt @@ -116,6 +116,7 @@ class SirTypeTranslator( SpecialReferenceOirType.Class -> sirBuiltins.Swift.AnyClass.defaultType SpecialReferenceOirType.Id -> SpecialSirType.Any SpecialReferenceOirType.InstanceType -> SpecialSirType.Self + SpecialReferenceOirType.Protocol -> SpecialSirType.Protocol } private fun mapType(oirType: TypeParameterUsageOirType): SirType = diff --git a/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/io/outfoxx/swiftpoet/ProtocolTypeName.kt b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/io/outfoxx/swiftpoet/ProtocolTypeName.kt new file mode 100644 index 00000000..745d1e4f --- /dev/null +++ b/SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/io/outfoxx/swiftpoet/ProtocolTypeName.kt @@ -0,0 +1,30 @@ +package io.outfoxx.swiftpoet + +/* + * Copyright 2023 Touchlab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class ProtocolTypeName private constructor() : TypeName() { + + override fun emit(out: CodeWriter): CodeWriter { + out.emit("Protocol") + return out + } + + companion object { + + val INSTANCE = ProtocolTypeName() + } +}