[K/N][IR] Used .isFakeOverride instead of a special origin
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-12
@@ -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))
|
||||||
|
|||||||
+1
-1
@@ -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()
|
||||||
|
|
||||||
|
|||||||
+6
-14
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user