Coerce finally expression to Unit

This commit is contained in:
Dmitry Petrov
2016-09-21 12:44:41 +03:00
parent 663eb21990
commit 7e7bc127d1
@@ -61,7 +61,7 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi
body.statements.forEachIndexed { i, irStatement -> body.statements.forEachIndexed { i, irStatement ->
if (irStatement is IrExpression) { if (irStatement is IrExpression) {
body.statements[i] = irStatement.coerceToUnit(builtIns.unitType) body.statements[i] = irStatement.coerceToUnit()
} }
} }
@@ -83,7 +83,7 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi
if (i == lastIndex) if (i == lastIndex)
irStatement.cast(type) irStatement.cast(type)
else else
irStatement.coerceToUnit(builtIns.unitType) irStatement.coerceToUnit()
} }
} }
@@ -145,7 +145,7 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi
loop.condition = loop.condition.cast(builtIns.booleanType) loop.condition = loop.condition.cast(builtIns.booleanType)
loop.body = loop.body?.coerceToUnit(builtIns.unitType) loop.body = loop.body?.coerceToUnit()
return loop return loop
} }
@@ -169,6 +169,8 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi
aCatch.result = aCatch.result.cast(resultType) aCatch.result = aCatch.result.cast(resultType)
} }
aTry.finallyExpression = aTry.finallyExpression?.coerceToUnit()
return aTry return aTry
} }
@@ -192,7 +194,7 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi
if (expectedType.isError) return this if (expectedType.isError) return this
if (KotlinBuiltIns.isUnit(expectedType)) return coerceToUnit(expectedType) if (KotlinBuiltIns.isUnit(expectedType)) return coerceToUnit()
val valueType = this.type val valueType = this.type
@@ -212,12 +214,14 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi
return this return this
} }
private fun IrExpression.coerceToUnit(unitType: KotlinType): IrExpression { private fun IrExpression.coerceToUnit(): IrExpression {
val valueType = this.type val valueType = this.type
if (KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType, unitType)) return this return if (KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType, builtIns.unitType))
this
return IrTypeOperatorCallImpl(startOffset, endOffset, unitType, IrTypeOperator.IMPLICIT_COERCION_TO_UNIT, unitType, this) else
IrTypeOperatorCallImpl(startOffset, endOffset, builtIns.unitType,
IrTypeOperator.IMPLICIT_COERCION_TO_UNIT, builtIns.unitType, this)
} }
} }