Add insert default constructor conversion
diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt
index 92e1cb9..0e7b2c3 100644
--- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt
+++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt
@@ -35,6 +35,7 @@
+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 e022361..9c26db4 100644
--- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt
+++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt
@@ -120,7 +120,7 @@
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 @@
}
}
- 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 0000000..b5b7208
--- /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<JKClassType>()
+ .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