Generated constructors with default parameter values are marked with kotlin.jvm.overloads annotation

This commit is contained in:
Valentin Kipyatkov
2015-04-07 21:27:10 +03:00
parent 1afbb961ee
commit 9b80d49bab
18 changed files with 46 additions and 30 deletions
@@ -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<PsiMember>,
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? {
@@ -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?,
@@ -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<Block>
) : Member(annotations, modifiers)
class PrimaryConstructor(
annotations: Annotations,
modifiers: Modifiers,
val parameterList: ParameterList,
val body: DeferredElement<Block>
) : Member(annotations, modifiers) {
parameterList: ParameterList,
body: DeferredElement<Block>
) : 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<Block>,
parameterList: ParameterList,
body: DeferredElement<Block>,
private val thisOrSuperCall: DeferredElement<Expression>?
) : Member(annotations, modifiers) {
) : Constructor(annotations, modifiers, parameterList, body) {
override fun generateCode(builder: CodeBuilder) {
builder.append(annotations)
@@ -1,5 +1,5 @@
class A// this is a primary constructor
(p: Int = 1) {
[overloads] (p: Int = 1) {
private val v: Int
init {
@@ -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() {
@@ -1 +1 @@
class C(private val string: String, a: Int = string.length())
class C [overloads] (private val string: String, a: Int = string.length())
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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) {
}
@@ -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) {
}
@@ -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) {
}
@@ -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)
@@ -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)
@@ -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 {
@@ -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) {
}
@@ -1 +1 @@
public class C(c: C, public val x: Int = c.x)
public class C [overloads] (c: C, public val x: Int = c.x)