From 01e5ee718f7f494cbade39a1dc58a85ac99e59f5 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 20 Mar 2015 12:59:05 +0300 Subject: [PATCH] Allow secondary constructors without body #KT-6967 Fixed --- .../codegen/ImplementationBodyCodegen.java | 4 +- .../jetbrains/kotlin/parsing/JetParsing.java | 4 +- .../kotlin/psi/JetSecondaryConstructor.java | 4 +- .../accessToCompanion.kt | 2 +- .../clashingDefaultConstructors.kt | 8 +- .../delegationWithPrimary.kt | 2 +- .../box/secondaryConstructors/generics.kt | 6 +- .../classInitializersWithoutPrimary.kt | 2 +- .../companionObjectScope.kt | 4 +- .../constructorCallType.kt | 8 +- .../constructorInObject.kt | 16 +-- .../constructorInTrait.kt | 4 +- .../ctrsAnnotationResolve.kt | 6 +- .../cyclicDelegationCalls.kt | 36 +++---- .../secondaryConstructors/dataClasses.kt | 6 +- .../dataFlowInDelegationCall.kt | 2 +- .../delegationByWithoutPrimary.kt | 2 +- .../tests/secondaryConstructors/enums.kt | 22 ++--- .../expectedPrimaryConstructorCall.kt | 4 +- .../tests/secondaryConstructors/generics.kt | 18 ++-- .../tests/secondaryConstructors/generics2.kt | 24 ++--- .../tests/secondaryConstructors/generics3.kt | 18 ++-- .../headerSupertypeInitialization.kt | 2 +- .../initializationFromOtherInstance.kt | 2 +- .../tests/secondaryConstructors/kt6992.kt | 2 +- .../tests/secondaryConstructors/kt6993.kt | 3 +- .../tests/secondaryConstructors/kt6994.kt | 3 +- .../lambdaInDelegation.kt | 4 +- .../memberAccessBeforeSuperCall.kt | 12 +-- .../noDefaultIfEmptySecondary.kt | 2 +- .../noPrimaryConstructor.kt | 4 +- ...oSupertypeInitWithSecondaryConstructors.kt | 2 +- .../secondaryConstructors/redeclarations.kt | 17 ++-- .../redeclarationsOfConstructorsIgnored.kt | 4 +- ...esolvePropertyInitializerWithoutPrimary.kt | 2 +- .../secondaryConstructors/superAnyNonEmpty.kt | 2 +- .../superSecondaryNonExisting.kt | 8 +- .../valOrValAndModifiersInCtr.kt | 2 +- .../varargsInDelegationCallToPrimary.kt | 8 +- .../varargsInDelegationCallToSecondary.kt | 8 +- .../psi/secondaryConstructors/emptyBody.kt | 10 ++ .../psi/secondaryConstructors/emptyBody.txt | 97 +++++++++++++++++++ .../recoveryEmptyDelegationType.kt | 4 + .../recoveryEmptyDelegationType.txt | 33 +++++++ .../recoveryWithoutParameterList.kt | 5 + .../recoveryWithoutParameterList.txt | 26 ++++- .../recoveryWrongDelegationName.kt | 6 ++ .../recoveryWrongDelegationName.txt | 52 +++++++++- .../parsing/JetParsingTestGenerated.java | 6 ++ .../formatter/SecondaryConstructors.after.kt | 6 +- .../formatter/SecondaryConstructors.kt | 4 +- .../secondaryCtorLineBreak.after.inv.kt | 2 + .../formatter/secondaryCtorLineBreak.after.kt | 2 + .../formatter/secondaryCtorLineBreak.kt | 1 + 54 files changed, 390 insertions(+), 153 deletions(-) create mode 100644 compiler/testData/psi/secondaryConstructors/emptyBody.kt create mode 100644 compiler/testData/psi/secondaryConstructors/emptyBody.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 8a6c71bad3c..28ddc21527a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -1176,7 +1176,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { JetSecondaryConstructor constructor = (JetSecondaryConstructor) DescriptorToSourceUtils.descriptorToDeclaration(constructorDescriptor); assert constructor != null; - codegen.gen(constructor.getBodyExpression(), Type.VOID_TYPE); + if (constructor.hasBody()) { + codegen.gen(constructor.getBodyExpression(), Type.VOID_TYPE); + } iv.visitInsn(RETURN); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java index 0dd1381837b..a350578a268 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java @@ -908,7 +908,9 @@ public class JetParsing extends AbstractJetParsing { emptyDelegationCall.done(CONSTRUCTOR_DELEGATION_CALL); } - parseBlock(); + if (at(LBRACE)) { + parseBlock(); + } } private void parseThisOrSuper() { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetSecondaryConstructor.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetSecondaryConstructor.java index 83e173730d7..b3c18918f61 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetSecondaryConstructor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetSecondaryConstructor.java @@ -88,7 +88,7 @@ public class JetSecondaryConstructor extends JetDeclarationStub(val x: T, val y: T) { - constructor(x: T): this(x, x) {} + constructor(x: T): this(x, x) override fun toString() = "$x#$y" } class A : B { - constructor(): super("default") {} - constructor(x: String): super(x, "default") {} + constructor(): super("default") + constructor(x: String): super(x, "default") } fun box(): String { diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/classInitializersWithoutPrimary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/classInitializersWithoutPrimary.kt index 9a25b89fc60..30c8fe5f432 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/classInitializersWithoutPrimary.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/classInitializersWithoutPrimary.kt @@ -1,4 +1,4 @@ class A { - constructor() {} + constructor() init {} } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/companionObjectScope.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/companionObjectScope.kt index 43a40a6e941..eadb1fd1607 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/companionObjectScope.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/companionObjectScope.kt @@ -12,6 +12,6 @@ class A { object C { } - constructor(x: Int) {} - constructor() : this(foo() + prop + B.bar() + B.prop + C) {} + constructor(x: Int) + constructor() : this(foo() + prop + B.bar() + B.prop + C) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt index 81bb7884051..813262f1d1c 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt @@ -1,15 +1,15 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A(x: Int) { - constructor(x: Double): this(1) {} - constructor(x: String): this(1) {} + constructor(x: Double): this(1) + constructor(x: String): this(1) } val x1: A = A(1) val x2: A = A(1.0) val x3: A = A("abc") class B { - constructor(x: String) {} - constructor(x: R) {} + constructor(x: String) + constructor(x: R) } val y1: B = B(1) diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.kt index d3bbc486c60..eb98b90d088 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInObject.kt @@ -1,20 +1,20 @@ object A { - constructor() {} - init {} + constructor() + init {} } enum class B { X : B() { - constructor() {} - } + constructor() + } } class C { companion object { - constructor() {} - } + constructor() + } } val anonObject = object { - constructor() {} -} + constructor() +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInTrait.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInTrait.kt index ee001cd3ebd..d7825e8687f 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInTrait.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorInTrait.kt @@ -1,3 +1,3 @@ trait A { - constructor() {} -} + constructor() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/ctrsAnnotationResolve.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/ctrsAnnotationResolve.kt index 4b5246999a9..da64820316a 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/ctrsAnnotationResolve.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/ctrsAnnotationResolve.kt @@ -3,7 +3,7 @@ annotation class Ann1 annotation class Ann2(val x: Int) class A { - Ann1 constructor() {} - Ann2 constructor(x1: Int) {} - Ann2(2) constructor(x1: Int, x2: Int) {} + Ann1 constructor() + Ann2 constructor(x1: Int) + Ann2(2) constructor(x1: Int, x2: Int) } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/cyclicDelegationCalls.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/cyclicDelegationCalls.kt index 1102dfc8039..0a9a4ef093e 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/cyclicDelegationCalls.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/cyclicDelegationCalls.kt @@ -1,39 +1,39 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A1 { - constructor(): this() {} + constructor(): this() } class A2(x: Byte) { - constructor(x1: Int): this(x1, 1) {} - constructor(x1: Int, x2: Int): this(x1, x2, 2) {} - constructor(x1: Int, x2: Int, x3: Int): this(x1) {} + constructor(x1: Int): this(x1, 1) + constructor(x1: Int, x2: Int): this(x1, x2, 2) + constructor(x1: Int, x2: Int, x3: Int): this(x1) // delegating to previously declared cycle - constructor(x1: Double): this(1) {} + constructor(x1: Double): this(1) // delegating to cycle declared after - constructor(x1: String): this(1L) {} + constructor(x1: String): this(1L) - constructor(x1: Long): this(x1, 1L) {} - constructor(x1: Long, x2: Long): this(x1, x2, 2L) {} - constructor(x1: Long, x2: Long, x3: Long): this(x1) {} + constructor(x1: Long): this(x1, 1L) + constructor(x1: Long, x2: Long): this(x1, x2, 2L) + constructor(x1: Long, x2: Long, x3: Long): this(x1) // no cycle, just call to primary constuctor - constructor(x1: Double, x2: Double): this(x1, x2, 1.0) {} - constructor(x1: Double, x2: Double, x3: Double): this(x1, x2, x3, 1.0) {} - constructor(x1: Double, x2: Double, x3: Double, x4: Double): this(1.toByte()) {} + constructor(x1: Double, x2: Double): this(x1, x2, 1.0) + constructor(x1: Double, x2: Double, x3: Double): this(x1, x2, x3, 1.0) + constructor(x1: Double, x2: Double, x3: Double, x4: Double): this(1.toByte()) - constructor(): this("x", "y") {} + constructor(): this("x", "y") - constructor(x1: String, x2: String): this(x1, x2, "") {} - constructor(x1: String, x2: String, x3: String): this(x1, x2) {} + constructor(x1: String, x2: String): this(x1, x2, "") + constructor(x1: String, x2: String, x3: String): this(x1, x2) } open class B(x: Byte) class A : B { // no cycle, just call to super constuctor - constructor(x1: Double, x2: Double): this(x1, x2, 1.0) {} - constructor(x1: Double, x2: Double, x3: Double): this(x1, x2, x3, 1.0) {} - constructor(x1: Double, x2: Double, x3: Double, x4: Double): super(1.toByte()) {} + constructor(x1: Double, x2: Double): this(x1, x2, 1.0) + constructor(x1: Double, x2: Double, x3: Double): this(x1, x2, x3, 1.0) + constructor(x1: Double, x2: Double, x3: Double, x4: Double): super(1.toByte()) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.kt index 09c2bc61049..76d76fa977c 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.kt @@ -1,12 +1,12 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER data class A1(val x: String) { - constructor(): this("") {} + constructor(): this("") } data class A2() { - constructor(x: String): this() {} + constructor(x: String): this() } data class A3 { - constructor() {} + constructor() } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/dataFlowInDelegationCall.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/dataFlowInDelegationCall.kt index ecd4baf8f3b..207b99c9d00 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/dataFlowInDelegationCall.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/dataFlowInDelegationCall.kt @@ -1,6 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A { - constructor(x: Any, y: Any, z: Any) {} + constructor(x: Any, y: Any, z: Any) constructor(x: String?, y: String?): this(x!!, x.length().toString() + y!!, "") { x.length() + y.length() } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt index 669d75112c9..8163abc6ef4 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt @@ -2,5 +2,5 @@ trait A class AImpl : A class B : A by AImpl() { - constructor() {} + constructor() } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/enums.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/enums.kt index 18457a93555..c46ace21313 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/enums.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/enums.kt @@ -2,24 +2,24 @@ enum class A { W: A(1) X: A(1, 2) Y: A(3.0) Z: A("") E: A() - constructor() {} - constructor(x: Int) {} - constructor(x: Int, y: Int): this(x+y) {} - constructor(x: Double): this(x.toInt(), 1) {} - constructor(x: String): super(x, 1) {} + constructor() + constructor(x: Int) + constructor(x: Int, y: Int): this(x+y) + constructor(x: Double): this(x.toInt(), 1) + constructor(x: String): super(x, 1) } enum class B(x: Int) { W: B(1) X: B(1, 2) Y: B(3.0) Z: B("") - constructor(x: Int, y: Int): this(x+y) {} - constructor(x: Double): this(x.toInt(), 1) {} - constructor(x: String): super(x, 1) {} + constructor(x: Int, y: Int): this(x+y) + constructor(x: Double): this(x.toInt(), 1) + constructor(x: String): super(x, 1) } enum class C { EMPTY: C() // may be we should avoid explicit call here - constructor() {} + constructor() } enum class D(val prop: Int) { @@ -33,8 +33,8 @@ enum class D(val prop: Int) { override fun f() = prop } - constructor(): this(1) {} - constructor(x: String): this(x.length()) {} + constructor(): this(1) + constructor(x: String): this(x.length()) abstract fun f(): Int } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/expectedPrimaryConstructorCall.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/expectedPrimaryConstructorCall.kt index 0216202458f..d849121170c 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/expectedPrimaryConstructorCall.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/expectedPrimaryConstructorCall.kt @@ -1,8 +1,8 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A(x: Int) { - constructor() {} + constructor() } open class B(x: Int) class C(x: Int) : B(x) { - constructor(): super(1) {} + constructor(): super(1) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/generics.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/generics.kt index 9995a37a28d..ec12f03f68a 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/generics.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/generics.kt @@ -1,21 +1,21 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -UNREACHABLE_CODE open class B(x: T, y: T) { - constructor(x: T): this(x, x) {} - constructor(): this(null!!, null!!) {} + constructor(x: T): this(x, x) + constructor(): this(null!!, null!!) } class A0 : B { - constructor() {} - constructor(x: String): super(x) {} - constructor(x: String, y: String): super(x, y) {} + constructor() + constructor(x: String): super(x) + constructor(x: String, y: String): super(x, y) } class A1 : B { - constructor() {} - constructor(x: R): super(x) {} - constructor(x: R, y: R): super(x, y) {} + constructor() + constructor(x: R): super(x) + constructor(x: R, y: R): super(x, y) } class A2 { - constructor(t: R, i: Int) : this(i, 1) {} + constructor(t: R, i: Int) : this(i, 1) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/generics2.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/generics2.kt index 4a4c28f65e6..550319f69b8 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/generics2.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/generics2.kt @@ -2,25 +2,25 @@ open class B(x: R1, y: R2) class A0 { - constructor(x: T1, y: T2): this(x, y) {} + constructor(x: T1, y: T2): this(x, y) - constructor(x: T1, y: T2, z: T2): this(x, 1) {} // ok, delegates to constructor(x: T1, y: Int) + constructor(x: T1, y: T2, z: T2): this(x, 1) // ok, delegates to constructor(x: T1, y: Int) - constructor(x: T1, y: Int): this(x, "") {} - constructor(x: T1): this(x, 1) {} - constructor(x: T1, y: T2, z: String): this(y, x) {} + constructor(x: T1, y: Int): this(x, "") + constructor(x: T1): this(x, 1) + constructor(x: T1, y: T2, z: String): this(y, x) } class A1 : B { - constructor(x: T1, y: T2): super(x, y) {} - constructor(x: T1, y: Int): super(x, y) {} - constructor(x: T1, y: T1, z: T1): super(x, y) {} + constructor(x: T1, y: T2): super(x, y) + constructor(x: T1, y: Int): super(x, y) + constructor(x: T1, y: T1, z: T1): super(x, y) } class A2 : B { - constructor(x: T1, y: T2): super(x, y) {} - constructor(x: T1, y: Int): super(x, y) {} - constructor(x: T1, y: T1, z: T1): super(x, y) {} - constructor(x: T1, y: T2, z: String): super(y, 1) {} + constructor(x: T1, y: T2): super(x, y) + constructor(x: T1, y: Int): super(x, y) + constructor(x: T1, y: T1, z: T1): super(x, y) + constructor(x: T1, y: T2, z: String): super(y, 1) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/generics3.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/generics3.kt index 2df7806d789..be48be48bdd 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/generics3.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/generics3.kt @@ -1,16 +1,16 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER open class B { - constructor(x: X, y: Y) {} - constructor(x: X, s: String) {} - constructor(y: Y, i: Int) : this(y, "") {} + constructor(x: X, y: Y) + constructor(x: X, s: String) + constructor(y: Y, i: Int) : this(y, "") } class A : B { - constructor(x: T1, y: T2): super(x, y) {} - constructor(x: T2, y: T2, z: String): super(x, y) {} + constructor(x: T1, y: T2): super(x, y) + constructor(x: T2, y: T2, z: String): super(x, y) - constructor(x: T2, z: String, z1: String): super(x, "") {} - constructor(x: T2, z: String, z1: String, z2: String): super(x, 1) {} - constructor(x: T1, z: String, z1: String, z2: String, z3: String): super(x, "") {} - constructor(x: T1, z: String, z1: String, z2: String, z3: String, z4: String): super(x, 1) {} + constructor(x: T2, z: String, z1: String): super(x, "") + constructor(x: T2, z: String, z1: String, z2: String): super(x, 1) + constructor(x: T1, z: String, z1: String, z2: String, z3: String): super(x, "") + constructor(x: T1, z: String, z1: String, z2: String, z3: String, z4: String): super(x, 1) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/headerSupertypeInitialization.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/headerSupertypeInitialization.kt index faf1a4023ed..fbaccfdb361 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/headerSupertypeInitialization.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/headerSupertypeInitialization.kt @@ -1,5 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER open class B(x: Int) class A : B(1) { - constructor(): super(1) {} + constructor(): super(1) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/initializationFromOtherInstance.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/initializationFromOtherInstance.kt index b5b7c98f7ce..783a39e61ab 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/initializationFromOtherInstance.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/initializationFromOtherInstance.kt @@ -11,5 +11,5 @@ class A { } } class A1(val x: Int, val y: Int) { - constructor(other: A1): this(other.x, other.y) {} + constructor(other: A1): this(other.x, other.y) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/kt6992.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/kt6992.kt index 6e5da24f3f2..ea55fe28ebf 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/kt6992.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/kt6992.kt @@ -1,3 +1,3 @@ class X(val t: T) { - constructor(t: String): this(t) {} + constructor(t: String): this(t) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/kt6993.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/kt6993.kt index 43ce6347784..507c3565bd0 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/kt6993.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/kt6993.kt @@ -1,5 +1,4 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class X(val t: T) { - constructor(t: T, i: Int) : this(i) { - } + constructor(t: T, i: Int) : this(i) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/kt6994.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/kt6994.kt index 71a89ed93fc..11e040e7b24 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/kt6994.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/kt6994.kt @@ -1,5 +1,4 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class X { - constructor(t: T, i: Int): this(i, 1) { // no error - } + constructor(t: T, i: Int): this(i, 1) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/lambdaInDelegation.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/lambdaInDelegation.kt index 287c9a3a531..c89b547890c 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/lambdaInDelegation.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/lambdaInDelegation.kt @@ -1,5 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A { - constructor(block: (T1) -> T2) {} - constructor(x: T2): this({ x }) {} + constructor(block: (T1) -> T2) + constructor(x: T2): this({ x }) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt index 553f29be5ce..bf32a7f53fa 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt @@ -3,11 +3,11 @@ open class B(open val parentProperty: String) class A : B { val myProp: String = "" override val parentProperty: String = "" - constructor(arg: String = myProp): super(myProp) {} - constructor(x1: String, arg: String = this.myProp): super(this.myProp) {} - constructor(x1: String, x2: String, arg: String = parentProperty): super(parentProperty) {} - constructor(x1: String, x2: String, x3: String, arg: String = super.parentProperty): super(super.parentProperty) {} - constructor(x1: String, x2: String, x3: String, x4: String, arg: String = foo(this)): super(foo(this)) {} - constructor(x1: String, x2: String, x3: String, x4: String, x5: String, arg: String = foo(this@A)): super(foo(this@A)) {} + constructor(arg: String = myProp): super(myProp) + constructor(x1: String, arg: String = this.myProp): super(this.myProp) + constructor(x1: String, x2: String, arg: String = parentProperty): super(parentProperty) + constructor(x1: String, x2: String, x3: String, arg: String = super.parentProperty): super(super.parentProperty) + constructor(x1: String, x2: String, x3: String, x4: String, arg: String = foo(this)): super(foo(this)) + constructor(x1: String, x2: String, x3: String, x4: String, x5: String, arg: String = foo(this@A)): super(foo(this@A)) } fun foo(x: A) = "" diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/noDefaultIfEmptySecondary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/noDefaultIfEmptySecondary.kt index e0572c3396f..8cacea8d87e 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/noDefaultIfEmptySecondary.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/noDefaultIfEmptySecondary.kt @@ -1,4 +1,4 @@ // do not report generate empty synthetic constructor by primary as it leads to CONFLICTING_JVM_DECLARATIONS class A(val x: Int = 1, val y: Int = 2) { - constructor(): this(0, 0) {} + constructor(): this(0, 0) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt index 6a55f3fd351..89665c8bbbc 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt @@ -1,8 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A { - constructor(x: Int) { - - } + constructor(x: Int) } val x = A() diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt index 4f839663dcc..83d0dd91591 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt @@ -2,5 +2,5 @@ open class B trait C trait D class A : C, B, D { - constructor() {} + constructor() } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt index eb542956b0c..eb568279afc 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt @@ -1,27 +1,26 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A(x: String = "", y: String = "") { - constructor(x: String, y: String): this(x, y) {} - constructor(): this("", "") {} - constructor(): this("", "") {} + constructor(x: String, y: String): this(x, y) + constructor(): this("", "") + constructor(): this("", "") } class B { - constructor(x: Int) {} + constructor(x: Int) } fun B(x: Int) {} class Outer { class A(x: String = "", y: String = "") { - constructor(x: String, y: String): this(x, y) {} - constructor(): this("", "") {} - constructor(): this("", "") {} + constructor(x: String, y: String): this(x, y) + constructor(): this("", "") + constructor(): this("", "") } class B { - constructor(x: Int) { - } + constructor(x: Int) } fun B(x: Int) {} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarationsOfConstructorsIgnored.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarationsOfConstructorsIgnored.kt index 2eb5c2c13c2..eb709c8a119 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarationsOfConstructorsIgnored.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarationsOfConstructorsIgnored.kt @@ -1,11 +1,11 @@ class A class A { - constructor() {} + constructor() } class B class Outer { class B { - constructor() {} + constructor() } } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/resolvePropertyInitializerWithoutPrimary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/resolvePropertyInitializerWithoutPrimary.kt index bdb30e427fe..b7efe8ba91d 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/resolvePropertyInitializerWithoutPrimary.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/resolvePropertyInitializerWithoutPrimary.kt @@ -1,4 +1,4 @@ class A { val prop: Int = "" - constructor() {} + constructor() } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/superAnyNonEmpty.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/superAnyNonEmpty.kt index 95ba83edf37..1e31c5345f7 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/superAnyNonEmpty.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/superAnyNonEmpty.kt @@ -1,4 +1,4 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER class A { - constructor(): super(1) { } + constructor(): super(1) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt index 86b1bb8b989..fe14269ce2c 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt @@ -1,10 +1,10 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER open class B(x: Double) { - constructor(x: Int): this(1.0) {} - constructor(x: String): this(1.0) {} + constructor(x: Int): this(1.0) + constructor(x: String): this(1.0) } trait C class A : B, C { - constructor(): super(' ') { } - constructor(x: Int) { } + constructor(): super(' ') + constructor(x: Int) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt index f9a37b86104..fcdbb1b3833 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt @@ -3,5 +3,5 @@ class A { constructor( val x: Int, y: Int, var z: Int, - public a: Int) {} + public a: Int) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToPrimary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToPrimary.kt index 2d75e8c62fd..837503019cf 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToPrimary.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToPrimary.kt @@ -2,11 +2,11 @@ fun array(vararg x: T): Array = null!! open class B(vararg y: String) { - constructor(x: Int): this(x.toString(), *array("1"), "2") {} + constructor(x: Int): this(x.toString(), *array("1"), "2") } class A : B { - constructor(x: String, y: String): super(x, *array("3"), y) {} - constructor(x: String): super(x) {} - constructor(): super() {} + constructor(x: String, y: String): super(x, *array("3"), y) + constructor(x: String): super(x) + constructor(): super() } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToSecondary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToSecondary.kt index 9679b02f84a..1dfd9cfe6af 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToSecondary.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToSecondary.kt @@ -2,13 +2,13 @@ fun array(vararg x: T): Array = null!! open class B(x: Int) { - constructor(vararg y: String): this(y[0].length()) {} + constructor(vararg y: String): this(y[0].length()) } class A : B { - constructor(x: String, y: String): super(x, *array("q"), y) {} - constructor(x: String): super(x) {} - constructor(): super() {} + constructor(x: String, y: String): super(x, *array("q"), y) + constructor(x: String): super(x) + constructor(): super() } val b1 = B() diff --git a/compiler/testData/psi/secondaryConstructors/emptyBody.kt b/compiler/testData/psi/secondaryConstructors/emptyBody.kt new file mode 100644 index 00000000000..404345d03f3 --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/emptyBody.kt @@ -0,0 +1,10 @@ +class A { + constructor() + fun foo() = 1 + public constructor() + val x = 2 + + constructor(): this() + constructor(): super(3) + val x = 4 +} diff --git a/compiler/testData/psi/secondaryConstructors/emptyBody.txt b/compiler/testData/psi/secondaryConstructors/emptyBody.txt new file mode 100644 index 00000000000..18ae977f0ec --- /dev/null +++ b/compiler/testData/psi/secondaryConstructors/emptyBody.txt @@ -0,0 +1,97 @@ +JetFile: emptyBody.kt + PACKAGE_DIRECTIVE + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('A') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + MODIFIER_LIST + PsiElement(public)('public') + PsiWhiteSpace(' ') + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('2') + PsiWhiteSpace('\n\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + PsiElement(this)('this') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + PsiElement(super)('super') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('3') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('4') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.kt b/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.kt index db64890ccac..38efdf885d3 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.kt +++ b/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.kt @@ -5,6 +5,10 @@ class A { fun foo() = 2 } +class C { + constructor(x: Int) : () +} + class B { constructor(x: Int) : () { x = 3 diff --git a/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.txt b/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.txt index b0a4793eb19..51af980c4a7 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.txt +++ b/compiler/testData/psi/secondaryConstructors/recoveryEmptyDelegationType.txt @@ -62,6 +62,39 @@ JetFile: recoveryEmptyDelegationType.kt PsiWhiteSpace('\n') PsiElement(RBRACE)('}') PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('C') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('x') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') CLASS PsiElement(class)('class') PsiWhiteSpace(' ') diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.kt b/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.kt index 90be7e9def5..2ef05b955a9 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.kt +++ b/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.kt @@ -2,6 +2,11 @@ class A { constructor : this() {} val x: Int } + +class C { + constructor : this() +} + class B { constructor : this() {} } diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.txt b/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.txt index 08707412cd0..548c62a80ec 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.txt +++ b/compiler/testData/psi/secondaryConstructors/recoveryWithoutParameterList.txt @@ -39,7 +39,31 @@ JetFile: recoveryWithoutParameterList.kt PsiElement(IDENTIFIER)('Int') PsiWhiteSpace('\n') PsiElement(RBRACE)('}') - PsiWhiteSpace('\n') + PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('C') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + PsiErrorElement:Expecting '(' + + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + CONSTRUCTOR_DELEGATION_REFERENCE + PsiElement(this)('this') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') CLASS PsiElement(class)('class') PsiWhiteSpace(' ') diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt index a49f0a6fa51..ee6aa19994d 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt +++ b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.kt @@ -2,3 +2,9 @@ class A { constructor() : superr(1,2) {} val x: Int } + +class B { + constructor() : thhiis(3, 4) +} + +val x: Int = 1 \ No newline at end of file diff --git a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt index 53881731a1b..b06cddc773f 100644 --- a/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt +++ b/compiler/testData/psi/secondaryConstructors/recoveryWrongDelegationName.txt @@ -47,4 +47,54 @@ JetFile: recoveryWrongDelegationName.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('Int') PsiWhiteSpace('\n') - PsiElement(RBRACE)('}') \ No newline at end of file + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('B') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + SECONDARY_CONSTRUCTOR + PsiElement(constructor)('constructor') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + CONSTRUCTOR_DELEGATION_CALL + PsiElement(IDENTIFIER)('thhiis') + PsiErrorElement:Expecting a 'this' or 'super' constructor call + + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('3') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + VALUE_ARGUMENT + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('4') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java index db90b2b720f..a9966f75d00 100644 --- a/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java @@ -1917,6 +1917,12 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest { doParsingTest(fileName); } + @TestMetadata("emptyBody.kt") + public void testEmptyBody() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/secondaryConstructors/emptyBody.kt"); + doParsingTest(fileName); + } + @TestMetadata("enumParsing.kt") public void testEnumParsing() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/secondaryConstructors/enumParsing.kt"); diff --git a/idea/testData/formatter/SecondaryConstructors.after.kt b/idea/testData/formatter/SecondaryConstructors.after.kt index 50d18ecce1b..dd5fe264a3e 100644 --- a/idea/testData/formatter/SecondaryConstructors.after.kt +++ b/idea/testData/formatter/SecondaryConstructors.after.kt @@ -8,8 +8,7 @@ class A { fun foo() { } - constructor() { - } + constructor() fun foo() { } @@ -55,8 +54,7 @@ class A { constructor() : this() { } - constructor() : this() { - } + constructor() : this() constructor() : super() { } diff --git a/idea/testData/formatter/SecondaryConstructors.kt b/idea/testData/formatter/SecondaryConstructors.kt index 9949dc578c2..73fe328e04d 100644 --- a/idea/testData/formatter/SecondaryConstructors.kt +++ b/idea/testData/formatter/SecondaryConstructors.kt @@ -2,7 +2,7 @@ class A { constructor() {} constructor() {} fun foo() {} - constructor() {} + constructor() fun foo() {} constructor() {} val x = 1 @@ -26,6 +26,6 @@ constructor() {} constructor() : this() {} constructor():this() {} - constructor(): this () {} + constructor(): this () constructor(): super(){} } \ No newline at end of file diff --git a/idea/testData/formatter/secondaryCtorLineBreak.after.inv.kt b/idea/testData/formatter/secondaryCtorLineBreak.after.inv.kt index 62f31f0a543..b5ab2319a6b 100644 --- a/idea/testData/formatter/secondaryCtorLineBreak.after.inv.kt +++ b/idea/testData/formatter/secondaryCtorLineBreak.after.inv.kt @@ -18,6 +18,8 @@ class A { { } + constructor() + constructor() { } } diff --git a/idea/testData/formatter/secondaryCtorLineBreak.after.kt b/idea/testData/formatter/secondaryCtorLineBreak.after.kt index 9e7b9a77a57..cb13b54d91e 100644 --- a/idea/testData/formatter/secondaryCtorLineBreak.after.kt +++ b/idea/testData/formatter/secondaryCtorLineBreak.after.kt @@ -22,6 +22,8 @@ class A { } + constructor() + constructor() { } diff --git a/idea/testData/formatter/secondaryCtorLineBreak.kt b/idea/testData/formatter/secondaryCtorLineBreak.kt index 85d6fdb42af..e6fae94d47c 100644 --- a/idea/testData/formatter/secondaryCtorLineBreak.kt +++ b/idea/testData/formatter/secondaryCtorLineBreak.kt @@ -18,6 +18,7 @@ class A { {} + constructor() constructor() { } }