FIR: Fix 2^n transform complexity in blocks/whens

This commit is contained in:
Simon Ogorodnik
2019-03-20 19:16:54 +03:00
parent 6799eeb084
commit 3e7e9269ab
@@ -257,8 +257,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
override fun transformBlock(block: FirBlock, data: Any?): CompositeTransformResult<FirStatement> { override fun transformBlock(block: FirBlock, data: Any?): CompositeTransformResult<FirStatement> {
val block = super.transformBlock(block, data).single as FirBlock
block.transformChildren(this, data)
val statement = block.statements.lastOrNull() val statement = block.statements.lastOrNull()
val resultExpression = when (statement) { val resultExpression = when (statement) {
@@ -267,7 +266,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
else -> null else -> null
} }
resultExpression?.resultType?.let { bindingContext[block] = it } resultExpression?.resultType?.let { bindingContext[block] = it }
return super.transformBlock(block, data) return block.compose()
} }
private fun commonSuperType(types: List<FirTypeRef>): FirTypeRef? { private fun commonSuperType(types: List<FirTypeRef>): FirTypeRef? {
@@ -275,12 +274,12 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
} }
override fun transformWhenExpression(whenExpression: FirWhenExpression, data: Any?): CompositeTransformResult<FirStatement> { override fun transformWhenExpression(whenExpression: FirWhenExpression, data: Any?): CompositeTransformResult<FirStatement> {
val whenExpression = super.transformWhenExpression(whenExpression, data).single as FirWhenExpression
val type = commonSuperType(whenExpression.branches.mapNotNull { val type = commonSuperType(whenExpression.branches.mapNotNull {
it.result.visitNoTransform(this, data)
it.result.resultType it.result.resultType
}) })
if (type != null) bindingContext[whenExpression] = type if (type != null) bindingContext[whenExpression] = type
return super.transformWhenExpression(whenExpression, data) return whenExpression.compose()
} }
override fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: Any?): CompositeTransformResult<FirStatement> { override fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: Any?): CompositeTransformResult<FirStatement> {