From c04b52561e914922bb8572191560d5c8f6692734 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 9 Oct 2014 22:21:03 +0400 Subject: [PATCH] "abstract" modifier on enum class is an error #KT-3454 Fixed --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 2 ++ .../lang/diagnostics/rendering/DefaultErrorMessages.java | 1 + .../org/jetbrains/jet/lang/resolve/DeclarationsChecker.java | 3 +++ .../UninitializedOrReassignedVariables.kt | 2 +- .../UninitializedOrReassignedVariables.txt | 2 +- compiler/testData/diagnostics/tests/enum/AbstractEnum.kt | 2 +- compiler/testData/diagnostics/tests/regressions/Jet183-1.kt | 2 +- .../testData/diagnostics/tests/regressions/Jet183-1.txt | 2 +- compiler/testData/diagnostics/tests/regressions/Jet183.kt | 2 +- compiler/testData/diagnostics/tests/regressions/Jet183.txt | 2 +- .../jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java | 1 + idea/testData/checker/Abstract.kt | 2 +- idea/testData/checker/regression/Jet183-1.kt | 2 +- idea/testData/checker/regression/Jet183.kt | 2 +- .../quickfix/modifiers/afterAbstractModifierInEnum.kt | 3 +++ .../quickfix/modifiers/beforeAbstractModifierInEnum.kt | 3 +++ .../jet/plugin/quickfix/QuickFixTestGenerated.java | 6 ++++++ 17 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 idea/testData/quickfix/modifiers/afterAbstractModifierInEnum.kt create mode 100644 idea/testData/quickfix/modifiers/beforeAbstractModifierInEnum.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 51b483338c0..42890cf2f13 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -174,6 +174,8 @@ public interface Errors { DiagnosticFactory0 OPEN_MODIFIER_IN_ENUM = DiagnosticFactory0 .create(ERROR, modifierSetPosition(JetTokens.OPEN_KEYWORD)); + DiagnosticFactory0 ABSTRACT_MODIFIER_IN_ENUM = DiagnosticFactory0 + .create(ERROR, modifierSetPosition(JetTokens.ABSTRACT_KEYWORD)); DiagnosticFactory0 CLASS_IN_SUPERTYPE_FOR_ENUM = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 67f3cba180d..ac8d655495e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -98,6 +98,7 @@ public class DefaultErrorMessages { MAP.put(ABSTRACT_MODIFIER_IN_TRAIT, "Modifier ''abstract'' is redundant in trait"); MAP.put(OPEN_MODIFIER_IN_TRAIT, "Modifier ''open'' is redundant in trait"); MAP.put(OPEN_MODIFIER_IN_ENUM, "Modifier ''open'' is not applicable for enum class"); + MAP.put(ABSTRACT_MODIFIER_IN_ENUM, "Modifier ''abstract'' is not applicable for enum class"); MAP.put(ILLEGAL_ENUM_ANNOTATION, "Annotation ''enum'' is only applicable for class"); MAP.put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter"); MAP.put(TRAIT_CAN_NOT_BE_FINAL, "Trait cannot be final"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 6bea8886ebd..eb6b20e85de 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -545,6 +545,9 @@ public class DeclarationsChecker { if (aClass.hasModifier(JetTokens.OPEN_KEYWORD)) { trace.report(OPEN_MODIFIER_IN_ENUM.on(aClass)); } + if (aClass.hasModifier(JetTokens.ABSTRACT_KEYWORD)) { + trace.report(ABSTRACT_MODIFIER_IN_ENUM.on(aClass)); + } } private void checkEnumEntry(@NotNull JetEnumEntry enumEntry, @NotNull ClassDescriptor classDescriptor) { diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt index 214831534d8..8f5fd8a4271 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt @@ -68,7 +68,7 @@ fun t1() { b = 3 } -abstract enum class ProtocolState { +enum class ProtocolState { WAITING { override fun signal() = ProtocolState.TALKING } diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.txt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.txt index f8e32e98cb6..f6d04e33e3c 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.txt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.txt @@ -116,7 +116,7 @@ package uninitialized_reassigned_variables { } } - internal abstract enum class ProtocolState : kotlin.Enum { + internal final enum class ProtocolState : kotlin.Enum { private constructor ProtocolState() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/enum/AbstractEnum.kt b/compiler/testData/diagnostics/tests/enum/AbstractEnum.kt index 02136757956..87d785e169e 100644 --- a/compiler/testData/diagnostics/tests/enum/AbstractEnum.kt +++ b/compiler/testData/diagnostics/tests/enum/AbstractEnum.kt @@ -1,3 +1,3 @@ package abstract -abstract enum class MyAbstractEnum() {} +abstract enum class MyAbstractEnum() {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/Jet183-1.kt b/compiler/testData/diagnostics/tests/regressions/Jet183-1.kt index d093fdb4610..3722ecde425 100644 --- a/compiler/testData/diagnostics/tests/regressions/Jet183-1.kt +++ b/compiler/testData/diagnostics/tests/regressions/Jet183-1.kt @@ -1,4 +1,4 @@ -abstract enum class ProtocolState { +enum class ProtocolState { WAITING { override fun signal() = ProtocolState.TALKING } diff --git a/compiler/testData/diagnostics/tests/regressions/Jet183-1.txt b/compiler/testData/diagnostics/tests/regressions/Jet183-1.txt index 61f5df25496..b706af4ce6c 100644 --- a/compiler/testData/diagnostics/tests/regressions/Jet183-1.txt +++ b/compiler/testData/diagnostics/tests/regressions/Jet183-1.txt @@ -2,7 +2,7 @@ package internal fun box(): kotlin.String -internal abstract enum class ProtocolState : kotlin.Enum { +internal final enum class ProtocolState : kotlin.Enum { private constructor ProtocolState() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/regressions/Jet183.kt b/compiler/testData/diagnostics/tests/regressions/Jet183.kt index 081c7d6e59f..a6899d93794 100644 --- a/compiler/testData/diagnostics/tests/regressions/Jet183.kt +++ b/compiler/testData/diagnostics/tests/regressions/Jet183.kt @@ -1,4 +1,4 @@ -abstract enum class ProtocolState { +enum class ProtocolState { WAITING { override fun signal() = ProtocolState.TALKING } diff --git a/compiler/testData/diagnostics/tests/regressions/Jet183.txt b/compiler/testData/diagnostics/tests/regressions/Jet183.txt index 63bd11b150c..a37574525ae 100644 --- a/compiler/testData/diagnostics/tests/regressions/Jet183.txt +++ b/compiler/testData/diagnostics/tests/regressions/Jet183.txt @@ -23,7 +23,7 @@ internal final enum class Foo : kotlin.Enum> { public final /*synthesized*/ fun values(): kotlin.Array> } -internal abstract enum class ProtocolState : kotlin.Enum { +internal final enum class ProtocolState : kotlin.Enum { private constructor ProtocolState() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java index 8fba22af954..72d87114f73 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java @@ -186,6 +186,7 @@ public class QuickFixRegistrar { QuickFixes.factories.put(PARAMETER_NAME_CHANGED_ON_OVERRIDE, RenameParameterToMatchOverriddenMethodFix.createFactory()); QuickFixes.factories.put(OPEN_MODIFIER_IN_ENUM, RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OPEN_KEYWORD)); + QuickFixes.factories.put(ABSTRACT_MODIFIER_IN_ENUM, RemoveModifierFix.createRemoveModifierFromListOwnerFactory(ABSTRACT_KEYWORD)); QuickFixes.factories.put(ILLEGAL_ENUM_ANNOTATION, RemoveModifierFix.createRemoveModifierFromListOwnerFactory(ENUM_KEYWORD)); QuickFixes.factories.put(NESTED_CLASS_NOT_ALLOWED, AddModifierFix.createFactory(INNER_KEYWORD)); diff --git a/idea/testData/checker/Abstract.kt b/idea/testData/checker/Abstract.kt index 1ee2a9f0b59..0aaf80c7328 100644 --- a/idea/testData/checker/Abstract.kt +++ b/idea/testData/checker/Abstract.kt @@ -116,7 +116,7 @@ enum class MyEnum() { abstract fun j() {} } -abstract enum class MyAbstractEnum() {} +abstract enum class MyAbstractEnum() {} //properties val a: Int diff --git a/idea/testData/checker/regression/Jet183-1.kt b/idea/testData/checker/regression/Jet183-1.kt index 0199cd9fcb3..7d30b3c7585 100644 --- a/idea/testData/checker/regression/Jet183-1.kt +++ b/idea/testData/checker/regression/Jet183-1.kt @@ -1,4 +1,4 @@ -abstract enum class ProtocolState { +enum class ProtocolState { WAITING { override fun signal() = ProtocolState.TALKING } diff --git a/idea/testData/checker/regression/Jet183.kt b/idea/testData/checker/regression/Jet183.kt index 645c93f52c4..a48e2aa712e 100644 --- a/idea/testData/checker/regression/Jet183.kt +++ b/idea/testData/checker/regression/Jet183.kt @@ -1,4 +1,4 @@ -abstract enum class ProtocolState { +enum class ProtocolState { WAITING { override fun signal() = ProtocolState.TALKING } diff --git a/idea/testData/quickfix/modifiers/afterAbstractModifierInEnum.kt b/idea/testData/quickfix/modifiers/afterAbstractModifierInEnum.kt new file mode 100644 index 00000000000..04c450ead7d --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterAbstractModifierInEnum.kt @@ -0,0 +1,3 @@ +// "Make 'A' not abstract" "true" +enum class A() { +} diff --git a/idea/testData/quickfix/modifiers/beforeAbstractModifierInEnum.kt b/idea/testData/quickfix/modifiers/beforeAbstractModifierInEnum.kt new file mode 100644 index 00000000000..e3d23cb96ac --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeAbstractModifierInEnum.kt @@ -0,0 +1,3 @@ +// "Make 'A' not abstract" "true" +abstract enum class A() { +} diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index 054d159200c..7445b205f01 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -1716,6 +1716,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { @InnerTestClasses({Modifiers.AddOpenToClassDeclaration.class}) @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) public static class Modifiers extends AbstractQuickFixTest { + @TestMetadata("beforeAbstractModifierInEnum.kt") + public void testAbstractModifierInEnum() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAbstractModifierInEnum.kt"); + doTest(fileName); + } + @TestMetadata("beforeAddInnerModifier.kt") public void testAddInnerModifier() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAddInnerModifier.kt");