diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 40300d70afd..27db7179a1c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -745,7 +745,8 @@ class SymbolTable( isLateinit = descriptor.isLateInit, isDelegated = isDelegated, isExternal = descriptor.isEffectivelyExternal(), - isExpect = descriptor.isExpect + isExpect = descriptor.isExpect, + isFakeOverride = descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE ).apply { metadata = DescriptorMetadataSource.Property(symbol.descriptor) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt index f05f86a16e8..9f9785576d1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.ir.util +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource @@ -24,7 +25,17 @@ fun SymbolTable.declareSimpleFunctionWithOverrides( with(descriptor) { irFactory.createFunction( startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(this), - visibility, modality, IrUninitializedType, isInline, isEffectivelyExternal(), isTailrec, isSuspend, isOperator, isInfix, isExpect + visibility, + modality, + IrUninitializedType, + isInline, + isEffectivelyExternal(), + isTailrec, + isSuspend, + isOperator, + isInfix, + isExpect, + isFakeOverride = descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE ).also { declaration -> declaration.metadata = DescriptorMetadataSource.Function(this) } 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 22bfa76f4ce..031e81aa8d6 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 @@ -139,13 +139,14 @@ internal class BuiltInFictitiousFunctionIrClassFactory( private fun createSimpleFunction( descriptor: FunctionDescriptor, origin: IrDeclarationOrigin, - returnType: IrType + returnType: IrType, + isFakeOverride: Boolean ): IrSimpleFunction { val functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction = { with(descriptor) { IrFunctionImpl( SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, it, name, visibility, modality, returnType, - isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect + isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride ) } } @@ -198,19 +199,15 @@ internal class BuiltInFictitiousFunctionIrClassFactory( OperatorNameConventions.INVOKE, NoLookupLocation.FROM_BACKEND).single() val isFakeOverride = invokeFunctionDescriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE if (!isFakeOverride) { - val invokeFunctionOrigin = - if (isFakeOverride) - IrDeclarationOrigin.FAKE_OVERRIDE - else - DECLARATION_ORIGIN_FUNCTION_CLASS declarations += createSimpleFunction( - invokeFunctionDescriptor, invokeFunctionOrigin, - typeParameters.last().defaultType + invokeFunctionDescriptor, DECLARATION_ORIGIN_FUNCTION_CLASS, + typeParameters.last().defaultType, + isFakeOverride ).apply { parent = functionClass valueParameters += invokeFunctionDescriptor.valueParameters.map { IrValueParameterImpl( - SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, invokeFunctionOrigin, + SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, DECLARATION_ORIGIN_FUNCTION_CLASS, IrValueParameterSymbolImpl(it), it.name, it.index, functionClass.typeParameters[it.index].defaultType, null, it.isCrossinline, it.isNoinline, @@ -218,7 +215,7 @@ internal class BuiltInFictitiousFunctionIrClassFactory( ).also { it.parent = this } } if (!isFakeOverride) - createDispatchReceiverParameter(invokeFunctionOrigin) + createDispatchReceiverParameter(DECLARATION_ORIGIN_FUNCTION_CLASS) else { val overriddenFunction = superTypes .mapNotNull { it.classOrNull?.owner } @@ -328,7 +325,7 @@ internal class BuiltInFictitiousFunctionIrClassFactory( isDelegated = descriptor.isDelegated, isExternal = descriptor.isExternal, isExpect = descriptor.isExpect, - isFakeOverride = memberOrigin == IrDeclarationOrigin.FAKE_OVERRIDE) + isFakeOverride = true) } val property = symbolTable?.declareProperty(offset, offset, memberOrigin, descriptor, propertyFactory = propertyDeclare) ?: propertyDeclare(IrPropertySymbolImpl(descriptor)) 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 d32d14cccdc..969cef0d251 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 @@ -102,7 +102,7 @@ fun FunctionDescriptor.canObjCClassMethodBeCalledVirtually(overriddenDescriptor: overriddenDescriptor.isOverridable && this.kind.isReal && !this.isExternalObjCClassMethod() internal fun IrFunction.canObjCClassMethodBeCalledVirtually(overridden: IrFunction) = - overridden.isOverridable && this.origin != IrDeclarationOrigin.FAKE_OVERRIDE && !this.isExternalObjCClassMethod() + overridden.isOverridable && !this.isFakeOverride && !this.isExternalObjCClassMethod() fun ClassDescriptor.isKotlinObjCClass(): Boolean = this.isObjCClass() && !this.isExternalObjCClass() 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 bd9ddd65c6b..51ae66a2d17 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 @@ -80,7 +80,7 @@ internal interface DescriptorToIrTranslationMixin { return fakeOverrides.map { when (it) { is PropertyDescriptor -> createProperty(it) - is FunctionDescriptor -> createFunction(it, IrDeclarationOrigin.FAKE_OVERRIDE) + is FunctionDescriptor -> createFunction(it) else -> error("Unexpected fake override descriptor: $it") } } @@ -109,19 +109,14 @@ internal interface DescriptorToIrTranslationMixin { } fun createProperty(propertyDescriptor: PropertyDescriptor): IrProperty { - val origin = if (propertyDescriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - IrDeclarationOrigin.FAKE_OVERRIDE - } else { - IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB - } - val irProperty = symbolTable.declareProperty(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, propertyDescriptor) + val irProperty = symbolTable.declareProperty(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, propertyDescriptor) irProperty.getter = propertyDescriptor.getter?.let { - val irGetter = createFunction(it, origin) + val irGetter = createFunction(it) irGetter.correspondingPropertySymbol = irProperty.symbol irGetter } irProperty.setter = propertyDescriptor.setter?.let { - val irSetter = createFunction(it, origin) + val irSetter = createFunction(it) irSetter.correspondingPropertySymbol = irProperty.symbol irSetter } @@ -129,11 +124,8 @@ internal interface DescriptorToIrTranslationMixin { return irProperty } - fun createFunction( - functionDescriptor: FunctionDescriptor, - origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB - ): IrSimpleFunction { - val irFunction = symbolTable.declareSimpleFunctionWithOverrides(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, functionDescriptor) + fun createFunction(functionDescriptor: FunctionDescriptor): IrSimpleFunction { + val irFunction = symbolTable.declareSimpleFunctionWithOverrides(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, functionDescriptor) symbolTable.withScope(irFunction) { irFunction.returnType = functionDescriptor.returnType!!.toIrType() irFunction.valueParameters += functionDescriptor.valueParameters.map {