From d02be5ae94e4d0e2194fc6adbc6ca8cca55a842d Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 18 Dec 2018 14:58:54 +0300 Subject: [PATCH] New J2K: Create init declaration from primary constructor in PrimaryConstructorDetectConversion --- ...InsertDefaultPrimaryConstructorConversion.kt | 1 - .../PrimaryConstructorDetectConversion.kt | 17 +++++++++++++++-- .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 10 +--------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt index 40de8b2c87e..e3383d0d78a 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt @@ -19,7 +19,6 @@ class InsertDefaultPrimaryConstructorConversion(private val context: ConversionC val constructor = JKKtPrimaryConstructorImpl( JKNameIdentifierImpl(element.name.value), emptyList(), - JKBodyStub, JKStubExpressionImpl(), emptyList(), Visibility.PUBLIC, diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PrimaryConstructorDetectConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PrimaryConstructorDetectConversion.kt index 8f60b0e4ba7..23f3b543cb4 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PrimaryConstructorDetectConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PrimaryConstructorDetectConversion.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.j2k.conversions import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.j2k.tree.impl.JKKtInitDeclarationImpl import org.jetbrains.kotlin.j2k.tree.impl.JKKtPrimaryConstructorImpl class PrimaryConstructorDetectConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { @@ -17,6 +18,13 @@ class PrimaryConstructorDetectConversion(private val context: ConversionContext) return recurse(element) } + private fun List.replace(element: T, replacer: T): List { + val mutableList = toMutableList() + val index = indexOf(element) + mutableList[index] = replacer + return mutableList + } + private fun processClass(element: JKClass) { val constructors = element.declarationList.filterIsInstance() if (constructors.any { it is JKKtPrimaryConstructor }) return @@ -24,15 +32,20 @@ class PrimaryConstructorDetectConversion(private val context: ConversionContext) val delegationCall = primaryConstructorCandidate.delegationCall as? JKDelegationConstructorCall if (delegationCall?.expression is JKThisExpression) return - element.classBody.declarations -= primaryConstructorCandidate primaryConstructorCandidate.invalidate() + if (primaryConstructorCandidate.block.statements.isNotEmpty()) { + val initDeclaration = JKKtInitDeclarationImpl(primaryConstructorCandidate.block) + element.classBody.declarations = + element.classBody.declarations.replace(primaryConstructorCandidate, initDeclaration) + } else { + element.classBody.declarations -= primaryConstructorCandidate + } val primaryConstructor = JKKtPrimaryConstructorImpl( primaryConstructorCandidate.name, primaryConstructorCandidate.parameters, - primaryConstructorCandidate.block, primaryConstructorCandidate.delegationCall, primaryConstructorCandidate.extraModifiers, primaryConstructorCandidate.visibility, 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 7853c1c0ee5..975c315c8a9 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -192,7 +192,7 @@ class JKKtPrimaryConstructorImpl( override var name: JKNameIdentifier by child(name) override var parameters: List by children(parameters) - override var block: JKBlock by child(block) + override var block: JKBlock by child(JKBodyStub) override var delegationCall: JKExpression by child(delegationCall) override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl()) override var annotationList: JKAnnotationList by child(JKAnnotationListImpl()) @@ -238,14 +238,6 @@ class JKKtInitDeclarationImpl(block: JKBlock) : JKKtInitDeclaration, JKBranchEle 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()) - classBody.declarations += newDeclaration - return newDeclaration -} - class JKKtOperatorExpressionImpl( receiver: JKExpression, override var identifier: JKMethodSymbol,