KT-322 Prohibit inheriting classes from enums

#KT-322 Fixed
This commit is contained in:
Natalia
2012-09-06 17:03:43 +04:00
parent 07cf73ecef
commit 4303083945
7 changed files with 38 additions and 10 deletions
@@ -68,6 +68,8 @@ public interface Errors {
.create(WARNING, ABSTRACT_MODIFIER);
SimpleDiagnosticFactory<JetModifierListOwner> OPEN_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory
.create(WARNING, positionModifier(JetTokens.OPEN_KEYWORD));
SimpleDiagnosticFactory<JetModifierListOwner> OPEN_MODIFIER_IN_ENUM = SimpleDiagnosticFactory
.create(ERROR, positionModifier(JetTokens.OPEN_KEYWORD));
SimpleDiagnosticFactory<PsiElement>
REDUNDANT_MODIFIER_IN_GETTER = SimpleDiagnosticFactory.create(WARNING);
SimpleDiagnosticFactory<PsiElement> TRAIT_CAN_NOT_BE_FINAL = SimpleDiagnosticFactory.create(ERROR);
@@ -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,
@@ -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;