From e39ce9125355b6cf771c8b1da0830bdca5172203 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Fri, 4 Sep 2020 22:26:12 +0500 Subject: [PATCH] [IR] Fixed fake override builder for lowerings --- .../kotlin/backend/common/ir/IrUtils.kt | 90 +++++-------- .../lower/AbstractSuspendFunctionsLowering.kt | 2 +- .../lower/SingleAbstractMethodLowering.kt | 4 +- .../inline/DeepCopyIrTreeWithDescriptors.kt | 5 +- .../AbstractSuspendFunctionsLowering.kt | 2 +- .../jvm/lower/FunctionReferenceLowering.kt | 2 +- ...epCopyIrTreeWithSymbolsForFakeOverrides.kt | 25 ++-- .../ir}/overrides/FakeOverrideCopier.kt | 2 +- .../kotlin/ir}/overrides/IrOverridingUtil.kt | 126 +++++++++++++----- .../kotlin/ir}/overrides/IrVisibilityUtil.kt | 2 +- .../kotlin/ir/types}/IrTypeCheckerUtils.kt | 8 +- .../ir/util}/DescriptorsToIrRemapper.kt | 2 +- .../backend/common/overrides/FakeOverrides.kt | 38 +----- 13 files changed, 167 insertions(+), 141 deletions(-) rename compiler/ir/{serialization.common/src/org/jetbrains/kotlin/backend/common => ir.tree/src/org/jetbrains/kotlin/ir}/overrides/DeepCopyIrTreeWithSymbolsForFakeOverrides.kt (83%) rename compiler/ir/{serialization.common/src/org/jetbrains/kotlin/backend/common => ir.tree/src/org/jetbrains/kotlin/ir}/overrides/FakeOverrideCopier.kt (98%) rename compiler/ir/{serialization.common/src/org/jetbrains/kotlin/backend/common => ir.tree/src/org/jetbrains/kotlin/ir}/overrides/IrOverridingUtil.kt (84%) rename compiler/ir/{serialization.common/src/org/jetbrains/kotlin/backend/common => ir.tree/src/org/jetbrains/kotlin/ir}/overrides/IrVisibilityUtil.kt (96%) rename compiler/ir/{serialization.common/src/org/jetbrains/kotlin/backend/common/overrides => ir.tree/src/org/jetbrains/kotlin/ir/types}/IrTypeCheckerUtils.kt (85%) rename compiler/ir/{backend.common/src/org/jetbrains/kotlin/backend/common => ir.tree/src/org/jetbrains/kotlin/ir/util}/DescriptorsToIrRemapper.kt (98%) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 5499b69967c..4736d9fbd02 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.declarations.addConstructor -import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildReceiverParameter import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter import org.jetbrains.kotlin.ir.declarations.* @@ -25,8 +24,11 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl +import org.jetbrains.kotlin.ir.overrides.FakeOverrideBuilderStrategy +import org.jetbrains.kotlin.ir.overrides.IrOverridingUtil import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.* @@ -438,63 +440,41 @@ val IrFunction.allParameters: List explicitParameters } -fun IrClass.addFakeOverridesViaIncorrectHeuristic(implementedMembers: List = emptyList()) { - fun IrDeclaration.toList() = when (this) { - is IrSimpleFunction -> listOf(this) - is IrProperty -> listOfNotNull(getter, setter) - else -> emptyList() +private object FakeOverrideBuilder : FakeOverrideBuilderStrategy() { + override fun linkFakeOverride(fakeOverride: IrOverridableMember) { + when (fakeOverride) { + is IrFakeOverrideFunction -> linkFunctionFakeOverride(fakeOverride) + is IrFakeOverrideProperty -> linkPropertyFakeOverride(fakeOverride) + else -> error("Unexpected fake override: $fakeOverride") + } } - val overriddenFunctions = (declarations + implementedMembers) - .flatMap { it.toList() } - .flatMap { it.overriddenSymbols.map { it.owner } } - .toSet() - - val unoverriddenSuperFunctions = superTypes - .map { it.getClass()!! } - .flatMap { irClass -> - irClass.declarations - .flatMap { it.toList() } - .filter { it !in overriddenFunctions } - .filter { it.visibility != DescriptorVisibilities.PRIVATE } - } - .toMutableSet() - - // TODO: A dirty hack. - val groupedUnoverriddenSuperFunctions = unoverriddenSuperFunctions.groupBy { it.name.asString() + it.allParameters.size } - - fun createFakeOverride(overriddenFunctions: List) = - overriddenFunctions.first().let { irFunction -> - irFunction.factory.buildFun { - origin = IrDeclarationOrigin.FAKE_OVERRIDE - name = irFunction.name - visibility = DescriptorVisibilities.PUBLIC - modality = irFunction.modality - returnType = irFunction.returnType - isInline = irFunction.isInline - isExternal = irFunction.isExternal - isTailrec = irFunction.isTailrec - isSuspend = irFunction.isSuspend - isOperator = irFunction.isOperator - isInfix = irFunction.isInfix - isExpect = irFunction.isExpect - isFakeOverride = true - }.apply { - parent = this@addFakeOverridesViaIncorrectHeuristic - overriddenSymbols = overriddenFunctions.map { it.symbol } - copyParameterDeclarationsFrom(irFunction) - copyAttributes(irFunction) - } - } - - val fakeOverriddenFunctions = groupedUnoverriddenSuperFunctions - .asSequence() - .associate { it.value.first() to createFakeOverride(it.value) } - .toMutableMap() - - for (fo in fakeOverriddenFunctions.values) { - addChild(fo) + private fun linkFunctionFakeOverride(declaration: IrFakeOverrideFunction) { + declaration.acquireSymbol(IrSimpleFunctionSymbolImpl(WrappedSimpleFunctionDescriptor())) } + + private fun linkPropertyFakeOverride(declaration: IrFakeOverrideProperty) { + val propertySymbol = IrPropertySymbolImpl(WrappedPropertyDescriptor()) + declaration.getter?.let { it.correspondingPropertySymbol = propertySymbol } + declaration.setter?.let { it.correspondingPropertySymbol = propertySymbol } + + declaration.acquireSymbol(propertySymbol) + + declaration.getter?.let { + it.correspondingPropertySymbol = declaration.symbol + linkFunctionFakeOverride(it as? IrFakeOverrideFunction ?: error("Unexpected fake override getter: $it")) + } + declaration.setter?.let { + it.correspondingPropertySymbol = declaration.symbol + linkFunctionFakeOverride(it as? IrFakeOverrideFunction ?: error("Unexpected fake override setter: $it")) + } + } +} + +fun IrClass.addFakeOverrides(irBuiltIns: IrBuiltIns, implementedMembers: List = emptyList()) { + IrOverridingUtil(irBuiltIns, FakeOverrideBuilder) + .buildFakeOverridesForClassUsingOverriddenSymbols(this, implementedMembers) + .forEach { addChild(it) } } @OptIn(ObsoleteDescriptorBasedAPI::class) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt index 0dcff24a5f2..b5ed5abd114 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt @@ -354,7 +354,7 @@ abstract class AbstractSuspendFunctionsLowering(val co } coroutineClass.superTypes += superTypes - coroutineClass.addFakeOverridesViaIncorrectHeuristic() + coroutineClass.addFakeOverrides(context.irBuiltIns) initializeStateMachine(coroutineConstructors, coroutineClassThis) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt index 426afe259a2..ed397e9c154 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.ScopeWithIr -import org.jetbrains.kotlin.backend.common.ir.addFakeOverridesViaIncorrectHeuristic +import org.jetbrains.kotlin.backend.common.ir.addFakeOverrides import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor import org.jetbrains.kotlin.descriptors.ClassKind @@ -225,7 +225,7 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) : if (superType.needEqualsHashCodeMethods) generateEqualsHashCode(subclass, superType, field) - subclass.addFakeOverridesViaIncorrectHeuristic() + subclass.addFakeOverrides(context.irBuiltIns) return subclass } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/DeepCopyIrTreeWithDescriptors.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/DeepCopyIrTreeWithDescriptors.kt index 7bb40a70ccf..cef21ef8877 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/DeepCopyIrTreeWithDescriptors.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/DeepCopyIrTreeWithDescriptors.kt @@ -5,9 +5,8 @@ package org.jetbrains.kotlin.backend.common.lower.inline -import org.jetbrains.kotlin.backend.common.CommonBackendContext -import org.jetbrains.kotlin.backend.common.DescriptorsToIrRemapper -import org.jetbrains.kotlin.backend.common.WrappedDescriptorPatcher +import org.jetbrains.kotlin.ir.util.DescriptorsToIrRemapper +import org.jetbrains.kotlin.ir.util.WrappedDescriptorPatcher import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt index 5909c7a59d1..10cd43be21a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt @@ -438,7 +438,7 @@ abstract class AbstractSuspendFunctionsLowering(val co coroutineClass.superTypes += coroutineBaseClass.defaultType } - coroutineClass.addFakeOverridesViaIncorrectHeuristic(implementedMembers) + coroutineClass.addFakeOverrides(context.irBuiltIns, implementedMembers) // TODO: find out whether Kotlin/Native needs this call initializeStateMachine(listOf(coroutineConstructor), coroutineClassThis) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index 62de75f852d..d09edec6452 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -221,7 +221,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) generateSamEqualsHashCodeMethods(boundReceiverVar) } if (isKotlinFunInterface) { - functionReferenceClass.addFakeOverridesViaIncorrectHeuristic() + functionReferenceClass.addFakeOverrides(context.irBuiltIns) } +functionReferenceClass diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/DeepCopyIrTreeWithSymbolsForFakeOverrides.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/DeepCopyIrTreeWithSymbolsForFakeOverrides.kt similarity index 83% rename from compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/DeepCopyIrTreeWithSymbolsForFakeOverrides.kt rename to compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/DeepCopyIrTreeWithSymbolsForFakeOverrides.kt index cd8e4bfb463..900d01cd71c 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/DeepCopyIrTreeWithSymbolsForFakeOverrides.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/DeepCopyIrTreeWithSymbolsForFakeOverrides.kt @@ -1,7 +1,12 @@ -package org.jetbrains.kotlin.backend.common.overrides +/* + * 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. + */ -import org.jetbrains.kotlin.backend.common.DescriptorsToIrRemapper -import org.jetbrains.kotlin.backend.common.WrappedDescriptorPatcher +package org.jetbrains.kotlin.ir.overrides + +import org.jetbrains.kotlin.ir.util.DescriptorsToIrRemapper +import org.jetbrains.kotlin.ir.util.WrappedDescriptorPatcher import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer @@ -84,10 +89,14 @@ class DeepCopyIrTreeWithSymbolsForFakeOverrides(typeArguments: Map() + + for (i in typeParameters.indices) { + val tp = typeParameters[i] + val ta = superArguments[i] + require(ta is IrTypeProjection) { "Unexpected super type argument: $ta @ $i" } + assert(ta.variance == Variance.INVARIANT) { "Unexpected variance in super type argument: ${ta.variance} @$i" } + substitutionMap[tp.symbol] = ta.type + } + + val copier = DeepCopyIrTreeWithSymbolsForFakeOverrides(substitutionMap) + val deepCopyFakeOverride = copier.copy(member, clazz) as IrOverridableMember + deepCopyFakeOverride.parent = clazz + + return deepCopyFakeOverride + } // TODO: this one doesn't belong here. IrOverridingUtil shouldn't know about symbol table. - fun linkFakeOverride(fakeOverride: IrOverridableMember) + abstract fun linkFakeOverride(fakeOverride: IrOverridableMember) // TODO: need to make IrProperty carry overriddenSymbols. - val propertyOverriddenSymbols: MutableMap> + val propertyOverriddenSymbols: MutableMap> = mutableMapOf() } // TODO: @@ -127,6 +143,45 @@ class IrOverridingUtil( } } + fun buildFakeOverridesForClassUsingOverriddenSymbols( + clazz: IrClass, + implementedMembers: List = emptyList() + ): List { + fakeOverrideBuilder.propertyOverriddenSymbols.clear() + + val overriddenMembers = (clazz.declarations.filterIsInstance() + implementedMembers) + .flatMap { + when (it) { + is IrSimpleFunction -> it.overriddenSymbols.map { it.owner } + is IrProperty -> (it.getter ?: it.setter)?.overriddenSymbols + ?.map { it.owner.correspondingPropertySymbol!!.owner } + ?: emptyList() + else -> error("Unexpected IrOverridableMember: $it") + } + } + .toSet() + + val unoverriddenSuperMembers = clazz.superTypes.flatMap { superType -> + val superClass = superType.getClass() ?: error("Unexpected super type: $superType") + superClass.declarations + .filterIsInstance() + .filter { it !in overriddenMembers } + .map { overridenMember -> + val fakeOverride = fakeOverrideBuilder.fakeOverrideMember(superType, overridenMember, clazz) + originals[fakeOverride] = overridenMember + originalSuperTypes[fakeOverride] = superType + fakeOverride + } + } + + val unoverriddenSuperMembersGroupedByName = unoverriddenSuperMembers.groupBy { it.name } + val fakeOverrides = mutableListOf() + for (group in unoverriddenSuperMembersGroupedByName.values) { + createAndBindFakeOverrides(clazz, group, fakeOverrides) + } + return fakeOverrides + } + private fun generateOverridesInFunctionGroup( membersFromSupertypes: List, membersFromCurrent: List, @@ -139,7 +194,9 @@ class IrOverridingUtil( notOverridden.removeAll(bound) } - createAndBindFakeOverrides(current, notOverridden) + val addedFakeOverrides = mutableListOf() + createAndBindFakeOverrides(current, notOverridden, addedFakeOverrides) + current.declarations.addAll(addedFakeOverrides) } private fun extractAndBindOverridesForMember( @@ -150,7 +207,8 @@ class IrOverridingUtil( val overridden = mutableSetOf() for (fromSupertype in descriptorsFromSuper) { val result = isOverridableBy(fromSupertype, fromCurrent/*, current*/).result - val isVisibleForOverride = isVisibleForOverride(fromCurrent, fromSupertype.original) + val isVisibleForOverride = + isVisibleForOverride(fromCurrent, fromSupertype.original) when (result) { OverrideCompatibilityInfo.Result.OVERRIDABLE -> { if (isVisibleForOverride) { @@ -178,7 +236,8 @@ class IrOverridingUtil( private fun createAndBindFakeOverrides( current: IrClass, - notOverridden: Collection + notOverridden: Collection, + addedFakeOverrides: MutableList ) { val fromSuper = notOverridden.toMutableSet() while (fromSuper.isNotEmpty()) { @@ -187,7 +246,7 @@ class IrOverridingUtil( notOverriddenFromSuper, fromSuper ) - createAndBindFakeOverride(overridables, current) + createAndBindFakeOverride(overridables, current, addedFakeOverrides) } } @@ -292,7 +351,8 @@ class IrOverridingUtil( private fun createAndBindFakeOverride( overridables: Collection, - current: IrClass + current: IrClass, + addedFakeOverrides: MutableList ) { val effectiveOverridden = filterVisibleFakeOverrides(overridables) @@ -327,7 +387,7 @@ class IrOverridingUtil( ) { "Overridden symbols should be set for " + CallableMemberDescriptor.Kind.FAKE_OVERRIDE } fakeOverrideBuilder.linkFakeOverride(fakeOverride) - current.declarations.add(fakeOverride) + addedFakeOverrides.add(fakeOverride) } private fun isVisibilityMoreSpecific( @@ -582,7 +642,11 @@ class IrOverridingUtil( } val typeCheckerContext = - IrTypeCheckerContextWithAdditionalAxioms(irBuiltIns, superTypeParameters, subTypeParameters) + IrTypeCheckerContextWithAdditionalAxioms( + irBuiltIns, + superTypeParameters, + subTypeParameters + ) /* TODO: check the bounds. See OverridingUtil.areTypeParametersEquivalent() superTypeParameters.forEachIndexed { index, parameter -> diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrVisibilityUtil.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrVisibilityUtil.kt similarity index 96% rename from compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrVisibilityUtil.kt rename to compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrVisibilityUtil.kt index 5177a76d24d..d604f17b964 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrVisibilityUtil.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrVisibilityUtil.kt @@ -3,7 +3,7 @@ * 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.backend.common.overrides +package org.jetbrains.kotlin.ir.overrides import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithVisibility diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrTypeCheckerUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerUtils.kt similarity index 85% rename from compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrTypeCheckerUtils.kt rename to compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerUtils.kt index 78285f5c7c3..3c1c280b509 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrTypeCheckerUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerUtils.kt @@ -1,8 +1,12 @@ -package org.jetbrains.kotlin.backend.common.overrides +/* + * 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.types import org.jetbrains.kotlin.ir.declarations.IrTypeParameter import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.types.IrTypeCheckerContext import org.jetbrains.kotlin.types.model.TypeConstructorMarker open class IrTypeCheckerContextWithAdditionalAxioms( diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DescriptorsToIrRemapper.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DescriptorsToIrRemapper.kt similarity index 98% rename from compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DescriptorsToIrRemapper.kt rename to compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DescriptorsToIrRemapper.kt index 412a023ac50..8a2299dbbf5 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DescriptorsToIrRemapper.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DescriptorsToIrRemapper.kt @@ -3,7 +3,7 @@ * 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.backend.common +package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI 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 ede7907a138..5fc96b813b3 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 @@ -21,6 +21,9 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor +import org.jetbrains.kotlin.ir.overrides.DeepCopyIrTreeWithSymbolsForFakeOverrides +import org.jetbrains.kotlin.ir.overrides.FakeOverrideBuilderStrategy +import org.jetbrains.kotlin.ir.overrides.IrOverridingUtil import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol @@ -55,43 +58,10 @@ class FakeOverrideBuilder( val signaturer: IdSignatureSerializer, val irBuiltIns: IrBuiltIns, val platformSpecificClassFilter: PlatformFakeOverrideClassFilter = DefaultFakeOverrideClassFilter -) : FakeOverrideBuilderStrategy { +) : FakeOverrideBuilderStrategy() { private val haveFakeOverrides = mutableSetOf() - override val propertyOverriddenSymbols = mutableMapOf>() private val irOverridingUtil = IrOverridingUtil(irBuiltIns, this) - override fun fakeOverrideMember( - superType: IrType, - member: IrOverridableMember, - clazz: IrClass - ): IrOverridableMember { - require(superType is IrSimpleType) { "superType is $superType, expected IrSimpleType" } - val classifier = superType.classifier - require(classifier is IrClassSymbol) { "superType classifier is not IrClassSymbol: $classifier" } - - val typeParameters = extractTypeParameters(classifier.owner) - val superArguments = superType.arguments - assert(typeParameters.size == superArguments.size) { - "typeParameters = $typeParameters size != typeArguments = $superArguments size " - } - - val substitutionMap = mutableMapOf() - - for (i in typeParameters.indices) { - val tp = typeParameters[i] - val ta = superArguments[i] - require(ta is IrTypeProjection) { "Unexpected super type argument: $ta @ $i" } - assert(ta.variance == Variance.INVARIANT) { "Unexpected variance in super type argument: ${ta.variance} @$i" } - substitutionMap[tp.symbol] = ta.type - } - - val copier = DeepCopyIrTreeWithSymbolsForFakeOverrides(substitutionMap) - val deepCopyFakeOverride = copier.copy(member, clazz) as IrOverridableMember - deepCopyFakeOverride.parent = clazz - - return deepCopyFakeOverride - } - fun buildFakeOverrideChainsForClass(clazz: IrClass) { if (haveFakeOverrides.contains(clazz)) return if (!platformSpecificClassFilter.constructFakeOverrides(clazz) || !clazz.symbol.isPublicApi) return