From cc3564395c08e23530778c3a6c35c23a23720876 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 13 Feb 2019 13:11:05 +0300 Subject: [PATCH] New J2K: Promete class to object when init declaration present --- .../ClassToObjectPromotionConversion.kt | 28 +++++++++++++------ .../nj2k/conversions/InnerClassConversion.kt | 6 +++- .../org/jetbrains/kotlin/nj2k/expressions.kt | 18 +++++++++++- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ClassToObjectPromotionConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ClassToObjectPromotionConversion.kt index 0760dae73a4..350f18bca28 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ClassToObjectPromotionConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ClassToObjectPromotionConversion.kt @@ -6,22 +6,28 @@ package org.jetbrains.kotlin.nj2k.conversions import org.jetbrains.kotlin.nj2k.ConversionContext +import org.jetbrains.kotlin.nj2k.getCompanion import org.jetbrains.kotlin.nj2k.tree.* -import org.jetbrains.kotlin.nj2k.tree.impl.* -import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull +import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationListImpl +import org.jetbrains.kotlin.nj2k.tree.impl.JKClassImpl +import org.jetbrains.kotlin.nj2k.tree.impl.psi class ClassToObjectPromotionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) { - val companion = - element.declarationList.firstIsInstanceOrNull() - ?.takeIf { it.classKind == JKClass.ClassKind.COMPANION } - ?: return recurse(element) + val companion = element.getCompanion() ?: return recurse(element) val allDeclarationsMatches = element.declarationList.all { when (it) { is JKKtPrimaryConstructor -> it.parameters.isEmpty() && it.block.statements.isEmpty() - is JKClass -> it.classKind == JKClass.ClassKind.COMPANION + is JKKtInitDeclaration -> + it.block.statements.all { statement -> + when (statement) { + is JKDeclarationStatement -> statement.declaredStatements.isEmpty() + else -> false + } + } + is JKClass -> true else -> false } } @@ -35,8 +41,12 @@ class ClassToObjectPromotionConversion(private val context: ConversionContext) : element.inheritance, JKClass.ClassKind.OBJECT, element.typeParameterList, - companion.classBody.also { - it.handleDeclarationsModifiers() + companion.classBody.also { body -> + body.handleDeclarationsModifiers() + body.declarations += element.classBody.declarations.filter { + //TODO preseve order + it is JKClass && it.classKind != JKClass.ClassKind.COMPANION + }.map { it.detached(element.classBody) } }, JKAnnotationListImpl(), element.extraModifiers, diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/InnerClassConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/InnerClassConversion.kt index 31022ade38e..14b02b89a79 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/InnerClassConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/InnerClassConversion.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.nj2k.conversions -import org.jetbrains.kotlin.nj2k.tree.* +import org.jetbrains.kotlin.nj2k.tree.ExtraModifier +import org.jetbrains.kotlin.nj2k.tree.JKClass +import org.jetbrains.kotlin.nj2k.tree.JKTreeElement +import org.jetbrains.kotlin.nj2k.tree.isLocalClass class InnerClassConversion : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { @@ -19,6 +22,7 @@ class InnerClassConversion : RecursiveApplicableConversionBase() { private fun applyArmed(element: JKTreeElement, outer: JKClass): JKTreeElement { if (element !is JKClass) return recurseArmed(element, outer) + if (element.classKind == JKClass.ClassKind.COMPANION) return recurseArmed(element, outer) if (element.isLocalClass()) return recurseArmed(element, outer) val static = element.extraModifiers.find { it == ExtraModifier.STATIC } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt index 46496ba8a09..a611ed14ce1 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt @@ -482,8 +482,24 @@ fun equalsExpression(left: JKExpression, right: JKExpression, symbolProvider: JK symbolProvider ) +fun createCompanion(declarations: List): JKClass = + JKClassImpl( + JKNameIdentifierImpl(""), + JKInheritanceInfoImpl(emptyList(), emptyList()), + JKClass.ClassKind.COMPANION, + JKTypeParameterListImpl(), + JKClassBodyImpl(declarations), + JKAnnotationListImpl(), + emptyList(), + Visibility.PUBLIC, + Modality.FINAL + ) + +fun JKClass.getCompanion(): JKClass? = + declarationList.firstOrNull { it is JKClass && it.classKind == JKClass.ClassKind.COMPANION } as? JKClass + fun JKClass.getOrCreateCompainonObject(): JKClass = - (declarationList.firstOrNull { it is JKClass && it.classKind == JKClass.ClassKind.COMPANION } as? JKClass) + getCompanion() ?: JKClassImpl( JKNameIdentifierImpl(""), JKInheritanceInfoImpl(emptyList(), emptyList()),