JVM_IR: use .isFakeOverride instead of testing origin
This commit is contained in:
committed by
romanart
parent
0480f2d170
commit
2784e30fd4
+2
-2
@@ -316,7 +316,7 @@ open class ClassCodegen protected constructor(
|
|||||||
ClassCodegen(klass, context, this, parentFunction)
|
ClassCodegen(klass, context, this, parentFunction)
|
||||||
|
|
||||||
private fun generateField(field: IrField) {
|
private fun generateField(field: IrField) {
|
||||||
if (field.origin == IrDeclarationOrigin.FAKE_OVERRIDE) return
|
if (field.isFakeOverride) return
|
||||||
|
|
||||||
val fieldType = typeMapper.mapType(field)
|
val fieldType = typeMapper.mapType(field)
|
||||||
val fieldSignature =
|
val fieldSignature =
|
||||||
@@ -349,7 +349,7 @@ open class ClassCodegen protected constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun generateMethod(method: IrFunction) {
|
private fun generateMethod(method: IrFunction) {
|
||||||
if (method.origin == IrDeclarationOrigin.FAKE_OVERRIDE) {
|
if (method.isFakeOverride) {
|
||||||
jvmSignatureClashDetector.trackFakeOverrideMethod(method)
|
jvmSignatureClashDetector.trackFakeOverrideMethod(method)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -180,8 +180,8 @@ class JvmDeclarationFactory(
|
|||||||
fun getStaticBackingField(irProperty: IrProperty): IrField? {
|
fun getStaticBackingField(irProperty: IrProperty): IrField? {
|
||||||
// Only fields defined directly in objects should be made static.
|
// Only fields defined directly in objects should be made static.
|
||||||
// Fake overrides never point to those, as objects are final.
|
// Fake overrides never point to those, as objects are final.
|
||||||
if (irProperty.origin == IrDeclarationOrigin.FAKE_OVERRIDE) return null
|
|
||||||
val oldField = irProperty.backingField ?: return null
|
val oldField = irProperty.backingField ?: return null
|
||||||
|
if (oldField.isFakeOverride) return null
|
||||||
val oldParent = irProperty.parent as? IrClass ?: return null
|
val oldParent = irProperty.parent as? IrClass ?: return null
|
||||||
if (!oldParent.isObject) return null
|
if (!oldParent.isObject) return null
|
||||||
return staticBackingFields.getOrPut(irProperty) {
|
return staticBackingFields.getOrPut(irProperty) {
|
||||||
@@ -226,7 +226,7 @@ class JvmDeclarationFactory(
|
|||||||
// is supposed to allow using `I2.DefaultImpls.f` as if it was inherited from `I1.DefaultImpls`.
|
// is supposed to allow using `I2.DefaultImpls.f` as if it was inherited from `I1.DefaultImpls`.
|
||||||
// The classes are not actually related and `I2.DefaultImpls.f` is not a fake override but a bridge.
|
// The classes are not actually related and `I2.DefaultImpls.f` is not a fake override but a bridge.
|
||||||
origin = when {
|
origin = when {
|
||||||
interfaceFun.origin != IrDeclarationOrigin.FAKE_OVERRIDE -> interfaceFun.origin
|
!interfaceFun.isFakeOverride -> interfaceFun.origin
|
||||||
interfaceFun.resolveFakeOverride()!!.origin.isSynthetic -> JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_TO_SYNTHETIC
|
interfaceFun.resolveFakeOverride()!!.origin.isSynthetic -> JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_TO_SYNTHETIC
|
||||||
else -> JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE
|
else -> JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE
|
||||||
},
|
},
|
||||||
@@ -271,6 +271,7 @@ class JvmDeclarationFactory(
|
|||||||
fun getDefaultImplsRedirection(fakeOverride: IrSimpleFunction): IrSimpleFunction =
|
fun getDefaultImplsRedirection(fakeOverride: IrSimpleFunction): IrSimpleFunction =
|
||||||
defaultImplsRedirections.getOrPut(fakeOverride) {
|
defaultImplsRedirections.getOrPut(fakeOverride) {
|
||||||
assert(fakeOverride.origin == IrDeclarationOrigin.FAKE_OVERRIDE)
|
assert(fakeOverride.origin == IrDeclarationOrigin.FAKE_OVERRIDE)
|
||||||
|
assert(fakeOverride.isFakeOverride)
|
||||||
val irClass = fakeOverride.parentAsClass
|
val irClass = fakeOverride.parentAsClass
|
||||||
val descriptor = DescriptorsToIrRemapper.remapDeclaredSimpleFunction(fakeOverride.descriptor)
|
val descriptor = DescriptorsToIrRemapper.remapDeclaredSimpleFunction(fakeOverride.descriptor)
|
||||||
with(fakeOverride) {
|
with(fakeOverride) {
|
||||||
|
|||||||
+1
-1
@@ -50,7 +50,7 @@ internal class CollectionStubMethodLowering(val context: JvmBackendContext) : Cl
|
|||||||
// it means an abstract function in superclass that is not implemented yet,
|
// it means an abstract function in superclass that is not implemented yet,
|
||||||
// stub generation is still needed to avoid invocation error.
|
// stub generation is still needed to avoid invocation error.
|
||||||
val existingMethodsBySignature = irClass.functions.filterNot {
|
val existingMethodsBySignature = irClass.functions.filterNot {
|
||||||
it.modality == Modality.ABSTRACT && it.origin == IrDeclarationOrigin.FAKE_OVERRIDE
|
it.modality == Modality.ABSTRACT && it.isFakeOverride
|
||||||
}.associateBy { it.toSignature() }
|
}.associateBy { it.toSignature() }
|
||||||
|
|
||||||
for (member in methodStubsToGenerate) {
|
for (member in methodStubsToGenerate) {
|
||||||
|
|||||||
+16
-5
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.jvm.lower
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||||
|
import org.jetbrains.kotlin.backend.common.ir.copyParameterDeclarationsFrom
|
||||||
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
|
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
|
||||||
import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom
|
import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom
|
||||||
import org.jetbrains.kotlin.backend.common.lower
|
import org.jetbrains.kotlin.backend.common.lower
|
||||||
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.ir.*
|
|||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
|
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
|
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
@@ -204,21 +206,31 @@ private fun IrSimpleFunction.createMultifileDelegateIfNeeded(
|
|||||||
facadeClass: IrClass,
|
facadeClass: IrClass,
|
||||||
shouldGeneratePartHierarchy: Boolean
|
shouldGeneratePartHierarchy: Boolean
|
||||||
): IrSimpleFunction? {
|
): IrSimpleFunction? {
|
||||||
|
val target = this
|
||||||
|
|
||||||
if (Visibilities.isPrivate(visibility) ||
|
if (Visibilities.isPrivate(visibility) ||
|
||||||
name == StaticInitializersLowering.clinitName ||
|
name == StaticInitializersLowering.clinitName ||
|
||||||
origin == JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
|
origin == JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
|
||||||
) return null
|
) return null
|
||||||
|
|
||||||
// TODO: perform copy of the signature only, without body
|
val function = buildFun {
|
||||||
val function = deepCopyWithSymbols(facadeClass)
|
updateFrom(target)
|
||||||
|
origin = if (shouldGeneratePartHierarchy) IrDeclarationOrigin.FAKE_OVERRIDE else JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE
|
||||||
|
name = target.name
|
||||||
|
}
|
||||||
|
|
||||||
|
function.copyParameterDeclarationsFrom(target)
|
||||||
|
function.returnType = target.returnType
|
||||||
|
function.parent = facadeClass
|
||||||
|
function.annotations = target.annotations
|
||||||
|
|
||||||
if (shouldGeneratePartHierarchy) {
|
if (shouldGeneratePartHierarchy) {
|
||||||
function.body = null
|
function.body = null
|
||||||
function.origin = IrDeclarationOrigin.FAKE_OVERRIDE
|
|
||||||
function.overriddenSymbols = listOf(symbol)
|
function.overriddenSymbols = listOf(symbol)
|
||||||
} else {
|
} else {
|
||||||
|
function.overriddenSymbols = overriddenSymbols.toList()
|
||||||
function.body = context.createIrBuilder(function.symbol).irBlockBody {
|
function.body = context.createIrBuilder(function.symbol).irBlockBody {
|
||||||
+irReturn(irCall(this@createMultifileDelegateIfNeeded).also { call ->
|
+irReturn(irCall(target).also { call ->
|
||||||
call.passTypeArgumentsFrom(function)
|
call.passTypeArgumentsFrom(function)
|
||||||
function.extensionReceiverParameter?.let { parameter ->
|
function.extensionReceiverParameter?.let { parameter ->
|
||||||
call.extensionReceiver = irGet(parameter)
|
call.extensionReceiver = irGet(parameter)
|
||||||
@@ -228,7 +240,6 @@ private fun IrSimpleFunction.createMultifileDelegateIfNeeded(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
function.origin = JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
facadeClass.declarations.add(function)
|
facadeClass.declarations.add(function)
|
||||||
|
|||||||
+1
-1
@@ -95,7 +95,7 @@ internal class InterfaceLowering(val context: JvmBackendContext) : IrElementTran
|
|||||||
* interface B : A { class DefaultImpls { fun foo() = A.DefaultImpls.foo() } }
|
* interface B : A { class DefaultImpls { fun foo() = A.DefaultImpls.foo() } }
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
function.origin == IrDeclarationOrigin.FAKE_OVERRIDE -> {
|
function.isFakeOverride -> {
|
||||||
// We check to see if this is a default stub function BEFORE finding the implementation because of a front-end bug
|
// We check to see if this is a default stub function BEFORE finding the implementation because of a front-end bug
|
||||||
// (KT-36188) where there could be multiple implementations. (resolveFakeOverride() only returns the implementation if
|
// (KT-36188) where there could be multiple implementations. (resolveFakeOverride() only returns the implementation if
|
||||||
// there's only one.)
|
// there's only one.)
|
||||||
|
|||||||
+1
-1
@@ -113,7 +113,7 @@ private class FieldRenamer(private val newNames: Map<IrField, Name>) : IrElement
|
|||||||
return IrFieldImpl(
|
return IrFieldImpl(
|
||||||
declaration.startOffset, declaration.endOffset, declaration.origin, symbol, newName,
|
declaration.startOffset, declaration.endOffset, declaration.origin, symbol, newName,
|
||||||
declaration.type, declaration.visibility, declaration.isFinal, declaration.isExternal, declaration.isStatic,
|
declaration.type, declaration.visibility, declaration.isFinal, declaration.isExternal, declaration.isStatic,
|
||||||
isFakeOverride = declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE
|
isFakeOverride = declaration.isFakeOverride
|
||||||
).also {
|
).also {
|
||||||
descriptor.bind(it)
|
descriptor.bind(it)
|
||||||
it.parent = declaration.parent
|
it.parent = declaration.parent
|
||||||
|
|||||||
Reference in New Issue
Block a user