[Metadata] Add platform dependent type transformer
- Fix forward declaration type construction
This commit is contained in:
@@ -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()
|
||||||
)
|
)
|
||||||
+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.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
|
||||||
|
|||||||
+2
@@ -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,
|
||||||
|
|||||||
+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.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 {
|
||||||
|
|||||||
+17
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-21
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -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)
|
||||||
|
|
||||||
|
|||||||
+5
-4
@@ -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(
|
||||||
|
|||||||
+2
-1
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user