From 3509cafceac94d55b6aa40bd600f29d22830fb04 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 5 Feb 2015 11:28:18 +0300 Subject: [PATCH] Allow no super class initialization within header if there is no primary constructor --- .../kotlin/resolve/BodyResolver.java | 6 ++++- ...argumentsResolveInBodyAndDelegationCall.kt | 2 +- .../memberAccessBeforeSuperCall.kt | 2 +- ...oSupertypeInitWithSecondaryConstructors.kt | 6 +++++ ...SupertypeInitWithSecondaryConstructors.txt | 27 +++++++++++++++++++ .../superSecondaryNonExisting.kt | 2 +- .../checkers/JetDiagnosticsTestGenerated.java | 6 +++++ 7 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt create mode 100644 compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index e28c9e31f61..19b2f284e2d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -275,7 +275,11 @@ public class BodyResolver { // A "singleton in supertype" diagnostic will be reported later return; } - if (descriptor.getKind() != ClassKind.TRAIT && !superClass.getConstructors().isEmpty() && !ErrorUtils.isError(superClass)) { + if (descriptor.getKind() != ClassKind.TRAIT && + descriptor.getUnsubstitutedPrimaryConstructor() != null && + !superClass.getConstructors().isEmpty() && + !ErrorUtils.isError(superClass) + ) { trace.report(SUPERTYPE_NOT_INITIALIZED.on(specifier)); } } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/argumentsResolveInBodyAndDelegationCall.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/argumentsResolveInBodyAndDelegationCall.kt index c044fad5f7f..6b3a8d682ae 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/argumentsResolveInBodyAndDelegationCall.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/argumentsResolveInBodyAndDelegationCall.kt @@ -1,7 +1,7 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER open class B(open val parentProp: Int) val global: Int = 1 -class A : B { +class A : B { val myProp: Int = 1 override val parentProp = 1 diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt index 5969772db99..553f29be5ce 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/memberAccessBeforeSuperCall.kt @@ -1,6 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER open class B(open val parentProperty: String) -class A : B { +class A : B { val myProp: String = "" override val parentProperty: String = "" constructor(arg: String = myProp): super(myProp) {} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt new file mode 100644 index 00000000000..4f839663dcc --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt @@ -0,0 +1,6 @@ +open class B +trait C +trait D +class A : C, B, D { + constructor() {} +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.txt b/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.txt new file mode 100644 index 00000000000..c417f6a703e --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.txt @@ -0,0 +1,27 @@ +package + +internal final class A : C, B, D { + public constructor A() + public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal open class B { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait C { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal trait D { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt index f705c3bbe72..7c3b291450c 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/superSecondaryNonExisting.kt @@ -4,7 +4,7 @@ open class B(x: Double) { constructor(x: String): this(1.0) {} } trait C -class A : B, C { +class A : B, C { constructor(): super(' ') { } constructor(x: Int) { } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 47b66c8fc6d..467a693d18a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -10427,6 +10427,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("noSupertypeInitWithSecondaryConstructors.kt") + public void testNoSupertypeInitWithSecondaryConstructors() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/noSupertypeInitWithSecondaryConstructors.kt"); + doTest(fileName); + } + @TestMetadata("superAnyNonEmpty.kt") public void testSuperAnyNonEmpty() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/superAnyNonEmpty.kt");