diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index b3a9b5a1a63..87b916322c1 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -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 ") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldInitializersInPrimaryFromParamsConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldInitializersInPrimaryFromParamsConversion.kt index cf2384dc8c6..7811949d476 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldInitializersInPrimaryFromParamsConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldInitializersInPrimaryFromParamsConversion.kt @@ -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() ?: return + val removedStatements = mutableListOf() 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() ?: 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? { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index 93169a51ff5..8dd5a372bb6 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -252,4 +252,17 @@ class JKKtIsExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKKt override var expression by child(expression) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtIsExpression(this, data) +} + +class JKKtInitDeclarationImpl(block: JKBlock) : JKKtInitDeclaration, JKBranchElementBase() { + override var block: JKBlock by child(block) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtInitDeclaration(this, data) +} + +fun JKClass.getOrCreateInitDeclaration(): JKKtInitDeclaration { + val existingDeclaration = declarationList.filterIsInstance().firstOrNull() + if (existingDeclaration != null) return existingDeclaration + val newDeclaration = JKKtInitDeclarationImpl(JKBlockImpl()) + declarationList += newDeclaration + return newDeclaration } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt index 63fea84abcf..2570ef9a14c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt @@ -79,4 +79,8 @@ interface JKKtValueWhenLabel : JKKtWhenLabel { interface JKKtIsExpression : JKExpression { var expression: JKExpression var type: JKTypeElement +} + +interface JKKtInitDeclaration : JKDeclaration { + var block: JKBlock } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index 0e5358b0f04..d09b261cfdc 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -89,4 +89,5 @@ interface JKVisitor { 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) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index 7cc8ad7afc2..97b76cefc66 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -175,4 +175,6 @@ interface JKVisitorVoid : JKVisitor { 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) }