From b5def88ff4d47f2eecd91d6b9add3ba68b91aa6b Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Tue, 12 Dec 2023 13:35:59 +0100 Subject: [PATCH] [Wasm] NFC refactor: eraseGenerics -> toWasmSignatureType Use a more concrete name, make it private, and split out: IrSimpleType.toWasmSignatureSimpleType This does not change the behavior, but helps to set the stage for the following bugfix (KT-58852) --- .../ir/backend/js/utils/TypeTranformer.kt | 7 ----- .../kotlin/backend/wasm/ir2wasm/ClassInfo.kt | 27 ++++++++++++------- .../org/jetbrains/kotlin/ir/types/irTypes.kt | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/TypeTranformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/TypeTranformer.kt index 25a00839e3e..010d7d4d8aa 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/TypeTranformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/TypeTranformer.kt @@ -13,13 +13,6 @@ import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.defaultType -fun IrType.eraseGenerics(irBuiltIns: IrBuiltIns): IrType { - if (this is IrDynamicType) return this - if (this is IrErrorType) return this - val defaultType = this.erasedUpperBound?.defaultType ?: irBuiltIns.anyType - if (!this.isNullable()) return defaultType - return defaultType.makeNullable() -} // Return null if upper bound is Any private val IrTypeParameter.erasedUpperBound: IrClass? diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/ClassInfo.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/ClassInfo.kt index cf89dc70773..0c36dcebc8c 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/ClassInfo.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/ClassInfo.kt @@ -5,21 +5,17 @@ package org.jetbrains.kotlin.backend.wasm.ir2wasm -import org.jetbrains.kotlin.ir.util.isOverridableOrOverrides import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrBuiltIns -import org.jetbrains.kotlin.ir.backend.js.utils.eraseGenerics +import org.jetbrains.kotlin.ir.backend.js.utils.erasedUpperBound import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction -import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.classifierOrFail -import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable -import org.jetbrains.kotlin.ir.util.isInterface -import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.Name data class WasmSignature( @@ -45,12 +41,23 @@ data class WasmSignature( fun IrSimpleFunction.wasmSignature(irBuiltIns: IrBuiltIns): WasmSignature = WasmSignature( name, - extensionReceiverParameter?.type?.eraseGenerics(irBuiltIns), - valueParameters.map { it.type.eraseGenerics(irBuiltIns) }, - returnType.eraseGenerics(irBuiltIns), + extensionReceiverParameter?.type?.toWasmSignatureType(irBuiltIns), + valueParameters.map { it.type.toWasmSignatureType(irBuiltIns) }, + returnType.toWasmSignatureType(irBuiltIns), isOverridableOrOverrides ) +private fun IrType.toWasmSignatureType(irBuiltIns: IrBuiltIns): IrType = + when (this) { + is IrSimpleType -> toWasmSignatureSimpleType(irBuiltIns) + else -> this + } + +private fun IrSimpleType.toWasmSignatureSimpleType(irBuiltIns: IrBuiltIns): IrSimpleType { + val klass = (this.erasedUpperBound?.symbol ?: irBuiltIns.anyClass).owner + return klass.defaultType.withNullability(this.isNullable()) +} + class VirtualMethodMetadata( val function: IrSimpleFunction, val signature: WasmSignature diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt index 5b75723096e..55a45dbb6fe 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt @@ -31,7 +31,7 @@ private fun IrType.withNullability(newNullability: Boolean): IrType = else -> this } -private fun IrSimpleType.withNullability(newNullability: Boolean): IrSimpleType { +fun IrSimpleType.withNullability(newNullability: Boolean): IrSimpleType { val requiredNullability = if (newNullability) SimpleTypeNullability.MARKED_NULLABLE else SimpleTypeNullability.DEFINITELY_NOT_NULL return if (nullability == requiredNullability) this