diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 92e1cb9b711..0e7b2c3457e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -35,6 +35,7 @@ object ConversionsRunner { +AssignmentStatementOperatorConversion() +ConstructorConversion(context) +PrimaryConstructorDetectConversion(context) + +InsertDefaultPrimaryConstructorConversion(context) +JavaMethodToKotlinFunctionConversion() +LiteralConversion() +InnerClassConversion() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index e022361ca56..9c26db4ff7b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -120,7 +120,7 @@ class NewCodeBuilder { printer.printWithNoIndent(klass.name.value) val primaryConstructor = klass.primaryConstructor() - if (primaryConstructor != null) { + if (primaryConstructor != null && primaryConstructor.parameters.isNotEmpty()) { renderParameterList(primaryConstructor.parameters) } @@ -138,7 +138,7 @@ class NewCodeBuilder { } } - if (klass.declarationList.isNotEmpty()) { + if (klass.declarationList.any { it !is JKKtPrimaryConstructor }) { printer.block(multiline = true) { klass.declarationList.forEach { it.accept(this) } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt new file mode 100644 index 00000000000..b5b72089e32 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InsertDefaultPrimaryConstructorConversion.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import org.jetbrains.kotlin.j2k.ConversionContext +import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.j2k.tree.JKModalityModifier.Modality.* +import org.jetbrains.kotlin.j2k.tree.impl.* + +class InsertDefaultPrimaryConstructorConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKClass) return recurse(element) + if (element.classKind != JKClass.ClassKind.CLASS && element.declarationList.none { it is JKKtConstructor }) return recurse(element) + + val constructor = JKKtPrimaryConstructorImpl( + JKNameIdentifierImpl(element.name.value), emptyList(), JKBodyStub, + JKModifierListImpl().also { + it.modality = FINAL + it.visibility = JKAccessModifier.Visibility.PUBLIC + }, + JKStubExpressionImpl() + ) + + element.declarationList += constructor + + val superClassSymbol = element.inheritance.inherit.map { it.type } + .filterIsInstance() + .mapNotNull { (it.classReference as? JKClassSymbol) } + .firstOrNull { it.kind == JKClass.ClassKind.CLASS } + + if (superClassSymbol is JKUniverseClassSymbol) { + val superClass = recurse(superClassSymbol.target) + val superConstructor = context.symbolProvider.provideUniverseSymbol( + superClass.declarationList.single { it is JKKtConstructor && it.parameters.isEmpty() } as JKMethod + ) + constructor.delegationCall = JKDelegationConstructorCallImpl(superConstructor, JKSuperExpressionImpl(), JKExpressionListImpl()) + } + + return recurse(element) + } + + private val JKClassSymbol.kind + get() = when (this) { + is JKUniverseClassSymbol -> target.classKind + else -> null + } +} \ No newline at end of file