diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt index 6e5f0c5edd5..b5697548226 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt @@ -17,10 +17,11 @@ package org.jetbrains.kotlin.j2k import com.intellij.psi.* -import org.jetbrains.kotlin.j2k.ast.* import com.intellij.psi.util.PsiUtil -import java.util.HashMap +import org.jetbrains.kotlin.j2k.ast.* +import org.jetbrains.kotlin.j2k.ast.Annotation import java.util.ArrayList +import java.util.HashMap import java.util.HashSet class ConstructorConverter( @@ -152,9 +153,9 @@ class ConstructorConverter( annotations: Annotations, modifiers: Modifiers, membersToRemove: MutableSet, - postProcessBody: (Block) -> Block): Member? { - if (constructor == primaryConstructor) { - return convertPrimaryConstructor(annotations, modifiers, membersToRemove, postProcessBody) + postProcessBody: (Block) -> Block): Constructor? { + val result = if (constructor == primaryConstructor) { + convertPrimaryConstructor(annotations, modifiers, membersToRemove, postProcessBody) } else { if (constructor in constructorsToDrop) return null @@ -178,9 +179,17 @@ class ConstructorConverter( }).convertBlock(constructor.getBody())) } - return SecondaryConstructor(annotations, modifiers, params, - converter.deferredElement(::convertBody), thisOrSuperDeferred) + SecondaryConstructor(annotations, modifiers, params, converter.deferredElement(::convertBody), thisOrSuperDeferred) } + + if (result.parameterList.parameters.any { it.defaultValue != null }) { + result.annotations += Annotations(listOf(Annotation(Identifier("overloads").assignNoPrototype(), + listOf(), + brackets = result is PrimaryConstructor, + newLineAfter = false).assignNoPrototype())).assignNoPrototype() + } + + return result } private fun findThisOrSuperCall(constructor: PsiMethod): PsiExpressionStatement? { diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt index a1a102b1ae8..130138df8e8 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.j2k.ast import org.jetbrains.kotlin.j2k.* -abstract class Member(val annotations: Annotations, val modifiers: Modifiers) : Element() +abstract class Member(var annotations: Annotations, val modifiers: Modifiers) : Element() class ClassBody ( val primaryConstructorSignature: PrimaryConstructorSignature?, diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt index 51958f86d51..e965f0ac312 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt @@ -19,12 +19,19 @@ package org.jetbrains.kotlin.j2k.ast import org.jetbrains.kotlin.j2k.* import com.intellij.util.IncorrectOperationException +abstract class Constructor( + annotations: Annotations, + modifiers: Modifiers, + public val parameterList: ParameterList, + protected val body: DeferredElement +) : Member(annotations, modifiers) + class PrimaryConstructor( annotations: Annotations, modifiers: Modifiers, - val parameterList: ParameterList, - val body: DeferredElement -) : Member(annotations, modifiers) { + parameterList: ParameterList, + body: DeferredElement +) : Constructor(annotations, modifiers, parameterList, body) { override fun generateCode(builder: CodeBuilder) { throw IncorrectOperationException() } @@ -66,10 +73,10 @@ class PrimaryConstructorSignature(val annotations: Annotations, private val modi class SecondaryConstructor( annotations: Annotations, modifiers: Modifiers, - private val parameterList: ParameterList, - private val body: DeferredElement, + parameterList: ParameterList, + body: DeferredElement, private val thisOrSuperCall: DeferredElement? -) : Member(annotations, modifiers) { +) : Constructor(annotations, modifiers, parameterList, body) { override fun generateCode(builder: CodeBuilder) { builder.append(annotations) diff --git a/j2k/testData/fileOrElement/comments/commentsForConstructors.kt b/j2k/testData/fileOrElement/comments/commentsForConstructors.kt index 3a60fe10ed9..19b97efce0e 100644 --- a/j2k/testData/fileOrElement/comments/commentsForConstructors.kt +++ b/j2k/testData/fileOrElement/comments/commentsForConstructors.kt @@ -1,5 +1,5 @@ class A// this is a primary constructor -(p: Int = 1) { +[overloads] (p: Int = 1) { private val v: Int init { diff --git a/j2k/testData/fileOrElement/constructors/allCallsPrimary.kt b/j2k/testData/fileOrElement/constructors/allCallsPrimary.kt index 15d59dd3b6a..b598ef5337a 100644 --- a/j2k/testData/fileOrElement/constructors/allCallsPrimary.kt +++ b/j2k/testData/fileOrElement/constructors/allCallsPrimary.kt @@ -1,6 +1,6 @@ package pack -class C(arg1: Int, arg2: Int = 0, arg3: Int = 0) +class C [overloads] (arg1: Int, arg2: Int = 0, arg3: Int = 0) public object User { public fun main() { diff --git a/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParams9.kt b/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParams9.kt index 136d947610d..c46e8365379 100644 --- a/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParams9.kt +++ b/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParams9.kt @@ -1 +1 @@ -class C(private val string: String, a: Int = string.length()) \ No newline at end of file +class C [overloads] (private val string: String, a: Int = string.length()) diff --git a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults.kt b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults.kt index 809aa3ec397..2aa4e7b254e 100644 --- a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults.kt +++ b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults.kt @@ -1,4 +1,4 @@ -class A(nested: A.Nested = A.Nested(A.Nested.FIELD)) { +class A [overloads] (nested: A.Nested = A.Nested(A.Nested.FIELD)) { class Nested(p: Int) { companion object { diff --git a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt index 4b66aadb31f..67db9b6781a 100644 --- a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt +++ b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt @@ -1,7 +1,7 @@ // ERROR: Property must be initialized or be abstract import A.Nested -class A(nested: Nested = Nested(Nested.FIELD)) { +class A [overloads] (nested: Nested = Nested(Nested.FIELD)) { class Nested(p: Int) { companion object { diff --git a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt index 436c8a67ff9..ae315a6624a 100644 --- a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt +++ b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt @@ -3,7 +3,7 @@ package pack import pack.A.Nested -class A(nested: Nested = Nested(Nested.FIELD)) { +class A [overloads] (nested: Nested = Nested(Nested.FIELD)) { class Nested(p: Int) { companion object { diff --git a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt index 7578c0cbbe8..6c6bb3f315c 100644 --- a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt +++ b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt @@ -3,7 +3,7 @@ package pack import pack.A.* -class A(nested: Nested = Nested(Nested.FIELD)) { +class A [overloads] (nested: Nested = Nested(Nested.FIELD)) { class Nested(p: Int) { companion object { diff --git a/j2k/testData/fileOrElement/constructors/parameterDefaults1.kt b/j2k/testData/fileOrElement/constructors/parameterDefaults1.kt index 9bf9e6ab720..e7dc4057700 100644 --- a/j2k/testData/fileOrElement/constructors/parameterDefaults1.kt +++ b/j2k/testData/fileOrElement/constructors/parameterDefaults1.kt @@ -1,6 +1,6 @@ package pack -class C(a: Int = 0, b: Int = 0, c: Int = 0, d: Int = 0, e: Int = 0) { +class C [overloads] (a: Int = 0, b: Int = 0, c: Int = 0, d: Int = 0, e: Int = 0) { constructor(a: Int) : this(a, 0, 0, 0, 1) { } diff --git a/j2k/testData/fileOrElement/constructors/parameterDefaults2.kt b/j2k/testData/fileOrElement/constructors/parameterDefaults2.kt index e10eab09eb6..4067d0b4693 100644 --- a/j2k/testData/fileOrElement/constructors/parameterDefaults2.kt +++ b/j2k/testData/fileOrElement/constructors/parameterDefaults2.kt @@ -1,6 +1,6 @@ package pack -class C(a: Int = 0, b: Int = 0, c: Int = 0, d: Int = 0, e: Int = 0) { +class C [overloads] (a: Int = 0, b: Int = 0, c: Int = 0, d: Int = 0, e: Int = 0) { constructor(a1: Int, b1: Int, c1: Int) : this(a1, b1, c1, 0, 0) { } diff --git a/j2k/testData/fileOrElement/constructors/parameterDefaults3.kt b/j2k/testData/fileOrElement/constructors/parameterDefaults3.kt index 227426e9caf..1897e3c363b 100644 --- a/j2k/testData/fileOrElement/constructors/parameterDefaults3.kt +++ b/j2k/testData/fileOrElement/constructors/parameterDefaults3.kt @@ -1,6 +1,6 @@ package pack -class C(a: Int = 0, b: Int = 0, c: Int = 0, d: Int = 0, e: Int = 0) { +class C [overloads] (a: Int = 0, b: Int = 0, c: Int = 0, d: Int = 0, e: Int = 0) { constructor(a: Int, b: Int, c: Int) : this(b, a, c, 0, 0) { } diff --git a/j2k/testData/fileOrElement/constructors/parameterDefaults4.kt b/j2k/testData/fileOrElement/constructors/parameterDefaults4.kt index e4680f452d8..ce92eeaaacd 100644 --- a/j2k/testData/fileOrElement/constructors/parameterDefaults4.kt +++ b/j2k/testData/fileOrElement/constructors/parameterDefaults4.kt @@ -1,3 +1,3 @@ package pack -class C(a: Int = 1, b: Int = 2, c: Int = 3, d: Int = 4, e: Int = 5) +class C [overloads] (a: Int = 1, b: Int = 2, c: Int = 3, d: Int = 4, e: Int = 5) diff --git a/j2k/testData/fileOrElement/constructors/parameterDefaults5.kt b/j2k/testData/fileOrElement/constructors/parameterDefaults5.kt index e4680f452d8..ce92eeaaacd 100644 --- a/j2k/testData/fileOrElement/constructors/parameterDefaults5.kt +++ b/j2k/testData/fileOrElement/constructors/parameterDefaults5.kt @@ -1,3 +1,3 @@ package pack -class C(a: Int = 1, b: Int = 2, c: Int = 3, d: Int = 4, e: Int = 5) +class C [overloads] (a: Int = 1, b: Int = 2, c: Int = 3, d: Int = 4, e: Int = 5) diff --git a/j2k/testData/fileOrElement/constructors/parameterModification.kt b/j2k/testData/fileOrElement/constructors/parameterModification.kt index 3912190d9e2..985d1d23178 100644 --- a/j2k/testData/fileOrElement/constructors/parameterModification.kt +++ b/j2k/testData/fileOrElement/constructors/parameterModification.kt @@ -1,5 +1,5 @@ -// ERROR: Overload resolution ambiguity: public constructor C(arg1: kotlin.Int, arg2: kotlin.Int) defined in C public constructor C(arg1: kotlin.Int, arg2: kotlin.Int = ..., arg3: kotlin.Int = ...) defined in C -class C(arg1: Int, arg2: Int = 0, arg3: Int = 0) { +// ERROR: Overload resolution ambiguity: public constructor C(arg1: kotlin.Int, arg2: kotlin.Int) defined in C kotlin.jvm.overloads public constructor C(arg1: kotlin.Int, arg2: kotlin.Int = ..., arg3: kotlin.Int = ...) defined in C +class C [overloads] (arg1: Int, arg2: Int = 0, arg3: Int = 0) { private val field: Int init { diff --git a/j2k/testData/fileOrElement/constructors/privateConstructors.kt b/j2k/testData/fileOrElement/constructors/privateConstructors.kt index 4c2289de5b7..36df870569d 100644 --- a/j2k/testData/fileOrElement/constructors/privateConstructors.kt +++ b/j2k/testData/fileOrElement/constructors/privateConstructors.kt @@ -1,4 +1,4 @@ -class C private (arg1: Int, arg2: Int, arg3: Int = 0) { +class C [overloads] private (arg1: Int, arg2: Int, arg3: Int = 0) { public constructor(arg1: Int) : this(arg1, 0, 0) { } diff --git a/j2k/testData/fileOrElement/dropAccessors/DifferentFieldNameAndDefaultParameterValue.kt b/j2k/testData/fileOrElement/dropAccessors/DifferentFieldNameAndDefaultParameterValue.kt index 72ff7b69aeb..5ddd719213a 100644 --- a/j2k/testData/fileOrElement/dropAccessors/DifferentFieldNameAndDefaultParameterValue.kt +++ b/j2k/testData/fileOrElement/dropAccessors/DifferentFieldNameAndDefaultParameterValue.kt @@ -1 +1 @@ -public class C(c: C, public val x: Int = c.x) \ No newline at end of file +public class C [overloads] (c: C, public val x: Int = c.x)