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)
|
+SynchronizedStatementConversion(context)
|
||||||
+DefaultArgumentsConversion(context)
|
+DefaultArgumentsConversion(context)
|
||||||
+ConstructorConversion(context)
|
+ConstructorConversion(context)
|
||||||
|
+StaticInitDeclarationConversion()
|
||||||
+ImplicitInitializerConversion(context)
|
+ImplicitInitializerConversion(context)
|
||||||
+ParameterModificationInMethodCallsConversion(context)
|
+ParameterModificationInMethodCallsConversion(context)
|
||||||
+PrintlnConversion(context)
|
+PrintlnConversion(context)
|
||||||
|
|||||||
@@ -446,8 +446,11 @@ class JavaToJKTreeBuilder(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
fun PsiClassInitializer.toJK() =
|
fun PsiClassInitializer.toJK(): JKDeclaration =
|
||||||
JKKtInitDeclarationImpl(body.toJK())
|
if (hasModifier(JvmModifier.STATIC))
|
||||||
|
JKJavaStaticInitDeclarationImpl(body.toJK())
|
||||||
|
else JKKtInitDeclarationImpl(body.toJK())
|
||||||
|
|
||||||
|
|
||||||
fun PsiEnumConstant.toJK(): JKEnumConstant =
|
fun PsiEnumConstant.toJK(): JKEnumConstant =
|
||||||
JKEnumConstantImpl(
|
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)
|
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 {
|
interface JKJavaAnnotationMethod : JKMethod, JKBranchElement {
|
||||||
val defaultValue: JKAnnotationMemberValue
|
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