[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
@@ -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
// 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)
}
}
@@ -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)