diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt index bf63ae9d10d..4112375cde5 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt @@ -37,10 +37,8 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.originalKotlinType -import org.jetbrains.kotlin.ir.util.SymbolTable -import org.jetbrains.kotlin.ir.util.TypeTranslator -import org.jetbrains.kotlin.ir.util.coerceToUnit -import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.types.toKotlinType +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid @@ -175,7 +173,7 @@ internal class InsertImplicitCasts( body.transformPostfix { statements.forEachIndexed { i, irStatement -> if (irStatement is IrExpression) { - body.statements[i] = irStatement.coerceToUnit(irBuiltIns) + body.statements[i] = irStatement.coerceToUnit() } } } @@ -191,7 +189,7 @@ internal class InsertImplicitCasts( if (i == lastIndex) irStatement.cast(type) else - irStatement.coerceToUnit(irBuiltIns) + irStatement.coerceToUnit() } } } @@ -199,7 +197,7 @@ internal class InsertImplicitCasts( override fun visitReturn(expression: IrReturn): IrExpression = expression.transformPostfix { value = if (expression.returnTargetSymbol is IrConstructorSymbol) { - value.coerceToUnit(irBuiltIns) + value.coerceToUnit() } else { val returnTargetDescriptor = expression.returnTargetSymbol.descriptor val isLambdaReturnValue = returnTargetDescriptor is AnonymousFunctionDescriptor @@ -262,7 +260,7 @@ internal class InsertImplicitCasts( override fun visitLoop(loop: IrLoop): IrExpression = loop.transformPostfix { condition = condition.cast(builtIns.booleanType) - body = body?.coerceToUnit(irBuiltIns) + body = body?.coerceToUnit() } override fun visitThrow(expression: IrThrow): IrExpression = @@ -278,7 +276,7 @@ internal class InsertImplicitCasts( aCatch.result = aCatch.result.cast(type) } - finallyExpression = finallyExpression?.coerceToUnit(irBuiltIns) + finallyExpression = finallyExpression?.coerceToUnit() } override fun visitTypeOperator(expression: IrTypeOperatorCall): IrExpression = @@ -347,7 +345,7 @@ internal class InsertImplicitCasts( return when { expectedType.isUnit() -> - coerceToUnit(irBuiltIns) + coerceToUnit() valueType.isDynamic() && !expectedType.isDynamic() -> if (expectedType.isNullableAny()) @@ -478,4 +476,17 @@ internal class InsertImplicitCasts( KotlinBuiltIns.isUShort(this) || KotlinBuiltIns.isUInt(this) || KotlinBuiltIns.isULong(this) + + private fun IrExpression.coerceToUnit(): IrExpression { + return if (KotlinTypeChecker.DEFAULT.isSubtypeOf(type.toKotlinType(), irBuiltIns.unitType.toKotlinType())) + this + else + IrTypeOperatorCallImpl( + startOffset, endOffset, + irBuiltIns.unitType, + IrTypeOperator.IMPLICIT_COERCION_TO_UNIT, + irBuiltIns.unitType, + this + ) + } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 23e9acf0317..5f347bcccd0 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -19,8 +19,6 @@ import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.SpecialNames -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -156,23 +154,8 @@ fun IrExpression.isFalseConst() = this is IrConst<*> && this.kind == IrConstKind fun IrExpression.isIntegerConst(value: Int) = this is IrConst<*> && this.kind == IrConstKind.Int && this.value == value -@OptIn(ObsoleteDescriptorBasedAPI::class) fun IrExpression.coerceToUnit(builtins: IrBuiltIns): IrExpression { - return coerceToUnitIfNeeded(type.toKotlinType(), builtins) -} - -@ObsoleteDescriptorBasedAPI -fun IrExpression.coerceToUnitIfNeeded(valueType: KotlinType, irBuiltIns: IrBuiltIns): IrExpression { - return if (KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType, irBuiltIns.unitType.toKotlinType())) - this - else - IrTypeOperatorCallImpl( - startOffset, endOffset, - irBuiltIns.unitType, - IrTypeOperator.IMPLICIT_COERCION_TO_UNIT, - irBuiltIns.unitType, - this - ) + return coerceToUnitIfNeeded(type, builtins) } fun IrExpression.coerceToUnitIfNeeded(valueType: IrType, irBuiltIns: IrBuiltIns): IrExpression {