From c7ea8b1ab6e961d41271f78fc783b213745f3d28 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 21 Oct 2020 21:43:05 +0300 Subject: [PATCH] [Private fake overrides] Prepare IdSignature for private fake override construction --- .../kotlin/ir/overrides/IrOverridingUtil.kt | 15 ++++++++++ .../jetbrains/kotlin/ir/util/IdSignature.kt | 4 +-- .../signature/IdSignatureDescriptor.kt | 1 + .../signature/IdSignatureSerializer.kt | 29 +++++++++++++++++-- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt index a01ac7eb86b..7f4fd58a8c2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt @@ -745,3 +745,18 @@ class IrOverridingUtil( } } } + +fun IrSimpleFunction.isOverridableFunction(): Boolean = + this.visibility != DescriptorVisibilities.PRIVATE && + this.dispatchReceiverParameter != null + +fun IrProperty.isOverridableProperty(): Boolean = + this.visibility != DescriptorVisibilities.PRIVATE && + (this.getter?.dispatchReceiverParameter != null || + this.setter?.dispatchReceiverParameter != null) + +fun IrDeclaration.isOverridableMemberOrAccessor(): Boolean = when(this) { + is IrSimpleFunction -> isOverridableFunction() + is IrProperty -> isOverridableProperty() + else -> false +} \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IdSignature.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IdSignature.kt index 4f0d5ceff7a..7c47602d92e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IdSignature.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IdSignature.kt @@ -135,9 +135,9 @@ sealed class IdSignature { override fun render(): String = "${container.render()}:$id" override fun equals(other: Any?): Boolean = - other is FileLocalSignature && id == other.id + other is FileLocalSignature && id == other.id && container == other.container - override fun hashCode(): Int = id.toInt() + override fun hashCode(): Int = container.hashCode() * 31 + id.hashCode() } // Used to reference local variable and value parameters in function diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt index c97fcfef86a..049a4130089 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.common.serialization.signature import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.descriptors.WrappedDeclarationDescriptor import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignatureComposer diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt index 2e3f744deb3..3d35498771b 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.common.serialization.signature import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.overrides.isOverridableFunction +import org.jetbrains.kotlin.ir.overrides.isOverridableProperty import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.KotlinMangler import org.jetbrains.kotlin.ir.util.render @@ -22,7 +24,7 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna } else null } - private fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature { + fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature { return if (mangler.run { declaration.isExported() }) { composePublicIdSignature(declaration) } else composeFileLocalIdSignature(declaration) @@ -30,6 +32,8 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna private var localIndex: Long = 0 private var scopeIndex: Int = 0 + + // TODO: we need to disentangle signature construction with declaration tables. lateinit var table: DeclarationTable fun reset() { @@ -122,9 +126,28 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna IdSignature.FileLocalSignature(p, ++localIndex) } is IrSimpleFunction -> { + val parent = declaration.parent val p = declaration.correspondingPropertySymbol?.let { composeSignatureForDeclaration(it.owner) } - ?: composeContainerIdSignature(declaration.parent) - IdSignature.FileLocalSignature(p, ++localIndex) + ?: composeContainerIdSignature(parent) + IdSignature.FileLocalSignature( + p, + if (declaration.isOverridableFunction()) { + mangler.run { declaration.signatureMangle } + } else { + ++localIndex + } + ) + } + is IrProperty -> { + val parent = declaration.parent + IdSignature.FileLocalSignature( + composeContainerIdSignature(parent), + if (declaration.isOverridableProperty()) { + mangler.run { declaration.signatureMangle } + } else { + ++localIndex + } + ) } else -> IdSignature.FileLocalSignature(composeContainerIdSignature(declaration.parent), ++localIndex) }