New J2K: Convert Java method to Kotlin function independently of containing class

This commit is contained in:
Ilya Kirillov
2019-03-29 15:15:32 +03:00
committed by Ilya Kirillov
parent f28f340840
commit 86fa54fae9
@@ -23,46 +23,35 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtFunctionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtFunctionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
class JavaMethodToKotlinFunctionConversion(private val context: ConversionContext) : TransformerBasedConversion() { class JavaMethodToKotlinFunctionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun visitTreeElement(element: JKTreeElement) { override fun applyToElement(element: JKTreeElement): JKTreeElement {
element.acceptChildren(this, null) if (element !is JKJavaMethod) return recurse(element)
}
override fun visitClassBody(classBody: JKClassBody) { element.invalidate()
somethingChanged = true val kotlinFunction = JKKtFunctionImpl(
element.returnType,
classBody.declarations = classBody.declarations.map { declaration -> element.name,
if (declaration is JKJavaMethod) { element.parameters,
declaration.invalidate() element.block,
element.typeParameterList,
JKKtFunctionImpl( element.annotationList.also {
declaration.returnType, if (element.throwsList.isNotEmpty()) {
declaration.name,
declaration.parameters,
declaration.block,
declaration.typeParameterList,
declaration.annotationList.also {
if (declaration.throwsList.isNotEmpty()) {
it.annotations += it.annotations +=
throwAnnotation( throwAnnotation(
declaration.throwsList.map { it.type.updateNullabilityRecursively(Nullability.NotNull) }, element.throwsList.map { it.type.updateNullabilityRecursively(Nullability.NotNull) },
context.symbolProvider context.symbolProvider
) )
} }
}, },
declaration.extraModifierElements, element.extraModifierElements,
declaration.visibilityElement, element.visibilityElement,
declaration.modalityElement element.modalityElement
).also { ).also {
it.psi = declaration.psi it.psi = element.psi
context.symbolProvider.transferSymbol(it, declaration) context.symbolProvider.transferSymbol(it, element)
it.leftParen.takeNonCodeElementsFrom(declaration.leftParen) it.leftParen.takeNonCodeElementsFrom(element.leftParen)
it.rightParen.takeNonCodeElementsFrom(declaration.rightParen) it.rightParen.takeNonCodeElementsFrom(element.rightParen)
}.withNonCodeElementsFrom(declaration) }.withNonCodeElementsFrom(element)
} else { return recurse(kotlinFunction)
declaration
}
}
classBody.acceptChildren(this)
} }
} }