[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,
isDelegated = isDelegated,
isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect
isExpect = descriptor.isExpect,
isFakeOverride = descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE
).apply {
metadata = DescriptorMetadataSource.Property(symbol.descriptor)
}
@@ -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)
}
@@ -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))
@@ -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()
@@ -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 {