From 6df805d6f264cc369546dd6b116b95277e16e7ef Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 7 May 2015 11:22:34 +0300 Subject: [PATCH] Refine diagnostics reported on implicit constructor delegation call - Do not report anything else if primary's call expected - Do not repeat EXPLICIT_DELEGATION_CALL_REQUIRED #KT-7230 Fixed --- .../kotlin/resolve/calls/CallResolver.java | 1 + ...rategyForImplicitConstructorDelegationCall.kt | 6 +++++- .../implicitSuperCallErrorsIfPrimary.kt | 7 +++++++ .../implicitSuperCallErrorsIfPrimary.txt | 16 ++++++++++++++++ .../reportResolutionErrorOnImplicitOnce.kt | 6 ++++++ .../reportResolutionErrorOnImplicitOnce.txt | 15 +++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 12 ++++++++++++ 7 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.kt create mode 100644 compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.txt create mode 100644 compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.kt create mode 100644 compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index c5ea0098970..6e784637125 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -352,6 +352,7 @@ public class CallResolver { context.trace.report(PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED.on( (JetConstructorDelegationCall) calleeExpression.getParent() )); + if (call.isImplicit()) return OverloadResolutionResultsImpl.nameNotFound(); } if (constructors.isEmpty()) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TracingStrategyForImplicitConstructorDelegationCall.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TracingStrategyForImplicitConstructorDelegationCall.kt index 6d169519c38..5d35f96968a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TracingStrategyForImplicitConstructorDelegationCall.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TracingStrategyForImplicitConstructorDelegationCall.kt @@ -82,7 +82,11 @@ public class TracingStrategyForImplicitConstructorDelegationCall( } private fun reportError(trace: BindingTrace) { - trace.report(Errors.EXPLICIT_DELEGATION_CALL_REQUIRED.on(delegationCall)) + if (!trace.getBindingContext().getDiagnostics().forElement(delegationCall). + any { it.getFactory() == Errors.EXPLICIT_DELEGATION_CALL_REQUIRED } + ) { + trace.report(Errors.EXPLICIT_DELEGATION_CALL_REQUIRED.on(delegationCall)) + } } // Underlying methods should not be called because such errors are impossible diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.kt new file mode 100644 index 00000000000..4c620d5da70 --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.kt @@ -0,0 +1,7 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +open class A(p1: String) + +class B() : A("") { + constructor(s: String) { + } +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.txt b/compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.txt new file mode 100644 index 00000000000..6de3fc4f21b --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.txt @@ -0,0 +1,16 @@ +package + +internal open class A { + public constructor A(/*0*/ p1: kotlin.String) + 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 final class B : A { + public constructor B() + public constructor B(/*0*/ s: kotlin.String) + 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/reportResolutionErrorOnImplicitOnce.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.kt new file mode 100644 index 00000000000..7f2967cb8e1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.kt @@ -0,0 +1,6 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +open class A(p1: String, p2: String, p3: String, p4: String, p5: String) + +class B : A { + constructor(s: String) +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.txt b/compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.txt new file mode 100644 index 00000000000..936aeac592d --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.txt @@ -0,0 +1,15 @@ +package + +internal open class A { + public constructor A(/*0*/ p1: kotlin.String, /*1*/ p2: kotlin.String, /*2*/ p3: kotlin.String, /*3*/ p4: kotlin.String, /*4*/ p5: kotlin.String) + 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 final class B : A { + public constructor B(/*0*/ s: kotlin.String) + 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/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 57c2a35dce8..7845640d26b 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -10785,6 +10785,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("implicitSuperCallErrorsIfPrimary.kt") + public void testImplicitSuperCallErrorsIfPrimary() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/implicitSuperCallErrorsIfPrimary.kt"); + doTest(fileName); + } + @TestMetadata("initializationFromOtherInstance.kt") public void testInitializationFromOtherInstance() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/initializationFromOtherInstance.kt"); @@ -10863,6 +10869,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("reportResolutionErrorOnImplicitOnce.kt") + public void testReportResolutionErrorOnImplicitOnce() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/reportResolutionErrorOnImplicitOnce.kt"); + doTest(fileName); + } + @TestMetadata("resolvePropertyInitializerWithoutPrimary.kt") public void testResolvePropertyInitializerWithoutPrimary() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/resolvePropertyInitializerWithoutPrimary.kt");