From d09e72656a5534c830239fea75b3ec0e7e079d56 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 17 Jan 2019 16:56:59 +0300 Subject: [PATCH] New J2K: Add InterfaceWithFieldConversion --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 1 + .../InterfaceWithFieldConversion.kt | 26 ++++++++++++++++++ .../StaticsToCompanionExtractConversion.kt | 27 ++----------------- .../org/jetbrains/kotlin/j2k/expressions.kt | 14 ++++++++++ 4 files changed, 43 insertions(+), 25 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InterfaceWithFieldConversion.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 82852dc8aed..421ad548f35 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -72,6 +72,7 @@ object ConversionsRunner { //Kotlin --> Kotlin conversions +InnerClassConversion() +StaticsToCompanionExtractConversion() + +InterfaceWithFieldConversion() +ClassToObjectPromotionConversion(context) +ImportStatementConversion() +SortClassMembersConversion() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InterfaceWithFieldConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InterfaceWithFieldConversion.kt new file mode 100644 index 00000000000..422fe7087dc --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InterfaceWithFieldConversion.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2019 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.* +import org.jetbrains.kotlin.j2k.tree.* + + +class InterfaceWithFieldConversion : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKClass) return recurse(element) + if (element.classKind != JKClass.ClassKind.INTERFACE) return recurse(element) + val finalFields = element.declarationList + .filterIsInstance() + .filter { it.modality == Modality.FINAL } + if (finalFields.isNotEmpty()) { + element.classBody.declarations -= finalFields + val companion = element.getOrCreateCompainonObject() + companion.classBody.declarations += finalFields + } + return recurse(element) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt index 7a47dea6bfe..e345371bac8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/StaticsToCompanionExtractConversion.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.j2k.conversions +import org.jetbrains.kotlin.j2k.getOrCreateCompainonObject import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.impl.* @@ -16,38 +17,14 @@ class StaticsToCompanionExtractConversion : RecursiveApplicableConversionBase() declaration is JKExtraModifiersOwner && declaration.extraModifiers.any { it == ExtraModifier.STATIC } } - if (statics.isEmpty()) return recurse(element) - val companion = findOrCreateCompanion(element) - + val companion = element.getOrCreateCompainonObject() element.classBody.declarations -= statics companion.classBody.declarations += statics.onEach { declaration -> (declaration as JKExtraModifiersOwner) declaration.extraModifiers -= ExtraModifier.STATIC } - return recurse(element) } - - fun findOrCreateCompanion(element: JKClass): JKClass { - val companion = element.declarationList - .asSequence() - .filterIsInstance() - .firstOrNull { it.classKind == JKClass.ClassKind.COMPANION } - - if (companion != null) return companion - - return JKClassImpl( - JKNameIdentifierImpl(""), - JKInheritanceInfoImpl(emptyList(), emptyList()), - JKClass.ClassKind.COMPANION, - JKTypeParameterListImpl(), - JKClassBodyImpl(), - JKAnnotationListImpl(), - emptyList(), - Visibility.PUBLIC, - Modality.FINAL - ).also { element.classBody.declarations += it } - } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt index 5390dcef5e6..fc5538470bf 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt @@ -449,3 +449,17 @@ fun equalsExpression(left: JKExpression, right: JKExpression, symbolProvider: JK KtTokens.EQEQ, symbolProvider ) + +fun JKClass.getOrCreateCompainonObject(): JKClass = + (declarationList.firstOrNull { it is JKClass && it.classKind == JKClass.ClassKind.COMPANION } as? JKClass) + ?: JKClassImpl( + JKNameIdentifierImpl(""), + JKInheritanceInfoImpl(emptyList(), emptyList()), + JKClass.ClassKind.COMPANION, + JKTypeParameterListImpl(), + JKClassBodyImpl(), + JKAnnotationListImpl(), + emptyList(), + Visibility.PUBLIC, + Modality.FINAL + ).also { classBody.declarations += it } \ No newline at end of file