New J2K: Add init block

This commit is contained in:
Ilya Kirillov
2018-10-09 15:35:29 +03:00
committed by Ilya Kirillov
parent b6239a9130
commit baa9b714d1
6 changed files with 39 additions and 3 deletions
@@ -184,6 +184,15 @@ class NewCodeBuilder {
printer.printlnWithNoIndent()
}
override fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration) {
if (ktInitDeclaration.block.statements.isNotEmpty()) {
printer.print("init ")
printer.block(multiline = true) {
ktInitDeclaration.block.statements.forEach { it.accept(this) }
}
}
}
override fun visitKtIsExpression(ktIsExpression: JKKtIsExpression) {
ktIsExpression.expression.accept(this)
printer.printWithNoIndent(" is ")
@@ -5,9 +5,9 @@
package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.copyTree
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaFieldImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKNameIdentifierImpl
import org.jetbrains.kotlin.j2k.tree.impl.*
class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversion() {
@@ -16,6 +16,8 @@ class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversio
}
override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) {
val containingClass = ktPrimaryConstructor.parentOfType<JKClass>() ?: return
val removedStatements = mutableListOf<JKStatement>()
for (constructorStatement in ktPrimaryConstructor.block.statements) {
val assignmentExpression =
(constructorStatement as? JKExpressionStatement)?.expression as? JKJavaAssignmentExpression ?: continue
@@ -25,7 +27,6 @@ class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversio
val parameter =
(assignmentExpression.expression as? JKFieldAccessExpression)?.identifier?.target as? JKParameter ?: continue
if (ktPrimaryConstructor.parameters.contains(parameter)) {
val containingClass = ktPrimaryConstructor.parentOfType<JKClass>() ?: continue
val fieldDeclaration = containingClass.declarationList.find {
(it as? JKField)?.name?.value == fieldTarget.name.value
} ?: continue
@@ -36,8 +37,14 @@ class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversio
parameter.name = JKNameIdentifierImpl(fieldTarget.name.value)
}
somethingChanged = true
removedStatements += constructorStatement
}
}
ktPrimaryConstructor.block.statements -= removedStatements
if (ktPrimaryConstructor.block.statements.isNotEmpty()) {
ktPrimaryConstructor.block.detach(ktPrimaryConstructor)
containingClass.getOrCreateInitDeclaration().block = ktPrimaryConstructor.block
}
}
private fun JKJavaAssignmentExpression.smartField(): JKFieldAccessExpression? {
@@ -252,4 +252,17 @@ class JKKtIsExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKKt
override var expression by child(expression)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtIsExpression(this, data)
}
class JKKtInitDeclarationImpl(block: JKBlock) : JKKtInitDeclaration, JKBranchElementBase() {
override var block: JKBlock by child(block)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtInitDeclaration(this, data)
}
fun JKClass.getOrCreateInitDeclaration(): JKKtInitDeclaration {
val existingDeclaration = declarationList.filterIsInstance<JKKtInitDeclaration>().firstOrNull()
if (existingDeclaration != null) return existingDeclaration
val newDeclaration = JKKtInitDeclarationImpl(JKBlockImpl())
declarationList += newDeclaration
return newDeclaration
}
@@ -79,4 +79,8 @@ interface JKKtValueWhenLabel : JKKtWhenLabel {
interface JKKtIsExpression : JKExpression {
var expression: JKExpression
var type: JKTypeElement
}
interface JKKtInitDeclaration : JKDeclaration {
var block: JKBlock
}
@@ -89,4 +89,5 @@ interface JKVisitor<out R, in D> {
fun visitKtElseWhenLabel(ktElseWhenLabel: JKKtElseWhenLabel, data: D): R = visitKtWhenLabel(ktElseWhenLabel, data)
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: D): R = visitKtWhenLabel(ktValueWhenLabel, data)
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: D): R = visitExpression(ktIsExpression, data)
fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration, data: D): R = visitDeclaration(ktInitDeclaration, data)
}
@@ -175,4 +175,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: Nothing?) = visitKtValueWhenLabel(ktValueWhenLabel)
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression) = visitExpression(ktIsExpression, null)
override fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: Nothing?) = visitKtIsExpression(ktIsExpression)
fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration) = visitDeclaration(ktInitDeclaration, null)
override fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration, data: Nothing?) = visitKtInitDeclaration(ktInitDeclaration)
}