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.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer
|
import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
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.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.carriers.FunctionCarrier
|
import org.jetbrains.kotlin.ir.declarations.impl.carriers.FunctionCarrier
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
|
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
|
||||||
@@ -123,11 +124,11 @@ class IrFakeOverrideFunctionImpl(
|
|||||||
isSuspend: Boolean,
|
isSuspend: Boolean,
|
||||||
isOperator: Boolean,
|
isOperator: Boolean,
|
||||||
isInfix: Boolean,
|
isInfix: Boolean,
|
||||||
isExpect: Boolean
|
isExpect: Boolean,
|
||||||
) : IrFunctionCommonImpl(startOffset, endOffset, origin, name, visibility, modality, returnType, isInline,
|
) : IrFunctionCommonImpl(
|
||||||
isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect,
|
startOffset, endOffset, origin, name, visibility, modality, returnType, isInline,
|
||||||
isFakeOverride = true)
|
isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride = true
|
||||||
{
|
), IrFakeOverrideFunction {
|
||||||
private var _symbol: IrSimpleFunctionSymbol? = null
|
private var _symbol: IrSimpleFunctionSymbol? = null
|
||||||
|
|
||||||
override val symbol: IrSimpleFunctionSymbol
|
override val symbol: IrSimpleFunctionSymbol
|
||||||
@@ -138,7 +139,7 @@ class IrFakeOverrideFunctionImpl(
|
|||||||
get() = _symbol?.descriptor ?: WrappedSimpleFunctionDescriptor()
|
get() = _symbol?.descriptor ?: WrappedSimpleFunctionDescriptor()
|
||||||
|
|
||||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||||
fun acquireSymbol(symbol: IrSimpleFunctionSymbol) {
|
override fun acquireSymbol(symbol: IrSimpleFunctionSymbol) {
|
||||||
assert(_symbol == null) { "$this already has symbol _symbol" }
|
assert(_symbol == null) { "$this already has symbol _symbol" }
|
||||||
_symbol = symbol
|
_symbol = symbol
|
||||||
symbol.bind(this)
|
symbol.bind(this)
|
||||||
|
|||||||
@@ -145,9 +145,10 @@ class IrFakeOverridePropertyImpl(
|
|||||||
isDelegated: Boolean,
|
isDelegated: Boolean,
|
||||||
isExternal: Boolean,
|
isExternal: Boolean,
|
||||||
isExpect: Boolean,
|
isExpect: Boolean,
|
||||||
) : IrPropertyCommonImpl(startOffset, endOffset, origin, name, visibility, modality, isVar, isConst, isLateinit,
|
) : IrPropertyCommonImpl(
|
||||||
isDelegated, isExternal, isExpect, isFakeOverride = true)
|
startOffset, endOffset, origin, name, visibility, modality, isVar, isConst, isLateinit,
|
||||||
{
|
isDelegated, isExternal, isExpect, isFakeOverride = true
|
||||||
|
), IrFakeOverrideProperty {
|
||||||
private var _symbol: IrPropertySymbol? = null
|
private var _symbol: IrPropertySymbol? = null
|
||||||
|
|
||||||
override val symbol: IrPropertySymbol
|
override val symbol: IrPropertySymbol
|
||||||
@@ -158,7 +159,7 @@ class IrFakeOverridePropertyImpl(
|
|||||||
get() = _symbol?.descriptor ?: WrappedPropertyDescriptor()
|
get() = _symbol?.descriptor ?: WrappedPropertyDescriptor()
|
||||||
|
|
||||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||||
fun acquireSymbol(symbol: IrPropertySymbol) {
|
override fun acquireSymbol(symbol: IrPropertySymbol) {
|
||||||
assert(_symbol == null) { "$this already has symbol _symbol" }
|
assert(_symbol == null) { "$this already has symbol _symbol" }
|
||||||
_symbol = symbol
|
_symbol = symbol
|
||||||
symbol.bind(this)
|
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.backend.common.serialization.signature.IdSignatureSerializer
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
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.impl.IrFakeOverridePropertyImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverridePropertyImpl
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
|
import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
|
||||||
@@ -118,13 +114,13 @@ class FakeOverrideBuilder(
|
|||||||
|
|
||||||
override fun linkFakeOverride(fakeOverride: IrOverridableMember) {
|
override fun linkFakeOverride(fakeOverride: IrOverridableMember) {
|
||||||
when (fakeOverride) {
|
when (fakeOverride) {
|
||||||
is IrFakeOverrideFunctionImpl -> linkFunctionFakeOverride(fakeOverride)
|
is IrFakeOverrideFunction -> linkFunctionFakeOverride(fakeOverride)
|
||||||
is IrFakeOverridePropertyImpl -> linkPropertyFakeOverride(fakeOverride)
|
is IrFakeOverrideProperty -> linkPropertyFakeOverride(fakeOverride)
|
||||||
else -> error("Unexpected fake override: $fakeOverride")
|
else -> error("Unexpected fake override: $fakeOverride")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun linkFunctionFakeOverride(declaration: IrFakeOverrideFunctionImpl) {
|
private fun linkFunctionFakeOverride(declaration: IrFakeOverrideFunction) {
|
||||||
val signature = signaturer.composePublicIdSignature(declaration)
|
val signature = signaturer.composePublicIdSignature(declaration)
|
||||||
|
|
||||||
symbolTable.declareSimpleFunctionFromLinker(WrappedSimpleFunctionDescriptor(), signature) {
|
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,
|
// To compute a signature for a property with type parameters,
|
||||||
// we must have its accessor's correspondingProperty pointing to the property's symbol.
|
// we must have its accessor's correspondingProperty pointing to the property's symbol.
|
||||||
// See IrMangleComputer.mangleTypeParameterReference() for details.
|
// See IrMangleComputer.mangleTypeParameterReference() for details.
|
||||||
@@ -159,15 +155,11 @@ class FakeOverrideBuilder(
|
|||||||
|
|
||||||
declaration.getter?.let {
|
declaration.getter?.let {
|
||||||
it.correspondingPropertySymbol = declaration.symbol
|
it.correspondingPropertySymbol = declaration.symbol
|
||||||
linkFunctionFakeOverride(it as? IrFakeOverrideFunctionImpl
|
linkFunctionFakeOverride(it as? IrFakeOverrideFunction ?: error("Unexpected fake override getter: $it"))
|
||||||
?: error("Unexpected fake override getter: $it")
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
declaration.setter?.let {
|
declaration.setter?.let {
|
||||||
it.correspondingPropertySymbol = declaration.symbol
|
it.correspondingPropertySymbol = declaration.symbol
|
||||||
linkFunctionFakeOverride(it as? IrFakeOverrideFunctionImpl
|
linkFunctionFakeOverride(it as? IrFakeOverrideFunction ?: error("Unexpected fake override setter: $it"))
|
||||||
?: 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.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
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.declarations.impl.IrFakeOverridePropertyImpl
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||||
@@ -280,7 +279,7 @@ class IrOverridingUtil(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun IrSimpleFunction.updateAccessorModalityAndVisibility(newModality: Modality, newVisibility: Visibility): IrSimpleFunction? {
|
private fun IrSimpleFunction.updateAccessorModalityAndVisibility(newModality: Modality, newVisibility: Visibility): IrSimpleFunction? {
|
||||||
require(this is IrFakeOverrideFunctionImpl) {
|
require(this is IrFakeOverrideFunction) {
|
||||||
"Unexpected fake override accessor kind: $this"
|
"Unexpected fake override accessor kind: $this"
|
||||||
}
|
}
|
||||||
// For descriptors it gets INVISIBLE_FAKE.
|
// For descriptors it gets INVISIBLE_FAKE.
|
||||||
@@ -307,13 +306,13 @@ class IrOverridingUtil(
|
|||||||
|
|
||||||
val fakeOverride = mostSpecific.apply {
|
val fakeOverride = mostSpecific.apply {
|
||||||
when (this) {
|
when (this) {
|
||||||
is IrFakeOverridePropertyImpl -> {
|
is IrFakeOverrideProperty -> {
|
||||||
this.visibility = visibility
|
this.visibility = visibility
|
||||||
this.modality = modality
|
this.modality = modality
|
||||||
this.getter = this.getter?.updateAccessorModalityAndVisibility(modality, visibility)
|
this.getter = this.getter?.updateAccessorModalityAndVisibility(modality, visibility)
|
||||||
this.setter = this.setter?.updateAccessorModalityAndVisibility(modality, visibility)
|
this.setter = this.setter?.updateAccessorModalityAndVisibility(modality, visibility)
|
||||||
}
|
}
|
||||||
is IrFakeOverrideFunctionImpl -> {
|
is IrFakeOverrideFunction -> {
|
||||||
this.visibility = visibility
|
this.visibility = visibility
|
||||||
this.modality = modality
|
this.modality = modality
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user