From 0634782e47b4c76678562b2bc1675368a3f6d63d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 13 Dec 2016 21:05:04 +0300 Subject: [PATCH] Allow open impl class for final header class --- .../checkers/HeaderImplDeclarationChecker.kt | 3 +- .../headerClass/implOpenClass.kt | 16 ++++++++++ .../headerClass/implOpenClass.txt | 31 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt index 76c5a9bd21c..65f42bac3ba 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt @@ -319,7 +319,8 @@ class HeaderImplDeclarationChecker(val moduleToCheck: ModuleDescriptor? = null) val substitutor = Substitutor(aTypeParams, bTypeParams, parentSubstitutor) - if (a.modality != b.modality) return Incompatible.Modality + if (a.modality != b.modality && !(a.modality == Modality.FINAL && b.modality == Modality.OPEN)) return Incompatible.Modality + if (a.visibility != b.visibility) return Incompatible.Visibility areCompatibleTypeParameters(aTypeParams, bTypeParams, substitutor).let { if (it != Compatible) return it } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.kt new file mode 100644 index 00000000000..77cf7fd386e --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.kt @@ -0,0 +1,16 @@ +// !LANGUAGE: +MultiPlatformProjects +// MODULE: m1-common +// FILE: common.kt + +header class Foo + +header fun getFoo(): Foo + +// MODULE: m2-jvm(m1-common) +// FILE: jvm.kt + +impl open class Foo + +class Bar : Foo() + +impl fun getFoo(): Foo = Bar() diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.txt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.txt new file mode 100644 index 00000000000..62872669be1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.txt @@ -0,0 +1,31 @@ +// -- Module: -- +package + +public header fun getFoo(): Foo + +public final header class Foo { + public constructor Foo() + 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 +} + + +// -- Module: -- +package + +public impl fun getFoo(): Foo + +public final class Bar : Foo { + public constructor Bar() + 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 +} + +public open impl class Foo { + public constructor Foo() + 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/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 796f6ee32a7..3682bbf8707 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13098,6 +13098,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("implOpenClass.kt") + public void testImplOpenClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/implOpenClass.kt"); + doTest(fileName); + } + @TestMetadata("simpleHeaderClass.kt") public void testSimpleHeaderClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/simpleHeaderClass.kt");