commonMain.co.touchlab.skie.kir.irbuilder.impl.namespace.DeserializedClassNamespace.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kotlin-compiler-linker-plugin-kgp_1.9.20 Show documentation
Show all versions of kotlin-compiler-linker-plugin-kgp_1.9.20 Show documentation
Kotlin compiler plugin that improves Swift interface of a Kotlin Multiplatform framework.
The newest version!
package co.touchlab.skie.kir.irbuilder.impl.namespace
import co.touchlab.skie.compilerinject.reflection.reflectedBy
import co.touchlab.skie.compilerinject.reflection.reflectors.DeserializedClassMemberScopeReflector
import co.touchlab.skie.kir.irbuilder.UnsupportedDeclarationDescriptorException
import co.touchlab.skie.kir.irbuilder.util.findSourceFile
import co.touchlab.skie.phases.KotlinIrPhase
import co.touchlab.skie.phases.skieSymbolTable
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
class DeserializedClassNamespace(
override val descriptor: DeserializedClassDescriptor,
) : BaseDeserializedNamespace() {
override val sourceElement: SourceElement = SourceElement { descriptor.findSourceFile() }
override fun addDescriptorIntoDescriptorHierarchy(declarationDescriptor: DeclarationDescriptor) {
when (declarationDescriptor) {
is SimpleFunctionDescriptor -> addFunctionDescriptor(declarationDescriptor)
is ClassConstructorDescriptor -> addSecondaryConstructorDescriptor(declarationDescriptor)
else -> throw UnsupportedDeclarationDescriptorException(declarationDescriptor)
}
}
private fun addFunctionDescriptor(functionDescriptor: SimpleFunctionDescriptor) {
addDescriptorToAllDescriptors(functionDescriptor)
descriptor.unsubstitutedMemberScope.addFunctionDescriptorToImpl(functionDescriptor)
}
private fun addDescriptorToAllDescriptors(declarationDescriptor: DeclarationDescriptor) {
val classScope = descriptor.unsubstitutedMemberScope.reflectedBy()
@Suppress("UNCHECKED_CAST")
val children = classScope.allDescriptors() as ArrayList
children.add(declarationDescriptor)
}
private fun addSecondaryConstructorDescriptor(constructorDescriptor: ClassConstructorDescriptor) {
require(!constructorDescriptor.isPrimary) { "Primary constructors are not yet supported." }
(descriptor.constructors as MutableCollection).add(constructorDescriptor)
}
context(KotlinIrPhase.Context)
override fun generateNamespaceIr(): IrDeclarationContainer =
skieSymbolTable.descriptorExtension.referenceClass(descriptor).owner
}