New J2K: Add support of Java static init declarations

This commit is contained in:
Ilya Kirillov
2019-02-13 13:06:39 +03:00
committed by Ilya Kirillov
parent ef89a249f2
commit 5ae1a819bc
6 changed files with 67 additions and 2 deletions
@@ -48,6 +48,7 @@ object ConversionsRunner {
+SynchronizedStatementConversion(context)
+DefaultArgumentsConversion(context)
+ConstructorConversion(context)
+StaticInitDeclarationConversion()
+ImplicitInitializerConversion(context)
+ParameterModificationInMethodCallsConversion(context)
+PrintlnConversion(context)
@@ -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(
@@ -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<JKJavaStaticInitDeclaration>()
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())
}
@@ -414,3 +414,7 @@ class JKKtAnnotationArrayInitializerExpressionImpl(initializers: List<JKAnnotati
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtAnnotationArrayInitializerExpression(this, data)
}
class JKJavaStaticInitDeclarationImpl(block: JKBlock) : JKJavaStaticInitDeclaration, JKBranchElementBase() {
override var block: JKBlock by child(block)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaStaticInitDeclaration(this, data)
}
@@ -136,4 +136,8 @@ interface JKJavaSynchronizedStatement : JKStatement, JKBranchElement {
interface JKJavaAnnotationMethod : JKMethod, JKBranchElement {
val defaultValue: JKAnnotationMemberValue
}
interface JKJavaStaticInitDeclaration : JKDeclaration, JKBranchElement {
var block: JKBlock
}
@@ -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 <T> List<T>.replace(element: T, replacer: T): List<T> {
val mutableList = toMutableList()
val index = indexOf(element)
mutableList[index] = replacer
return mutableList
}