diff --git a/SKIE/acceptance-tests b/SKIE/acceptance-tests index 89af845f3..d4a94e9b3 160000 --- a/SKIE/acceptance-tests +++ b/SKIE/acceptance-tests @@ -1 +1 @@ -Subproject commit 89af845f3f51d3387ebd9f5921151bfd9a72ff26 +Subproject commit d4a94e9b311eb9e2613ba62fe05497b809ae63b4 diff --git a/SKIE/common/configuration/annotations/src/commonMain/kotlin/co/touchlab/skie/configuration/annotations/SkieVisibility.kt b/SKIE/common/configuration/annotations/src/commonMain/kotlin/co/touchlab/skie/configuration/annotations/SkieVisibility.kt index 68e9d6d92..f1000128c 100644 --- a/SKIE/common/configuration/annotations/src/commonMain/kotlin/co/touchlab/skie/configuration/annotations/SkieVisibility.kt +++ b/SKIE/common/configuration/annotations/src/commonMain/kotlin/co/touchlab/skie/configuration/annotations/SkieVisibility.kt @@ -52,7 +52,7 @@ annotation class SkieVisibility { * * For example, a top-level function originally exposed as `FileKt.functionName` will be internal, if SKIE generated the global function wrapper for it. * - * Note that this setting will only affect callable declarations (functions, properties, constructors) - not classes. + * Note that this setting will only affect non-abstract callable declarations (functions, properties, constructors) - not classes. */ @Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR) diff --git a/SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/SkieVisibility.kt b/SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/SkieVisibility.kt index 3ab3bf5f8..921df7df6 100644 --- a/SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/SkieVisibility.kt +++ b/SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/SkieVisibility.kt @@ -45,7 +45,7 @@ object SkieVisibility : ConfigurationKey.Enum(this)?.configuration?.get(SkieVisibility) == SkieVisibility.Level.InternalIfWrapped +} diff --git a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/member/NormalizeKotlinCSirVisibilityPhase.kt b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/member/NormalizeKotlinCSirVisibilityPhase.kt index 341ab9efb..65756fde0 100644 --- a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/member/NormalizeKotlinCSirVisibilityPhase.kt +++ b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/member/NormalizeKotlinCSirVisibilityPhase.kt @@ -8,7 +8,7 @@ import co.touchlab.skie.sir.element.getAllDeclarationsRecursively /** * Changes `SirVisibility.Private` to `SirVisibility.Removed` in all Kotlin declarations. */ -object NormalizeKotlinSirVisibilityPhase : SirPhase { +object NormalizeKotlinSirPrivateVisibilityPhase : SirPhase { context(SirPhase.Context) override suspend fun execute() { diff --git a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/type/PropagateSirVisibilityToClassesPhase.kt b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/type/PropagateSirVisibilityToClassesPhase.kt index 27d8b7857..4ef212158 100644 --- a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/type/PropagateSirVisibilityToClassesPhase.kt +++ b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/phases/sir/type/PropagateSirVisibilityToClassesPhase.kt @@ -5,7 +5,6 @@ import co.touchlab.skie.phases.SirPhase import co.touchlab.skie.sir.element.SirClass import co.touchlab.skie.sir.element.SirModule import co.touchlab.skie.sir.element.SirVisibility -import co.touchlab.skie.sir.element.coerceAtMost import co.touchlab.skie.sir.element.kirClassOrNull import co.touchlab.skie.sir.element.superClassType import co.touchlab.skie.sir.element.superProtocolTypes diff --git a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirCallableDeclaration.kt b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirCallableDeclaration.kt index 3bd3f1399..6e4621137 100644 --- a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirCallableDeclaration.kt +++ b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirCallableDeclaration.kt @@ -47,6 +47,9 @@ sealed interface SirCallableDeclaration : SirDeclarationWithVisibility, SirEleme val deprecationLevel: DeprecationLevel + // TODO Remove and check wrappedBy functions in Sir instead (once the concept of bridged callable declarations is refactored). + var isWrappedBySkie: Boolean + fun toReadableString(): String = Signature(this).toString() } @@ -57,3 +60,6 @@ val SirCallableDeclaration.receiverDeclaration: SirClass? is SirExtension -> parent.classDeclaration else -> null } + +val SirCallableDeclaration.isAbstract: Boolean + get() = (this as? SirOverridableDeclaration<*>)?.isAbstract == true diff --git a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirConstructor.kt b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirConstructor.kt index bc1c3bd2e..3a123209b 100644 --- a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirConstructor.kt +++ b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirConstructor.kt @@ -14,6 +14,7 @@ class SirConstructor( var isConvenience: Boolean = false, override var throws: Boolean = false, override val deprecationLevel: DeprecationLevel = DeprecationLevel.None, + override var isWrappedBySkie: Boolean = false, ) : SirFunction(attributes.toMutableList(), modifiers.toMutableList()) { override val identifier = "init" @@ -46,6 +47,7 @@ class SirConstructor( isConvenience: Boolean = false, throws: Boolean = false, deprecationLevel: DeprecationLevel = DeprecationLevel.None, + isWrappedBySkie: Boolean = false, ): SirConstructor = SirConstructor( parent = this@SirDeclarationNamespace, @@ -56,6 +58,7 @@ class SirConstructor( isConvenience = isConvenience, throws = throws, deprecationLevel = deprecationLevel, + isWrappedBySkie = isWrappedBySkie, ) } } @@ -69,6 +72,7 @@ fun SirConstructor.shallowCopy( isConvenience: Boolean = this.isConvenience, throws: Boolean = this.throws, deprecationLevel: DeprecationLevel = this.deprecationLevel, + isWrappedBySkie: Boolean = false, ): SirConstructor = SirConstructor( parent = parent, @@ -79,4 +83,5 @@ fun SirConstructor.shallowCopy( isConvenience = isConvenience, throws = throws, deprecationLevel = deprecationLevel, + isWrappedBySkie = isWrappedBySkie, ) diff --git a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirProperty.kt b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirProperty.kt index a47ffece6..3243448c3 100644 --- a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirProperty.kt +++ b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirProperty.kt @@ -19,6 +19,7 @@ class SirProperty( override var scope: SirScope = parent.coerceScope(SirScope.Member), override val deprecationLevel: DeprecationLevel = DeprecationLevel.None, override val isFakeOverride: Boolean = false, + override var isWrappedBySkie: Boolean = false, attributes: List = emptyList(), modifiers: List = emptyList(), ) : SirOverridableDeclaration, SirCallableDeclaration, SirElementWithModality { @@ -93,6 +94,7 @@ class SirProperty( scope: SirScope = coerceScope(SirScope.Member), deprecationLevel: DeprecationLevel = DeprecationLevel.None, isFakeOverride: Boolean = false, + isWrappedBySkie: Boolean = false, attributes: List = emptyList(), modifiers: List = emptyList(), ): SirProperty = @@ -108,6 +110,7 @@ class SirProperty( scope = scope, deprecationLevel = deprecationLevel, isFakeOverride = isFakeOverride, + isWrappedBySkie = isWrappedBySkie, attributes = attributes, modifiers = modifiers, ) @@ -126,6 +129,7 @@ fun SirProperty.shallowCopy( scope: SirScope = parent.coerceScope(this.scope), deprecationLevel: DeprecationLevel = this.deprecationLevel, isFakeOverride: Boolean = this.isFakeOverride, + isWrappedBySkie: Boolean = false, attributes: List = this.attributes, modifiers: List = this.modifiers, ): SirProperty = @@ -141,6 +145,7 @@ fun SirProperty.shallowCopy( scope = scope, deprecationLevel = deprecationLevel, isFakeOverride = isFakeOverride, + isWrappedBySkie = isWrappedBySkie, attributes = attributes, modifiers = modifiers, ) diff --git a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirSimpleFunction.kt b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirSimpleFunction.kt index 55def70ab..19440dc13 100644 --- a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirSimpleFunction.kt +++ b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/sir/element/SirSimpleFunction.kt @@ -13,11 +13,12 @@ class SirSimpleFunction( var returnType: SirType, override var visibility: SirVisibility = SirVisibility.Public, override var modality: SirModality = parent.coerceModalityForSimpleFunctionOrProperty(), - override val isAbstract: Boolean, + override val isAbstract: Boolean = false, override var isReplaced: Boolean = false, override var isHidden: Boolean = false, override var scope: SirScope = parent.coerceScope(SirScope.Member), override val isFakeOverride: Boolean = false, + override var isWrappedBySkie: Boolean = false, attributes: List = emptyList(), modifiers: List = emptyList(), var isAsync: Boolean = false, @@ -77,6 +78,7 @@ class SirSimpleFunction( isHidden: Boolean = false, scope: SirScope = coerceScope(SirScope.Member), isFakeOverride: Boolean = false, + isWrappedBySkie: Boolean = false, attributes: List = emptyList(), modifiers: List = emptyList(), isAsync: Boolean = false, @@ -94,6 +96,7 @@ class SirSimpleFunction( isHidden = isHidden, scope = scope, isFakeOverride = isFakeOverride, + isWrappedBySkie = isWrappedBySkie, attributes = attributes, modifiers = modifiers, isAsync = isAsync, @@ -114,6 +117,7 @@ fun SirSimpleFunction.shallowCopy( isHidden: Boolean = this.isHidden, scope: SirScope = parent.coerceScope(this.scope), isFakeOverride: Boolean = this.isFakeOverride, + isWrappedBySkie: Boolean = false, attributes: List = this.attributes, modifiers: List = this.modifiers, isAsync: Boolean = this.isAsync, @@ -131,6 +135,7 @@ fun SirSimpleFunction.shallowCopy( isHidden = isHidden, scope = scope, isFakeOverride = isFakeOverride, + isWrappedBySkie = isWrappedBySkie, attributes = attributes, modifiers = modifiers, isAsync = isAsync, diff --git a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/util/SkieVisibilityToSirVisibility.kt b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/util/SkieVisibilityToSirVisibility.kt index a258c5339..078eff8f1 100644 --- a/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/util/SkieVisibilityToSirVisibility.kt +++ b/SKIE/kotlin-compiler/core/src/commonMain/kotlin/co/touchlab/skie/util/SkieVisibilityToSirVisibility.kt @@ -3,13 +3,13 @@ package co.touchlab.skie.util import co.touchlab.skie.configuration.SkieVisibility import co.touchlab.skie.sir.element.SirVisibility -fun SkieVisibility.Level.toSirVisibility(isWrapped: Boolean = false): SirVisibility = +fun SkieVisibility.Level.toSirVisibility(): SirVisibility = when (this) { SkieVisibility.Level.Public -> SirVisibility.Public SkieVisibility.Level.PublicButHidden -> SirVisibility.Public SkieVisibility.Level.PublicButReplaced -> SirVisibility.Public SkieVisibility.Level.Internal -> SirVisibility.Internal SkieVisibility.Level.InternalAndReplaced -> SirVisibility.Internal - SkieVisibility.Level.InternalIfWrapped -> if (isWrapped) SirVisibility.Internal else SirVisibility.Public + SkieVisibility.Level.InternalIfWrapped -> SirVisibility.Public SkieVisibility.Level.Private -> SirVisibility.Removed } diff --git a/SKIE/kotlin-compiler/linker-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/LinkerPhaseScheduler.kt b/SKIE/kotlin-compiler/linker-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/LinkerPhaseScheduler.kt index b47c9f39e..16ba59d80 100644 --- a/SKIE/kotlin-compiler/linker-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/LinkerPhaseScheduler.kt +++ b/SKIE/kotlin-compiler/linker-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/LinkerPhaseScheduler.kt @@ -66,11 +66,12 @@ import co.touchlab.skie.phases.runtime.ConfigureStableNameTypeAliasesForKotlinRu import co.touchlab.skie.phases.runtime.KotlinRuntimeHidingPhase import co.touchlab.skie.phases.runtime.SwiftRuntimeGenerator import co.touchlab.skie.phases.sir.CommitSirIsReplacedPropertyPhase +import co.touchlab.skie.phases.sir.member.ConfigureInternalVisibilityForWrappedCallableDeclarationsPhase import co.touchlab.skie.phases.sir.member.CreateAsyncSirFunctionsPhase import co.touchlab.skie.phases.sir.member.CreateSirMembersPhase import co.touchlab.skie.phases.sir.member.InitializeSirMembersCachePhase import co.touchlab.skie.phases.sir.member.InitializeSirOverridesPhase -import co.touchlab.skie.phases.sir.member.NormalizeKotlinSirVisibilityPhase +import co.touchlab.skie.phases.sir.member.NormalizeKotlinSirPrivateVisibilityPhase import co.touchlab.skie.phases.sir.member.VerifySirVisibilityInAbstractMembersPhase import co.touchlab.skie.phases.sir.member.PropagateSirVisibilityToMembersPhase import co.touchlab.skie.phases.sir.member.StripKonanCallableDeclarationManglingPhase @@ -188,7 +189,7 @@ class LinkerPhaseScheduler : SkiePhaseScheduler { FixNamesOfInaccessibleNestedClassesPhase, CommitSirIsReplacedPropertyPhase, - NormalizeKotlinSirVisibilityPhase, + NormalizeKotlinSirPrivateVisibilityPhase, PropagateSirVisibilityToClassesPhase, PropagateSirVisibilityToMembersPhase, PropagateSirVisibilityToTypeAliasesPhase, @@ -228,7 +229,8 @@ class LinkerPhaseScheduler : SkiePhaseScheduler { MoveBridgesToTopLevelPhase, - NormalizeKotlinSirVisibilityPhase, + NormalizeKotlinSirPrivateVisibilityPhase, + ConfigureInternalVisibilityForWrappedCallableDeclarationsPhase, PropagateSirVisibilityToClassesPhase, PropagateSirVisibilityToMembersPhase, PropagateSirVisibilityToFileClassesPhase,