Prohibit non-inner classes in enum entries since 1.3

This commit is contained in:
Dmitry Petrov
2017-09-08 10:51:22 +03:00
parent ea91a0794d
commit ba2c3136bb
12 changed files with 79 additions and 15 deletions
@@ -20,6 +20,7 @@ import com.google.common.collect.Maps;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.config.LanguageFeature;
import org.jetbrains.kotlin.config.LanguageVersionSettings;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1;
@@ -202,6 +203,17 @@ public class ModifiersChecker {
return;
}
// Since 1.3, enum entries can contain inner classes only.
// Companion objects are reported in ModifierCheckerCore.
if (DescriptorUtils.isEnumEntry(containingClass) && !classDescriptor.isInner() && kind != DetailedClassKind.COMPANION_OBJECT) {
DiagnosticFactory1<KtClassOrObject, String> diagnostic =
languageVersionSettings.supportsFeature(LanguageFeature.NestedClassesInEnumEntryShouldBeInner)
? NESTED_CLASS_NOT_ALLOWED
: NESTED_CLASS_NOT_ALLOWED_SINCE_1_3;
trace.report(diagnostic.on(ktClassOrObject, kind.withCapitalFirstLetter));
return;
}
if (!classDescriptor.isInner() && (containingClass.isInner() || DescriptorUtils.isLocal(containingClass))) {
trace.report(NESTED_CLASS_NOT_ALLOWED.on(ktClassOrObject, kind.withCapitalFirstLetter));
}