From 517c3e10203ecbb575b7c2b40a3f382027e05bdc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 10 Jul 2020 18:13:12 +0200 Subject: [PATCH] IR: introduce IrFakeOverrideFunction, IrFakeOverrideProperty Use them instead of the implementations. This will allow to refactor creation to a factory and allow to use other implementations in the future. --- .../ir/declarations/IrFakeOverrideFunction.kt | 15 +++++++++++++ .../ir/declarations/IrFakeOverrideProperty.kt | 15 +++++++++++++ .../ir/declarations/impl/IrFunctionImpl.kt | 13 ++++++----- .../ir/declarations/impl/IrPropertyImpl.kt | 9 ++++---- .../backend/common/overrides/FakeOverrides.kt | 22 ++++++------------- .../common/overrides/IrOverridingUtil.kt | 7 +++--- 6 files changed, 52 insertions(+), 29 deletions(-) create mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideFunction.kt create mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideProperty.kt diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideFunction.kt new file mode 100644 index 00000000000..3fa743f545b --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideFunction.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir.declarations + +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol + +interface IrFakeOverrideFunction : IrSimpleFunction { + override var modality: Modality + + fun acquireSymbol(symbol: IrSimpleFunctionSymbol) +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideProperty.kt new file mode 100644 index 00000000000..1867cbc4ba1 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFakeOverrideProperty.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir.declarations + +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol + +interface IrFakeOverrideProperty : IrProperty { + override var modality: Modality + + fun acquireSymbol(symbol: IrPropertySymbol) +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt index bcbfd38bad1..ea2942cb8df 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.ir.declarations.IrFakeOverrideFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.impl.carriers.FunctionCarrier import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor @@ -123,11 +124,11 @@ class IrFakeOverrideFunctionImpl( isSuspend: Boolean, isOperator: Boolean, isInfix: Boolean, - isExpect: Boolean -) : IrFunctionCommonImpl(startOffset, endOffset, origin, name, visibility, modality, returnType, isInline, - isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, - isFakeOverride = true) -{ + isExpect: Boolean, +) : IrFunctionCommonImpl( + startOffset, endOffset, origin, name, visibility, modality, returnType, isInline, + isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride = true +), IrFakeOverrideFunction { private var _symbol: IrSimpleFunctionSymbol? = null override val symbol: IrSimpleFunctionSymbol @@ -138,7 +139,7 @@ class IrFakeOverrideFunctionImpl( get() = _symbol?.descriptor ?: WrappedSimpleFunctionDescriptor() @OptIn(ObsoleteDescriptorBasedAPI::class) - fun acquireSymbol(symbol: IrSimpleFunctionSymbol) { + override fun acquireSymbol(symbol: IrSimpleFunctionSymbol) { assert(_symbol == null) { "$this already has symbol _symbol" } _symbol = symbol symbol.bind(this) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt index f5a83c2139e..68671df1591 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt @@ -145,9 +145,10 @@ class IrFakeOverridePropertyImpl( isDelegated: Boolean, isExternal: Boolean, isExpect: Boolean, -) : IrPropertyCommonImpl(startOffset, endOffset, origin, name, visibility, modality, isVar, isConst, isLateinit, - isDelegated, isExternal, isExpect, isFakeOverride = true) -{ +) : IrPropertyCommonImpl( + startOffset, endOffset, origin, name, visibility, modality, isVar, isConst, isLateinit, + isDelegated, isExternal, isExpect, isFakeOverride = true +), IrFakeOverrideProperty { private var _symbol: IrPropertySymbol? = null override val symbol: IrPropertySymbol @@ -158,7 +159,7 @@ class IrFakeOverridePropertyImpl( get() = _symbol?.descriptor ?: WrappedPropertyDescriptor() @OptIn(ObsoleteDescriptorBasedAPI::class) - fun acquireSymbol(symbol: IrPropertySymbol) { + override fun acquireSymbol(symbol: IrPropertySymbol) { assert(_symbol == null) { "$this already has symbol _symbol" } _symbol = symbol symbol.bind(this) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt index 52596ae38e5..815958785e8 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt @@ -18,11 +18,7 @@ package org.jetbrains.kotlin.backend.common.overrides import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrModuleFragment -import org.jetbrains.kotlin.ir.declarations.IrOverridableMember -import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverrideFunctionImpl +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverridePropertyImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor @@ -118,13 +114,13 @@ class FakeOverrideBuilder( override fun linkFakeOverride(fakeOverride: IrOverridableMember) { when (fakeOverride) { - is IrFakeOverrideFunctionImpl -> linkFunctionFakeOverride(fakeOverride) - is IrFakeOverridePropertyImpl -> linkPropertyFakeOverride(fakeOverride) + is IrFakeOverrideFunction -> linkFunctionFakeOverride(fakeOverride) + is IrFakeOverrideProperty -> linkPropertyFakeOverride(fakeOverride) else -> error("Unexpected fake override: $fakeOverride") } } - private fun linkFunctionFakeOverride(declaration: IrFakeOverrideFunctionImpl) { + private fun linkFunctionFakeOverride(declaration: IrFakeOverrideFunction) { val signature = signaturer.composePublicIdSignature(declaration) symbolTable.declareSimpleFunctionFromLinker(WrappedSimpleFunctionDescriptor(), signature) { @@ -133,7 +129,7 @@ class FakeOverrideBuilder( } } - private fun linkPropertyFakeOverride(declaration: IrFakeOverridePropertyImpl) { + private fun linkPropertyFakeOverride(declaration: IrFakeOverrideProperty) { // To compute a signature for a property with type parameters, // we must have its accessor's correspondingProperty pointing to the property's symbol. // See IrMangleComputer.mangleTypeParameterReference() for details. @@ -159,15 +155,11 @@ class FakeOverrideBuilder( declaration.getter?.let { it.correspondingPropertySymbol = declaration.symbol - linkFunctionFakeOverride(it as? IrFakeOverrideFunctionImpl - ?: error("Unexpected fake override getter: $it") - ) + linkFunctionFakeOverride(it as? IrFakeOverrideFunction ?: error("Unexpected fake override getter: $it")) } declaration.setter?.let { it.correspondingPropertySymbol = declaration.symbol - linkFunctionFakeOverride(it as? IrFakeOverrideFunctionImpl - ?: error("Unexpected fake override setter: $it") - ) + linkFunctionFakeOverride(it as? IrFakeOverrideFunction ?: error("Unexpected fake override setter: $it")) } } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt index 5c353060a87..e92300f0aaa 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverrideFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverridePropertyImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol @@ -280,7 +279,7 @@ class IrOverridingUtil( } private fun IrSimpleFunction.updateAccessorModalityAndVisibility(newModality: Modality, newVisibility: Visibility): IrSimpleFunction? { - require(this is IrFakeOverrideFunctionImpl) { + require(this is IrFakeOverrideFunction) { "Unexpected fake override accessor kind: $this" } // For descriptors it gets INVISIBLE_FAKE. @@ -307,13 +306,13 @@ class IrOverridingUtil( val fakeOverride = mostSpecific.apply { when (this) { - is IrFakeOverridePropertyImpl -> { + is IrFakeOverrideProperty -> { this.visibility = visibility this.modality = modality this.getter = this.getter?.updateAccessorModalityAndVisibility(modality, visibility) this.setter = this.setter?.updateAccessorModalityAndVisibility(modality, visibility) } - is IrFakeOverrideFunctionImpl -> { + is IrFakeOverrideFunction -> { this.visibility = visibility this.modality = modality }