IR: remove .toKotlinType() usage from coerceToUnit calls in lowerings
This commit is contained in:
+21
-10
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user