diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 05ba97378d5..86769ee05bb 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -28,6 +28,7 @@ object ConversionsRunner { TypeMappingConversion(context), FieldToPropertyConversion(), PrintlnConversion(context), + BlockToRunConversion(context), AssignmentAsExpressionToAlsoConversion(context), AssignmentStatementValCreationConversion(context), AssignmentStatementOperatorConversion(), diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 66e0e03ca8b..a1a26d86d47 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -426,12 +426,20 @@ class NewCodeBuilder { } override fun visitLambdaExpression(lambdaExpression: JKLambdaExpression) { - printer.printWithNoIndent("{") - lambdaExpression.parameters.firstOrNull()?.accept(this) - lambdaExpression.parameters.asSequence().drop(1).forEach { printer.printWithNoIndent(", "); it.accept(this) } - printer.printWithNoIndent(" -> ") - lambdaExpression.statement.accept(this) - printer.printWithNoIndent("}") + printer.par(CURVED_MULTILINE) { + lambdaExpression.parameters.firstOrNull()?.accept(this) + lambdaExpression.parameters.asSequence().drop(1).forEach { printer.printWithNoIndent(", "); it.accept(this) } + if (lambdaExpression.parameters.isNotEmpty()) { + printer.printWithNoIndent(" -> ") + } + + val statement = lambdaExpression.statement + if (statement is JKBlockStatement) { + statement.block.statements.forEach { it.accept(this) } + } else { + statement.accept(this) + } + } } override fun visitBlockStatement(blockStatement: JKBlockStatement) { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BlockToRunConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BlockToRunConversion.kt new file mode 100644 index 00000000000..cf506adca92 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BlockToRunConversion.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.j2k.ConversionContext +import org.jetbrains.kotlin.j2k.ast.Nullability +import org.jetbrains.kotlin.j2k.tree.JKBlock +import org.jetbrains.kotlin.j2k.tree.JKBlockStatement +import org.jetbrains.kotlin.j2k.tree.JKDeclaration +import org.jetbrains.kotlin.j2k.tree.JKTreeElement +import org.jetbrains.kotlin.j2k.tree.impl.* +import org.jetbrains.kotlin.name.ClassId + +class BlockToRunConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKBlockStatement) return recurse(element) + + if (element.parent !is JKBlock) return recurse(element) + + val parentDeclaration = element.parentOfType() ?: return recurse(element) + val psiContext = context.backAnnotator(parentDeclaration) ?: return recurse(element) + + val unitType = + context.symbolProvider.provideDirectSymbol( + resolveFqName(ClassId.topLevel(KotlinBuiltIns.FQ_NAMES.unit.toSafe()), psiContext)!! + ) + val runSymbol = context.symbolProvider.provideDirectSymbol( + multiResolveFqName(ClassId.fromString("kotlin/run"), psiContext).first() + ) + + element.invalidate() + val lambda = JKLambdaExpressionImpl( + emptyList(), + JKTypeElementImpl(JKClassTypeImpl(unitType as JKClassSymbol, emptyList(), Nullability.NotNull)), + JKBlockStatementImpl(element.block) + ) + val call = JKKtCallExpressionImpl(runSymbol as JKMethodSymbol, JKExpressionListImpl(listOf(lambda))) + return recurse(call) + } + +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 4e822786fe1..e3e75627deb 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -197,7 +197,7 @@ interface JKLoopStatement : JKStatement { var body: JKStatement } -interface JKBlockStatement : JKStatement { +interface JKBlockStatement : JKStatement, JKBranchElement { var block: JKBlock }