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()
|
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) {
|
override fun visitKtIsExpression(ktIsExpression: JKKtIsExpression) {
|
||||||
ktIsExpression.expression.accept(this)
|
ktIsExpression.expression.accept(this)
|
||||||
printer.printWithNoIndent(" is ")
|
printer.printWithNoIndent(" is ")
|
||||||
|
|||||||
+10
-3
@@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k.conversions
|
package org.jetbrains.kotlin.j2k.conversions
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.j2k.copyTree
|
||||||
import org.jetbrains.kotlin.j2k.tree.*
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaFieldImpl
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.JKNameIdentifierImpl
|
|
||||||
|
|
||||||
|
|
||||||
class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversion() {
|
class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversion() {
|
||||||
@@ -16,6 +16,8 @@ class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversio
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) {
|
override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) {
|
||||||
|
val containingClass = ktPrimaryConstructor.parentOfType<JKClass>() ?: return
|
||||||
|
val removedStatements = mutableListOf<JKStatement>()
|
||||||
for (constructorStatement in ktPrimaryConstructor.block.statements) {
|
for (constructorStatement in ktPrimaryConstructor.block.statements) {
|
||||||
val assignmentExpression =
|
val assignmentExpression =
|
||||||
(constructorStatement as? JKExpressionStatement)?.expression as? JKJavaAssignmentExpression ?: continue
|
(constructorStatement as? JKExpressionStatement)?.expression as? JKJavaAssignmentExpression ?: continue
|
||||||
@@ -25,7 +27,6 @@ class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversio
|
|||||||
val parameter =
|
val parameter =
|
||||||
(assignmentExpression.expression as? JKFieldAccessExpression)?.identifier?.target as? JKParameter ?: continue
|
(assignmentExpression.expression as? JKFieldAccessExpression)?.identifier?.target as? JKParameter ?: continue
|
||||||
if (ktPrimaryConstructor.parameters.contains(parameter)) {
|
if (ktPrimaryConstructor.parameters.contains(parameter)) {
|
||||||
val containingClass = ktPrimaryConstructor.parentOfType<JKClass>() ?: continue
|
|
||||||
val fieldDeclaration = containingClass.declarationList.find {
|
val fieldDeclaration = containingClass.declarationList.find {
|
||||||
(it as? JKField)?.name?.value == fieldTarget.name.value
|
(it as? JKField)?.name?.value == fieldTarget.name.value
|
||||||
} ?: continue
|
} ?: continue
|
||||||
@@ -36,8 +37,14 @@ class FieldInitializersInPrimaryFromParamsConversion : TransformerBasedConversio
|
|||||||
parameter.name = JKNameIdentifierImpl(fieldTarget.name.value)
|
parameter.name = JKNameIdentifierImpl(fieldTarget.name.value)
|
||||||
}
|
}
|
||||||
somethingChanged = true
|
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? {
|
private fun JKJavaAssignmentExpression.smartField(): JKFieldAccessExpression? {
|
||||||
|
|||||||
@@ -252,4 +252,17 @@ class JKKtIsExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKKt
|
|||||||
override var expression by child(expression)
|
override var expression by child(expression)
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtIsExpression(this, data)
|
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 {
|
interface JKKtIsExpression : JKExpression {
|
||||||
var expression: JKExpression
|
var expression: JKExpression
|
||||||
var type: JKTypeElement
|
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 visitKtElseWhenLabel(ktElseWhenLabel: JKKtElseWhenLabel, data: D): R = visitKtWhenLabel(ktElseWhenLabel, data)
|
||||||
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: D): R = visitKtWhenLabel(ktValueWhenLabel, data)
|
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: D): R = visitKtWhenLabel(ktValueWhenLabel, data)
|
||||||
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: D): R = visitExpression(ktIsExpression, 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)
|
override fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: Nothing?) = visitKtValueWhenLabel(ktValueWhenLabel)
|
||||||
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression) = visitExpression(ktIsExpression, null)
|
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression) = visitExpression(ktIsExpression, null)
|
||||||
override fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: Nothing?) = visitKtIsExpression(ktIsExpression)
|
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