[K/N] Drop merging forward and real declaration in deserializer

^KT-59643
This commit is contained in:
Pavel Kunyavskiy
2023-07-11 14:05:34 +02:00
committed by Space Team
parent e4c2fa1080
commit d797505f06
15 changed files with 19 additions and 126 deletions
@@ -177,8 +177,7 @@ private class KlibMetadataDependencyContainer(
KlibMetadataModuleDescriptorFactoryImpl( KlibMetadataModuleDescriptorFactoryImpl(
MetadataFactories.DefaultDescriptorFactory, MetadataFactories.DefaultDescriptorFactory,
MetadataFactories.DefaultPackageFragmentsFactory, MetadataFactories.DefaultPackageFragmentsFactory,
MetadataFactories.flexibleTypeDeserializer, MetadataFactories.flexibleTypeDeserializer
MetadataFactories.platformDependentTypeTransformer
) )
} }
@@ -209,6 +208,5 @@ private class KlibMetadataDependencyContainer(
private val MetadataFactories = private val MetadataFactories =
KlibMetadataFactories( KlibMetadataFactories(
{ DefaultBuiltIns.Instance }, { DefaultBuiltIns.Instance },
NullFlexibleTypeDeserializer, NullFlexibleTypeDeserializer
NativeTypeTransformer()
) )
@@ -91,21 +91,10 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
when (val type = wrappedType.unwrap()) { when (val type = wrappedType.unwrap()) {
is SimpleType -> { is SimpleType -> {
if (type is SupposititiousSimpleType) { when (val classifier = type.constructor.declarationDescriptor) {
val classId = type.overwrittenClass is ClassDescriptor -> with(copy(MangleMode.FQNAME)) { classifier.visit() }
classId.packageFqName.let { is TypeParameterDescriptor -> tBuilder.mangleTypeParameterReference(classifier)
if (!it.isRoot) { else -> error("Unexpected classifier: $classifier")
builder.appendSignature(it.asString())
builder.appendSignature(MangleConstant.FQN_SEPARATOR)
}
builder.appendSignature(classId.relativeClassName.asString())
}
} else {
when (val classifier = type.constructor.declarationDescriptor) {
is ClassDescriptor -> with(copy(MangleMode.FQNAME)) { classifier.visit() }
is TypeParameterDescriptor -> tBuilder.mangleTypeParameterReference(classifier)
else -> error("Unexpected classifier: $classifier")
}
} }
mangleTypeArguments(tBuilder, type, null) mangleTypeArguments(tBuilder, type, null)
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutForWriter
import org.jetbrains.kotlin.library.impl.KotlinLibraryWriterImpl import org.jetbrains.kotlin.library.impl.KotlinLibraryWriterImpl
import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories
import org.jetbrains.kotlin.library.metadata.KlibMetadataVersion import org.jetbrains.kotlin.library.metadata.KlibMetadataVersion
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.resolveSingleFileKlib import org.jetbrains.kotlin.library.resolveSingleFileKlib
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -114,7 +113,7 @@ object KlibTestUtil {
strategy = ToolingSingleFileKlibResolveStrategy strategy = ToolingSingleFileKlibResolveStrategy
) )
val metadataFactories = KlibMetadataFactories({ DefaultBuiltIns.Instance }, NullFlexibleTypeDeserializer, NativeTypeTransformer()) val metadataFactories = KlibMetadataFactories({ DefaultBuiltIns.Instance }, NullFlexibleTypeDeserializer)
val module = metadataFactories.DefaultDeserializedDescriptorFactory.createDescriptor( val module = metadataFactories.DefaultDeserializedDescriptorFactory.createDescriptor(
library = library, library = library,
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.library.metadata package org.jetbrains.kotlin.library.metadata
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer import org.jetbrains.kotlin.descriptors.deserialization.*
import org.jetbrains.kotlin.library.metadata.impl.KlibMetadataDeserializedPackageFragmentsFactoryImpl import org.jetbrains.kotlin.library.metadata.impl.KlibMetadataDeserializedPackageFragmentsFactoryImpl
import org.jetbrains.kotlin.library.metadata.impl.KlibMetadataModuleDescriptorFactoryImpl import org.jetbrains.kotlin.library.metadata.impl.KlibMetadataModuleDescriptorFactoryImpl
import org.jetbrains.kotlin.library.metadata.impl.KlibModuleDescriptorFactoryImpl import org.jetbrains.kotlin.library.metadata.impl.KlibModuleDescriptorFactoryImpl
@@ -19,13 +19,8 @@ import org.jetbrains.kotlin.storage.StorageManager
*/ */
class KlibMetadataFactories( 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.
*/ */
@@ -58,8 +53,7 @@ class KlibMetadataFactories(
KlibMetadataModuleDescriptorFactoryImpl( KlibMetadataModuleDescriptorFactoryImpl(
descriptorFactory, descriptorFactory,
packageFragmentsFactory, packageFragmentsFactory,
flexibleTypeDeserializer, flexibleTypeDeserializer
platformDependentTypeTransformer
) )
fun createDefaultKonanResolvedModuleDescriptorsFactory( fun createDefaultKonanResolvedModuleDescriptorsFactory(
@@ -9,7 +9,6 @@ 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.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
@@ -22,7 +21,6 @@ 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,
@@ -1,35 +0,0 @@
/*
* 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.NativeForwardDeclarationKind
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 forwardPackagesSet = NativeForwardDeclarationKind.entries.map { it.packageFqName }.toSet()
}
}
@@ -10,7 +10,6 @@ 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.EmptyPackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
@@ -33,8 +32,7 @@ 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(
@@ -173,7 +171,6 @@ class KlibMetadataModuleDescriptorFactoryImpl(
ContractDeserializerImpl(configuration, storageManager), ContractDeserializerImpl(configuration, storageManager),
extensionRegistryLite = KlibMetadataSerializerProtocol.extensionRegistry, extensionRegistryLite = KlibMetadataSerializerProtocol.extensionRegistry,
samConversionResolver = SamConversionResolverImpl(storageManager, samWithReceiverResolvers = emptyList()), samConversionResolver = SamConversionResolverImpl(storageManager, samWithReceiverResolvers = emptyList()),
platformDependentTypeTransformer = platformDependentTypeTransformer,
enumEntriesDeserializationSupport = enumEntriesDeserializationSupport, enumEntriesDeserializationSupport = enumEntriesDeserializationSupport,
) )
@@ -1,17 +0,0 @@
/*
* 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
}
}
@@ -237,31 +237,6 @@ private class SimpleTypeImpl(
} }
} }
// Note: a hack to support class descriptor overwriting in case of K/N forward declaration replacement and other such cases
class SupposititiousSimpleType(private val realType: SimpleType, val overwrittenClass: ClassId) : SimpleType() {
private fun maybeWrap(newType: SimpleType): SupposititiousSimpleType {
return if (newType === realType) this
else SupposititiousSimpleType(newType, overwrittenClass)
}
override fun replaceAttributes(newAttributes: TypeAttributes): SimpleType =
maybeWrap(realType.replaceAttributes(newAttributes))
override fun makeNullableAsSpecified(newNullability: Boolean): SimpleType =
maybeWrap(realType.makeNullableAsSpecified(newNullability))
@TypeRefinement
override fun refine(kotlinTypeRefiner: KotlinTypeRefiner): SimpleType =
maybeWrap(realType.refine(kotlinTypeRefiner))
override val constructor: TypeConstructor = realType.constructor
override val arguments: List<TypeProjection> = realType.arguments
override val isMarkedNullable: Boolean = realType.isMarkedNullable
override val memberScope: MemberScope = realType.memberScope
override val attributes: TypeAttributes get() = realType.attributes
}
abstract class DelegatingSimpleTypeImpl(override val delegate: SimpleType) : DelegatingSimpleType() { abstract class DelegatingSimpleTypeImpl(override val delegate: SimpleType) : DelegatingSimpleType() {
override fun replaceAttributes(newAttributes: TypeAttributes): SimpleType = override fun replaceAttributes(newAttributes: TypeAttributes): SimpleType =
if (newAttributes !== attributes) if (newAttributes !== attributes)
@@ -137,11 +137,6 @@ class TypeDeserializer(
simpleType.withAbbreviation(simpleType(it, expandTypeAliases = false)) simpleType.withAbbreviation(simpleType(it, expandTypeAliases = false))
} ?: simpleType } ?: simpleType
if (proto.hasClassName()) {
val classId = c.nameResolver.getClassId(proto.className)
return c.components.platformDependentTypeTransformer.transformPlatformType(classId, computedType)
}
return computedType return computedType
} }
@@ -21,7 +21,6 @@ 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.*
@@ -54,7 +53,6 @@ class DeserializationComponents(
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 typeAttributeTranslators: List<TypeAttributeTranslator> = listOf(DefaultTypeAttributeTranslator), val typeAttributeTranslators: List<TypeAttributeTranslator> = listOf(DefaultTypeAttributeTranslator),
val enumEntriesDeserializationSupport: EnumEntriesDeserializationSupport = EnumEntriesDeserializationSupport.Default, val enumEntriesDeserializationSupport: EnumEntriesDeserializationSupport = EnumEntriesDeserializationSupport.Default,
) { ) {
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
import org.jetbrains.kotlin.descriptors.isEmpty import org.jetbrains.kotlin.descriptors.isEmpty
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
@@ -39,7 +38,7 @@ import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.name.*
internal val KlibFactories = KlibMetadataFactories(::KonanBuiltIns, DynamicTypeDeserializer, PlatformDependentTypeTransformer.None) internal val KlibFactories = KlibMetadataFactories(::KonanBuiltIns, DynamicTypeDeserializer)
internal fun PhaseContext.fir2Ir( internal fun PhaseContext.fir2Ir(
input: FirOutput.Full, input: FirOutput.Full,
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDependenciesImpl
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.library.metadata.CurrentKlibModuleOrigin import org.jetbrains.kotlin.library.metadata.CurrentKlibModuleOrigin
import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories
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.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -29,7 +28,7 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProvid
internal object TopDownAnalyzerFacadeForKonan { internal object TopDownAnalyzerFacadeForKonan {
private val nativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer, NativeTypeTransformer()) private val nativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer)
fun analyzeFiles(files: Collection<KtFile>, context: FrontendContext): AnalysisResult { fun analyzeFiles(files: Collection<KtFile>, context: FrontendContext): AnalysisResult {
val config = context.config val config = context.config
@@ -8,6 +8,11 @@ package sample.tensorflow
import kotlinx.cinterop.* import kotlinx.cinterop.*
import platform.posix.size_t import platform.posix.size_t
import tensorflow.* import tensorflow.*
import cnames.structs.TF_Status
import cnames.structs.TF_Operation
import cnames.structs.TF_Tensor
import cnames.structs.TF_OperationDescription
import cnames.structs.TF_Session
typealias Status = CPointer<TF_Status> typealias Status = CPointer<TF_Status>
typealias Operation = CPointer<TF_Operation> typealias Operation = CPointer<TF_Operation>
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
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.isNativeStdlib import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.file.File
@@ -33,7 +32,7 @@ import org.jetbrains.kotlin.util.Logger
import org.jetbrains.kotlin.util.removeSuffixIfPresent import org.jetbrains.kotlin.util.removeSuffixIfPresent
import kotlin.system.exitProcess import kotlin.system.exitProcess
internal val KlibFactories = KlibMetadataFactories(::KonanBuiltIns, DynamicTypeDeserializer, PlatformDependentTypeTransformer.None) internal val KlibFactories = KlibMetadataFactories(::KonanBuiltIns, DynamicTypeDeserializer)
fun printUsage() { fun printUsage() {
println("Usage: klib <command> <library> <options>") println("Usage: klib <command> <library> <options>")