From a0fdf08b561e92de02cc6c97b0d6ce607e6e3df2 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 19 Aug 2022 17:12:15 +0200 Subject: [PATCH] [IR] Partial linkage: unify UnlinkedDeclarationsSupport for JS and Native backends --- ....kt => UnlinkedDeclarationsSupportImpl.kt} | 21 +++++++++--- .../jetbrains/kotlin/ir/backend/js/klib.kt | 5 +-- .../js/lower/serialization/ir/JsIrLinker.kt | 11 ++----- .../ir/JsUnlinkedDeclarationsSupport.kt | 24 -------------- .../jetbrains/kotlin/backend/konan/PsiToIr.kt | 3 +- .../KonanUnlinkedDeclarationsSupport.kt | 33 ------------------- 6 files changed, 25 insertions(+), 72 deletions(-) rename compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/unlinked/{BasicUnlinkedDeclarationsSupport.kt => UnlinkedDeclarationsSupportImpl.kt} (88%) delete mode 100644 compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsUnlinkedDeclarationsSupport.kt delete mode 100644 kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanUnlinkedDeclarationsSupport.kt diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/unlinked/BasicUnlinkedDeclarationsSupport.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/unlinked/UnlinkedDeclarationsSupportImpl.kt similarity index 88% rename from compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/unlinked/BasicUnlinkedDeclarationsSupport.kt rename to compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/unlinked/UnlinkedDeclarationsSupportImpl.kt index a985983e4b5..c23b3314684 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/unlinked/BasicUnlinkedDeclarationsSupport.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/unlinked/UnlinkedDeclarationsSupportImpl.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.common.serialization.unlinked import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder +import org.jetbrains.kotlin.backend.common.serialization.unlinked.UnlinkedDeclarationsSupport.UnlinkedMarkerTypeHandler import org.jetbrains.kotlin.backend.common.serialization.unlinked.UsedClassifierSymbolStatus.* import org.jetbrains.kotlin.descriptors.NotFoundClasses import org.jetbrains.kotlin.ir.IrBuiltIns @@ -20,19 +21,31 @@ import org.jetbrains.kotlin.ir.types.IrErrorType import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrTypeProjection +import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.parentClassOrNull import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid -abstract class BasicUnlinkedDeclarationsSupport : UnlinkedDeclarationsSupport { - protected abstract val handler: UnlinkedDeclarationsSupport.UnlinkedMarkerTypeHandler - protected abstract val builtIns: IrBuiltIns +class UnlinkedDeclarationsSupportImpl( + private val builtIns: IrBuiltIns, + override val allowUnboundSymbols: Boolean +) : UnlinkedDeclarationsSupport { + private val handler = object : UnlinkedMarkerTypeHandler { + override val unlinkedMarkerType = IrSimpleTypeImpl( + classifier = builtIns.anyClass, + hasQuestionMark = true, + arguments = emptyList(), + annotations = emptyList() + ) + + override fun IrType.isUnlinkedMarkerType(): Boolean = this === unlinkedMarkerType + } private val usedClassifierSymbols = UsedClassifierSymbols() - final override fun markUsedClassifiersExcludingUnlinkedFromFakeOverrideBuilding(fakeOverrideBuilder: FakeOverrideBuilder) { + override fun markUsedClassifiersExcludingUnlinkedFromFakeOverrideBuilding(fakeOverrideBuilder: FakeOverrideBuilder) { if (!allowUnboundSymbols) return val entries = fakeOverrideBuilder.fakeOverrideCandidates diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 8bcd8da30a3..b491e64b236 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDes import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataIncrementalSerializer import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor +import org.jetbrains.kotlin.backend.common.serialization.unlinked.UnlinkedDeclarationsSupportImpl import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -376,7 +377,7 @@ fun getIrModuleInfoForKlib( val irBuiltIns = IrBuiltInsOverDescriptors(moduleDescriptor.builtIns, typeTranslator, symbolTable) val allowUnboundSymbols = configuration[JSConfigurationKeys.PARTIAL_LINKAGE] ?: false - val unlinkedDeclarationsSupport = JsUnlinkedDeclarationsSupport(irBuiltIns, allowUnboundSymbols) + val unlinkedDeclarationsSupport = UnlinkedDeclarationsSupportImpl(irBuiltIns, allowUnboundSymbols) val irLinker = JsIrLinker( currentModule = null, @@ -435,7 +436,7 @@ fun getIrModuleInfoForSourceFiles( } val allowUnboundSymbols = configuration[JSConfigurationKeys.PARTIAL_LINKAGE] ?: false - val unlinkedDeclarationsSupport = JsUnlinkedDeclarationsSupport(irBuiltIns, allowUnboundSymbols) + val unlinkedDeclarationsSupport = UnlinkedDeclarationsSupportImpl(irBuiltIns, allowUnboundSymbols) val irLinker = JsIrLinker( currentModule = psi2IrContext.moduleDescriptor, diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt index 8cb040ac847..efed49bb6d5 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt @@ -7,17 +7,12 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder import org.jetbrains.kotlin.backend.common.serialization.* -import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData import org.jetbrains.kotlin.backend.common.serialization.unlinked.UnlinkedDeclarationsSupport -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.backend.common.serialization.unlinked.UnlinkedDeclarationsSupportImpl +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns -import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.TranslationPluginContext -import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrModuleFragment -import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl -import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol -import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.library.IrLibrary @@ -30,7 +25,7 @@ class JsIrLinker( override val translationPluginContext: TranslationPluginContext?, private val icData: ICData? = null, friendModules: Map> = emptyMap(), - override val unlinkedDeclarationsSupport: UnlinkedDeclarationsSupport = JsUnlinkedDeclarationsSupport( + override val unlinkedDeclarationsSupport: UnlinkedDeclarationsSupport = UnlinkedDeclarationsSupportImpl( builtIns, allowUnboundSymbols = false ), diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsUnlinkedDeclarationsSupport.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsUnlinkedDeclarationsSupport.kt deleted file mode 100644 index c83df235471..00000000000 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsUnlinkedDeclarationsSupport.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2010-2022 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.ir.backend.js.lower.serialization.ir - -import org.jetbrains.kotlin.backend.common.serialization.unlinked.BasicUnlinkedDeclarationsSupport -import org.jetbrains.kotlin.backend.common.serialization.unlinked.UnlinkedDeclarationsSupport.UnlinkedMarkerTypeHandler -import org.jetbrains.kotlin.ir.IrBuiltIns -import org.jetbrains.kotlin.ir.types.IrErrorType -import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.impl.IrErrorTypeImpl -import org.jetbrains.kotlin.types.Variance - -class JsUnlinkedDeclarationsSupport( - override val builtIns: IrBuiltIns, - override val allowUnboundSymbols: Boolean -) : BasicUnlinkedDeclarationsSupport() { - override val handler = object : UnlinkedMarkerTypeHandler { - override val unlinkedMarkerType = IrErrorTypeImpl(null, emptyList(), Variance.INVARIANT) - override fun IrType.isUnlinkedMarkerType() = this is IrErrorType - } -} diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt index 6a671b7a51f..4353bf073b1 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt @@ -7,6 +7,7 @@ import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignature import org.jetbrains.kotlin.backend.common.serialization.linkerissues.checkNoUnboundSymbols import org.jetbrains.kotlin.backend.common.serialization.mangle.ManglerChecker import org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.Ir2DescriptorManglerAdapter +import org.jetbrains.kotlin.backend.common.serialization.unlinked.UnlinkedDeclarationsSupportImpl import org.jetbrains.kotlin.backend.konan.descriptors.isForwardDeclarationModule import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols @@ -122,7 +123,7 @@ internal fun Context.psiToIr( config.resolve.includedLibraries.map { it.uniqueName } ).associateWith { friendModules } - val unlinkedDeclarationsSupport = KonanUnlinkedDeclarationsSupport(generatorContext.irBuiltIns, allowUnboundSymbols) + val unlinkedDeclarationsSupport = UnlinkedDeclarationsSupportImpl(generatorContext.irBuiltIns, allowUnboundSymbols) KonanIrLinker( currentModule = moduleDescriptor, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanUnlinkedDeclarationsSupport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanUnlinkedDeclarationsSupport.kt deleted file mode 100644 index c9b51155ae0..00000000000 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanUnlinkedDeclarationsSupport.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2010-2022 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.backend.konan.serialization - -import org.jetbrains.kotlin.backend.common.serialization.unlinked.BasicUnlinkedDeclarationsSupport -import org.jetbrains.kotlin.backend.common.serialization.unlinked.UnlinkedDeclarationsSupport.UnlinkedMarkerTypeHandler -import org.jetbrains.kotlin.ir.IrBuiltIns -import org.jetbrains.kotlin.ir.types.IrErrorType -import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl - -/** - * Kotlin/Native backend does not support [IrErrorType]. - * So, let's use a special instance of nullable [kotlin.Any] as a marker-type instead. - */ -class KonanUnlinkedDeclarationsSupport( - override val builtIns: IrBuiltIns, - override val allowUnboundSymbols: Boolean -) : BasicUnlinkedDeclarationsSupport() { - override val handler = object : UnlinkedMarkerTypeHandler { - override val unlinkedMarkerType = IrSimpleTypeImpl( - classifier = builtIns.anyClass, - hasQuestionMark = true, - arguments = emptyList(), - annotations = emptyList() - ) - - override fun IrType.isUnlinkedMarkerType(): Boolean = this === unlinkedMarkerType - } -} \ No newline at end of file