From a3baca829fdbaba90f92cd4d4c309e3c02aa6f70 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 17 Feb 2017 17:39:36 +0300 Subject: [PATCH] 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 --- .../kotlin/resolve/ModifiersChecker.java | 2 +- .../kotlin/resolve/ModifiersChecker.kt | 33 +++++++++---------- .../classObjects/InnerClassClassObject.kt | 4 +-- .../multipleDissallowedDefaultObjects.kt | 8 ++--- .../diagnostics/tests/inner/nestedObject.kt | 2 +- .../descriptors/annotations/KotlinTarget.kt | 11 +++---- .../idea/completion/KeywordCompletion.kt | 3 +- 7 files changed, 29 insertions(+), 34 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index e63e8c0b2c8..bcb718487e3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -228,7 +228,7 @@ public class ModifiersChecker { private void checkObjectInsideInnerClass(@NotNull KtDeclaration modifierListOwner, @NotNull MemberDescriptor descriptor) { if (modifierListOwner instanceof KtObjectDeclaration) { KtObjectDeclaration ktObject = (KtObjectDeclaration) modifierListOwner; - if (!ktObject.isLocal() && !ktObject.isCompanion() && isIllegalNestedClass(descriptor)) { + if (!ktObject.isLocal() && isIllegalNestedClass(descriptor)) { trace.report(NESTED_OBJECT_NOT_ALLOWED.on(ktObject)); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 0b4ab906d87..510c238b9a0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -54,23 +54,22 @@ object ModifierCheckerCore { 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_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR, TYPEALIAS) val possibleTargetMap = mapOf>( ENUM_KEYWORD to EnumSet.of(ENUM_CLASS), - ABSTRACT_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION), - OPEN_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION), - FINAL_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, ENUM_CLASS, OBJECT, MEMBER_PROPERTY, MEMBER_FUNCTION), - SEALED_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS), - // We should have also CLASS_ONLY here because INNER_CLASS is not always perfectly identified - INNER_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS), + ABSTRACT_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_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, ENUM_CLASS, OBJECT, MEMBER_PROPERTY, MEMBER_FUNCTION), + SEALED_KEYWORD to EnumSet.of(CLASS_ONLY), + INNER_KEYWORD to EnumSet.of(CLASS_ONLY), OVERRIDE_KEYWORD to EnumSet.of(MEMBER_PROPERTY, MEMBER_FUNCTION), PRIVATE_KEYWORD to defaultVisibilityTargets, PUBLIC_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), IN_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), COMPANION_KEYWORD to EnumSet.of(OBJECT), 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), NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), TAILREC_KEYWORD to EnumSet.of(FUNCTION), @@ -89,8 +88,8 @@ object ModifierCheckerCore { CONST_KEYWORD to EnumSet.of(MEMBER_PROPERTY, TOP_LEVEL_PROPERTY), OPERATOR_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), - 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) + 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, ENUM_CLASS, ANNOTATION_CLASS, TYPEALIAS) ) val featureDependencies = mapOf( @@ -121,16 +120,16 @@ object ModifierCheckerCore { ) val possibleParentTargetMap = mapOf>( - INNER_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS), - OVERRIDE_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, + INNER_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, ENUM_CLASS), + OVERRIDE_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, INTERFACE, ENUM_CLASS, ENUM_ENTRY), - PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS, COMPANION_OBJECT), - INTERNAL_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, + PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, ENUM_CLASS, COMPANION_OBJECT), + INTERNAL_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, 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), 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) ) diff --git a/compiler/testData/diagnostics/tests/classObjects/InnerClassClassObject.kt b/compiler/testData/diagnostics/tests/classObjects/InnerClassClassObject.kt index f660c0f89ea..b0e1a24241b 100644 --- a/compiler/testData/diagnostics/tests/classObjects/InnerClassClassObject.kt +++ b/compiler/testData/diagnostics/tests/classObjects/InnerClassClassObject.kt @@ -2,7 +2,7 @@ class A { inner class B { - companion object { } + companion object { } } } @@ -22,4 +22,4 @@ class C { class D { companion object { } } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.kt b/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.kt index 77d75ed47f6..8742af35623 100644 --- a/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.kt +++ b/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.kt @@ -1,10 +1,10 @@ class A { inner class I { - companion object A + companion object A - companion object B + companion object B - companion object C + companion object C } } @@ -14,4 +14,4 @@ object O { companion object B companion object C -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inner/nestedObject.kt b/compiler/testData/diagnostics/tests/inner/nestedObject.kt index c1f8c0fbf24..65c5ffc9941 100644 --- a/compiler/testData/diagnostics/tests/inner/nestedObject.kt +++ b/compiler/testData/diagnostics/tests/inner/nestedObject.kt @@ -3,7 +3,7 @@ class Outer { inner class Inner1 { object Obj1 - companion object Obj2 + companion object Obj2 inner class Inner2 { object Obj3 diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt index 8b96851a6dd..c05851931ca 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt @@ -44,14 +44,13 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true) STAR_PROJECTION("star projection", 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 COMPANION_OBJECT("companion object", false), INTERFACE("interface", false), ENUM_CLASS("enum class", false), ENUM_ENTRY("enum entry", false), - INNER_CLASS("inner class", false), LOCAL_CLASS("local class", 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 = when (descriptor.kind) { ClassKind.ANNOTATION_CLASS -> listOf(ANNOTATION_CLASS, CLASS) ClassKind.CLASS -> - if (descriptor.isInner) { - listOf(INNER_CLASS, CLASS) - } - else if (DescriptorUtils.isLocal(descriptor)) { + // inner local classes should be CLASS_ONLY, not LOCAL_CLASS + if (!descriptor.isInner && DescriptorUtils.isLocal(descriptor)) { listOf(LOCAL_CLASS, CLASS) } else { @@ -132,4 +129,4 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true) AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD to FIELD) } -} \ No newline at end of file +} diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt index d239ea1a0f5..1df8e922143 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt @@ -321,7 +321,7 @@ object KeywordCompletion { 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) @@ -339,7 +339,6 @@ object KeywordCompletion { ownerDeclaration.isInterface() -> KotlinTarget.INTERFACE ownerDeclaration.isEnum() -> KotlinTarget.ENUM_CLASS ownerDeclaration.isAnnotation() -> KotlinTarget.ANNOTATION_CLASS - ownerDeclaration.isInner() -> KotlinTarget.INNER_CLASS else -> KotlinTarget.CLASS_ONLY } }