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 4952b9b1f6a..2912f90fb61 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -68,6 +68,8 @@ public interface Errors { .create(WARNING, ABSTRACT_MODIFIER); SimpleDiagnosticFactory OPEN_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory .create(WARNING, positionModifier(JetTokens.OPEN_KEYWORD)); + SimpleDiagnosticFactory OPEN_MODIFIER_IN_ENUM = SimpleDiagnosticFactory + .create(ERROR, positionModifier(JetTokens.OPEN_KEYWORD)); SimpleDiagnosticFactory REDUNDANT_MODIFIER_IN_GETTER = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory TRAIT_CAN_NOT_BE_FINAL = SimpleDiagnosticFactory.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 427e43540e5..bd9f7355599 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 @@ -81,6 +81,7 @@ public class DefaultErrorMessages { MAP.put(REDUNDANT_MODIFIER, "Modifier ''{0}'' is redundant because ''{1}'' is present", TO_STRING, TO_STRING); 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(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter"); MAP.put(TRAIT_CAN_NOT_BE_FINAL, "Trait cannot be final"); MAP.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, 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 61f897cb842..e58890599eb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Sets; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; @@ -94,12 +93,18 @@ public class DeclarationsChecker { private void checkClass(JetClass aClass, MutableClassDescriptor classDescriptor) { checkOpenMembers(classDescriptor); - checkTraitModifiers(aClass); - checkEnum(aClass, classDescriptor); + if (aClass.isTrait()) { + checkTraitModifiers(aClass); + } + else if (aClass.hasModifier(JetTokens.ENUM_KEYWORD)) { + checkEnumModifiers(aClass); + } + else if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) { + checkEnumEntry(aClass, classDescriptor); + } } private void checkTraitModifiers(JetClass aClass) { - if (!aClass.isTrait()) return; JetModifierList modifierList = aClass.getModifierList(); if (modifierList == null) return; if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) { @@ -295,11 +300,13 @@ public class DeclarationsChecker { } } + private void checkEnumModifiers(JetClass aClass) { + if (aClass.hasModifier(JetTokens.OPEN_KEYWORD)) { + trace.report(OPEN_MODIFIER_IN_ENUM.on(aClass)); + } + } - - private void checkEnum(JetClass aClass, ClassDescriptor classDescriptor) { - if (classDescriptor.getKind() != ClassKind.ENUM_ENTRY) return; - + private void checkEnumEntry(JetClass aClass, ClassDescriptor classDescriptor) { DeclarationDescriptor declaration = classDescriptor.getContainingDeclaration().getContainingDeclaration(); assert declaration instanceof ClassDescriptor; ClassDescriptorFromSource enumClass = (ClassDescriptorFromSource) declaration; diff --git a/compiler/testData/diagnostics/tests/DelegationNotTotrait.kt b/compiler/testData/diagnostics/tests/DelegationNotTotrait.kt index 62d0f5cd6f7..a6ee551a1e8 100644 --- a/compiler/testData/diagnostics/tests/DelegationNotTotrait.kt +++ b/compiler/testData/diagnostics/tests/DelegationNotTotrait.kt @@ -8,7 +8,7 @@ trait T {} class Br(t : T) : T by t {} -open enum class EN() { +open enum class EN() { A } diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kt1193.kt b/compiler/testData/diagnostics/tests/declarationChecks/kt1193.kt index 22c5a16dd49..48650d68ff1 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/kt1193.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/kt1193.kt @@ -2,7 +2,7 @@ package kt1193 -open enum class MyEnum(val i: Int) { +enum class MyEnum(val i: Int) { A : MyEnum(12) B //no error } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.kt b/compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.kt new file mode 100644 index 00000000000..31a5fcd847c --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.kt @@ -0,0 +1,13 @@ +// FILE: MyJavaEnum.java +public enum MyJavaEnum {} + +// FILE: test.kt +open enum class MyEnum() { + A: MyEnum() +} + +enum class MyEnum2() {} + +class MyClass(): MyEnum2() {} + +class MyClass2(): MyJavaEnum() {} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 0abdbdaa148..bd3769e54d8 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1244,6 +1244,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/enum/importEnumFromJava.kt"); } + @TestMetadata("inheritanceFromEnum.kt") + public void testInheritanceFromEnum() throws Exception { + doTest("compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.kt"); + } + @TestMetadata("javaEnumValueOfMethod.kt") public void testJavaEnumValueOfMethod() throws Exception { doTest("compiler/testData/diagnostics/tests/enum/javaEnumValueOfMethod.kt");