Skip to content

Commit

Permalink
Add Sir functions for Kotlin declarations.
Browse files Browse the repository at this point in the history
  • Loading branch information
FilipDolnik committed Oct 4, 2023
1 parent 00e56fd commit 4e4d7ba
Show file tree
Hide file tree
Showing 86 changed files with 1,441 additions and 570 deletions.
2 changes: 1 addition & 1 deletion SKIE/acceptance-tests
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@ class SirPhaseContext private constructor(
namer = mainSkieContext.namer,
descriptorProvider = mainSkieContext.descriptorProvider,
bridgeProvider = DescriptorBridgeProvider(mainSkieContext.namer),
skieContext = mainSkieContext,
sirProvider = SirProvider(
namer = mainSkieContext.namer,
framework = mainSkieContext.framework,
descriptorProvider = mainSkieContext.descriptorProvider,
sdkPath = mainSkieContext.configurables.absoluteTargetSysRoot,
reporter = mainSkieContext.reporter,
// WIP 2 Refactor so that it is not duplicated
bridgeProvider = DescriptorBridgeProvider(mainSkieContext.namer),
skieContext = mainSkieContext,
),
),
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package co.touchlab.skie.kir

import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
Expand All @@ -13,6 +14,8 @@ import org.jetbrains.kotlin.utils.ResolvedDependency

