From 2bf0e6744d59ef81ada07b89a407115a683aef45 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 3 Jun 2021 11:58:08 +0300 Subject: [PATCH] FIR2IR: optimize coerceToUnitIfNeeded in implicit cast inserter --- .../fir/backend/Fir2IrImplicitCastInserter.kt | 23 +++++++++++++------ .../kotlin/fir/backend/Fir2IrVisitor.kt | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt index ebe7c9e559f..f365c607582 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt @@ -21,20 +21,16 @@ import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl -import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.makeNotNull -import org.jetbrains.kotlin.ir.types.removeAnnotations -import org.jetbrains.kotlin.ir.types.withHasQuestionMark +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.classId -import org.jetbrains.kotlin.ir.util.coerceToUnitIfNeeded import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.types.AbstractTypeChecker class Fir2IrImplicitCastInserter( - private val components: Fir2IrComponents, - private val visitor: Fir2IrVisitor + private val components: Fir2IrComponents ) : Fir2IrComponents by components, FirDefaultVisitor() { private fun FirTypeRef.toIrType(): IrType = with(typeConverter) { toIrType() } @@ -333,4 +329,17 @@ class Fir2IrImplicitCastInserter( original ) } + + private fun IrExpression.coerceToUnitIfNeeded(valueType: IrType, irBuiltIns: IrBuiltIns): IrExpression { + return if (valueType.isUnit() || valueType.isNothing()) + this + else + IrTypeOperatorCallImpl( + startOffset, endOffset, + irBuiltIns.unitType, + IrTypeOperator.IMPLICIT_COERCION_TO_UNIT, + irBuiltIns.unitType, + this + ) + } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index bab43f871ea..4266f40494d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -52,7 +52,7 @@ class Fir2IrVisitor( private val conversionScope: Fir2IrConversionScope ) : Fir2IrComponents by components, FirDefaultVisitor(), IrGeneratorContextInterface { - internal val implicitCastInserter = Fir2IrImplicitCastInserter(components, this) + internal val implicitCastInserter = Fir2IrImplicitCastInserter(components) private val memberGenerator = ClassMemberGenerator(components, this, conversionScope)