From 9fcdb7dde777f9a77169c95a7a475367029cb5a7 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 26 Jan 2019 03:01:04 +0300 Subject: [PATCH] New J2K: Fix statement conversion in a case of inner blocks --- .../conversions/SwitchStatementConversion.kt | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SwitchStatementConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SwitchStatementConversion.kt index b3f98a503df..0f3f918d9f9 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SwitchStatementConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SwitchStatementConversion.kt @@ -10,7 +10,9 @@ import com.intellij.psi.controlFlow.ControlFlowFactory import com.intellij.psi.controlFlow.ControlFlowUtil import com.intellij.psi.controlFlow.LocalsOrMyInstanceFieldsControlFlowPolicy import org.jetbrains.kotlin.j2k.ConversionContext +import org.jetbrains.kotlin.j2k.blockStatement import org.jetbrains.kotlin.j2k.copyTreeAndDetach +import org.jetbrains.kotlin.j2k.runExpression import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.impl.* @@ -39,14 +41,20 @@ class SwitchStatementConversion(private val context: ConversionContext) : Recurs val statements = cases .takeWhileInclusive { it.statements.fallsThrough() } .flatMap { it.statements } - .flatMap { it.singleListOrBlockStatements() } - .takeWhile { !isSwitchBreak(it) } - .map { it.copyTreeAndDetach() } - .let { - if (it.size == 1 && cases.first().statements.singleOrNull() is JKBlockStatement) - listOf(JKBlockStatementImpl(JKBlockImpl(it))) - else it + .takeWhileInclusive { it.singleListOrBlockStatements().none { isSwitchBreak(it) } } + .mapNotNull { statement -> + when { + statement is JKBlockStatement -> + blockStatement( + statement.block.statements + .takeWhile { !isSwitchBreak(it) } + .map { it.copyTreeAndDetach() } + ) + isSwitchBreak(statement) -> null + else -> statement.copyTreeAndDetach() + } } + val javaLabels = cases .takeWhileInclusive { it.statements.isEmpty() } @@ -56,12 +64,12 @@ class SwitchStatementConversion(private val context: ConversionContext) : Recurs val elseLabel = javaLabels .find { it is JKJavaDefaultSwitchCaseImpl } ?.let { JKKtElseWhenLabelImpl() } - val elseWhenCase = elseLabel?.let { - JKKtWhenCaseImpl(listOf(it), statements.map { it.copyTreeAndDetach() }.blockOrSingle()) + val elseWhenCase = elseLabel?.let { label -> + JKKtWhenCaseImpl(listOf(label), statements.map { it.copyTreeAndDetach() }.singleBlockOrWrapToRun()) } val mainWhenCase = if (statementLabels.isNotEmpty()) { - JKKtWhenCaseImpl(statementLabels, statements.blockOrSingle()) + JKKtWhenCaseImpl(statementLabels, statements.singleBlockOrWrapToRun()) } else null listOfNotNull(mainWhenCase) + listOfNotNull(elseWhenCase) + @@ -71,9 +79,19 @@ class SwitchStatementConversion(private val context: ConversionContext) : Recurs private fun List.takeWhileInclusive(predicate: (T) -> Boolean): List = takeWhile(predicate) + listOfNotNull(find { !predicate(it) }) - private fun List.blockOrSingle(): JKStatement = + private fun List.singleBlockOrWrapToRun(): JKStatement = singleOrNull() - ?: JKBlockStatementImpl(JKBlockImpl(this)) + ?: JKBlockStatementImpl( + JKBlockImpl(map { statement -> + when (statement) { + is JKBlockStatement -> + JKExpressionStatementImpl( + runExpression(statement, context.symbolProvider) + ) + else -> statement + } + }) + ) private fun JKStatement.singleListOrBlockStatements(): List =