New J2K: Add finalize & clone to JavaStandartMethodsConversion

This commit is contained in:
Ilya Kirillov
2018-12-19 15:42:31 +03:00
committed by Ilya Kirillov
parent 12fe096b82
commit 667ead10a3
3 changed files with 41 additions and 7 deletions
@@ -49,7 +49,7 @@ object ConversionsRunner {
+PrimaryConstructorDetectConversion(context) +PrimaryConstructorDetectConversion(context)
+InsertDefaultPrimaryConstructorConversion(context) +InsertDefaultPrimaryConstructorConversion(context)
+FieldToPropertyConversion() +FieldToPropertyConversion()
+JavaStandartMethodsConversion() +JavaStandartMethodsConversion(context)
+JavaMethodToKotlinFunctionConversion(context) +JavaMethodToKotlinFunctionConversion(context)
+MainFunctionConversion(context) +MainFunctionConversion(context)
+LiteralConversion() +LiteralConversion()
@@ -5,16 +5,28 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaMethodImpl import org.jetbrains.kotlin.j2k.tree.impl.JKJavaMethodImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKJavaVoidType
import org.jetbrains.kotlin.j2k.tree.impl.JKTypeElementImpl import org.jetbrains.kotlin.j2k.tree.impl.JKTypeElementImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKUnresolvedClassType
class JavaStandartMethodsConversion : RecursiveApplicableConversionBase() { class JavaStandartMethodsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaMethodImpl) return recurse(element) if (element !is JKClass) return recurse(element)
if (fixToStringMethod(element)) { for (declaration in element.classBody.declarations) {
return recurse(element) if (declaration !is JKJavaMethodImpl) continue
if (fixToStringMethod(declaration)) continue
if (fixFinalizeMethod(declaration, element)) continue
if (fixCloneMethod(declaration)) {
element.inheritance.implements +=
JKTypeElementImpl(
JKUnresolvedClassType("Cloneable", emptyList(), Nullability.NotNull)
)
continue
}
} }
return recurse(element) return recurse(element)
} }
@@ -28,4 +40,26 @@ class JavaStandartMethodsConversion : RecursiveApplicableConversionBase() {
method.returnType = JKTypeElementImpl(type) method.returnType = JKTypeElementImpl(type)
return true return true
} }
private fun fixCloneMethod(method: JKJavaMethodImpl): Boolean {
if (method.name.value != "clone") return false
if (method.parameters.isNotEmpty()) return false
val type = (method.returnType.type as? JKClassType)
?.takeIf { it.classReference.name == "Object" }
?.updateNullability(Nullability.NotNull) ?: return false
method.returnType = JKTypeElementImpl(type)
return true
}
private fun fixFinalizeMethod(method: JKJavaMethodImpl, containingClass: JKClass): Boolean {
if (method.name.value != "finalize") return false
if (method.parameters.isNotEmpty()) return false
if (method.returnType.type != JKJavaVoidType) return false
if (method.modality == Modality.OVERRIDE) {
method.modality =
if (containingClass.modality == Modality.OPEN) Modality.OPEN
else Modality.FINAL
}
return true
}
} }
@@ -171,7 +171,7 @@ class JKKtConstructorImpl(
override var visibility: Visibility, override var visibility: Visibility,
override var modality: Modality override var modality: Modality
) : JKBranchElementBase(), JKKtConstructor { ) : JKBranchElementBase(), JKKtConstructor {
override val returnType: JKTypeElement get() = TODO("!") override var returnType: JKTypeElement by child(JKTypeElementImpl(JKNoTypeImpl))
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override var parameters: List<JKParameter> by children(parameters) override var parameters: List<JKParameter> by children(parameters)
@@ -191,7 +191,7 @@ class JKKtPrimaryConstructorImpl(
override var visibility: Visibility, override var visibility: Visibility,
override var modality: Modality override var modality: Modality
) : JKBranchElementBase(), JKKtPrimaryConstructor { ) : JKBranchElementBase(), JKKtPrimaryConstructor {
override val returnType: JKTypeElement get() = TODO("!") override var returnType: JKTypeElement by child(JKTypeElementImpl(JKNoTypeImpl))
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override var parameters: List<JKParameter> by children(parameters) override var parameters: List<JKParameter> by children(parameters)