[Metadata] Add platform dependent type transformer
- Fix forward declaration type construction
This commit is contained in:
+12
-2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataDe
|
||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataModuleDescriptorFactory
|
||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.impl.KlibMetadataDeserializedPackageFragmentsFactoryImpl
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
|
||||
import org.jetbrains.kotlin.descriptors.konan.KlibModuleDescriptorFactory
|
||||
import org.jetbrains.kotlin.descriptors.konan.impl.KlibModuleDescriptorFactoryImpl
|
||||
import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeDeserializer
|
||||
@@ -22,9 +23,13 @@ import org.jetbrains.kotlin.storage.StorageManager
|
||||
*/
|
||||
open class KlibMetadataFactories(
|
||||
createBuiltIns:(StorageManager) -> KotlinBuiltIns,
|
||||
val flexibleTypeDeserializer: FlexibleTypeDeserializer
|
||||
val flexibleTypeDeserializer: FlexibleTypeDeserializer,
|
||||
val platformDependentTypeTransformer: PlatformDependentTypeTransformer
|
||||
) {
|
||||
|
||||
constructor(createBuiltIns:(StorageManager) -> KotlinBuiltIns, flexibleTypeDeserializer: FlexibleTypeDeserializer) :
|
||||
this(createBuiltIns, flexibleTypeDeserializer, PlatformDependentTypeTransformer.None)
|
||||
|
||||
/**
|
||||
* The default [KlibModuleDescriptorFactory] factory instance.
|
||||
*/
|
||||
@@ -54,7 +59,12 @@ open class KlibMetadataFactories(
|
||||
descriptorFactory: KlibModuleDescriptorFactory,
|
||||
packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory
|
||||
): KlibMetadataModuleDescriptorFactory =
|
||||
KlibMetadataModuleDescriptorFactoryImpl(descriptorFactory, packageFragmentsFactory, flexibleTypeDeserializer)
|
||||
KlibMetadataModuleDescriptorFactoryImpl(
|
||||
descriptorFactory,
|
||||
packageFragmentsFactory,
|
||||
flexibleTypeDeserializer,
|
||||
platformDependentTypeTransformer
|
||||
)
|
||||
|
||||
fun createDefaultKonanResolvedModuleDescriptorsFactory(
|
||||
moduleDescriptorFactory: KlibMetadataModuleDescriptorFactory
|
||||
|
||||
+2
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
||||
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
|
||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.konan.KlibModuleDescriptorFactory
|
||||
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||
@@ -17,6 +18,7 @@ interface KlibMetadataModuleDescriptorFactory {
|
||||
val descriptorFactory: KlibModuleDescriptorFactory
|
||||
val packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory
|
||||
val flexibleTypeDeserializer: FlexibleTypeDeserializer
|
||||
val platformDependentTypeTransformer: PlatformDependentTypeTransformer
|
||||
|
||||
fun createDescriptor(
|
||||
library: KotlinLibrary,
|
||||
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.library.metadata
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.SimpleType
|
||||
import org.jetbrains.kotlin.types.SupposititiousSimpleType
|
||||
|
||||
class NativeTypeTransformer : PlatformDependentTypeTransformer {
|
||||
override fun transformPlatformType(classId: ClassId, computedType: SimpleType): SimpleType {
|
||||
val originalPackageFqn = classId.packageFqName
|
||||
if (originalPackageFqn in forwardPackagesSet) {
|
||||
// This hack is about keeping original class id written into proto which is required for correct IR linkage
|
||||
val constructor = computedType.constructor
|
||||
val classDescriptor = constructor.declarationDescriptor as ClassDescriptor
|
||||
val realPackageFqn = (classDescriptor.containingDeclaration as PackageFragmentDescriptor).fqName
|
||||
if (originalPackageFqn != realPackageFqn) {
|
||||
return SupposititiousSimpleType(computedType, classId)
|
||||
}
|
||||
}
|
||||
|
||||
return computedType
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val cNames = FqName("cnames")
|
||||
private val cNamesStructs = cNames.child(Name.identifier("structs"))
|
||||
|
||||
private val objCNames = FqName("objcnames")
|
||||
private val objCNamesClasses = objCNames.child(Name.identifier("classes"))
|
||||
private val objCNamesProtocols = objCNames.child(Name.identifier("protocols"))
|
||||
|
||||
private val forwardPackagesSet = setOf(cNamesStructs, objCNamesClasses, objCNamesProtocols)
|
||||
}
|
||||
}
|
||||
+5
-2
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.builtins.functions.functionInterfacePackageFragmentP
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
|
||||
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
|
||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
|
||||
@@ -36,7 +37,8 @@ private val ModuleDescriptorImpl.isStdlibModule
|
||||
class KlibMetadataModuleDescriptorFactoryImpl(
|
||||
override val descriptorFactory: KlibModuleDescriptorFactory,
|
||||
override val packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory,
|
||||
override val flexibleTypeDeserializer: FlexibleTypeDeserializer
|
||||
override val flexibleTypeDeserializer: FlexibleTypeDeserializer,
|
||||
override val platformDependentTypeTransformer: PlatformDependentTypeTransformer
|
||||
) : KlibMetadataModuleDescriptorFactory {
|
||||
|
||||
override fun createDescriptorOptionalBuiltIns(
|
||||
@@ -151,7 +153,8 @@ class KlibMetadataModuleDescriptorFactoryImpl(
|
||||
notFoundClasses,
|
||||
ContractDeserializerImpl(configuration, storageManager),
|
||||
extensionRegistryLite = KlibMetadataSerializerProtocol.extensionRegistry,
|
||||
samConversionResolver = SamConversionResolverImpl(storageManager, samWithReceiverResolvers = emptyList())
|
||||
samConversionResolver = SamConversionResolverImpl(storageManager, samWithReceiverResolvers = emptyList()),
|
||||
platformDependentTypeTransformer = platformDependentTypeTransformer
|
||||
)
|
||||
|
||||
fragmentsToInitialize.forEach {
|
||||
|
||||
Reference in New Issue
Block a user