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.
This commit is contained in:
Alexander Udalov
2020-07-10 18:13:12 +02:00
parent ca5eb40fa5
commit 517c3e1020
6 changed files with 52 additions and 29 deletions
@@ -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)
}
@@ -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)
}
@@ -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)
@@ -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)
@@ -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"))
}
}
@@ -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
}