diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt index c119fd1c15b..85aa3ea0907 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.impl.buildKoltinLibrary +import org.jetbrains.kotlin.library.metadata.NativeTypeTransformer import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer import org.jetbrains.kotlin.library.metadata.parseModuleHeader import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion @@ -165,7 +166,8 @@ private class KlibMetadataDependencyContainer( KlibMetadataModuleDescriptorFactoryImpl( MetadataFactories.DefaultDescriptorFactory, MetadataFactories.DefaultPackageFragmentsFactory, - MetadataFactories.flexibleTypeDeserializer + MetadataFactories.flexibleTypeDeserializer, + MetadataFactories.platformDependentTypeTransformer ) } @@ -195,5 +197,6 @@ private class KlibMetadataDependencyContainer( private val MetadataFactories = KlibMetadataFactories( { DefaultBuiltIns.Instance }, - NullFlexibleTypeDeserializer + NullFlexibleTypeDeserializer, + NativeTypeTransformer() ) \ No newline at end of file diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataFactories.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataFactories.kt index e8d72986740..8267dafe719 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataFactories.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataFactories.kt @@ -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 diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataModuleDescriptorFactory.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataModuleDescriptorFactory.kt index c9ec770a47c..ea2083cc785 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataModuleDescriptorFactory.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataModuleDescriptorFactory.kt @@ -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, diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/NativeTypeTransformer.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/NativeTypeTransformer.kt new file mode 100644 index 00000000000..349d2cb8555 --- /dev/null +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/NativeTypeTransformer.kt @@ -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) + } +} \ No newline at end of file diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt index 9d5c97b7980..0c66cfb7e4f 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt @@ -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 { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentTypeTransformer.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentTypeTransformer.kt new file mode 100644 index 00000000000..2bb6b276bab --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentTypeTransformer.kt @@ -0,0 +1,17 @@ +/* + * 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.descriptors.deserialization + +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.types.SimpleType + +interface PlatformDependentTypeTransformer { + fun transformPlatformType(classId: ClassId, computedType: SimpleType): SimpleType + + object None : PlatformDependentTypeTransformer { + override fun transformPlatformType(classId: ClassId, computedType: SimpleType): SimpleType = computedType + } +} \ No newline at end of file diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt index 4182fa57f71..5d65ffa7d88 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt @@ -100,18 +100,10 @@ class TypeDeserializer( simpleType.withAbbreviation(simpleType(it)) } ?: simpleType - // TODO: move this hack in some platform specific place ASAP + if (proto.hasClassName()) { val classId = c.nameResolver.getClassId(proto.className) - 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 classDescriptor = constructor.declarationDescriptor as ClassDescriptor - val realPackageFqn = (classDescriptor.containingDeclaration as PackageFragmentDescriptor).fqName - if (originalPackageFqn != realPackageFqn) { - return SupposititiousSimpleType(computedType, classId) - } - } + return c.components.platformDependentTypeTransformer.transformPlatformType(classId, computedType) } return computedType @@ -272,15 +264,4 @@ class TypeDeserializer( } override fun toString() = debugName + (if (parent == null) "" else ". Child of ${parent.debugName}") - - 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) - } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt index 41385ac59eb..5b60f70ab61 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter +import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.* @@ -50,7 +51,8 @@ class DeserializationComponents( val platformDependentDeclarationFilter: PlatformDependentDeclarationFilter = PlatformDependentDeclarationFilter.All, val extensionRegistryLite: ExtensionRegistryLite, val kotlinTypeChecker: NewKotlinTypeChecker = NewKotlinTypeChecker.Default, - val samConversionResolver: SamConversionResolver + val samConversionResolver: SamConversionResolver, + val platformDependentTypeTransformer: PlatformDependentTypeTransformer = PlatformDependentTypeTransformer.None ) { val classDeserializer: ClassDeserializer = ClassDeserializer(this) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt index bf2eb7a23dd..3ec732980d0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt @@ -136,15 +136,16 @@ class CompositeResolverForModuleFactory( val packageFragmentNames = parseModuleHeader(library.moduleHeaderData).packageFragmentNameList - val MetadataFactories = KlibMetadataFactories( + val metadataFactories = KlibMetadataFactories( { DefaultBuiltIns.Instance }, NullFlexibleTypeDeserializer ) val klibMetadataModuleDescriptorFactory = KlibMetadataModuleDescriptorFactoryImpl( - MetadataFactories.DefaultDescriptorFactory, - MetadataFactories.DefaultPackageFragmentsFactory, - MetadataFactories.flexibleTypeDeserializer + metadataFactories.DefaultDescriptorFactory, + metadataFactories.DefaultPackageFragmentsFactory, + metadataFactories.flexibleTypeDeserializer, + metadataFactories.platformDependentTypeTransformer ) klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/NativeFactories.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/NativeFactories.kt index 7b0e7d84738..3c6eafdda67 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/NativeFactories.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/NativeFactories.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.konan.util.KlibMetadataFactories +import org.jetbrains.kotlin.library.metadata.NativeTypeTransformer import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer -object NativeFactories : KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer) +object NativeFactories : KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer, NativeTypeTransformer())