New J2K: Add block statement to run conversion
This commit is contained in:
committed by
Ilya Kirillov
parent
f496a472f4
commit
d793769e92
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user