[Metadata] Add platform dependent type transformer

- Fix forward declaration type construction
This commit is contained in:
Roman Artemev
2020-02-17 17:58:05 +03:00
parent 25a91a217e
commit bb43a66716
10 changed files with 96 additions and 33 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.*
import org.jetbrains.kotlin.library.impl.buildKoltinLibrary 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.NullFlexibleTypeDeserializer
import org.jetbrains.kotlin.library.metadata.parseModuleHeader import org.jetbrains.kotlin.library.metadata.parseModuleHeader
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
@@ -165,7 +166,8 @@ private class KlibMetadataDependencyContainer(
KlibMetadataModuleDescriptorFactoryImpl( KlibMetadataModuleDescriptorFactoryImpl(
MetadataFactories.DefaultDescriptorFactory, MetadataFactories.DefaultDescriptorFactory,
MetadataFactories.DefaultPackageFragmentsFactory, MetadataFactories.DefaultPackageFragmentsFactory,
MetadataFactories.flexibleTypeDeserializer MetadataFactories.flexibleTypeDeserializer,
MetadataFactories.platformDependentTypeTransformer
) )
} }
@@ -195,5 +197,6 @@ private class KlibMetadataDependencyContainer(
private val MetadataFactories = private val MetadataFactories =
KlibMetadataFactories( KlibMetadataFactories(
{ DefaultBuiltIns.Instance }, { DefaultBuiltIns.Instance },
NullFlexibleTypeDeserializer NullFlexibleTypeDeserializer,
NativeTypeTransformer()
) )
@@ -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.KlibMetadataModuleDescriptorFactory
import org.jetbrains.kotlin.backend.common.serialization.metadata.impl.KlibMetadataDeserializedPackageFragmentsFactoryImpl import org.jetbrains.kotlin.backend.common.serialization.metadata.impl.KlibMetadataDeserializedPackageFragmentsFactoryImpl
import org.jetbrains.kotlin.builtins.KotlinBuiltIns 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.KlibModuleDescriptorFactory
import org.jetbrains.kotlin.descriptors.konan.impl.KlibModuleDescriptorFactoryImpl import org.jetbrains.kotlin.descriptors.konan.impl.KlibModuleDescriptorFactoryImpl
import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeDeserializer import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeDeserializer
@@ -22,9 +23,13 @@ import org.jetbrains.kotlin.storage.StorageManager
*/ */
open class KlibMetadataFactories( open class KlibMetadataFactories(
createBuiltIns:(StorageManager) -> KotlinBuiltIns, 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. * The default [KlibModuleDescriptorFactory] factory instance.
*/ */
@@ -54,7 +59,12 @@ open class KlibMetadataFactories(
descriptorFactory: KlibModuleDescriptorFactory, descriptorFactory: KlibModuleDescriptorFactory,
packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory
): KlibMetadataModuleDescriptorFactory = ): KlibMetadataModuleDescriptorFactory =
KlibMetadataModuleDescriptorFactoryImpl(descriptorFactory, packageFragmentsFactory, flexibleTypeDeserializer) KlibMetadataModuleDescriptorFactoryImpl(
descriptorFactory,
packageFragmentsFactory,
flexibleTypeDeserializer,
platformDependentTypeTransformer
)
fun createDefaultKonanResolvedModuleDescriptorsFactory( fun createDefaultKonanResolvedModuleDescriptorsFactory(
moduleDescriptorFactory: KlibMetadataModuleDescriptorFactory moduleDescriptorFactory: KlibMetadataModuleDescriptorFactory
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider 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.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.descriptors.konan.KlibModuleDescriptorFactory import org.jetbrains.kotlin.descriptors.konan.KlibModuleDescriptorFactory
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
@@ -17,6 +18,7 @@ interface KlibMetadataModuleDescriptorFactory {
val descriptorFactory: KlibModuleDescriptorFactory val descriptorFactory: KlibModuleDescriptorFactory
val packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory val packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory
val flexibleTypeDeserializer: FlexibleTypeDeserializer val flexibleTypeDeserializer: FlexibleTypeDeserializer
val platformDependentTypeTransformer: PlatformDependentTypeTransformer
fun createDescriptor( fun createDescriptor(
library: KotlinLibrary, library: KotlinLibrary,
@@ -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)
}
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.builtins.functions.functionInterfacePackageFragmentP
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.ContractDeserializerImpl import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
import org.jetbrains.kotlin.descriptors.* 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.CompositePackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
@@ -36,7 +37,8 @@ private val ModuleDescriptorImpl.isStdlibModule
class KlibMetadataModuleDescriptorFactoryImpl( class KlibMetadataModuleDescriptorFactoryImpl(
override val descriptorFactory: KlibModuleDescriptorFactory, override val descriptorFactory: KlibModuleDescriptorFactory,
override val packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory, override val packageFragmentsFactory: KlibMetadataDeserializedPackageFragmentsFactory,
override val flexibleTypeDeserializer: FlexibleTypeDeserializer override val flexibleTypeDeserializer: FlexibleTypeDeserializer,
override val platformDependentTypeTransformer: PlatformDependentTypeTransformer
) : KlibMetadataModuleDescriptorFactory { ) : KlibMetadataModuleDescriptorFactory {
override fun createDescriptorOptionalBuiltIns( override fun createDescriptorOptionalBuiltIns(
@@ -151,7 +153,8 @@ class KlibMetadataModuleDescriptorFactoryImpl(
notFoundClasses, notFoundClasses,
ContractDeserializerImpl(configuration, storageManager), ContractDeserializerImpl(configuration, storageManager),
extensionRegistryLite = KlibMetadataSerializerProtocol.extensionRegistry, extensionRegistryLite = KlibMetadataSerializerProtocol.extensionRegistry,
samConversionResolver = SamConversionResolverImpl(storageManager, samWithReceiverResolvers = emptyList()) samConversionResolver = SamConversionResolverImpl(storageManager, samWithReceiverResolvers = emptyList()),
platformDependentTypeTransformer = platformDependentTypeTransformer
) )
fragmentsToInitialize.forEach { fragmentsToInitialize.forEach {
@@ -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
}
}
@@ -100,18 +100,10 @@ class TypeDeserializer(
simpleType.withAbbreviation(simpleType(it)) simpleType.withAbbreviation(simpleType(it))
} ?: simpleType } ?: simpleType
// TODO: move this hack in some platform specific place ASAP
if (proto.hasClassName()) { if (proto.hasClassName()) {
val classId = c.nameResolver.getClassId(proto.className) val classId = c.nameResolver.getClassId(proto.className)
val originalPackageFqn = classId.packageFqName return c.components.platformDependentTypeTransformer.transformPlatformType(classId, computedType)
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 computedType return computedType
@@ -272,15 +264,4 @@ class TypeDeserializer(
} }
override fun toString() = debugName + (if (parent == null) "" else ". Child of ${parent.debugName}") 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)
}
} }
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider
import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter 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.incremental.components.LookupTracker
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.metadata.deserialization.*
@@ -50,7 +51,8 @@ class DeserializationComponents(
val platformDependentDeclarationFilter: PlatformDependentDeclarationFilter = PlatformDependentDeclarationFilter.All, val platformDependentDeclarationFilter: PlatformDependentDeclarationFilter = PlatformDependentDeclarationFilter.All,
val extensionRegistryLite: ExtensionRegistryLite, val extensionRegistryLite: ExtensionRegistryLite,
val kotlinTypeChecker: NewKotlinTypeChecker = NewKotlinTypeChecker.Default, val kotlinTypeChecker: NewKotlinTypeChecker = NewKotlinTypeChecker.Default,
val samConversionResolver: SamConversionResolver val samConversionResolver: SamConversionResolver,
val platformDependentTypeTransformer: PlatformDependentTypeTransformer = PlatformDependentTypeTransformer.None
) { ) {
val classDeserializer: ClassDeserializer = ClassDeserializer(this) val classDeserializer: ClassDeserializer = ClassDeserializer(this)
@@ -136,15 +136,16 @@ class CompositeResolverForModuleFactory(
val packageFragmentNames = parseModuleHeader(library.moduleHeaderData).packageFragmentNameList val packageFragmentNames = parseModuleHeader(library.moduleHeaderData).packageFragmentNameList
val MetadataFactories = KlibMetadataFactories( val metadataFactories = KlibMetadataFactories(
{ DefaultBuiltIns.Instance }, { DefaultBuiltIns.Instance },
NullFlexibleTypeDeserializer NullFlexibleTypeDeserializer
) )
val klibMetadataModuleDescriptorFactory = KlibMetadataModuleDescriptorFactoryImpl( val klibMetadataModuleDescriptorFactory = KlibMetadataModuleDescriptorFactoryImpl(
MetadataFactories.DefaultDescriptorFactory, metadataFactories.DefaultDescriptorFactory,
MetadataFactories.DefaultPackageFragmentsFactory, metadataFactories.DefaultPackageFragmentsFactory,
MetadataFactories.flexibleTypeDeserializer metadataFactories.flexibleTypeDeserializer,
metadataFactories.platformDependentTypeTransformer
) )
klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider( klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider(
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
import org.jetbrains.kotlin.library.metadata.NativeTypeTransformer
import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer
object NativeFactories : KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer) object NativeFactories : KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer, NativeTypeTransformer())