From cd3237295b92ac9940a84b0451554b727523706d Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Mon, 5 Jun 2023 18:58:18 +0200 Subject: [PATCH] [K/N] Remove module-wide ObsoleteDescriptorBasedApi opt-in --- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 5 --- kotlin-native/backend.native/build.gradle | 1 - ...BuiltInFictitiousFunctionIrClassFactory.kt | 4 ++ .../backend/konan/DependenciesTracker.kt | 7 ++-- .../konan/LlvmModuleSpecificationImpl.kt | 1 - .../kotlin/backend/konan/ObjCInterop.kt | 12 +++--- .../jetbrains/kotlin/backend/konan/PsiToIr.kt | 2 + .../konan/cexport/CAdapterGenerator.kt | 2 + .../kotlin/backend/konan/cgen/CBridgeGen.kt | 6 +-- .../backend/konan/cgen/InteropIrUtils.kt | 2 + .../konan/descriptors/ClassLayoutBuilder.kt | 2 +- .../kotlin/backend/konan/ir/FakeIrUtils.kt | 3 +- .../kotlin/backend/konan/ir/ModuleIndex.kt | 2 + .../kotlin/backend/konan/ir/NewIrUtils.kt | 33 ++++++++------- .../interop/DescriptorToIrTranslationUtils.kt | 4 ++ .../IrProviderForCEnumAndCStructStubs.kt | 2 + .../cenum/CEnumByValueFunctionGenerator.kt | 2 + .../ir/interop/cenum/CEnumClassGenerator.kt | 2 + .../interop/cenum/CEnumCompanionGenerator.kt | 2 + .../interop/cenum/CEnumVarClassGenerator.kt | 2 + .../cstruct/CStructVarClassGenerator.kt | 2 + .../cstruct/CStructVarCompanionGenerator.kt | 2 + .../backend/konan/llvm/CodeGenerator.kt | 4 +- .../kotlin/backend/konan/llvm/Imports.kt | 6 +++ .../backend/konan/llvm/IntrinsicGenerator.kt | 3 +- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 16 ++++---- .../llvm/KotlinObjCClassInfoGenerator.kt | 2 +- .../backend/konan/llvm/RTTIGenerator.kt | 2 +- .../konan/llvm/coverage/CoverageManager.kt | 2 + .../objcexport/ObjCExportCodeGenerator.kt | 2 + .../backend/konan/lower/BridgesBuilding.kt | 9 +++-- .../konan/lower/ExpectDeclarationsRemoving.kt | 2 + .../backend/konan/lower/InteropLowering.kt | 4 ++ .../lower/SpecialBackendChecksTraversal.kt | 40 +++++++++---------- .../backend/konan/lower/TestProcessor.kt | 2 + .../konan/objcexport/ObjCExportCodeSpec.kt | 2 + .../backend/konan/optimizations/DFGBuilder.kt | 30 ++++++-------- .../backend/konan/optimizations/DataFlowIR.kt | 6 ++- .../optimizations/DevirtualizationAnalysis.kt | 20 +++++----- .../serialization/KonanDeclarationTable.kt | 7 ++-- .../konan/serialization/KonanIrlinker.kt | 8 +++- .../konan/serialization/KonanMangler.kt | 3 ++ .../org/jetbrains/kotlin/ir/util/IrUtils2.kt | 35 ++-------------- 43 files changed, 166 insertions(+), 139 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index ba32e8054ea..fd8b5f91ecd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -169,11 +169,6 @@ fun IrMemberAccessExpression<*>.addArguments(args: Map.addArguments(args: List>) = - this.addArguments(args.toMap()) - fun IrExpression.isNullConst() = this is IrConst<*> && this.kind == IrConstKind.Null fun IrExpression.isTrueConst() = this is IrConst<*> && this.kind == IrConstKind.Boolean && this.value == true diff --git a/kotlin-native/backend.native/build.gradle b/kotlin-native/backend.native/build.gradle index c11fed4d0a9..c5320b55539 100644 --- a/kotlin-native/backend.native/build.gradle +++ b/kotlin-native/backend.native/build.gradle @@ -36,7 +36,6 @@ compileCompilerKotlin { kotlinOptions.jvmTarget = "1.8" kotlinOptions.freeCompilerArgs += [ '-opt-in=kotlin.RequiresOptIn', - '-opt-in=org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI', "-opt-in=kotlinx.cinterop.BetaInteropApi", "-opt-in=kotlinx.cinterop.ExperimentalForeignApi", '-Xskip-prerelease-check'] diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt index e3a0b207ac2..762f3005830 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.* import org.jetbrains.kotlin.ir.descriptors.IrAbstractDescriptorBasedFunctionFactory @@ -34,10 +35,12 @@ import org.jetbrains.kotlin.util.OperatorNameConventions internal object DECLARATION_ORIGIN_FUNCTION_CLASS : IrDeclarationOriginImpl("DECLARATION_ORIGIN_FUNCTION_CLASS") +@OptIn(ObsoleteDescriptorBasedAPI::class) val IrPackageFragment.isFunctionInterfaceFile get() = packageFragmentDescriptor is FunctionInterfacePackageFragment abstract class KonanIrAbstractDescriptorBasedFunctionFactory : IrProvider, IrAbstractDescriptorBasedFunctionFactory() +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class LazyIrFunctionFactory( private val symbolTable: SymbolTable, private val stubGenerator: DeclarationStubGenerator, @@ -90,6 +93,7 @@ internal class LazyIrFunctionFactory( builtClassesMap.getOrPut(descriptor) { createClass(descriptor, declarator) } } +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class BuiltInFictitiousFunctionIrClassFactory( private val symbolTable: SymbolTable, private val irBuiltIns: IrBuiltInsOverDescriptors, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt index 546cfb2cbcb..43ac2c63235 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt @@ -6,11 +6,12 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.backend.common.atMostOne -import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary +import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.llvm.FunctionOrigin import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin import org.jetbrains.kotlin.backend.konan.llvm.standardLlvmSymbolsOrigin +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.getPackageFragment import org.jetbrains.kotlin.konan.library.KonanLibrary @@ -116,13 +117,13 @@ internal class DependenciesTrackerImpl( return if (packageFragment.isFunctionInterfaceFile) FileOrigin.StdlibKFunctionImpl else { - val library = when (val origin = packageFragment.packageFragmentDescriptor.llvmSymbolOrigin) { + val library = when (val origin = packageFragment.llvmSymbolOrigin) { CurrentKlibModuleOrigin -> config.libraryToCache?.klib?.takeIf { config.producePerFileCache } else -> (origin as DeserializedKlibModuleOrigin).library } when { library == null -> FileOrigin.CurrentFile - packageFragment.packageFragmentDescriptor.containingDeclaration.isFromInteropLibrary() -> + packageFragment.isFromInteropLibrary() -> FileOrigin.EntireModule(library) else -> FileOrigin.CertainFile(library, packageFragment.packageFqName.asString(), filePathGetter()) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt index 3f51e8e594a..194bb39f906 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.backend.konan.ir.konanLibrary -import org.jetbrains.kotlin.builtins.FunctionInterfacePackageFragment import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.fileOrNull diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt index e3b2a8c4c88..25265e0c655 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.ir.parentDeclarationsWithSelf import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.IrBasedClassConstructorDescriptor import org.jetbrains.kotlin.ir.expressions.IrConstructorCall @@ -180,7 +181,7 @@ private fun IrSimpleFunction.getObjCMethodInfo(onlyExternal: Boolean): ObjCMetho } return overriddenSymbols.firstNotNullOfOrNull { - assert(it.owner != this) { "Function ${it.owner.descriptor.fqNameSafe}() is wrongly contained in its own overriddenSymbols"} + assert(it.owner != this) { "Function ${it.owner.fqNameWhenAvailable}() is wrongly contained in its own overriddenSymbols"} it.owner.getObjCMethodInfo(onlyExternal) } } @@ -290,6 +291,7 @@ fun IrConstructor.getObjCInitMethod(): IrSimpleFunction? { } } +@ObsoleteDescriptorBasedAPI fun ConstructorDescriptor.getObjCInitMethod(): FunctionDescriptor? { if (this is IrBasedClassConstructorDescriptor) { // E.g. in case of K2. @@ -341,13 +343,13 @@ fun inferObjCSelector(descriptor: FunctionDescriptor): String = if (descriptor.v } } -fun ClassDescriptor.getExternalObjCClassBinaryName(): String = +fun IrClass.getExternalObjCClassBinaryName(): String = this.getExplicitExternalObjCClassBinaryName() ?: this.name.asString() -fun ClassDescriptor.getExternalObjCMetaClassBinaryName(): String = +fun IrClass.getExternalObjCMetaClassBinaryName(): String = this.getExplicitExternalObjCClassBinaryName() ?: this.name.asString().removeSuffix("Meta") -private fun ClassDescriptor.getExplicitExternalObjCClassBinaryName() = - this.annotations.findAnnotation(externalObjCClassFqName)!!.getStringValueOrNull("binaryName") +private fun IrClass.getExplicitExternalObjCClassBinaryName() = + this.annotations.findAnnotation(externalObjCClassFqName)!!.getAnnotationValueOrNull("binaryName") 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 6c7c3cbf43e..abd54bb7380 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 @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.linkage.IrDeserializer import org.jetbrains.kotlin.ir.linkage.partial.partialLinkageConfig @@ -46,6 +47,7 @@ object KonanStubGeneratorExtensions : StubGeneratorExtensions() { } } +@OptIn(ObsoleteDescriptorBasedAPI::class) internal fun PsiToIrContext.psiToIr( input: PsiToIrInput, useLinkerWhenProducingLibrary: Boolean diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt index 7bc93c60115..baf7544a906 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys.USE_FIR import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.util.referenceFunction import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -119,6 +120,7 @@ internal class ExportedElementScope(val kind: ScopeKind, val name: String) { } } +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class ExportedElement( val kind: ElementKind, val scope: ExportedElementScope, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt index a2dbba44432..d58d437d36c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt @@ -36,7 +36,6 @@ import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance -import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.getClassFqNameUnsafe import org.jetbrains.kotlin.util.OperatorNameConventions internal interface KotlinStubs { @@ -417,8 +416,7 @@ internal fun KotlinStubs.generateObjCCall( } internal fun IrBuilderWithScope.getObjCClass(symbols: KonanSymbols, symbol: IrClassSymbol): IrExpression { - val classDescriptor = symbol.descriptor - require(!classDescriptor.isObjCMetaClass()) + require(!symbol.owner.isObjCMetaClass()) return irCall(symbols.interopGetObjCClass, symbols.nativePtrType, listOf(symbol.starProjectedType)) } @@ -553,7 +551,7 @@ internal fun KotlinStubs.generateCFunctionPointer( ) addKotlin(fakeFunction) - return IrFunctionReferenceImpl.fromSymbolDescriptor( + return IrFunctionReferenceImpl.fromSymbolOwner( expression.startOffset, expression.endOffset, expression.type, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt index 07d4b0c9fd2..079598364f8 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.KonanFqNames import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.ir.* import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization @@ -32,6 +33,7 @@ internal fun IrType.isCEnumType(): Boolean { private val cCall = RuntimeNames.cCall // Make sure external stubs always get proper annotaions. +@OptIn(ObsoleteDescriptorBasedAPI::class) fun IrDeclaration.hasCCallAnnotation(name: String): Boolean = this.annotations.hasAnnotation(cCall.child(Name.identifier(name))) // LazyIr doesn't pass annotations from descriptor to IrValueParameter. diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt index de509287abd..070d3643119 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt @@ -370,7 +370,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) { fun vtableIndex(function: IrSimpleFunction): Int { val bridgeDirections = function.target.bridgeDirectionsTo(function) val index = vtableEntries.indexOfFirst { it.function == function && it.bridgeDirections == bridgeDirections } - if (index < 0) throw Error(function.render() + " $function " + " (${function.symbol.descriptor}) not in vtable of " + irClass.render()) + require(index >= 0) { "${function.render()} is not found in vtable of ${irClass.render()}" } return index } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FakeIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FakeIrUtils.kt index 1c48e6da633..18af9b5f7c4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FakeIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FakeIrUtils.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.konan.ir import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.toKotlinType @@ -15,7 +16,7 @@ import org.jetbrains.kotlin.ir.util.getPackageFragment // This file contains some IR utilities which actually use descriptors. // TODO: port this code to IR. -internal val IrDeclaration.llvmSymbolOrigin get() = getPackageFragment().packageFragmentDescriptor.llvmSymbolOrigin +@OptIn(ObsoleteDescriptorBasedAPI::class) internal fun IrType.isObjCObjectType() = this.toKotlinType().isObjCObjectType() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt index d1b861262a0..9b3c1342ea2 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt @@ -9,11 +9,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid +@ObsoleteDescriptorBasedAPI class ModuleIndex(val module: IrModuleFragment) { /** 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 e5e8421f008..20ad03404d0 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 @@ -8,14 +8,15 @@ package org.jetbrains.kotlin.backend.konan.ir import org.jetbrains.kotlin.backend.common.atMostOne 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.descriptors.isInteropLibrary import org.jetbrains.kotlin.backend.konan.llvm.KonanMetadata import org.jetbrains.kotlin.backend.konan.serialization.KonanFileMetadataSource import org.jetbrains.kotlin.backend.konan.serialization.KonanIrModuleFragmentImpl import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl @@ -47,10 +48,6 @@ fun IrClass.isNothing() = this.isClassTypeWithSignature(IdSignatureValues.nothin fun IrClass.getSuperInterfaces() = this.superClasses.map { it.owner }.filter { it.isInterface } -// Note: psi2ir doesn't set `origin = FAKE_OVERRIDE` for fields and properties yet. -val IrProperty.isReal: Boolean get() = this.descriptor.kind.isReal -val IrField.isReal: Boolean get() = this.descriptor.kind.isReal - fun IrClass.isSpecialClassWithNoSupertypes() = this.isAny() || this.isNothing() inline fun IrDeclaration.getAnnotationArgumentValue(fqName: FqName, argumentName: String): T? { @@ -105,22 +102,30 @@ private fun IrClass.getOverridingOf(function: IrFunction) = (function as? IrSimp val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library val IrModuleFragment.konanLibrary get() = (this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary -val IrPackageFragment.konanLibrary - get() = if (this is IrFile) - this.konanLibrary - else - this.packageFragmentDescriptor.containingDeclaration.konanLibrary -val IrFile.konanLibrary - get() = (metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary +@OptIn(ObsoleteDescriptorBasedAPI::class) +val IrPackageFragment.konanLibrary : KotlinLibrary? + get() { + if (this is IrFile) { + (metadata as? KonanFileMetadataSource)?.module?.konanLibrary?.let { return it } + } + return this.packageFragmentDescriptor.containingDeclaration.konanLibrary + } val IrDeclaration.konanLibrary: KotlinLibrary? get() { ((this as? IrMetadataSourceOwner)?.metadata as? KonanMetadata)?.let { return it.konanLibrary } return when (val parent = parent) { - is IrFile -> parent.konanLibrary - is IrPackageFragment -> parent.packageFragmentDescriptor.containingDeclaration.konanLibrary + is IrPackageFragment -> parent.konanLibrary is IrDeclaration -> parent.konanLibrary else -> TODO("Unexpected declaration parent: $parent") } } 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/ir/interop/DescriptorToIrTranslationUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/DescriptorToIrTranslationUtils.kt index 524992a61e3..a62bfdb0160 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/DescriptorToIrTranslationUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/DescriptorToIrTranslationUtils.kt @@ -8,6 +8,7 @@ import org.jetbrains.kotlin.backend.konan.InteropFqNames import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.IrBuilder import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl @@ -30,6 +31,7 @@ internal inline fun ClassDescriptor.findDecla * Provides a set of functions and properties that helps * to translate descriptor declarations to corresponding IR. */ +@OptIn(ObsoleteDescriptorBasedAPI::class) internal interface DescriptorToIrTranslationMixin { val symbolTable: SymbolTable @@ -161,6 +163,7 @@ internal fun ClassDescriptor.inheritsFromCStructVar(): Boolean = * This function checks that given symbol located in subtree of * CEnum inheritor. */ +@OptIn(ObsoleteDescriptorBasedAPI::class) internal fun IrSymbol.findCEnumDescriptor(): ClassDescriptor? = descriptor.findCEnumDescriptor() @@ -172,6 +175,7 @@ internal fun DeclarationDescriptor.findCEnumDescriptor(): ClassDescriptor? = * This function checks that given symbol located in subtree of * CStructVar inheritor. */ +@OptIn(ObsoleteDescriptorBasedAPI::class) internal fun IrSymbol.findCStructDescriptor(): ClassDescriptor? = descriptor.findCStructDescriptor() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt index fe0e23a96a9..37b5b42a328 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumVarClassGenerato import org.jetbrains.kotlin.backend.konan.ir.interop.cstruct.CStructVarClassGenerator import org.jetbrains.kotlin.backend.konan.ir.interop.cstruct.CStructVarCompanionGenerator import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.util.* @@ -31,6 +32,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter * 2. It is an easier and more obvious approach. Since implementation of metadata-based * libraries generation already took too much time we take an easier approach here. */ +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class IrProviderForCEnumAndCStructStubs( context: GeneratorContext, symbols: KonanSymbols diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt index 03a4c2ad204..5374f2f94b0 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMi import org.jetbrains.kotlin.backend.konan.ir.interop.findDeclarationByName import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction @@ -24,6 +25,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions /** * Generate IR for function that returns appropriate enum entry for the provided integral value. */ +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class CEnumByValueFunctionGenerator( context: GeneratorContext, private val symbols: KonanSymbols diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt index 9d3ec81f388..d2128b141ac 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression @@ -40,6 +41,7 @@ private val cEnumEntryValueTypes = setOf( "UByte", "UShort", "UInt", "ULong" ) +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class CEnumClassGenerator( val context: GeneratorContext, private val cEnumCompanionGenerator: CEnumCompanionGenerator, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumCompanionGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumCompanionGenerator.kt index 60a95ec6ddf..ccc358612bb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumCompanionGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumCompanionGenerator.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.irBlockBody import org.jetbrains.kotlin.ir.builders.irReturn import org.jetbrains.kotlin.ir.declarations.* @@ -24,6 +25,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns private val cEnumEntryAliasAnnonation = FqName("kotlinx.cinterop.internal.CEnumEntryAlias") +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class CEnumCompanionGenerator( context: GeneratorContext, private val cEnumByValueFunctionGenerator: CEnumByValueFunctionGenerator diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt index c3c9eca9603..689b54f5b60 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.irBlockBody import org.jetbrains.kotlin.ir.builders.irGet import org.jetbrains.kotlin.ir.builders.irInt @@ -29,6 +30,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext private val typeSizeAnnotation = FqName("kotlinx.cinterop.internal.CEnumVarTypeSize") +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class CEnumVarClassGenerator( context: GeneratorContext, private val symbols: KonanSymbols diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt index 8fb1ae05ef2..8824bbb5e10 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMi import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class CStructVarClassGenerator( context: GeneratorContext, private val companionGenerator: CStructVarCompanionGenerator, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt index b9eba5d4a2c..67b4bfc1b06 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.irBlockBody import org.jetbrains.kotlin.ir.builders.irInt import org.jetbrains.kotlin.ir.builders.irLong @@ -27,6 +28,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext private val varTypeAnnotationFqName = FqName("kotlinx.cinterop.internal.CStruct.VarType") +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class CStructVarCompanionGenerator( context: GeneratorContext, private val symbols: KonanSymbols diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index 399c91de38d..c5b07192c62 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -1294,7 +1294,7 @@ internal abstract class FunctionGenerationContext( return if (irClass.isExternalObjCClass()) { generationState.dependenciesTracker.add(irClass) if (irClass.isObjCMetaClass()) { - val name = irClass.descriptor.getExternalObjCMetaClassBinaryName() + val name = irClass.getExternalObjCMetaClassBinaryName() val objCClass = getObjCClass(name) val getClass = llvm.externalNativeRuntimeFunction( @@ -1304,7 +1304,7 @@ internal abstract class FunctionGenerationContext( ) call(getClass, listOf(objCClass), exceptionHandler = exceptionHandler) } else { - getObjCClass(irClass.descriptor.getExternalObjCClassBinaryName()) + getObjCClass(irClass.getExternalObjCClassBinaryName()) } } else { if (irClass.isObjCMetaClass()) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt index 1f0a7fb7ae5..58a6b856afb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.konan.llvm import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.declarations.IrPackageFragment import org.jetbrains.kotlin.library.metadata.CompiledKlibModuleOrigin import org.jetbrains.kotlin.library.metadata.SyntheticModulesOrigin import org.jetbrains.kotlin.library.metadata.klibModuleOrigin @@ -26,3 +28,7 @@ internal val DeclarationDescriptor.llvmSymbolOrigin: CompiledKlibModuleOrigin } internal val Context.standardLlvmSymbolsOrigin: CompiledKlibModuleOrigin get() = this.stdlibModule.llvmSymbolOrigin + +@OptIn(ObsoleteDescriptorBasedAPI::class) +internal val IrPackageFragment.llvmSymbolOrigin + get() = packageFragmentDescriptor.llvmSymbolOrigin \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt index aa158ee0db1..0b8c6aee78d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt @@ -416,8 +416,7 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv } private fun FunctionGenerationContext.emitCreateUninitializedInstance(callSite: IrCall, resultSlot: LLVMValueRef?): LLVMValueRef { - val typeParameterT = context.ir.symbols.createUninitializedInstance.descriptor.typeParameters[0] - val enumClass = callSite.getTypeArgument(typeParameterT.index)!! + val enumClass = callSite.getTypeArgument(0)!! val enumIrClass = enumClass.getClass()!! return allocInstance(enumIrClass, environment.calculateLifetime(callSite), resultSlot) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 551c33c673e..1ff914d6029 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.backend.konan.llvm.coverage.LLVMCoverageInstrumentat import org.jetbrains.kotlin.backend.konan.lower.* import org.jetbrains.kotlin.builtins.UnsignedType import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement @@ -860,7 +859,7 @@ internal class CodeGeneratorVisitor( } if (context.shouldVerifyBitCode()) - verifyModule(llvm.module, "${declaration.descriptor.containingDeclaration}::${ir2string(declaration)}") + verifyModule(llvm.module, "${ir2string(declaration.parent)}::${ir2string(declaration)}") } private fun IrFunction.location(start: Boolean) = @@ -898,7 +897,7 @@ internal class CodeGeneratorVisitor( } private fun needGlobalInit(field: IrField): Boolean { - if (field.descriptor.containingDeclaration !is PackageFragmentDescriptor) return field.isStatic + if (field.parent !is IrPackageFragment) return field.isStatic // TODO: add some smartness here. Maybe if package of the field is in never accessed // assume its global init can be actually omitted. return true @@ -1181,7 +1180,7 @@ internal class CodeGeneratorVisitor( } } - if (catch.catchParameter.descriptor.type == context.builtIns.throwable.defaultType) { + if (catch.catchParameter.type == context.irBuiltIns.throwableType) { genCatchBlock() return // Remaining catch clauses are unreachable. } else { @@ -1482,7 +1481,7 @@ internal class CodeGeneratorVisitor( } private fun IrType.isUnsignedInteger(): Boolean = !isNullable() && - UnsignedType.values().any { it.classId == this.getClass()?.descriptor?.classId } + UnsignedType.values().any { it.classId == this.getClass()?.classId } private fun evaluateIntegerCoercion(value: IrTypeOperatorCall): LLVMValueRef { context.log{"evaluateIntegerCoercion : ${ir2string(value)}"} @@ -2349,11 +2348,11 @@ internal class CodeGeneratorVisitor( private fun evaluateFunctionReference(expression: IrFunctionReference): LLVMValueRef { // TODO: consider creating separate IR element for pointer to function. - assert (expression.type.getClass()?.descriptor?.fqNameUnsafe == InteropFqNames.cPointer) { - "assert: ${expression.type.getClass()?.descriptor?.fqNameUnsafe} == ${InteropFqNames.cPointer}" + assert (expression.type.getClass()?.symbol?.hasEqualFqName(InteropFqNames.cPointer.toSafe()) == true) { + "assert: should be ${InteropFqNames.cPointer}, ${expression.type.render()} found" } - assert (expression.getArguments().isEmpty()) + assert (expression.getArgumentsWithIr().isEmpty()) val function = expression.symbol.owner assert (function.dispatchReceiverParameter == null) @@ -2965,7 +2964,6 @@ private val doubleUnderscoreThisName = Name.identifier("__this") * 2. this is reserved name and compiled in special way. */ private fun IrValueDeclaration.debugNameConversion(): Name { - val name = descriptor.name if (name == thisName) { return when (origin) { IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_EXTENSION_RECEIVER -> doubleUnderscoreThisName diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt index bd48e4a13c0..b5eba425a5a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt @@ -27,7 +27,7 @@ internal class KotlinObjCClassInfoGenerator(override val generationState: Native val superclassName = irClass.getSuperClassNotAny()!!.let { llvm.dependenciesTracker.add(it) - it.descriptor.getExternalObjCClassBinaryName() + it.getExternalObjCClassBinaryName() } val protocolNames = irClass.getSuperInterfaces().map { llvm.dependenciesTracker.add(it) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index 653b62b90ba..f48563532ab 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -230,7 +230,7 @@ internal class RTTIGenerator( val objOffsetsPtr = staticData.placeGlobalConstArray("krefs:$className", llvm.int32Type, objOffsets) - val objOffsetsCount = if (irClass.descriptor == context.builtIns.array) { + val objOffsetsCount = if (irClass.symbol == context.irBuiltIns.arrayClass) { 1 // To mark it as non-leaf. } else { objOffsets.size diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageManager.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageManager.kt index 91bd7619dcf..9f9e90d2b4d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageManager.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageManager.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.llvm.LlvmCallable import org.jetbrains.kotlin.backend.konan.reportCompilationError import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -72,6 +73,7 @@ internal class CoverageManager(val generationState: NativeGenerationState) { coveredLibs + coveredSources } + @OptIn(ObsoleteDescriptorBasedAPI::class) private fun fileCoverageFilter(file: IrFile) = file.packageFragmentDescriptor.module in coveredModules diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt index 638997a7412..953e9172883 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.backend.konan.serialization.resolveFakeOverrideMaybe import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrClassReference import org.jetbrains.kotlin.ir.expressions.IrVararg @@ -803,6 +804,7 @@ private fun ObjCExportCodeGenerator.generateUnitContinuationToRetainedCompletion } // TODO: find out what to use instead here and in the dependent code +@OptIn(ObsoleteDescriptorBasedAPI::class) private val ObjCExportBlockCodeGenerator.mappedFunctionNClasses get() = // failed attempt to migrate to descriptor-less IrBuiltIns ((context.irBuiltIns as IrBuiltInsOverDescriptors).functionFactory as BuiltInFictitiousFunctionIrClassFactory).builtFunctionNClasses diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt index e56fe9dfe6f..b3c178256fd 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.computeFunctionName import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* @@ -36,6 +37,9 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature import org.jetbrains.kotlin.load.java.SpecialGenericSignatures +@OptIn(ObsoleteDescriptorBasedAPI::class) +internal fun IrFunction.getDefaultValueForOverriddenBuiltinFunction() = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor) + internal class BridgesSupport(mapping: NativeMapping, val irBuiltIns: IrBuiltIns, val irFactory: IrFactory) { private val bridges = mapping.bridges @@ -207,8 +211,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass { val body = declaration.body ?: return declaration - val descriptor = declaration.descriptor - val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor) + val typeSafeBarrierDescription = declaration.getDefaultValueForOverriddenBuiltinFunction() if (typeSafeBarrierDescription == null || builtBridges.contains(declaration)) return declaration @@ -295,7 +298,7 @@ private fun Context.buildBridge(startOffset: Int, endOffset: Int, val irBuilder = createIrBuilder(bridge.symbol, startOffset, endOffset) bridge.body = irBuilder.irBlockBody(bridge) { - val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(overriddenFunction.overriddenFunction.descriptor) + val typeSafeBarrierDescription = overriddenFunction.overriddenFunction.getDefaultValueForOverriddenBuiltinFunction() typeSafeBarrierDescription?.let { buildTypeSafeBarrier(bridge, overriddenFunction.function, it) } val delegatingCall = IrCallImpl.fromSymbolOwner( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt index e11e36e55ec..c19bf078a47 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.propertyIfAccessor import org.jetbrains.kotlin.backend.konan.ir.ModuleIndex import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl @@ -42,6 +43,7 @@ internal class ExpectDeclarationsRemoving(val context: Context) : FileLoweringPa } } +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFragment) { // Note: local declarations aren't required here; TODO: use more lightweight index. diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt index 95ab6c94ab4..32deb6757f3 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl @@ -64,6 +65,7 @@ internal class InteropLowering(generationState: NativeGenerationState) : FileLow } } +@OptIn(ObsoleteDescriptorBasedAPI::class) private abstract class BaseInteropIrTransformer( private val generationState: NativeGenerationState ) : IrBuildingTransformer(generationState.context) { @@ -136,6 +138,7 @@ private abstract class BaseInteropIrTransformer( protected abstract fun addTopLevel(declaration: IrDeclaration) } +@OptIn(ObsoleteDescriptorBasedAPI::class) private class InteropLoweringPart1(val generationState: NativeGenerationState) : BaseInteropIrTransformer(generationState), FileLoweringPass { private val context = generationState.context @@ -778,6 +781,7 @@ private class InteropLoweringPart2(val generationState: NativeGenerationState) : } } +@OptIn(ObsoleteDescriptorBasedAPI::class) private class InteropTransformer( val generationState: NativeGenerationState, override val irFile: IrFile diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt index fca251bd024..e7db1edc209 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.tryGetIntrinsicType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol @@ -142,9 +143,9 @@ private class BackendChecker( } private fun IrConstructor.overridesConstructor(other: IrConstructor) = - this.descriptor.valueParameters.size == other.descriptor.valueParameters.size && - this.descriptor.valueParameters.all { - val otherParameter = other.descriptor.valueParameters[it.index] + this.valueParameters.size == other.valueParameters.size && + this.valueParameters.all { + val otherParameter = other.valueParameters[it.index] it.name == otherParameter.name && it.type == otherParameter.type } @@ -156,7 +157,7 @@ private class BackendChecker( } function.valueParameters.forEach { - val kotlinType = it.descriptor.type + val kotlinType = it.type if (!kotlinType.isObjCObjectType()) reportError(it, "Unexpected $action method parameter type: ${it.type.classFqName}\n" + "Only Objective-C object types are supported here") @@ -170,19 +171,19 @@ private class BackendChecker( checkCanGenerateFunctionImp(function) } + @OptIn(ObsoleteDescriptorBasedAPI::class) private fun checkCanGenerateOutletSetterImp(property: IrProperty) { - val descriptor = property.descriptor val outlet = "@${InteropFqNames.objCOutlet}" - if (!descriptor.isVar) + if (!property.isVar) reportError(property, "$outlet property must be var") property.getter?.extensionReceiverParameter?.let { reportError(it, "$outlet must not have extension receiver") } - val type = descriptor.type + val type = property.descriptor.type if (!type.isObjCObjectType()) reportError(property, "Unexpected $outlet type: ${property.getter?.returnType?.classFqName}\n" + "Only Objective-C object types are supported here") @@ -225,11 +226,11 @@ private class BackendChecker( } } - val kind = irClass.descriptor.kind + val kind = irClass.kind if (kind != ClassKind.CLASS && kind != ClassKind.OBJECT) reportError(irClass, "Only classes are supported as subtypes of Objective-C types") - if (!irClass.descriptor.isFinalClass) + if (!irClass.isFinalClass) reportError(irClass, "Non-final Kotlin subclasses of Objective-C classes are not yet supported") irClass.companionObject()?.let { @@ -242,12 +243,12 @@ private class BackendChecker( } var hasObjCClassSupertype = false - irClass.descriptor.defaultType.constructor.supertypes.forEach { - val descriptor = it.constructor.declarationDescriptor as ClassDescriptor - if (!descriptor.isObjCClass()) + irClass.defaultType.superTypes().forEach { + val clazz = it.classOrFail.owner + if (!clazz.isObjCClass()) reportError(irClass, "Mixing Kotlin and Objective-C supertypes is not supported") - if (descriptor.kind == ClassKind.CLASS) + if (clazz.kind == ClassKind.CLASS) hasObjCClassSupertype = true } @@ -269,10 +270,9 @@ private class BackendChecker( else -> "corresponding Objective-C method" } - context.report( + reportError( method, "can't override '${method.name}', override $correspondingObjCMethod instead", - isError = true ) } } @@ -412,10 +412,10 @@ private class BackendChecker( val signatureTypes = target.allParameters.map { it.type } + target.returnType callee.typeParameters.indices.forEach { index -> - val typeArgument = expression.getTypeArgument(index)!!.toKotlinType() - val signatureType = signatureTypes[index].toKotlinType() - if (typeArgument.constructor != signatureType.constructor || - typeArgument.isMarkedNullable != signatureType.isMarkedNullable + val typeArgument = expression.getTypeArgument(index)!! + val signatureType = signatureTypes[index] + if (typeArgument.classifierOrNull != signatureType.classifierOrNull || + typeArgument.isMarkedNullable() != signatureType.isMarkedNullable() ) { reportError(expression, "C function signature element mismatch: " + "expected '${signatureTypes[index].classFqName}', got '${expression.getTypeArgument(index)!!.classFqName}'") @@ -541,7 +541,7 @@ private class BackendChecker( private fun getUnboundReferencedFunction(expression: IrExpression) = when (expression) { is IrFunctionReference -> { - val arguments = expression.getArguments() + val arguments = expression.getArgumentsWithIr() val capturedVariables = captures(expression.symbol.owner) ReferencedFunctionWithCapture( expression.symbol.owner.takeIf { arguments.isEmpty() && capturedVariables.isEmpty() }, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt index 3fe75761c46..3de7c8af537 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildFun @@ -678,6 +679,7 @@ internal class TestProcessor (val context: Context) { } // endregion + @OptIn(ObsoleteDescriptorBasedAPI::class) private fun shouldProcessFile(irFile: IrFile): Boolean = irFile.packageFragmentDescriptor.module.let { // Process test annotations in source libraries too. it in context.sourcesModules diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt index d1cecb14f7a..635b30bb711 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt @@ -11,10 +11,12 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isArray import org.jetbrains.kotlin.backend.konan.descriptors.isInterface import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny +@OptIn(ObsoleteDescriptorBasedAPI::class) internal fun ObjCExportedInterface.createCodeSpec(symbolTable: SymbolTable): ObjCExportCodeSpec { fun createObjCMethods(methods: List) = methods.map { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index b536b3de471..5aefee933ac 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid -import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.backend.konan.llvm.* @@ -187,7 +186,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag "Class constructor has empty body" } context.logMultiple { - +"Analysing function ${declaration.descriptor}" + +"Analysing function ${declaration.render()}" +"IR: ${ir2stringWhole(declaration)}" } analyze(declaration, body) @@ -200,7 +199,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag symbolTable.mapFunction(declaration) } else { context.logMultiple { - +"Analysing function ${declaration.descriptor}" + +"Analysing function ${declaration.render()}" +"IR: ${ir2stringWhole(declaration)}" } analyze(declaration, body) @@ -211,7 +210,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag if (declaration.isStatic) declaration.initializer?.let { context.logMultiple { - +"Analysing global field ${declaration.descriptor}" + +"Analysing global field ${declaration.render()}" +"IR: ${ir2stringWhole(declaration)}" } analyze(declaration, IrSetFieldImpl(it.startOffset, it.endOffset, declaration.symbol, null, @@ -262,7 +261,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag context.logMultiple { +"SYMBOL TABLE:" symbolTable.classMap.forEach { (irClass, type) -> - +" DESCRIPTOR: ${irClass.descriptor}" + +" IR CLASS: ${irClass.render()}" +" TYPE: $type" if (type !is DataFlowIR.Type.Declared) return@forEach @@ -323,7 +322,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag } if (expression.symbol == executeImplSymbol) { // Producer and job of executeImpl are called externally, we need to reflect this somehow. - val producerInvocation = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset, + val producerInvocation = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset, executeImplProducerInvoke.returnType, executeImplProducerInvoke.symbol, executeImplProducerInvoke.symbol.owner.typeParameters.size, @@ -335,7 +334,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag val jobFunctionReference = expression.getValueArgument(3) as? IrFunctionReference ?: error("A function reference expected") - val jobInvocation = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset, + val jobInvocation = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset, jobFunctionReference.symbol.owner.returnType, jobFunctionReference.symbol as IrSimpleFunctionSymbol, jobFunctionReference.symbol.owner.typeParameters.size, @@ -372,7 +371,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag // See ObjC instanceOf code generation for details. if (expression is IrTypeOperatorCall && expression.operator.callsInstanceOf() && expression.typeOperand.isObjCObjectType()) { - val objcObjGetter = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset, + val objcObjGetter = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset, objCObjectRawValueGetter.owner.returnType, objCObjectRawValueGetter, objCObjectRawValueGetter.owner.typeParameters.size, @@ -717,7 +716,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag is IrConstructorCall -> { val callee = value.symbol.owner - val arguments = value.getArguments().map { expressionToEdge(it.second) } + val arguments = value.getArgumentsWithIr().map { expressionToEdge(it.second) } DataFlowIR.Node.NewObject( symbolTable.mapFunction(callee), arguments, @@ -758,7 +757,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag initInstanceSymbol -> { val thiz = expressionToEdge(value.getValueArgument(0)!!) val initializer = value.getValueArgument(1) as IrConstructorCall - val arguments = listOf(thiz) + initializer.getArguments().map { expressionToEdge(it.second) } + val arguments = listOf(thiz) + initializer.getArgumentsWithIr().map { expressionToEdge(it.second) } val callee = initializer.symbol.owner DataFlowIR.Node.StaticCall( symbolTable.mapFunction(callee), @@ -771,7 +770,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag else -> { val callee = value.symbol.owner - val arguments = value.getArguments() + val arguments = value.getArgumentsWithIr() .map { expressionToEdge(it.second) } if (value.isVirtualCall) { @@ -784,12 +783,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag || !callee.isReal /* Could be a bridge. */) symbolTable.mapClassReferenceType(owner) else { - val actualClassAtCallsite = - (actualReceiverClassifier as IrClassSymbol).descriptor -// assert (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) { -// "Expected an inheritor of ${owner.descriptor}, but was $actualClassAtCallsite" -// } - if (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) { + if ((actualReceiverClassifier as IrClassSymbol).owner.isSubclassOf(owner)) { symbolTable.mapClassReferenceType(actualReceiverClassifier.owner) // Box if inline class. } else { symbolTable.mapClassReferenceType(owner) @@ -839,7 +833,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag val thisReceiver = (declaration as IrConstructor).constructedClass.thisReceiver!! val thiz = IrGetValueImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, thisReceiver.type, thisReceiver.symbol) - val arguments = listOf(thiz) + value.getArguments().map { it.second } + val arguments = listOf(thiz) + value.getArgumentsWithIr().map { it.second } DataFlowIR.Node.StaticCall( symbolTable.mapFunction(value.symbol.owner), arguments.map { expressionToEdge(it) }, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index 55c4b9b3ae2..e5a71ec7bf3 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -14,9 +14,11 @@ import org.jetbrains.kotlin.backend.konan.llvm.isExported import org.jetbrains.kotlin.backend.konan.llvm.localHash import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget +import org.jetbrains.kotlin.backend.konan.lower.getDefaultValueForOverriddenBuiltinFunction import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.types.IrType @@ -26,7 +28,6 @@ import org.jetbrains.kotlin.ir.types.isUnit import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid -import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -479,6 +480,7 @@ internal object DataFlowIR { }, data = null) } + @OptIn(ObsoleteDescriptorBasedAPI::class) fun mapClassReferenceType(irClass: IrClass): Type { // Do not try to devirtualize ObjC classes. if (irClass.module.name == Name.special("") || irClass.isObjCClass()) @@ -622,7 +624,7 @@ internal object DataFlowIR { val irClass = it.parent as? IrClass val bridgeTarget = it.bridgeTarget val isSpecialBridge = bridgeTarget.let { - it != null && BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(it.descriptor) != null + it != null && it.getDefaultValueForOverriddenBuiltinFunction() != null } val bridgeTargetSymbol = if (isSpecialBridge || bridgeTarget == null) null else mapFunction(bridgeTarget) val placeToFunctionsTable = !isAbstract && it !is IrConstructor && irClass != null diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt index 219922c548c..42778f8d115 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt @@ -1325,15 +1325,15 @@ internal object DevirtualizationAnalysis { if (coercion == null) value else irCall(coercion).apply { - addArguments(listOf(coercion.descriptor.explicitParameters.single() to value)) + require(coercion.owner.dispatchReceiverParameter == null && + coercion.owner.extensionReceiverParameter == null && + coercion.owner.valueParameters.size == 1 + ) { "Coercion function must be static with one value parameter" } + putValueArgument(0, value) } private fun IrBuilderWithScope.irCoerce(value: IrExpression, coercion: DataFlowIR.FunctionSymbol.Declared?) = - if (coercion == null) - value - else irCall(coercion.irFunction!!).apply { - putValueArgument(0, value) - } + irCoerce(value, coercion?.let { it.irFunction?.symbol!! }) sealed class PossiblyCoercedValue(private val coercion: IrFunctionSymbol?) { abstract fun getValue(irBuilder: IrBuilderWithScope): IrExpression @@ -1537,17 +1537,17 @@ internal object DevirtualizationAnalysis { optimize && possibleCallees.size == 1 -> { // Monomorphic callsite. irBlock(expression) { - val parameters = expression.getArgumentsWithSymbols().map { arg -> + val parameters = expression.getArgumentsWithIr().map { arg -> // Temporary val is not required here for a parameter, since each one is used for only one devirtualized callsite - irSplitCoercion(caller, arg.second, tempName = null, arg.first.owner.type) + irSplitCoercion(caller, arg.second, tempName = null, arg.first.type) } +irDevirtualizedCall(expression, type, possibleCallees[0].first, parameters) } } else -> irBlock(expression) { - val arguments = expression.getArgumentsWithSymbols().mapIndexed { index, arg -> - irSplitCoercion(caller, arg.second, "arg$index", arg.first.owner.type) + val arguments = expression.getArgumentsWithIr().mapIndexed { index, arg -> + irSplitCoercion(caller, arg.second, "arg$index", arg.first.type) } val receiver = irTemporary(arguments[0].getFullValue(this@irBlock)) val typeInfo by lazy { 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 c3ba0635393..d880fb788db 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,11 +3,11 @@ 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.descriptors.isFromInteropLibrary +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 import org.jetbrains.kotlin.ir.util.IdSignature -import org.jetbrains.kotlin.resolve.descriptorUtil.module class KonanGlobalDeclarationTable(builtIns: IrBuiltIns) : GlobalDeclarationTable(KonanManglerIr) { init { @@ -22,8 +22,9 @@ class KonanDeclarationTable( private val signatureIdComposer = DescToIrIdSignatureComputer(KonanIdSignaturer(KonanManglerDesc)) // TODO: We should get rid of this extension point in favor of proper support in IR-based mangler. + @OptIn(ObsoleteDescriptorBasedAPI::class) override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? = - if (declaration.descriptor.isFromInteropLibrary()) { + if (declaration.isFromInteropLibraryByDescriptor()) { signatureIdComposer.computeSignature(declaration) } else null } \ No newline at end of file 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 58a4a2c9708..fb573249851 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 @@ -33,10 +33,13 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs import org.jetbrains.kotlin.backend.konan.ir.konanLibrary +import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibrary +import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibraryByDescriptor import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass 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.* import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl @@ -428,11 +431,12 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter { IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY.test() } + @OptIn(ObsoleteDescriptorBasedAPI::class) private fun IrClassSymbol.isInterop(): Boolean { if (this is IrPublicSymbolBase<*> && this.signature.isInteropSignature()) return true // K2 doesn't properly put signatures into such symbols yet, workaround: - return this.isBound && this.owner is Fir2IrLazyClass && this.descriptor.isFromInteropLibrary() + return this.isBound && this.owner is Fir2IrLazyClass && this.owner.isFromInteropLibraryByDescriptor() } // This is an alternative to .isObjCClass that doesn't need to walk up all the class heirarchy, @@ -448,6 +452,7 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter { internal data class DeserializedInlineFunction(val firstAccess: Boolean, val function: InlineFunctionOriginInfo) +@OptIn(ObsoleteDescriptorBasedAPI::class) internal class KonanIrLinker( private val currentModule: ModuleDescriptor, override val translationPluginContext: TranslationPluginContext?, @@ -580,6 +585,7 @@ internal class KonanIrLinker( private val InvalidIndex = -1 + @OptIn(ObsoleteDescriptorBasedAPI::class) inner class KonanPartialModuleDeserializer( moduleDescriptor: ModuleDescriptor, override val klib: KotlinLibrary, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt index 968c3636f3b..b98096f1f48 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrExportCheck import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrMangleComputer import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.types.getClass import org.jetbrains.kotlin.ir.util.hasAnnotation @@ -147,6 +148,8 @@ abstract class AbstractKonanDescriptorMangler : DescriptorBasedKotlinManglerImpl return false } + + @OptIn(ObsoleteDescriptorBasedAPI::class) private class KonanDescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) : DescriptorMangleComputer(builder, mode) { override fun copy(newMode: MangleMode): DescriptorMangleComputer = KonanDescriptorMangleComputer(builder, newMode) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt index e6987ce33ce..4fe71c815bd 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt @@ -15,10 +15,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.ParameterDescriptor import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl -import org.jetbrains.kotlin.ir.IrBuiltIns -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.IrFileEntry -import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl @@ -124,22 +121,6 @@ tailrec fun IrDeclaration.getContainingFile(): IrFile? { } } -internal fun ErrorReportingContext.report(declaration: IrDeclaration, message: String, isError: Boolean) { - val irFile = declaration.getContainingFile() - this.report( - declaration, - irFile, - if (irFile != null) { - message - } else { - val renderer = org.jetbrains.kotlin.renderer.DescriptorRenderer.COMPACT_WITH_SHORT_TYPES - "$message\n${renderer.render(declaration.descriptor)}" - }, - isError - ) - if (isError) throw KonanCompilationException() -} - fun IrFunctionAccessExpression.addArguments(args: Map) { val unhandledParameters = args.keys.toMutableSet() fun getArg(parameter: IrValueParameter) = args[parameter]?.also { unhandledParameters -= parameter } @@ -209,7 +190,7 @@ fun IrBuilderWithScope.irCall(irFunction: IrFunction, typeArguments: List): IrCall = - IrCallImpl.fromSymbolDescriptor( + IrCallImpl.fromSymbolOwner( startOffset, endOffset, irFunction.substitutedReturnType(typeArguments), irFunction.symbol, typeArguments.size, irFunction.valueParameters.size ).apply { @@ -279,17 +260,6 @@ fun IrMemberAccessExpression<*>.getArgumentsWithIr(): List