interface DescriptorProvider {

val builtIns: KotlinBuiltIns

val exposedModules: Set<ModuleDescriptor>

val exposedClasses: Set<ClassDescriptor>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.konan.objcexport.isBaseMethod
import org.jetbrains.kotlin.backend.konan.objcexport.isObjCProperty
import org.jetbrains.kotlin.backend.konan.objcexport.isTopLevel
import org.jetbrains.kotlin.backend.konan.objcexport.shouldBeExposed
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
Expand Down Expand Up @@ -41,6 +42,10 @@ class NativeDescriptorProvider(
private val exportedInterface: ObjcExportedInterfaceReflector,
) : DescriptorProvider {

override val builtIns: KotlinBuiltIns by lazy {
exposedModules.first().builtIns
}

override val exposedModules: Set<ModuleDescriptor> by lazy {
exposedModulesProvider.exposedModules()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package co.touchlab.skie.kir
import co.touchlab.skie.compilerinject.reflection.reflectedBy
import org.jetbrains.kotlin.backend.konan.KonanConfig
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportedInterface
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
Expand All @@ -28,6 +29,9 @@ internal class NativeMutableDescriptorProvider(
IMMUTABLE,
}

override val builtIns: KotlinBuiltIns
get() = realProvider.builtIns

private lateinit var realProvider: NativeDescriptorProvider

private lateinit var mutationScope: DescriptorRegistrationScope
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import co.touchlab.skie.phases.features.defaultarguments.DefaultArgumentGenerato
import co.touchlab.skie.phases.features.enums.ExhaustiveEnumsGenerator
import co.touchlab.skie.phases.features.flow.FlowBridgingConfigurator
import co.touchlab.skie.phases.features.flow.FlowConversionConstructorsGenerator
import co.touchlab.skie.phases.features.flow.FlowMappingConfigurator
import co.touchlab.skie.phases.features.sealed.SealedInteropGenerator
import co.touchlab.skie.phases.features.suspend.SuspendGenerator
import co.touchlab.skie.phases.header.AddForwardDeclarationsPhase
Expand Down Expand Up @@ -79,7 +78,6 @@ class SkiePhaseScheduler {
addAll(
DumpSwiftApiPhase.BeforeApiNotes,

RemoveKonanManglingPhase,
RenameNestedTypesConflictingWithExternalTypesPhase,
RenameNestedKotlinTypesConflictingWithKeywordsPhase,
RenameSkieNamespacesConflictingWithKeywordsPhase,
Expand All @@ -90,17 +88,18 @@ class SkiePhaseScheduler {
ExtraClassExportPhase.FinalizePhase,
DefaultArgumentGenerator.FinalizePhase,
FlowBridgingConfigurator,
FlowMappingConfigurator(context),
SuspendGenerator.KotlinBridgeConfigurationPhase,
ExhaustiveEnumsGenerator,
SealedInteropGenerator(context),

MoveBridgesToTopLevelPhase,
RenameTypesConflictsWithOtherTypesPhase,

RemoveKonanManglingPhase,
FixCallableMembersConflictsPhase,

FlowConversionConstructorsGenerator,
ExhaustiveEnumsGenerator.FunctionGeneratorPhase,
ExhaustiveEnumsGenerator.EnumBodyGeneratorPhase,
SuspendGenerator.SwiftBridgeGeneratorPhase,

TemporarilyRenameTypesConflictingWithExternalModulesPhase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,27 @@ package co.touchlab.skie.phases.apinotes
import co.touchlab.skie.phases.SirPhase
import co.touchlab.skie.phases.apinotes.builder.ApiNotes
import co.touchlab.skie.phases.apinotes.builder.ApiNotesFactory
import co.touchlab.skie.sir.element.SirDeclaration
import co.touchlab.skie.sir.element.SirDeclarationParent
import co.touchlab.skie.util.cache.writeTextIfDifferent
import java.io.File

sealed class ApiNotesGenerationPhase : SirPhase {

context(SirPhase.Context)
override fun execute() {
val sirProvider = sirProvider
val allDeclarations = listOf(sirProvider.sirBuiltins.Kotlin.module, sirProvider.sirBuiltins.Stdlib.module)
.flatMap { it.allChildren() }

val apiNotes = ApiNotesFactory.create()

apiNotes.createApiNotesFile()
}

private fun SirDeclarationParent.allChildren(): List<SirDeclaration> =
(declarations.filterIsInstance<SirDeclarationParent>().flatMap { it.allChildren() } + this + declarations).filterIsInstance<SirDeclaration>()

context(SirPhase.Context)
private fun ApiNotes.createApiNotesFile() {
val content = this.createApiNotesFileContent()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import co.touchlab.skie.phases.SirPhase
import co.touchlab.skie.sir.element.SirClass
import co.touchlab.skie.sir.element.SirDeclarationNamespace
import co.touchlab.skie.sir.element.SirTypeAlias
import co.touchlab.skie.sir.element.SirVisibility
import co.touchlab.skie.sir.element.copyTypeParametersFrom
import co.touchlab.skie.sir.element.toTypeFromEnclosingTypeParameters

Expand All @@ -29,10 +30,10 @@ private fun SirClass.moveToTopLevel() {

private fun SirClass.createReplacementTypeAlias(namespace: SirDeclarationNamespace) {
val typeAlias = SirTypeAlias(
simpleName = simpleName,
baseName = baseName,
parent = namespace,
typeFactory = { typeAlias ->
this.toTypeFromEnclosingTypeParameters(typeAlias.typeParameters).also { it.useInternalName = false }
this.toTypeFromEnclosingTypeParameters(typeAlias.typeParameters).withFqName()
},
)

Expand All @@ -43,6 +44,7 @@ private fun SirClass.createReplacementTypeAlias(namespace: SirDeclarationNamespa
}

private fun SirClass.renameAndRemoveFromNamespace() {
simpleName = "__Skie__Bridge__${fqName.toLocalString().replace(".", "_")}"
baseName = "Bridge__${fqName.toLocalString().replace(".", "_")}"
visibility = SirVisibility.PublicButReplaced
this.namespace = null
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,10 @@ package co.touchlab.skie.phases.apinotes.builder

import co.touchlab.skie.kir.DescriptorProvider
import co.touchlab.skie.phases.SirPhase
import co.touchlab.skie.swiftmodel.SwiftModelVisibility
import co.touchlab.skie.sir.element.SirVisibility
import co.touchlab.skie.swiftmodel.callable.function.KotlinFunctionSwiftModel
import co.touchlab.skie.swiftmodel.callable.parameter.KotlinValueParameterSwiftModel
import co.touchlab.skie.swiftmodel.callable.property.regular.KotlinRegularPropertySwiftModel
import co.touchlab.skie.swiftmodel.isHidden
import co.touchlab.skie.swiftmodel.isRemoved
import co.touchlab.skie.swiftmodel.isReplaced
import co.touchlab.skie.swiftmodel.type.KotlinTypeSwiftModel
import org.jetbrains.kotlin.descriptors.isInterface

Expand All @@ -25,7 +22,7 @@ object ApiNotesFactory {
context(SirPhase.Context)
private val DescriptorProvider.swiftModelsForClassesAndFiles: List<KotlinTypeSwiftModel>
get() = this.exposedClasses.filterNot { it.kind.isInterface }.map { it.swiftModel } +
this.exposedFiles.map { it.swiftModel }
this.exposedFiles.map { it.swiftModel }

context(SirPhase.Context)
private val DescriptorProvider.swiftModelsForInterfaces: List<KotlinTypeSwiftModel>
Expand All @@ -37,8 +34,8 @@ object ApiNotesFactory {
objCFqName = this.objCFqName.asString(),
bridgeFqName = this.bridgedSirClass?.fqName?.toLocalString(),
swiftFqName = this.kotlinSirClass.fqName.toLocalString(),
isHidden = this.visibility.isHiddenOrReplaced,
availability = this.visibility.availability,
isHidden = this.kotlinSirClass.visibility.isHiddenInApiNotes,
availability = this.kotlinSirClass.visibility.availability,
methods = this.allDirectlyCallableMembers.filterIsInstance<KotlinFunctionSwiftModel>().map { it.toApiNote(this) },
properties = this.allDirectlyCallableMembers.filterIsInstance<KotlinRegularPropertySwiftModel>().map { it.toApiNote(this) },
)
Expand All @@ -48,9 +45,9 @@ object ApiNotesFactory {
ApiNotesMethod(
objCSelector = this.objCSelector,
kind = owner.kind.toMemberKind(),
swiftName = this.name,
isHidden = this.visibility.isHiddenOrReplaced,
availability = this.visibility.availability,
swiftName = this.kotlinSirCallableDeclaration.name,
isHidden = this.kotlinSirCallableDeclaration.visibility.isHiddenInApiNotes,
availability = this.kotlinSirCallableDeclaration.visibility.availability,
resultType = this.objCReturnType?.let { objCTypeRenderer.render(it, this.reservedIdentifierInApiNotes) } ?: "",
parameters = this.valueParameters.map { it.toApiNote(this) },
)
Expand All @@ -67,17 +64,21 @@ object ApiNotesFactory {
ApiNotesProperty(
objCName = this.objCName,
kind = owner.kind.toMemberKind(),
swiftName = this.name,
isHidden = this.visibility.isHiddenOrReplaced,
availability = this.visibility.availability,
swiftName = this.kotlinSirProperty.name,
isHidden = this.kotlinSirProperty.visibility.isHiddenInApiNotes,
availability = this.kotlinSirProperty.visibility.availability,
type = objCTypeRenderer.render(this.objCType, emptyList()),
)

private val SwiftModelVisibility.isHiddenOrReplaced: Boolean
get() = this.isHidden || this.isReplaced
private val SirVisibility.isHiddenInApiNotes: Boolean
get() = when (this) {
SirVisibility.PublicButHidden -> true
SirVisibility.PublicButReplaced -> true
else -> false
}

private val SwiftModelVisibility.availability: ApiNotesAvailabilityMode
get() = if (this.isRemoved) ApiNotesAvailabilityMode.NonSwift else ApiNotesAvailabilityMode.Available
private val SirVisibility.availability: ApiNotesAvailabilityMode
get() = if (this == SirVisibility.Removed) ApiNotesAvailabilityMode.NonSwift else ApiNotesAvailabilityMode.Available

private fun KotlinTypeSwiftModel.Kind.toMemberKind(): ApiNotesTypeMemberKind =
when (this) {
Expand All @@ -87,4 +88,4 @@ object ApiNotesFactory {
}

private val KotlinFunctionSwiftModel.reservedIdentifierInApiNotes: List<String>
get() = valueParameters.map { it.parameterName }
get() = kotlinSirValueParameters.map { it.name }
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import co.touchlab.skie.phases.DescriptorModificationPhase
import co.touchlab.skie.phases.SkiePhase
import co.touchlab.skie.phases.features.defaultarguments.DefaultArgumentGenerator
import co.touchlab.skie.phases.util.doInPhase
import co.touchlab.skie.sir.element.applyToEntireOverrideHierarchy
import co.touchlab.skie.swiftmodel.callable.KotlinDirectlyCallableMemberSwiftModel.CollisionResolutionStrategy
import co.touchlab.skie.util.SharedCounter
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
Expand Down Expand Up @@ -124,7 +125,9 @@ abstract class BaseFunctionDefaultArgumentGeneratorDelegate(

private fun renameOverloadedFunction(overloadDescriptor: FunctionDescriptor, function: SimpleFunctionDescriptor) {
context.doInPhase(DefaultArgumentGenerator.FinalizePhase) {
overloadDescriptor.swiftModel.identifier = function.swiftModel.identifier
overloadDescriptor.swiftModel.kotlinSirFunction.applyToEntireOverrideHierarchy {
identifier = function.swiftModel.kotlinSirFunction.identifier
}

val numberOfDefaultArguments = function.valueParameters.size - overloadDescriptor.valueParameters.size

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,9 @@ class ConstructorsDefaultArgumentGeneratorDelegate(

private fun fixOverloadLastParameterName(overloadDescriptor: FunctionDescriptor) {
context.doInPhase(DefaultArgumentGenerator.FinalizePhase) {
val lastParameter = overloadDescriptor.swiftModel.valueParameters.lastOrNull() ?: return@doInPhase
val lastParameter = overloadDescriptor.swiftModel.primarySirConstructor.valueParameters.lastOrNull() ?: return@doInPhase

lastParameter.argumentLabel = lastParameter.argumentLabel.dropUniqueParameterMangling()
lastParameter.label = lastParameter.labelOrName.dropUniqueParameterMangling()
}
}

Expand Down
Loading

0 comments on commit 4e4d7ba

Please sign in to comment.