New J2K: Add block statement to run conversion

This commit is contained in:
Simon Ogorodnik
2018-08-29 19:13:29 +03:00
committed by Ilya Kirillov
parent f496a472f4
commit d793769e92
4 changed files with 61 additions and 7 deletions
@@ -28,6 +28,7 @@ object ConversionsRunner {
TypeMappingConversion(context),
FieldToPropertyConversion(),
PrintlnConversion(context),
BlockToRunConversion(context),
AssignmentAsExpressionToAlsoConversion(context),
AssignmentStatementValCreationConversion(context),
AssignmentStatementOperatorConversion(),
@@ -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) {
@@ -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<JKDeclaration>() ?: 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)
}
}
@@ -197,7 +197,7 @@ interface JKLoopStatement : JKStatement {
var body: JKStatement
}
interface JKBlockStatement : JKStatement {
interface JKBlockStatement : JKStatement, JKBranchElement {
var block: JKBlock
}