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),
|
TypeMappingConversion(context),
|
||||||
FieldToPropertyConversion(),
|
FieldToPropertyConversion(),
|
||||||
PrintlnConversion(context),
|
PrintlnConversion(context),
|
||||||
|
BlockToRunConversion(context),
|
||||||
AssignmentAsExpressionToAlsoConversion(context),
|
AssignmentAsExpressionToAlsoConversion(context),
|
||||||
AssignmentStatementValCreationConversion(context),
|
AssignmentStatementValCreationConversion(context),
|
||||||
AssignmentStatementOperatorConversion(),
|
AssignmentStatementOperatorConversion(),
|
||||||
|
|||||||
@@ -426,12 +426,20 @@ class NewCodeBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitLambdaExpression(lambdaExpression: JKLambdaExpression) {
|
override fun visitLambdaExpression(lambdaExpression: JKLambdaExpression) {
|
||||||
printer.printWithNoIndent("{")
|
printer.par(CURVED_MULTILINE) {
|
||||||
lambdaExpression.parameters.firstOrNull()?.accept(this)
|
lambdaExpression.parameters.firstOrNull()?.accept(this)
|
||||||
lambdaExpression.parameters.asSequence().drop(1).forEach { printer.printWithNoIndent(", "); it.accept(this) }
|
lambdaExpression.parameters.asSequence().drop(1).forEach { printer.printWithNoIndent(", "); it.accept(this) }
|
||||||
printer.printWithNoIndent(" -> ")
|
if (lambdaExpression.parameters.isNotEmpty()) {
|
||||||
lambdaExpression.statement.accept(this)
|
printer.printWithNoIndent(" -> ")
|
||||||
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) {
|
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
|
var body: JKStatement
|
||||||
}
|
}
|
||||||
|
|
||||||
interface JKBlockStatement : JKStatement {
|
interface JKBlockStatement : JKStatement, JKBranchElement {
|
||||||
var block: JKBlock
|
var block: JKBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user