diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index d5d32a62134..cfeb86686a1 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -49,7 +49,7 @@ object ConversionsRunner { +PrimaryConstructorDetectConversion(context) +InsertDefaultPrimaryConstructorConversion(context) +FieldToPropertyConversion() - +JavaStandartMethodsConversion() + +JavaStandartMethodsConversion(context) +JavaMethodToKotlinFunctionConversion(context) +MainFunctionConversion(context) +LiteralConversion() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaStandartMethodsConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaStandartMethodsConversion.kt index ac1b7c934f8..9fd71e96784 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaStandartMethodsConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaStandartMethodsConversion.kt @@ -5,16 +5,28 @@ package org.jetbrains.kotlin.j2k.conversions +import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.* 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.JKUnresolvedClassType -class JavaStandartMethodsConversion : RecursiveApplicableConversionBase() { +class JavaStandartMethodsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { - if (element !is JKJavaMethodImpl) return recurse(element) - if (fixToStringMethod(element)) { - return recurse(element) + if (element !is JKClass) return recurse(element) + for (declaration in element.classBody.declarations) { + 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) } @@ -28,4 +40,26 @@ class JavaStandartMethodsConversion : RecursiveApplicableConversionBase() { method.returnType = JKTypeElementImpl(type) 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 + } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index ad1fb5a4e3e..378ecedb5d3 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -171,7 +171,7 @@ class JKKtConstructorImpl( override var visibility: Visibility, override var modality: Modality ) : 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 parameters: List by children(parameters) @@ -191,7 +191,7 @@ class JKKtPrimaryConstructorImpl( override var visibility: Visibility, override var modality: Modality ) : 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 parameters: List by children(parameters)