New J2K: Add init block
This commit is contained in:
committed by
Ilya Kirillov
parent
b6239a9130
commit
baa9b714d1
@@ -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 ")
|
||||
|
||||
+10
-3
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user