From 8519be28b48c814bbaee0e68bf759af6af35f138 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 28 Jan 2021 20:52:35 +0300 Subject: [PATCH] Drop more usages of IrDeclaration.descriptor from ObjCExportCodeGenerator --- .../BuiltInFictitiousFunctionIrClassFactory.kt | 8 ++++---- .../llvm/objcexport/ObjCExportCodeGenerator.kt | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 10 deletions(-) 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 ef10bbadf85..15df97563cf 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 @@ -62,7 +62,7 @@ internal class BuiltInFictitiousFunctionIrClassFactory( // builtClasses.forEach { it.addFakeOverrides() } } - class FunctionalInterface(val irClass: IrClass, val arity: Int) + class FunctionalInterface(val irClass: IrClass, val descriptor: FunctionClassDescriptor, val arity: Int) fun buildAllClasses() { val maxArity = 255 // See [BuiltInFictitiousFunctionClassFactory]. @@ -112,10 +112,10 @@ internal class BuiltInFictitiousFunctionIrClassFactory( val builtClasses get() = builtClassesMap.values - val builtFunctionNClasses get() = builtClassesMap.values.mapNotNull { - with(it.descriptor as FunctionClassDescriptor) { + val builtFunctionNClasses get() = builtClassesMap.entries.mapNotNull { (descriptor, irClass) -> + with(descriptor) { if (functionKind == FunctionClassKind.Function) - FunctionalInterface(it, arity) + FunctionalInterface(irClass, descriptor, arity) else null } } 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 ea524cd0c33..c4d034eb567 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 @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.backend.konan.serialization.resolveFakeOverrideMaybe import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.konan.CompiledKlibModuleOrigin import org.jetbrains.kotlin.descriptors.konan.CurrentKlibModuleOrigin +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrClassReference import org.jetbrains.kotlin.ir.expressions.IrVararg @@ -372,10 +373,15 @@ internal class ObjCExportCodeGenerator( private val objCClassForAny = ObjCClassForKotlinClass( namer.kotlinAnyName.binaryName, symbols.any, - methods = listOf("equals", "hashCode", "toString").map { name -> - symbols.any.owner.simpleFunctions().single { it.name == Name.identifier(name) } - }.map { - val baseMethod = createObjCMethodSpecBaseMethod(mapper, namer, it.symbol, it.descriptor) + methods = listOf("equals", "hashCode", "toString").map { nameString -> + val name = Name.identifier(nameString) + + val irFunction = symbols.any.owner.simpleFunctions().single { it.name == name } + + val descriptor = context.builtIns.any.unsubstitutedMemberScope + .getContributedFunctions(name, NoLookupLocation.FROM_BACKEND).single() + + val baseMethod = createObjCMethodSpecBaseMethod(mapper, namer, irFunction.symbol, descriptor) ObjCMethodForKotlinMethod(baseMethod) }, categoryMethods = emptyList(), @@ -631,7 +637,7 @@ private fun ObjCExportCodeGenerator.generateContinuationToCompletionConverter( private val ObjCExportBlockCodeGenerator.mappedFunctionNClasses get() = context.ir.symbols.functionIrClassFactory.builtFunctionNClasses - .filter { it.irClass.descriptor.isMappedFunctionClass() } + .filter { it.descriptor.isMappedFunctionClass() } private fun ObjCExportBlockCodeGenerator.emitFunctionConverters() { require(context.producedLlvmModuleContainsStdlib) @@ -1428,7 +1434,7 @@ private fun ObjCExportCodeGenerator.createDirectAdapters( private fun findImplementation(irClass: IrClass, method: IrSimpleFunction, context: Context): IrSimpleFunction? { val override = irClass.simpleFunctions().singleOrNull { method in it.allOverriddenFunctions - } ?: error("no implementation for ${method.descriptor}\nin ${irClass.descriptor}") + } ?: error("no implementation for ${method.render()}\nin ${irClass.fqNameWhenAvailable}") return OverriddenFunctionInfo(override, method).getImplementation(context) }