Drop KotlinTarget.INNER_CLASS entry

In most of the cases it was used together with CLASS_ONLY and vice versa
They only case when CLASS_ONLY was used without INNER_CLASS
is possibleParentTargetMap.COMPANION_KEYWORD.

But after diagnostic NESTED_OBJECT_NOT_ALLOWED has been introduced,
there's no sense in the restriction of exactly the companion's parent

For clarification see test data changed
This commit is contained in:
Denis Zharkov
2017-02-17 17:39:36 +03:00
parent d1b17f050b
commit a3baca829f
7 changed files with 29 additions and 34 deletions
@@ -228,7 +228,7 @@ public class ModifiersChecker {
private void checkObjectInsideInnerClass(@NotNull KtDeclaration modifierListOwner, @NotNull MemberDescriptor descriptor) { private void checkObjectInsideInnerClass(@NotNull KtDeclaration modifierListOwner, @NotNull MemberDescriptor descriptor) {
if (modifierListOwner instanceof KtObjectDeclaration) { if (modifierListOwner instanceof KtObjectDeclaration) {
KtObjectDeclaration ktObject = (KtObjectDeclaration) modifierListOwner; KtObjectDeclaration ktObject = (KtObjectDeclaration) modifierListOwner;
if (!ktObject.isLocal() && !ktObject.isCompanion() && isIllegalNestedClass(descriptor)) { if (!ktObject.isLocal() && isIllegalNestedClass(descriptor)) {
trace.report(NESTED_OBJECT_NOT_ALLOWED.on(ktObject)); trace.report(NESTED_OBJECT_NOT_ALLOWED.on(ktObject));
} }
} }
@@ -54,23 +54,22 @@ object ModifierCheckerCore {
COMPATIBLE_FOR_CLASSES_ONLY COMPATIBLE_FOR_CLASSES_ONLY
} }
private val defaultVisibilityTargets = EnumSet.of(CLASS_ONLY, OBJECT, INTERFACE, INNER_CLASS, ENUM_CLASS, ANNOTATION_CLASS, private val defaultVisibilityTargets = EnumSet.of(CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS,
MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR, TYPEALIAS) MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR, TYPEALIAS)
val possibleTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>( val possibleTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>(
ENUM_KEYWORD to EnumSet.of(ENUM_CLASS), ENUM_KEYWORD to EnumSet.of(ENUM_CLASS),
ABSTRACT_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION), ABSTRACT_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION),
OPEN_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION), OPEN_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION),
FINAL_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, ENUM_CLASS, OBJECT, MEMBER_PROPERTY, MEMBER_FUNCTION), FINAL_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, ENUM_CLASS, OBJECT, MEMBER_PROPERTY, MEMBER_FUNCTION),
SEALED_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS), SEALED_KEYWORD to EnumSet.of(CLASS_ONLY),
// We should have also CLASS_ONLY here because INNER_CLASS is not always perfectly identified INNER_KEYWORD to EnumSet.of(CLASS_ONLY),
INNER_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS),
OVERRIDE_KEYWORD to EnumSet.of(MEMBER_PROPERTY, MEMBER_FUNCTION), OVERRIDE_KEYWORD to EnumSet.of(MEMBER_PROPERTY, MEMBER_FUNCTION),
PRIVATE_KEYWORD to defaultVisibilityTargets, PRIVATE_KEYWORD to defaultVisibilityTargets,
PUBLIC_KEYWORD to defaultVisibilityTargets, PUBLIC_KEYWORD to defaultVisibilityTargets,
INTERNAL_KEYWORD to defaultVisibilityTargets, INTERNAL_KEYWORD to defaultVisibilityTargets,
PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, OBJECT, INTERFACE, INNER_CLASS, ENUM_CLASS, ANNOTATION_CLASS, PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS,
MEMBER_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, MEMBER_PROPERTY, CONSTRUCTOR, TYPEALIAS), MEMBER_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, MEMBER_PROPERTY, CONSTRUCTOR, TYPEALIAS),
IN_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION), IN_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION),
OUT_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION), OUT_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION),
@@ -78,7 +77,7 @@ object ModifierCheckerCore {
VARARG_KEYWORD to EnumSet.of(VALUE_PARAMETER, PROPERTY_PARAMETER), VARARG_KEYWORD to EnumSet.of(VALUE_PARAMETER, PROPERTY_PARAMETER),
COMPANION_KEYWORD to EnumSet.of(OBJECT), COMPANION_KEYWORD to EnumSet.of(OBJECT),
LATEINIT_KEYWORD to EnumSet.of(MEMBER_PROPERTY), LATEINIT_KEYWORD to EnumSet.of(MEMBER_PROPERTY),
DATA_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS), DATA_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS),
INLINE_KEYWORD to EnumSet.of(FUNCTION, PROPERTY, PROPERTY_GETTER, PROPERTY_SETTER), INLINE_KEYWORD to EnumSet.of(FUNCTION, PROPERTY, PROPERTY_GETTER, PROPERTY_SETTER),
NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER),
TAILREC_KEYWORD to EnumSet.of(FUNCTION), TAILREC_KEYWORD to EnumSet.of(FUNCTION),
@@ -89,8 +88,8 @@ object ModifierCheckerCore {
CONST_KEYWORD to EnumSet.of(MEMBER_PROPERTY, TOP_LEVEL_PROPERTY), CONST_KEYWORD to EnumSet.of(MEMBER_PROPERTY, TOP_LEVEL_PROPERTY),
OPERATOR_KEYWORD to EnumSet.of(FUNCTION), OPERATOR_KEYWORD to EnumSet.of(FUNCTION),
INFIX_KEYWORD to EnumSet.of(FUNCTION), INFIX_KEYWORD to EnumSet.of(FUNCTION),
HEADER_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE, CLASS_ONLY, OBJECT, INTERFACE, INNER_CLASS, ENUM_CLASS, ANNOTATION_CLASS), HEADER_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS),
IMPL_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, MEMBER_FUNCTION, TOP_LEVEL_PROPERTY, MEMBER_PROPERTY, CONSTRUCTOR, CLASS_ONLY, OBJECT, INTERFACE, INNER_CLASS, ENUM_CLASS, ANNOTATION_CLASS, TYPEALIAS) IMPL_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, MEMBER_FUNCTION, TOP_LEVEL_PROPERTY, MEMBER_PROPERTY, CONSTRUCTOR, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS, TYPEALIAS)
) )
val featureDependencies = mapOf( val featureDependencies = mapOf(
@@ -121,16 +120,16 @@ object ModifierCheckerCore {
) )
val possibleParentTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>( val possibleParentTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>(
INNER_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS), INNER_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, ENUM_CLASS),
OVERRIDE_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, OVERRIDE_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
INTERFACE, ENUM_CLASS, ENUM_ENTRY), INTERFACE, ENUM_CLASS, ENUM_ENTRY),
PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS, COMPANION_OBJECT), PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, ENUM_CLASS, COMPANION_OBJECT),
INTERNAL_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, INTERNAL_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
ENUM_CLASS, ENUM_ENTRY, FILE), ENUM_CLASS, ENUM_ENTRY, FILE),
PRIVATE_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, PRIVATE_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
INTERFACE, ENUM_CLASS, ENUM_ENTRY, FILE), INTERFACE, ENUM_CLASS, ENUM_ENTRY, FILE),
COMPANION_KEYWORD to EnumSet.of(CLASS_ONLY, ENUM_CLASS, INTERFACE), COMPANION_KEYWORD to EnumSet.of(CLASS_ONLY, ENUM_CLASS, INTERFACE),
FINAL_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, FINAL_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, FILE) ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, FILE)
) )
@@ -2,7 +2,7 @@
class A { class A {
inner class B { inner class B {
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object { } companion <!NESTED_OBJECT_NOT_ALLOWED!>object<!> { }
} }
} }
@@ -22,4 +22,4 @@ class C {
class D { class D {
companion object { } companion object { }
} }
} }
@@ -1,10 +1,10 @@
class A { class A {
inner class I { inner class I {
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object A companion <!NESTED_OBJECT_NOT_ALLOWED!>object A<!>
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object B <!MANY_COMPANION_OBJECTS!>companion<!> <!NESTED_OBJECT_NOT_ALLOWED!>object B<!>
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object C <!MANY_COMPANION_OBJECTS!>companion<!> <!NESTED_OBJECT_NOT_ALLOWED!>object C<!>
} }
} }
@@ -14,4 +14,4 @@ object O {
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object B <!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object B
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object C <!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object C
} }
+1 -1
View File
@@ -3,7 +3,7 @@ class Outer {
inner class Inner1 { inner class Inner1 {
<!NESTED_OBJECT_NOT_ALLOWED!>object Obj1<!> <!NESTED_OBJECT_NOT_ALLOWED!>object Obj1<!>
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object Obj2 companion <!NESTED_OBJECT_NOT_ALLOWED!>object Obj2<!>
inner class Inner2 { inner class Inner2 {
<!NESTED_OBJECT_NOT_ALLOWED!>object Obj3<!> <!NESTED_OBJECT_NOT_ALLOWED!>object Obj3<!>
@@ -44,14 +44,13 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
STAR_PROJECTION("star projection", false), STAR_PROJECTION("star projection", false),
PROPERTY_PARAMETER("property constructor parameter", false), PROPERTY_PARAMETER("property constructor parameter", false),
CLASS_ONLY("class", false), // includes only top level classes and nested classes (but not enums, objects, interfaces, inner or local classes) CLASS_ONLY("class", false), // includes only top level classes and nested/inner classes (but not enums, objects, interfaces and local classes)
OBJECT("object", false), // does not include OBJECT_LITERAL but DOES include COMPANION_OBJECT OBJECT("object", false), // does not include OBJECT_LITERAL but DOES include COMPANION_OBJECT
COMPANION_OBJECT("companion object", false), COMPANION_OBJECT("companion object", false),
INTERFACE("interface", false), INTERFACE("interface", false),
ENUM_CLASS("enum class", false), ENUM_CLASS("enum class", false),
ENUM_ENTRY("enum entry", false), ENUM_ENTRY("enum entry", false),
INNER_CLASS("inner class", false),
LOCAL_CLASS("local class", false), LOCAL_CLASS("local class", false),
LOCAL_FUNCTION("local function", false), LOCAL_FUNCTION("local function", false),
@@ -93,10 +92,8 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
fun classActualTargets(descriptor: ClassDescriptor): List<KotlinTarget> = when (descriptor.kind) { fun classActualTargets(descriptor: ClassDescriptor): List<KotlinTarget> = when (descriptor.kind) {
ClassKind.ANNOTATION_CLASS -> listOf(ANNOTATION_CLASS, CLASS) ClassKind.ANNOTATION_CLASS -> listOf(ANNOTATION_CLASS, CLASS)
ClassKind.CLASS -> ClassKind.CLASS ->
if (descriptor.isInner) { // inner local classes should be CLASS_ONLY, not LOCAL_CLASS
listOf(INNER_CLASS, CLASS) if (!descriptor.isInner && DescriptorUtils.isLocal(descriptor)) {
}
else if (DescriptorUtils.isLocal(descriptor)) {
listOf(LOCAL_CLASS, CLASS) listOf(LOCAL_CLASS, CLASS)
} }
else { else {
@@ -132,4 +129,4 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD to FIELD) AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD to FIELD)
} }
} }
@@ -321,7 +321,7 @@ object KeywordCompletion {
is KtEnumEntry -> listOf(ENUM_ENTRY) is KtEnumEntry -> listOf(ENUM_ENTRY)
is KtClassBody -> listOf(CLASS_ONLY, INTERFACE, OBJECT, ENUM_CLASS, ANNOTATION_CLASS, INNER_CLASS, MEMBER_FUNCTION, MEMBER_PROPERTY, FUNCTION, PROPERTY) is KtClassBody -> listOf(CLASS_ONLY, INTERFACE, OBJECT, ENUM_CLASS, ANNOTATION_CLASS, MEMBER_FUNCTION, MEMBER_PROPERTY, FUNCTION, PROPERTY)
is KtFile -> listOf(CLASS_ONLY, INTERFACE, OBJECT, ENUM_CLASS, ANNOTATION_CLASS, TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY, FUNCTION, PROPERTY) is KtFile -> listOf(CLASS_ONLY, INTERFACE, OBJECT, ENUM_CLASS, ANNOTATION_CLASS, TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY, FUNCTION, PROPERTY)
@@ -339,7 +339,6 @@ object KeywordCompletion {
ownerDeclaration.isInterface() -> KotlinTarget.INTERFACE ownerDeclaration.isInterface() -> KotlinTarget.INTERFACE
ownerDeclaration.isEnum() -> KotlinTarget.ENUM_CLASS ownerDeclaration.isEnum() -> KotlinTarget.ENUM_CLASS
ownerDeclaration.isAnnotation() -> KotlinTarget.ANNOTATION_CLASS ownerDeclaration.isAnnotation() -> KotlinTarget.ANNOTATION_CLASS
ownerDeclaration.isInner() -> KotlinTarget.INNER_CLASS
else -> KotlinTarget.CLASS_ONLY else -> KotlinTarget.CLASS_ONLY
} }
} }