From 7e3b9093947968a7a4298e740d667674d82831fd Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Mon, 18 Dec 2023 20:08:20 +0100 Subject: [PATCH] [K/N] Move some utils to the `serialization.native` module KT-64392 --- .../ir/serialization.native/build.gradle.kts | 4 ++ .../backend/konan/serialization/IrUtils.kt | 57 +++++++++++++++++++ .../kotlin/backend/konan/descriptors/utils.kt | 39 ------------- .../kotlin/backend/konan/ir/NewIrUtils.kt | 8 --- .../serialization/KonanDeclarationTable.kt | 1 - .../konan/serialization/KonanIdSignaturer.kt | 1 - .../konan/serialization/KonanIrLinker.kt | 1 - 7 files changed, 61 insertions(+), 50 deletions(-) create mode 100644 compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt diff --git a/compiler/ir/serialization.native/build.gradle.kts b/compiler/ir/serialization.native/build.gradle.kts index 7da2a93a352..a4774b9df67 100644 --- a/compiler/ir/serialization.native/build.gradle.kts +++ b/compiler/ir/serialization.native/build.gradle.kts @@ -7,12 +7,16 @@ dependencies { api(project(":compiler:ir.tree")) api(project(":compiler:ir.serialization.common")) + implementation(project(":compiler:fir:fir2ir")) + implementation(project(":compiler:fir:tree")) implementation(project(":compiler:ir.objcinterop")) implementation(project(":core:compiler.common.native")) compileOnly(intellijCore()) } +optInToUnsafeDuringIrConstructionAPI() + sourceSets { "main" { projectDefault() } } diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt new file mode 100644 index 00000000000..7c148d54c9c --- /dev/null +++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2010-2023 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.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.utils.sourceElement +import org.jetbrains.kotlin.fir.lazy.AbstractFir2IrLazyDeclaration +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.descriptors.IrBasedDeclarationDescriptor +import org.jetbrains.kotlin.library.metadata.KlibDeserializedContainerSource +import org.jetbrains.kotlin.library.metadata.isFromInteropLibrary +import org.jetbrains.kotlin.resolve.descriptorUtil.module + +private fun IrDeclaration.findTopLevelDeclaration(): IrDeclaration = when (val parent = this.parent) { + is IrDeclaration -> parent.findTopLevelDeclaration() + else -> this +} + +private fun IrDeclaration.propertyIfAccessor(): IrDeclaration = + (this as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: this + +fun DeclarationDescriptor.isFromInteropLibrary(): Boolean = + this.isFromFirDeserializedInteropLibrary() || this.module.isFromInteropLibrary() + +private fun DeclarationDescriptor.isFromFirDeserializedInteropLibrary(): Boolean { + val declaration = (this as? IrBasedDeclarationDescriptor<*>)?.owner ?: return false + + // We need to find top-level non-accessor declaration, because + // - fir2ir lazy IR creates non-AbstractFir2IrLazyDeclaration declarations sometimes, e.g. for enum entries; + // - K2 metadata deserializer doesn't set containerSource for property accessors. + val topLevelDeclaration = declaration.findTopLevelDeclaration().propertyIfAccessor() + + val firDeclaration = (topLevelDeclaration as? AbstractFir2IrLazyDeclaration<*>)?.fir as? FirMemberDeclaration ?: return false + val containerSource = when (firDeclaration) { + is FirCallableDeclaration -> firDeclaration.containerSource + is FirClassLikeDeclaration -> firDeclaration.sourceElement + } + + return containerSource is KlibDeserializedContainerSource && containerSource.isFromNativeInteropLibrary +} + +/** + * This function should be equivalent to `IrDeclaration.isFromInteropLibrary` from `backend.native`, but in fact it is not for declarations + * from Fir modules. + * + * This should be fixed in the future. + */ +@ObsoleteDescriptorBasedAPI +fun IrDeclaration.isFromInteropLibraryByDescriptor() = descriptor.isFromInteropLibrary() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt index 2544da551de..429f8d2633c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt @@ -9,19 +9,8 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration -import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration -import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.declarations.utils.sourceElement -import org.jetbrains.kotlin.fir.lazy.AbstractFir2IrLazyDeclaration -import org.jetbrains.kotlin.ir.declarations.IrDeclaration -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction -import org.jetbrains.kotlin.ir.descriptors.IrBasedDeclarationDescriptor -import org.jetbrains.kotlin.library.metadata.KlibDeserializedContainerSource import org.jetbrains.kotlin.library.metadata.impl.KlibResolvedModuleDescriptorsFactoryImpl.Companion.FORWARD_DECLARATIONS_MODULE_NAME -import org.jetbrains.kotlin.library.metadata.isFromInteropLibrary import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.descriptorUtil.module fun DeclarationDescriptor.deepPrint() { this.accept(DeepPrintVisitor(PrintVisitor()), 0) @@ -37,33 +26,5 @@ internal val CallableMemberDescriptor.propertyIfAccessor this.correspondingProperty else this -private fun IrDeclaration.findTopLevelDeclaration(): IrDeclaration = when (val parent = this.parent) { - is IrDeclaration -> parent.findTopLevelDeclaration() - else -> this -} - -private fun IrDeclaration.propertyIfAccessor(): IrDeclaration = - (this as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: this - val ModuleDescriptor.isForwardDeclarationModule: Boolean get() = name == FORWARD_DECLARATIONS_MODULE_NAME - -fun DeclarationDescriptor.isFromInteropLibrary(): Boolean = - this.isFromFirDeserializedInteropLibrary() || this.module.isFromInteropLibrary() - -private fun DeclarationDescriptor.isFromFirDeserializedInteropLibrary(): Boolean { - val declaration = (this as? IrBasedDeclarationDescriptor<*>)?.owner ?: return false - - // We need to find top-level non-accessor declaration, because - // - fir2ir lazy IR creates non-AbstractFir2IrLazyDeclaration declarations sometimes, e.g. for enum entries; - // - K2 metadata deserializer doesn't set containerSource for property accessors. - val topLevelDeclaration = declaration.findTopLevelDeclaration().propertyIfAccessor() - - val firDeclaration = (topLevelDeclaration as? AbstractFir2IrLazyDeclaration<*>)?.fir as? FirMemberDeclaration ?: return false - val containerSource = when (firDeclaration) { - is FirCallableDeclaration -> firDeclaration.containerSource - is FirClassLikeDeclaration -> firDeclaration.sourceElement - } - - return containerSource is KlibDeserializedContainerSource && containerSource.isFromNativeInteropLibrary -} diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt index 9cb1a1a7b52..039f80fb9ec 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.backend.konan.ir import org.jetbrains.kotlin.backend.konan.DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions -import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.llvm.KonanMetadata import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns @@ -109,10 +108,3 @@ val IrDeclaration.konanLibrary: KotlinLibrary? fun IrDeclaration.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true fun IrPackageFragment.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true - -/** - * This function should be equivalent to [IrDeclaration.isFromInteropLibrary], but in fact it is not for declarations - * from Fir modules. This should be fixed in the future. - */ -@ObsoleteDescriptorBasedAPI -fun IrDeclaration.isFromInteropLibraryByDescriptor() = descriptor.isFromInteropLibrary() \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt index d880fb788db..2cce8cb86a2 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt @@ -3,7 +3,6 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable import org.jetbrains.kotlin.backend.common.serialization.signature.DescToIrIdSignatureComputer -import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibraryByDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.IrDeclaration diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIdSignaturer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIdSignaturer.kt index 18eb3dc7328..746f6aeb7a9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIdSignaturer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIdSignaturer.kt @@ -2,7 +2,6 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.common.serialization.mangle.SpecialDeclarationType import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor -import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.KotlinMangler diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt index 0625284bc05..29ac81da738 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.backend.konan.CachedLibraries import org.jetbrains.kotlin.backend.konan.InlineFunctionOriginInfo import org.jetbrains.kotlin.backend.konan.PartialCacheInfo import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs -import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibraryByDescriptor import org.jetbrains.kotlin.backend.konan.ir.konanLibrary import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib