diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 5b6ebf244db..05ba97378d5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -38,6 +38,7 @@ object ConversionsRunner { InnerClassConversion(), ModifiersConversion(context), StaticsToCompanionExtractConversion(), + ClassToObjectPromotionConversion(), PolyadicExpressionConversion(), BinaryExpressionConversion() ) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 62cf3519c37..8c9ba37fb38 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -329,12 +329,6 @@ class NewCodeBuilder { printer.printWithNoIndent(type.name) else -> printer.printWithNoIndent("Unit /* TODO: ${type::class} */") } - when (type.nullability) { - Nullability.Nullable -> printer.printWithNoIndent("?") - Nullability.Default -> printer.printWithNoIndent("?")// /* TODO: Default */") - else -> { - } - } if (type is JKParametrizedType && type.parameters.isNotEmpty()) { printer.par(ANGLE) { renderList(type.parameters) { @@ -342,6 +336,12 @@ class NewCodeBuilder { } } } + when (type.nullability) { + Nullability.Nullable -> printer.printWithNoIndent("?") + Nullability.Default -> printer.printWithNoIndent("?")// /* TODO: Default */") + else -> { + } + } } override fun visitTypeElement(typeElement: JKTypeElement) { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ClassToObjectPromotionConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ClassToObjectPromotionConversion.kt new file mode 100644 index 00000000000..c23dcfa8cde --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ClassToObjectPromotionConversion.kt @@ -0,0 +1,36 @@ +/* + * 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.tree.JKClass +import org.jetbrains.kotlin.j2k.tree.JKKtPrimaryConstructor +import org.jetbrains.kotlin.j2k.tree.JKTreeElement +import org.jetbrains.kotlin.j2k.tree.impl.JKClassImpl +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull + +class ClassToObjectPromotionConversion : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) { + val constructor = element.declarationList.firstIsInstanceOrNull() + val companion = element.declarationList.firstOrNull { it is JKClass && it.classKind == JKClass.ClassKind.COMPANION } + if (companion != null && (constructor == null || constructor.parameters.isEmpty())) { + val declarations = element.declarationList - companion - listOfNotNull(constructor) + if (declarations.isEmpty()) { + companion as JKClass + companion.invalidate() + element.invalidate() + return recurse( + JKClassImpl(element.modifierList, element.name, element.inheritance, JKClass.ClassKind.OBJECT) + .apply { + declarationList = companion.declarationList + } + ) + } + } + } + return recurse(element) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 59ae2624225..397ddf3b143 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -38,7 +38,7 @@ interface JKFile : JKTreeElement, JKBranchElement { var declarationList: List } -interface JKClass : JKDeclaration, JKModifierListOwner { +interface JKClass : JKDeclaration, JKModifierListOwner, JKBranchElement { val name: JKNameIdentifier val inheritance: JKInheritanceInfo