From fcc84d00c30cbfeb5cd7c8427babe44cee19b0a1 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 15 Sep 2017 13:45:38 +0300 Subject: [PATCH] Migration: make header/impl/expect/actual contradictory to each other --- .../org/jetbrains/kotlin/psi/addRemoveModifier.kt | 8 ++++---- .../jetbrains/kotlin/resolve/ModifiersChecker.kt | 5 ++++- .../tests/multiplatform/incompatibles.kt | 13 +++++++++++++ .../tests/multiplatform/incompatibles.txt | 8 ++++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ .../javac/DiagnosticsUsingJavacTestGenerated.java | 6 ++++++ .../kotlin/idea/quickfix/ReplaceModifierFix.kt | 2 -- 7 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/incompatibles.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/incompatibles.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt index c62c72cfc06..879aff8feef 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt @@ -129,10 +129,10 @@ private val MODIFIERS_TO_REPLACE = mapOf( PROTECTED_KEYWORD to listOf(PUBLIC_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD), PRIVATE_KEYWORD to listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, INTERNAL_KEYWORD), INTERNAL_KEYWORD to listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD), - HEADER_KEYWORD to listOf(IMPL_KEYWORD, ACTUAL_KEYWORD), - IMPL_KEYWORD to listOf(HEADER_KEYWORD, EXPECT_KEYWORD), - EXPECT_KEYWORD to listOf(IMPL_KEYWORD, ACTUAL_KEYWORD), - ACTUAL_KEYWORD to listOf(HEADER_KEYWORD, EXPECT_KEYWORD) + HEADER_KEYWORD to listOf(IMPL_KEYWORD, ACTUAL_KEYWORD, EXPECT_KEYWORD), + IMPL_KEYWORD to listOf(HEADER_KEYWORD, EXPECT_KEYWORD, ACTUAL_KEYWORD), + EXPECT_KEYWORD to listOf(IMPL_KEYWORD, ACTUAL_KEYWORD, HEADER_KEYWORD), + ACTUAL_KEYWORD to listOf(HEADER_KEYWORD, EXPECT_KEYWORD, IMPL_KEYWORD) ) private val MODIFIERS_ORDER = listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 54657321c8b..574f7efa1ff 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -189,9 +189,12 @@ object ModifierCheckerCore { // (see the KEEP https://github.com/Kotlin/KEEP/blob/master/proposals/sealed-class-inheritance.md) result += incompatibilityRegister(SEALED_KEYWORD, INNER_KEYWORD) - // lateinit is incompatible with header + // lateinit is incompatible with header / expect result += incompatibilityRegister(LATEINIT_KEYWORD, HEADER_KEYWORD, EXPECT_KEYWORD) + // header / expect / impl / actual are all incompatible + result += incompatibilityRegister(HEADER_KEYWORD, EXPECT_KEYWORD, IMPL_KEYWORD, ACTUAL_KEYWORD) + return result } diff --git a/compiler/testData/diagnostics/tests/multiplatform/incompatibles.kt b/compiler/testData/diagnostics/tests/multiplatform/incompatibles.kt new file mode 100644 index 00000000000..92abdfa6363 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/incompatibles.kt @@ -0,0 +1,13 @@ +// !LANGUAGE: +MultiPlatformProjects + +header impl class First + +header expect class Second + +header actual class Third + +impl expect class Fourth + +impl actual class Fifth + +expect actual class Sixth \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/multiplatform/incompatibles.txt b/compiler/testData/diagnostics/tests/multiplatform/incompatibles.txt new file mode 100644 index 00000000000..c9c116d04e6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/incompatibles.txt @@ -0,0 +1,8 @@ +package + +public final actual class Fifth { + public constructor Fifth() + 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 1fff1382446..283319ea36e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13843,6 +13843,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("incompatibles.kt") + public void testIncompatibles() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/incompatibles.kt"); + doTest(fileName); + } + @TestMetadata("modifierApplicability.kt") public void testModifierApplicability() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/modifierApplicability.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 4918f3977c6..5897434f96a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -13843,6 +13843,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing doTest(fileName); } + @TestMetadata("incompatibles.kt") + public void testIncompatibles() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/incompatibles.kt"); + doTest(fileName); + } + @TestMetadata("modifierApplicability.kt") public void testModifierApplicability() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/modifierApplicability.kt"); diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceModifierFix.kt index 1cbf4fe0b33..69ddfc5fc3d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceModifierFix.kt @@ -47,11 +47,9 @@ class ReplaceModifierFix( when (modifier) { KtTokens.HEADER_KEYWORD -> { element.addModifier(KtTokens.EXPECT_KEYWORD) - element.removeModifier(KtTokens.HEADER_KEYWORD) } KtTokens.IMPL_KEYWORD -> { element.addModifier(KtTokens.ACTUAL_KEYWORD) - element.removeModifier(KtTokens.IMPL_KEYWORD) } } }