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:
+15
@@ -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)
|
||||
}
|
||||
+15
@@ -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)
|
||||
|
||||
+7
-15
@@ -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"))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-4
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user