IR: remove .toKotlinType() usage from coerceToUnit calls in lowerings

This commit is contained in:
Georgy Bronnikov
2020-09-11 13:04:49 +03:00
parent 6a55475392
commit 3c0fbd5f45
2 changed files with 22 additions and 28 deletions
@@ -37,10 +37,8 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.types.toKotlinType
import org.jetbrains.kotlin.ir.util.TypeTranslator import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.coerceToUnit
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -175,7 +173,7 @@ internal class InsertImplicitCasts(
body.transformPostfix { body.transformPostfix {
statements.forEachIndexed { i, irStatement -> statements.forEachIndexed { i, irStatement ->
if (irStatement is IrExpression) { 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) if (i == lastIndex)
irStatement.cast(type) irStatement.cast(type)
else else
irStatement.coerceToUnit(irBuiltIns) irStatement.coerceToUnit()
} }
} }
} }
@@ -199,7 +197,7 @@ internal class InsertImplicitCasts(
override fun visitReturn(expression: IrReturn): IrExpression = override fun visitReturn(expression: IrReturn): IrExpression =
expression.transformPostfix { expression.transformPostfix {
value = if (expression.returnTargetSymbol is IrConstructorSymbol) { value = if (expression.returnTargetSymbol is IrConstructorSymbol) {
value.coerceToUnit(irBuiltIns) value.coerceToUnit()
} else { } else {
val returnTargetDescriptor = expression.returnTargetSymbol.descriptor val returnTargetDescriptor = expression.returnTargetSymbol.descriptor
val isLambdaReturnValue = returnTargetDescriptor is AnonymousFunctionDescriptor val isLambdaReturnValue = returnTargetDescriptor is AnonymousFunctionDescriptor
@@ -262,7 +260,7 @@ internal class InsertImplicitCasts(
override fun visitLoop(loop: IrLoop): IrExpression = override fun visitLoop(loop: IrLoop): IrExpression =
loop.transformPostfix { loop.transformPostfix {
condition = condition.cast(builtIns.booleanType) condition = condition.cast(builtIns.booleanType)
body = body?.coerceToUnit(irBuiltIns) body = body?.coerceToUnit()
} }
override fun visitThrow(expression: IrThrow): IrExpression = override fun visitThrow(expression: IrThrow): IrExpression =
@@ -278,7 +276,7 @@ internal class InsertImplicitCasts(
aCatch.result = aCatch.result.cast(type) aCatch.result = aCatch.result.cast(type)
} }
finallyExpression = finallyExpression?.coerceToUnit(irBuiltIns) finallyExpression = finallyExpression?.coerceToUnit()
} }
override fun visitTypeOperator(expression: IrTypeOperatorCall): IrExpression = override fun visitTypeOperator(expression: IrTypeOperatorCall): IrExpression =
@@ -347,7 +345,7 @@ internal class InsertImplicitCasts(
return when { return when {
expectedType.isUnit() -> expectedType.isUnit() ->
coerceToUnit(irBuiltIns) coerceToUnit()
valueType.isDynamic() && !expectedType.isDynamic() -> valueType.isDynamic() && !expectedType.isDynamic() ->
if (expectedType.isNullableAny()) if (expectedType.isNullableAny())
@@ -478,4 +476,17 @@ internal class InsertImplicitCasts(
KotlinBuiltIns.isUShort(this) || KotlinBuiltIns.isUShort(this) ||
KotlinBuiltIns.isUInt(this) || KotlinBuiltIns.isUInt(this) ||
KotlinBuiltIns.isULong(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
)
}
} }
@@ -19,8 +19,6 @@ import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.SpecialNames 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.DFS
import org.jetbrains.kotlin.utils.addToStdlib.safeAs 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 fun IrExpression.isIntegerConst(value: Int) = this is IrConst<*> && this.kind == IrConstKind.Int && this.value == value
@OptIn(ObsoleteDescriptorBasedAPI::class)
fun IrExpression.coerceToUnit(builtins: IrBuiltIns): IrExpression { fun IrExpression.coerceToUnit(builtins: IrBuiltIns): IrExpression {
return coerceToUnitIfNeeded(type.toKotlinType(), builtins) return coerceToUnitIfNeeded(type, 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
)
} }
fun IrExpression.coerceToUnitIfNeeded(valueType: IrType, irBuiltIns: IrBuiltIns): IrExpression { fun IrExpression.coerceToUnitIfNeeded(valueType: IrType, irBuiltIns: IrBuiltIns): IrExpression {