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 627140be7d7..8cf65d29b97 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -70,6 +70,8 @@ public interface Errors { .create(WARNING, positionModifier(JetTokens.OPEN_KEYWORD)); SimpleDiagnosticFactory OPEN_MODIFIER_IN_ENUM = SimpleDiagnosticFactory .create(ERROR, positionModifier(JetTokens.OPEN_KEYWORD)); + SimpleDiagnosticFactory ILLEGAL_ENUM_ANNOTATION = SimpleDiagnosticFactory + .create(ERROR, positionModifier(JetTokens.ENUM_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 c61c72225ff..d2382b736b3 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 @@ -82,6 +82,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(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"); 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 e58890599eb..c8387e11037 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -66,6 +66,7 @@ public class DeclarationsChecker { MutableClassDescriptor objectDescriptor = entry.getValue(); if (!bodiesResolveContext.completeAnalysisNeeded(objectDeclaration)) continue; + checkObject(objectDeclaration); modifiersChecker.checkIllegalModalityModifiers(objectDeclaration); } @@ -91,12 +92,22 @@ public class DeclarationsChecker { } + private void reportErrorIfHasEnumModifier(JetModifierListOwner declaration) { + if (declaration.hasModifier(JetTokens.ENUM_KEYWORD)) { + trace.report(ILLEGAL_ENUM_ANNOTATION.on(declaration)); + } + } + + private void checkObject(JetObjectDeclaration declaration) { + reportErrorIfHasEnumModifier(declaration); + } + private void checkClass(JetClass aClass, MutableClassDescriptor classDescriptor) { checkOpenMembers(classDescriptor); if (aClass.isTrait()) { checkTraitModifiers(aClass); } - else if (aClass.hasModifier(JetTokens.ENUM_KEYWORD)) { + else if (classDescriptor.getKind() == ClassKind.ENUM_CLASS) { checkEnumModifiers(aClass); } else if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) { @@ -105,6 +116,7 @@ public class DeclarationsChecker { } private void checkTraitModifiers(JetClass aClass) { + reportErrorIfHasEnumModifier(aClass); JetModifierList modifierList = aClass.getModifierList(); if (modifierList == null) return; if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) { @@ -130,6 +142,7 @@ public class DeclarationsChecker { } private void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) { + reportErrorIfHasEnumModifier(property); DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); if (containingDeclaration instanceof ClassDescriptor) { checkPropertyAbstractness(property, propertyDescriptor, (ClassDescriptor) containingDeclaration); @@ -247,6 +260,7 @@ public class DeclarationsChecker { } protected void checkFunction(JetNamedFunction function, SimpleFunctionDescriptor functionDescriptor) { + reportErrorIfHasEnumModifier(function); DeclarationDescriptor containingDescriptor = functionDescriptor.getContainingDeclaration(); boolean hasAbstractModifier = function.hasModifier(JetTokens.ABSTRACT_KEYWORD); checkDeclaredTypeInPublicMember(function, functionDescriptor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 4e95b5b8d47..baec4cee20c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -279,7 +279,7 @@ public class TypeHierarchyResolver { } private void createClassObjectForEnumClass(JetClass klass, MutableClassDescriptor mutableClassDescriptor) { - if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) { + if (mutableClassDescriptor.getKind() == ClassKind.ENUM_CLASS) { MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor( mutableClassDescriptor, outerScope, ClassKind.CLASS_OBJECT, getClassObjectName(klass.getName())); diff --git a/compiler/testData/diagnostics/tests/enum/enumModifier.kt b/compiler/testData/diagnostics/tests/enum/enumModifier.kt new file mode 100644 index 00000000000..be6fcb280b4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/enumModifier.kt @@ -0,0 +1,15 @@ +enum class B {} + +class A { + enum class object {} +} + +enum object O {} + +enum trait T {} + +enum fun f() = 0 + +enum val x = 0 + +enum var y = 0 diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index ddbc790f19f..23528ff4a16 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1367,6 +1367,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/enum/enumInheritance.kt"); } + @TestMetadata("enumModifier.kt") + public void testEnumModifier() throws Exception { + doTest("compiler/testData/diagnostics/tests/enum/enumModifier.kt"); + } + @TestMetadata("enumStarImport.kt") public void testEnumStarImport() throws Exception { doTest("compiler/testData/diagnostics/tests/enum/enumStarImport.kt");