From 2784e30fd4533c26b0c28b0fa18589bfec1f94df Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Thu, 26 Mar 2020 17:36:23 +0300 Subject: [PATCH] JVM_IR: use .isFakeOverride instead of testing origin --- .../backend/jvm/codegen/ClassCodegen.kt | 4 ++-- .../jvm/descriptors/JvmDeclarationFactory.kt | 5 +++-- .../jvm/lower/CollectionStubMethodLowering.kt | 2 +- .../jvm/lower/GenerateMultifileFacades.kt | 21 ++++++++++++++----- .../backend/jvm/lower/InterfaceLowering.kt | 2 +- .../backend/jvm/lower/RenameFieldsLowering.kt | 2 +- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 03343364a55..ea0d15744d4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -316,7 +316,7 @@ open class ClassCodegen protected constructor( ClassCodegen(klass, context, this, parentFunction) private fun generateField(field: IrField) { - if (field.origin == IrDeclarationOrigin.FAKE_OVERRIDE) return + if (field.isFakeOverride) return val fieldType = typeMapper.mapType(field) val fieldSignature = @@ -349,7 +349,7 @@ open class ClassCodegen protected constructor( } private fun generateMethod(method: IrFunction) { - if (method.origin == IrDeclarationOrigin.FAKE_OVERRIDE) { + if (method.isFakeOverride) { jvmSignatureClashDetector.trackFakeOverrideMethod(method) return } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt index 91edea32ee4..aa64d5891ce 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt @@ -180,8 +180,8 @@ class JvmDeclarationFactory( fun getStaticBackingField(irProperty: IrProperty): IrField? { // Only fields defined directly in objects should be made static. // Fake overrides never point to those, as objects are final. - if (irProperty.origin == IrDeclarationOrigin.FAKE_OVERRIDE) return null val oldField = irProperty.backingField ?: return null + if (oldField.isFakeOverride) return null val oldParent = irProperty.parent as? IrClass ?: return null if (!oldParent.isObject) return null 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`. // The classes are not actually related and `I2.DefaultImpls.f` is not a fake override but a bridge. origin = when { - interfaceFun.origin != IrDeclarationOrigin.FAKE_OVERRIDE -> interfaceFun.origin + !interfaceFun.isFakeOverride -> interfaceFun.origin interfaceFun.resolveFakeOverride()!!.origin.isSynthetic -> JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_TO_SYNTHETIC else -> JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE }, @@ -271,6 +271,7 @@ class JvmDeclarationFactory( fun getDefaultImplsRedirection(fakeOverride: IrSimpleFunction): IrSimpleFunction = defaultImplsRedirections.getOrPut(fakeOverride) { assert(fakeOverride.origin == IrDeclarationOrigin.FAKE_OVERRIDE) + assert(fakeOverride.isFakeOverride) val irClass = fakeOverride.parentAsClass val descriptor = DescriptorsToIrRemapper.remapDeclaredSimpleFunction(fakeOverride.descriptor) with(fakeOverride) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt index a4c549785ce..7335c77f3ed 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt @@ -50,7 +50,7 @@ internal class CollectionStubMethodLowering(val context: JvmBackendContext) : Cl // it means an abstract function in superclass that is not implemented yet, // stub generation is still needed to avoid invocation error. val existingMethodsBySignature = irClass.functions.filterNot { - it.modality == Modality.ABSTRACT && it.origin == IrDeclarationOrigin.FAKE_OVERRIDE + it.modality == Modality.ABSTRACT && it.isFakeOverride }.associateBy { it.toSignature() } for (member in methodStubsToGenerate) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt index 3dda167522b..0e9e0716b38 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass 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.passTypeArgumentsFrom 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.declarations.addConstructor 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.impl.IrFileImpl import org.jetbrains.kotlin.ir.expressions.* @@ -204,21 +206,31 @@ private fun IrSimpleFunction.createMultifileDelegateIfNeeded( facadeClass: IrClass, shouldGeneratePartHierarchy: Boolean ): IrSimpleFunction? { + val target = this + if (Visibilities.isPrivate(visibility) || name == StaticInitializersLowering.clinitName || origin == JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR ) return null - // TODO: perform copy of the signature only, without body - val function = deepCopyWithSymbols(facadeClass) + val function = buildFun { + 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) { function.body = null - function.origin = IrDeclarationOrigin.FAKE_OVERRIDE function.overriddenSymbols = listOf(symbol) } else { + function.overriddenSymbols = overriddenSymbols.toList() function.body = context.createIrBuilder(function.symbol).irBlockBody { - +irReturn(irCall(this@createMultifileDelegateIfNeeded).also { call -> + +irReturn(irCall(target).also { call -> call.passTypeArgumentsFrom(function) function.extensionReceiverParameter?.let { parameter -> call.extensionReceiver = irGet(parameter) @@ -228,7 +240,6 @@ private fun IrSimpleFunction.createMultifileDelegateIfNeeded( } }) } - function.origin = JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE } facadeClass.declarations.add(function) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt index 8f83d2c2b19..e5513dbae4e 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt @@ -95,7 +95,7 @@ internal class InterfaceLowering(val context: JvmBackendContext) : IrElementTran * 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 // (KT-36188) where there could be multiple implementations. (resolveFakeOverride() only returns the implementation if // there's only one.) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt index 9e9ce6236a4..5f0871d4bef 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt @@ -113,7 +113,7 @@ private class FieldRenamer(private val newNames: Map) : IrElement return IrFieldImpl( declaration.startOffset, declaration.endOffset, declaration.origin, symbol, newName, declaration.type, declaration.visibility, declaration.isFinal, declaration.isExternal, declaration.isStatic, - isFakeOverride = declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE + isFakeOverride = declaration.isFakeOverride ).also { descriptor.bind(it) it.parent = declaration.parent