From 7e50f72d5b8defc5240c9733e2e6ef22f837756e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 30 Mar 2015 13:33:30 +0300 Subject: [PATCH] J2K: no call to super constructor in the header of class when there is no primary constructor --- j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt | 4 ++-- j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt | 5 ++++- j2k/src/org/jetbrains/kotlin/j2k/Converter.kt | 6 +++--- j2k/src/org/jetbrains/kotlin/j2k/ast/AnonymousClassBody.kt | 2 +- j2k/src/org/jetbrains/kotlin/j2k/ast/Class.kt | 6 +++--- j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt | 2 +- j2k/src/org/jetbrains/kotlin/j2k/ast/Enum.kt | 4 +--- j2k/src/org/jetbrains/kotlin/j2k/ast/Trait.kt | 3 +-- j2k/testData/fileOrElement/constructors/noPrimary.java | 5 ++++- j2k/testData/fileOrElement/constructors/noPrimary.kt | 4 +++- 10 files changed, 23 insertions(+), 18 deletions(-) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt index e0554ca96e6..c2cc238493f 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt @@ -71,7 +71,7 @@ class ClassBodyConverter(private val psiClass: PsiClass, val rBrace = RBrace().assignPrototype(psiClass.getRBrace()) if (isObject) { - return ClassBody(null, emptyList(), convertedMembers.values().toList(), emptyList(), lBrace, rBrace) + return ClassBody(null, null, convertedMembers.values().toList(), emptyList(), lBrace, rBrace) } val useCompanionObject = shouldGenerateCompanionObject(convertedMembers) @@ -102,7 +102,7 @@ class ClassBodyConverter(private val psiClass: PsiClass, primaryConstructorSignature = null // no "()" after class name is needed in this case } - return ClassBody(primaryConstructorSignature, constructorConverter?.baseClassParams ?: listOf(), members, companionObjectMembers, lBrace, rBrace) + return ClassBody(primaryConstructorSignature, constructorConverter?.baseClassParams, members, companionObjectMembers, lBrace, rBrace) } private fun Converter.convertMember(member: PsiMember, diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt index 656dca73b83..6e5f0c5edd5 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt @@ -145,7 +145,7 @@ class ConstructorConverter( } } - public var baseClassParams: List> = listOf() + public var baseClassParams: List>? = if (constructors.isEmpty()) emptyList() else null private set public fun convertConstructor(constructor: PsiMethod, @@ -263,6 +263,9 @@ class ConstructorConverter( correctedConverter.deferredElement { codeConverter -> codeConverter.correct().convertExpression(it) } } } + else { + baseClassParams = emptyList() + } val parameterList = ParameterList(params.indices.map { i -> val parameter = params[i] diff --git a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt b/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt index c6d3cbfd494..5d8c5f97b6f 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt @@ -158,12 +158,12 @@ class Converter private( return when { psiClass.isInterface() -> { val classBody = ClassBodyConverter(psiClass, this, isOpenClass = false, isObject = false).convertBody() - Trait(name, annotations, modifiers, typeParameters, extendsTypes, listOf(), implementsTypes, classBody) + Trait(name, annotations, modifiers, typeParameters, extendsTypes, implementsTypes, classBody) } psiClass.isEnum() -> { val classBody = ClassBodyConverter(psiClass, this, isOpenClass = false, isObject = false).convertBody() - Enum(name, annotations, modifiers, typeParameters, listOf(), listOf(), implementsTypes, classBody) + Enum(name, annotations, modifiers, typeParameters, implementsTypes, classBody) } else -> { @@ -254,7 +254,7 @@ class Converter private( convertModifiers(psiClass).without(Modifier.ABSTRACT), TypeParameterList.Empty, listOf(), - listOf(), + null, listOf(), classBody).assignPrototype(psiClass) } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/AnonymousClassBody.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/AnonymousClassBody.kt index 27126c95702..57554cd2bfa 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/AnonymousClassBody.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/AnonymousClassBody.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.j2k.ast import org.jetbrains.kotlin.j2k.CodeBuilder class AnonymousClassBody(body: ClassBody, val extendsTrait: Boolean) -: Class(Identifier.Empty, Annotations.Empty, Modifiers.Empty, TypeParameterList.Empty, listOf(), listOf(), listOf(), body) { +: Class(Identifier.Empty, Annotations.Empty, Modifiers.Empty, TypeParameterList.Empty, listOf(), null, listOf(), body) { override fun generateCode(builder: CodeBuilder) { body.append(builder) } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Class.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Class.kt index a6e2457c0f2..2f486f03044 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Class.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Class.kt @@ -25,7 +25,7 @@ open class Class( modifiers: Modifiers, val typeParameterList: TypeParameterList, val extendsTypes: List, - val baseClassParams: List>, + val baseClassParams: List>?, val implementsTypes: List, val body: ClassBody ) : Member(annotations, modifiers) { @@ -56,7 +56,7 @@ open class Class( } private fun baseClassSignatureWithParams(builder: CodeBuilder): List<() -> CodeBuilder> { - if (keyword.equals("class") && extendsTypes.size() == 1) { + if (keyword.equals("class") && extendsTypes.size() == 1 && baseClassParams != null) { return listOf({ builder append extendsTypes[0] append "(" builder.append(baseClassParams, ", ") @@ -75,7 +75,7 @@ class Object( annotations: Annotations, modifiers: Modifiers, body: ClassBody -) : Class(name, annotations, modifiers, TypeParameterList.Empty, emptyList(), emptyList(), emptyList(), body) { +) : Class(name, annotations, modifiers, TypeParameterList.Empty, emptyList(), null, emptyList(), body) { override val keyword: String get() = "object" diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt index 33fa67e6955..a1a102b1ae8 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt @@ -22,7 +22,7 @@ abstract class Member(val annotations: Annotations, val modifiers: Modifiers) : class ClassBody ( val primaryConstructorSignature: PrimaryConstructorSignature?, - val baseClassParams: List>, + val baseClassParams: List>?, val members: List, val companionObjectMembers: List, val lBrace: LBrace, diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Enum.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Enum.kt index f8f4deaeaaa..0abe9c0a637 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Enum.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Enum.kt @@ -23,11 +23,9 @@ class Enum( annotations: Annotations, modifiers: Modifiers, typeParameterList: TypeParameterList, - extendsTypes: List, - baseClassParams: List>, implementsTypes: List, body: ClassBody -) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) { +) : Class(name, annotations, modifiers, typeParameterList, emptyList(), null, implementsTypes, body) { override fun generateCode(builder: CodeBuilder) { builder append annotations appendWithSpaceAfter presentationModifiers() append "enum class " append name diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Trait.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Trait.kt index bee937fb4c2..f2b707ae978 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Trait.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Trait.kt @@ -22,10 +22,9 @@ class Trait( modifiers: Modifiers, typeParameterList: TypeParameterList, extendsTypes: List, - baseClassParams: List>, implementsTypes: List, body: ClassBody -) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) { +) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, null, implementsTypes, body) { override val keyword: String get() = "trait" diff --git a/j2k/testData/fileOrElement/constructors/noPrimary.java b/j2k/testData/fileOrElement/constructors/noPrimary.java index 29e31f2243c..026524520f4 100644 --- a/j2k/testData/fileOrElement/constructors/noPrimary.java +++ b/j2k/testData/fileOrElement/constructors/noPrimary.java @@ -1,4 +1,7 @@ -class C { +class Base { +} + +class C extends Base { C(int arg1, int arg2, int arg3) { } diff --git a/j2k/testData/fileOrElement/constructors/noPrimary.kt b/j2k/testData/fileOrElement/constructors/noPrimary.kt index 95bf0978356..83c6ffa9975 100644 --- a/j2k/testData/fileOrElement/constructors/noPrimary.kt +++ b/j2k/testData/fileOrElement/constructors/noPrimary.kt @@ -1,4 +1,6 @@ -class C { +open class Base + +class C : Base { constructor(arg1: Int, arg2: Int, arg3: Int) { }