From 5ae1a819bc5d2756ac1f7ed7d0271267786bef38 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 13 Feb 2019 13:06:39 +0300 Subject: [PATCH] New J2K: Add support of Java static init declarations --- .../kotlin/nj2k/ConversionsRunner.kt | 1 + .../kotlin/nj2k/JavaToJKTreeBuilder.kt | 7 +++- .../StaticInitDeclarationConversion.kt | 40 +++++++++++++++++++ .../org/jetbrains/kotlin/nj2k/tree/impl/j.kt | 4 ++ nj2k/src/org/jetbrains/kotlin/nj2k/tree/j.kt | 4 ++ nj2k/src/org/jetbrains/kotlin/nj2k/utils.kt | 13 ++++++ 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 nj2k/src/org/jetbrains/kotlin/nj2k/conversions/StaticInitDeclarationConversion.kt create mode 100644 nj2k/src/org/jetbrains/kotlin/nj2k/utils.kt diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/ConversionsRunner.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/ConversionsRunner.kt index ca4dcce779f..e33414cdd89 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/ConversionsRunner.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/ConversionsRunner.kt @@ -48,6 +48,7 @@ object ConversionsRunner { +SynchronizedStatementConversion(context) +DefaultArgumentsConversion(context) +ConstructorConversion(context) + +StaticInitDeclarationConversion() +ImplicitInitializerConversion(context) +ParameterModificationInMethodCallsConversion(context) +PrintlnConversion(context) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt index 6c727b89ba0..50bd18be534 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt @@ -446,8 +446,11 @@ class JavaToJKTreeBuilder( } ) - fun PsiClassInitializer.toJK() = - JKKtInitDeclarationImpl(body.toJK()) + fun PsiClassInitializer.toJK(): JKDeclaration = + if (hasModifier(JvmModifier.STATIC)) + JKJavaStaticInitDeclarationImpl(body.toJK()) + else JKKtInitDeclarationImpl(body.toJK()) + fun PsiEnumConstant.toJK(): JKEnumConstant = JKEnumConstantImpl( diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/StaticInitDeclarationConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/StaticInitDeclarationConversion.kt new file mode 100644 index 00000000000..41f658dd3a1 --- /dev/null +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/StaticInitDeclarationConversion.kt @@ -0,0 +1,40 @@ +/* + * 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.nj2k.conversions + +import org.jetbrains.kotlin.nj2k.createCompanion +import org.jetbrains.kotlin.nj2k.getCompanion +import org.jetbrains.kotlin.nj2k.replace +import org.jetbrains.kotlin.nj2k.tree.JKClass +import org.jetbrains.kotlin.nj2k.tree.JKJavaStaticInitDeclaration +import org.jetbrains.kotlin.nj2k.tree.JKTreeElement +import org.jetbrains.kotlin.nj2k.tree.detached +import org.jetbrains.kotlin.nj2k.tree.impl.JKKtInitDeclarationImpl + +class StaticInitDeclarationConversion : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKClass) return recurse(element) + val staticInitDeclarations = + element.classBody.declarations.filterIsInstance() + if (staticInitDeclarations.isEmpty()) return recurse(element) + val companion = element.getCompanion() + if (companion == null) { + element.classBody.declarations = element.classBody.declarations.replace( + staticInitDeclarations.first(), + createCompanion(staticInitDeclarations.map { it.toKtInitDeclaration() }) + ) + element.classBody.declarations -= staticInitDeclarations.drop(1) + } else { + companion.classBody.declarations += staticInitDeclarations.map { it.toKtInitDeclaration() } + element.classBody.declarations -= staticInitDeclarations + } + + return recurse(element) + } + + private fun JKJavaStaticInitDeclaration.toKtInitDeclaration() = + JKKtInitDeclarationImpl(::block.detached()) +} \ No newline at end of file diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/j.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/j.kt index eba73721bfb..697cc6b179b 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/j.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/j.kt @@ -414,3 +414,7 @@ class JKKtAnnotationArrayInitializerExpressionImpl(initializers: List accept(visitor: JKVisitor, data: D): R = visitor.visitKtAnnotationArrayInitializerExpression(this, data) } +class JKJavaStaticInitDeclarationImpl(block: JKBlock) : JKJavaStaticInitDeclaration, JKBranchElementBase() { + override var block: JKBlock by child(block) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaStaticInitDeclaration(this, data) +} \ No newline at end of file diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/j.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/j.kt index b04fe89dffb..284379fe9c9 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/j.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/j.kt @@ -136,4 +136,8 @@ interface JKJavaSynchronizedStatement : JKStatement, JKBranchElement { interface JKJavaAnnotationMethod : JKMethod, JKBranchElement { val defaultValue: JKAnnotationMemberValue +} + +interface JKJavaStaticInitDeclaration : JKDeclaration, JKBranchElement { + var block: JKBlock } \ No newline at end of file diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/utils.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/utils.kt new file mode 100644 index 00000000000..5baf692aabe --- /dev/null +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/utils.kt @@ -0,0 +1,13 @@ +/* + * 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.nj2k + +fun List.replace(element: T, replacer: T): List { + val mutableList = toMutableList() + val index = indexOf(element) + mutableList[index] = replacer + return mutableList +} \ No newline at end of file