J2K: no call to super constructor in the header of class when there is no primary constructor

This commit is contained in:
Valentin Kipyatkov
2015-03-30 13:33:30 +03:00
parent c57f2b10d6
commit 7e50f72d5b
10 changed files with 23 additions and 18 deletions
@@ -71,7 +71,7 @@ class ClassBodyConverter(private val psiClass: PsiClass,
val rBrace = RBrace().assignPrototype(psiClass.getRBrace()) val rBrace = RBrace().assignPrototype(psiClass.getRBrace())
if (isObject) { 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) 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 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, private fun Converter.convertMember(member: PsiMember,
@@ -145,7 +145,7 @@ class ConstructorConverter(
} }
} }
public var baseClassParams: List<DeferredElement<Expression>> = listOf() public var baseClassParams: List<DeferredElement<Expression>>? = if (constructors.isEmpty()) emptyList() else null
private set private set
public fun convertConstructor(constructor: PsiMethod, public fun convertConstructor(constructor: PsiMethod,
@@ -263,6 +263,9 @@ class ConstructorConverter(
correctedConverter.deferredElement { codeConverter -> codeConverter.correct().convertExpression(it) } correctedConverter.deferredElement { codeConverter -> codeConverter.correct().convertExpression(it) }
} }
} }
else {
baseClassParams = emptyList()
}
val parameterList = ParameterList(params.indices.map { i -> val parameterList = ParameterList(params.indices.map { i ->
val parameter = params[i] val parameter = params[i]
@@ -158,12 +158,12 @@ class Converter private(
return when { return when {
psiClass.isInterface() -> { psiClass.isInterface() -> {
val classBody = ClassBodyConverter(psiClass, this, isOpenClass = false, isObject = false).convertBody() 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() -> { psiClass.isEnum() -> {
val classBody = ClassBodyConverter(psiClass, this, isOpenClass = false, isObject = false).convertBody() 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 -> { else -> {
@@ -254,7 +254,7 @@ class Converter private(
convertModifiers(psiClass).without(Modifier.ABSTRACT), convertModifiers(psiClass).without(Modifier.ABSTRACT),
TypeParameterList.Empty, TypeParameterList.Empty,
listOf(), listOf(),
listOf(), null,
listOf(), listOf(),
classBody).assignPrototype(psiClass) classBody).assignPrototype(psiClass)
} }
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.j2k.ast
import org.jetbrains.kotlin.j2k.CodeBuilder import org.jetbrains.kotlin.j2k.CodeBuilder
class AnonymousClassBody(body: ClassBody, val extendsTrait: Boolean) 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) { override fun generateCode(builder: CodeBuilder) {
body.append(builder) body.append(builder)
} }
@@ -25,7 +25,7 @@ open class Class(
modifiers: Modifiers, modifiers: Modifiers,
val typeParameterList: TypeParameterList, val typeParameterList: TypeParameterList,
val extendsTypes: List<Type>, val extendsTypes: List<Type>,
val baseClassParams: List<DeferredElement<Expression>>, val baseClassParams: List<DeferredElement<Expression>>?,
val implementsTypes: List<Type>, val implementsTypes: List<Type>,
val body: ClassBody val body: ClassBody
) : Member(annotations, modifiers) { ) : Member(annotations, modifiers) {
@@ -56,7 +56,7 @@ open class Class(
} }
private fun baseClassSignatureWithParams(builder: CodeBuilder): List<() -> CodeBuilder> { 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({ return listOf({
builder append extendsTypes[0] append "(" builder append extendsTypes[0] append "("
builder.append(baseClassParams, ", ") builder.append(baseClassParams, ", ")
@@ -75,7 +75,7 @@ class Object(
annotations: Annotations, annotations: Annotations,
modifiers: Modifiers, modifiers: Modifiers,
body: ClassBody 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 override val keyword: String
get() = "object" get() = "object"
@@ -22,7 +22,7 @@ abstract class Member(val annotations: Annotations, val modifiers: Modifiers) :
class ClassBody ( class ClassBody (
val primaryConstructorSignature: PrimaryConstructorSignature?, val primaryConstructorSignature: PrimaryConstructorSignature?,
val baseClassParams: List<DeferredElement<Expression>>, val baseClassParams: List<DeferredElement<Expression>>?,
val members: List<Member>, val members: List<Member>,
val companionObjectMembers: List<Member>, val companionObjectMembers: List<Member>,
val lBrace: LBrace, val lBrace: LBrace,
+1 -3
View File
@@ -23,11 +23,9 @@ class Enum(
annotations: Annotations, annotations: Annotations,
modifiers: Modifiers, modifiers: Modifiers,
typeParameterList: TypeParameterList, typeParameterList: TypeParameterList,
extendsTypes: List<Type>,
baseClassParams: List<DeferredElement<Expression>>,
implementsTypes: List<Type>, implementsTypes: List<Type>,
body: ClassBody 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) { override fun generateCode(builder: CodeBuilder) {
builder append annotations appendWithSpaceAfter presentationModifiers() append "enum class " append name builder append annotations appendWithSpaceAfter presentationModifiers() append "enum class " append name
@@ -22,10 +22,9 @@ class Trait(
modifiers: Modifiers, modifiers: Modifiers,
typeParameterList: TypeParameterList, typeParameterList: TypeParameterList,
extendsTypes: List<Type>, extendsTypes: List<Type>,
baseClassParams: List<DeferredElement<Expression>>,
implementsTypes: List<Type>, implementsTypes: List<Type>,
body: ClassBody body: ClassBody
) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) { ) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, null, implementsTypes, body) {
override val keyword: String override val keyword: String
get() = "trait" get() = "trait"
@@ -1,4 +1,7 @@
class C { class Base {
}
class C extends Base {
C(int arg1, int arg2, int arg3) { C(int arg1, int arg2, int arg3) {
} }
@@ -1,4 +1,6 @@
class C { open class Base
class C : Base {
constructor(arg1: Int, arg2: Int, arg3: Int) { constructor(arg1: Int, arg2: Int, arg3: Int) {
} }