From 284c1b2ec5988f467d2f152774e0aae3d83f553c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 20 Nov 2015 18:10:02 +0300 Subject: [PATCH] Local sealed classes are deprecated --- .../src/org/jetbrains/kotlin/diagnostics/Errors.java | 1 + .../diagnostics/rendering/DefaultErrorMessages.java | 1 + .../org/jetbrains/kotlin/resolve/ModifiersChecker.kt | 12 +++++++++++- .../testData/diagnostics/tests/sealed/LocalSealed.kt | 3 +++ .../diagnostics/tests/sealed/LocalSealed.txt | 3 +++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ 6 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/sealed/LocalSealed.kt create mode 100644 compiler/testData/diagnostics/tests/sealed/LocalSealed.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 99d72308945..5c139a5e397 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -127,6 +127,7 @@ public interface Errors { DiagnosticFactory1 REPEATED_MODIFIER = DiagnosticFactory1.create(ERROR); DiagnosticFactory2 REDUNDANT_MODIFIER = DiagnosticFactory2.create(WARNING); DiagnosticFactory2 WRONG_MODIFIER_TARGET = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 DEPRECATED_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING); DiagnosticFactory2 REDUNDANT_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING); DiagnosticFactory2 WRONG_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 DEPRECATED_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(WARNING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 6f16cd66ebb..a8eea072cd2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -129,6 +129,7 @@ public class DefaultErrorMessages { MAP.put(DEPRECATED_MODIFIER_PAIR, "Modifier ''{0}'' is deprecated in presence of ''{1}''", TO_STRING, TO_STRING); MAP.put(REPEATED_MODIFIER, "Repeated ''{0}''", TO_STRING); MAP.put(WRONG_MODIFIER_TARGET, "Modifier ''{0}'' is not applicable to ''{1}''", TO_STRING, TO_STRING); + MAP.put(DEPRECATED_MODIFIER_FOR_TARGET, "Modifier ''{0}'' is deprecated for ''{1}''", TO_STRING, TO_STRING); MAP.put(REDUNDANT_MODIFIER_FOR_TARGET, "Modifier ''{0}'' is redundant for ''{1}''", TO_STRING, TO_STRING); MAP.put(WRONG_MODIFIER_CONTAINING_DECLARATION, "Modifier ''{0}'' is not applicable inside ''{1}''", TO_STRING, TO_STRING); MAP.put(DEPRECATED_MODIFIER_CONTAINING_DECLARATION, "Modifier ''{0}'' is deprecated inside ''{1}''", TO_STRING, TO_STRING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 51dd2c19886..134109650db 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -88,6 +88,12 @@ public object ModifierCheckerCore { INFIX_KEYWORD to EnumSet.of(FUNCTION) ) + // NOTE: deprecated targets must be possible! + private val deprecatedTargetMap = mapOf>( + // Deprecated in 1.0 beta 3 + SEALED_KEYWORD to EnumSet.of(LOCAL_CLASS) + ) + // NOTE: redundant targets must be possible! private val redundantTargetMap = mapOf>( ABSTRACT_KEYWORD to EnumSet.of(INTERFACE), @@ -227,8 +233,12 @@ public object ModifierCheckerCore { trace.report(Errors.WRONG_MODIFIER_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this")) return false } + val deprecatedTargets = deprecatedTargetMap[modifier] ?: emptySet() val redundantTargets = redundantTargetMap[modifier] ?: emptySet() - if (actualTargets.any { it in redundantTargets}) { + if (actualTargets.any { it in deprecatedTargets }) { + trace.report(Errors.DEPRECATED_MODIFIER_FOR_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this")) + } + else if (actualTargets.any { it in redundantTargets }) { trace.report(Errors.REDUNDANT_MODIFIER_FOR_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this")) } return true diff --git a/compiler/testData/diagnostics/tests/sealed/LocalSealed.kt b/compiler/testData/diagnostics/tests/sealed/LocalSealed.kt new file mode 100644 index 00000000000..dc22feb39f0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/LocalSealed.kt @@ -0,0 +1,3 @@ +fun foo() { + sealed class My +} diff --git a/compiler/testData/diagnostics/tests/sealed/LocalSealed.txt b/compiler/testData/diagnostics/tests/sealed/LocalSealed.txt new file mode 100644 index 00000000000..65a6ac47e1f --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/LocalSealed.txt @@ -0,0 +1,3 @@ +package + +public fun foo(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index ddd573be888..14463d80263 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13989,6 +13989,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("LocalSealed.kt") + public void testLocalSealed() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sealed/LocalSealed.kt"); + doTest(fileName); + } + @TestMetadata("NeverConstructed.kt") public void testNeverConstructed() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sealed/NeverConstructed.kt");