New J2K: Add support of Java static init declarations
This commit is contained in:
committed by
Ilya Kirillov
parent
ef89a249f2
commit
5ae1a819bc
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user