FIR2IR: optimize coerceToUnitIfNeeded in implicit cast inserter
This commit is contained in:
+16
-7
@@ -21,20 +21,16 @@ import org.jetbrains.kotlin.fir.typeContext
|
|||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
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.util.classId
|
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.ir.util.parentAsClass
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
|
|
||||||
class Fir2IrImplicitCastInserter(
|
class Fir2IrImplicitCastInserter(
|
||||||
private val components: Fir2IrComponents,
|
private val components: Fir2IrComponents
|
||||||
private val visitor: Fir2IrVisitor
|
|
||||||
) : Fir2IrComponents by components, FirDefaultVisitor<IrElement, IrElement>() {
|
) : Fir2IrComponents by components, FirDefaultVisitor<IrElement, IrElement>() {
|
||||||
|
|
||||||
private fun FirTypeRef.toIrType(): IrType = with(typeConverter) { toIrType() }
|
private fun FirTypeRef.toIrType(): IrType = with(typeConverter) { toIrType() }
|
||||||
@@ -333,4 +329,17 @@ class Fir2IrImplicitCastInserter(
|
|||||||
original
|
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
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class Fir2IrVisitor(
|
|||||||
private val conversionScope: Fir2IrConversionScope
|
private val conversionScope: Fir2IrConversionScope
|
||||||
) : Fir2IrComponents by components, FirDefaultVisitor<IrElement, Any?>(), IrGeneratorContextInterface {
|
) : Fir2IrComponents by components, FirDefaultVisitor<IrElement, Any?>(), IrGeneratorContextInterface {
|
||||||
|
|
||||||
internal val implicitCastInserter = Fir2IrImplicitCastInserter(components, this)
|
internal val implicitCastInserter = Fir2IrImplicitCastInserter(components)
|
||||||
|
|
||||||
private val memberGenerator = ClassMemberGenerator(components, this, conversionScope)
|
private val memberGenerator = ClassMemberGenerator(components, this, conversionScope)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user