[K/N][IR] Used .isFakeOverride instead of a special origin

This commit is contained in:
Igor Chevdar
2021-06-15 10:43:22 +05:00
parent dc568426bd
commit 3a4e8e7a61
5 changed files with 30 additions and 29 deletions
@@ -745,7 +745,8 @@ class SymbolTable(
isLateinit = descriptor.isLateInit, isLateinit = descriptor.isLateInit,
isDelegated = isDelegated, isDelegated = isDelegated,
isExternal = descriptor.isEffectivelyExternal(), isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect isExpect = descriptor.isExpect,
isFakeOverride = descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE
).apply { ).apply {
metadata = DescriptorMetadataSource.Property(symbol.descriptor) metadata = DescriptorMetadataSource.Property(symbol.descriptor)
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.ir.util package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
@@ -24,7 +25,17 @@ fun SymbolTable.declareSimpleFunctionWithOverrides(
with(descriptor) { with(descriptor) {
irFactory.createFunction( irFactory.createFunction(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(this), 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 -> ).also { declaration ->
declaration.metadata = DescriptorMetadataSource.Function(this) declaration.metadata = DescriptorMetadataSource.Function(this)
} }
@@ -139,13 +139,14 @@ internal class BuiltInFictitiousFunctionIrClassFactory(
private fun createSimpleFunction( private fun createSimpleFunction(
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
returnType: IrType returnType: IrType,
isFakeOverride: Boolean
): IrSimpleFunction { ): IrSimpleFunction {
val functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction = { val functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction = {
with(descriptor) { with(descriptor) {
IrFunctionImpl( IrFunctionImpl(
SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, it, name, visibility, modality, returnType, 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() OperatorNameConventions.INVOKE, NoLookupLocation.FROM_BACKEND).single()
val isFakeOverride = invokeFunctionDescriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE val isFakeOverride = invokeFunctionDescriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE
if (!isFakeOverride) { if (!isFakeOverride) {
val invokeFunctionOrigin =
if (isFakeOverride)
IrDeclarationOrigin.FAKE_OVERRIDE
else
DECLARATION_ORIGIN_FUNCTION_CLASS
declarations += createSimpleFunction( declarations += createSimpleFunction(
invokeFunctionDescriptor, invokeFunctionOrigin, invokeFunctionDescriptor, DECLARATION_ORIGIN_FUNCTION_CLASS,
typeParameters.last().defaultType typeParameters.last().defaultType,
isFakeOverride
).apply { ).apply {
parent = functionClass parent = functionClass
valueParameters += invokeFunctionDescriptor.valueParameters.map { valueParameters += invokeFunctionDescriptor.valueParameters.map {
IrValueParameterImpl( IrValueParameterImpl(
SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, invokeFunctionOrigin, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, DECLARATION_ORIGIN_FUNCTION_CLASS,
IrValueParameterSymbolImpl(it), it.name, it.index, IrValueParameterSymbolImpl(it), it.name, it.index,
functionClass.typeParameters[it.index].defaultType, null, functionClass.typeParameters[it.index].defaultType, null,
it.isCrossinline, it.isNoinline, it.isCrossinline, it.isNoinline,
@@ -218,7 +215,7 @@ internal class BuiltInFictitiousFunctionIrClassFactory(
).also { it.parent = this } ).also { it.parent = this }
} }
if (!isFakeOverride) if (!isFakeOverride)
createDispatchReceiverParameter(invokeFunctionOrigin) createDispatchReceiverParameter(DECLARATION_ORIGIN_FUNCTION_CLASS)
else { else {
val overriddenFunction = superTypes val overriddenFunction = superTypes
.mapNotNull { it.classOrNull?.owner } .mapNotNull { it.classOrNull?.owner }
@@ -328,7 +325,7 @@ internal class BuiltInFictitiousFunctionIrClassFactory(
isDelegated = descriptor.isDelegated, isDelegated = descriptor.isDelegated,
isExternal = descriptor.isExternal, isExternal = descriptor.isExternal,
isExpect = descriptor.isExpect, isExpect = descriptor.isExpect,
isFakeOverride = memberOrigin == IrDeclarationOrigin.FAKE_OVERRIDE) isFakeOverride = true)
} }
val property = symbolTable?.declareProperty(offset, offset, memberOrigin, descriptor, propertyFactory = propertyDeclare) val property = symbolTable?.declareProperty(offset, offset, memberOrigin, descriptor, propertyFactory = propertyDeclare)
?: propertyDeclare(IrPropertySymbolImpl(descriptor)) ?: propertyDeclare(IrPropertySymbolImpl(descriptor))
@@ -102,7 +102,7 @@ fun FunctionDescriptor.canObjCClassMethodBeCalledVirtually(overriddenDescriptor:
overriddenDescriptor.isOverridable && this.kind.isReal && !this.isExternalObjCClassMethod() overriddenDescriptor.isOverridable && this.kind.isReal && !this.isExternalObjCClassMethod()
internal fun IrFunction.canObjCClassMethodBeCalledVirtually(overridden: IrFunction) = 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() fun ClassDescriptor.isKotlinObjCClass(): Boolean = this.isObjCClass() && !this.isExternalObjCClass()
@@ -80,7 +80,7 @@ internal interface DescriptorToIrTranslationMixin {
return fakeOverrides.map { return fakeOverrides.map {
when (it) { when (it) {
is PropertyDescriptor -> createProperty(it) is PropertyDescriptor -> createProperty(it)
is FunctionDescriptor -> createFunction(it, IrDeclarationOrigin.FAKE_OVERRIDE) is FunctionDescriptor -> createFunction(it)
else -> error("Unexpected fake override descriptor: $it") else -> error("Unexpected fake override descriptor: $it")
} }
} }
@@ -109,19 +109,14 @@ internal interface DescriptorToIrTranslationMixin {
} }
fun createProperty(propertyDescriptor: PropertyDescriptor): IrProperty { fun createProperty(propertyDescriptor: PropertyDescriptor): IrProperty {
val origin = if (propertyDescriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { val irProperty = symbolTable.declareProperty(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, propertyDescriptor)
IrDeclarationOrigin.FAKE_OVERRIDE
} else {
IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
}
val irProperty = symbolTable.declareProperty(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, propertyDescriptor)
irProperty.getter = propertyDescriptor.getter?.let { irProperty.getter = propertyDescriptor.getter?.let {
val irGetter = createFunction(it, origin) val irGetter = createFunction(it)
irGetter.correspondingPropertySymbol = irProperty.symbol irGetter.correspondingPropertySymbol = irProperty.symbol
irGetter irGetter
} }
irProperty.setter = propertyDescriptor.setter?.let { irProperty.setter = propertyDescriptor.setter?.let {
val irSetter = createFunction(it, origin) val irSetter = createFunction(it)
irSetter.correspondingPropertySymbol = irProperty.symbol irSetter.correspondingPropertySymbol = irProperty.symbol
irSetter irSetter
} }
@@ -129,11 +124,8 @@ internal interface DescriptorToIrTranslationMixin {
return irProperty return irProperty
} }
fun createFunction( fun createFunction(functionDescriptor: FunctionDescriptor): IrSimpleFunction {
functionDescriptor: FunctionDescriptor, val irFunction = symbolTable.declareSimpleFunctionWithOverrides(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, functionDescriptor)
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
): IrSimpleFunction {
val irFunction = symbolTable.declareSimpleFunctionWithOverrides(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, functionDescriptor)
symbolTable.withScope(irFunction) { symbolTable.withScope(irFunction) {
irFunction.returnType = functionDescriptor.returnType!!.toIrType() irFunction.returnType = functionDescriptor.returnType!!.toIrType()
irFunction.valueParameters += functionDescriptor.valueParameters.map { irFunction.valueParameters += functionDescriptor.valueParameters.map {