From 5b9b003e020d312bef67359b1bdc1480605f1540 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 10 Feb 2017 16:31:54 +0300 Subject: [PATCH] Prohibit inner sealed classes #KT-16233 Fixed --- .../jetbrains/kotlin/resolve/ModifiersChecker.kt | 7 +++++++ .../tests/modifiers/IllegalModifiers.kt | 4 ++++ .../tests/modifiers/IllegalModifiers.txt | 14 ++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index fd9441e1740..0b4ab906d87 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -169,6 +169,13 @@ object ModifierCheckerCore { result += compatibilityForClassesRegister(PRIVATE_KEYWORD, ABSTRACT_KEYWORD) result += incompatibilityRegister(CROSSINLINE_KEYWORD, NOINLINE_KEYWORD) + + // 1. subclasses contained inside a sealed class can not be instantiated, because their constructors needs + // an instance of an outer sealed (effectively abstract) class + // 2. subclasses of a non-top-level sealed class must be declared inside the class + // (see the KEEP https://github.com/Kotlin/KEEP/blob/master/proposals/sealed-class-inheritance.md) + result += incompatibilityRegister(SEALED_KEYWORD, INNER_KEYWORD) + return result } diff --git a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt index 9a959f70f51..e753cb09e46 100644 --- a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt +++ b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt @@ -156,3 +156,7 @@ class IllegalModifiers10 const constructor() class IllegalModifiers11 private protected constructor() + +class Outer { + inner sealed class Inner +} diff --git a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt index f0c3bda5928..2915bfd788c 100644 --- a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt +++ b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt @@ -132,6 +132,20 @@ package illegal_modifiers { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } + public final class Outer { + public constructor Outer() + 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 sealed inner class Inner { + private constructor Inner() + 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 final interface T { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int