From ed4c265564b2a83bdd39b19529f6ce65b22aca97 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 4 Mar 2015 17:05:28 +0300 Subject: [PATCH] Drop ClassKind.CLASS_OBJECT Default and non-default objects now have ClassKind.OBJECT --- .../descriptors/impl/MutableClassDescriptor.java | 5 ++++- .../kotlin/resolve/lazy/data/JetObjectInfo.java | 8 +++++--- .../resolve/lazy/descriptors/LazyClassDescriptor.java | 5 ++++- .../resolve/lazy/descriptors/LazyClassMemberScope.kt | 3 +-- .../kotlin/test/util/DescriptorValidator.java | 4 ++-- .../org/jetbrains/kotlin/descriptors/ClassKind.java | 5 ++--- .../kotlin/renderer/DescriptorRendererImpl.java | 5 +++-- .../org/jetbrains/kotlin/resolve/DescriptorUtils.java | 8 ++++---- .../org/jetbrains/kotlin/resolve/DescriptorUtils.kt | 2 +- .../jetbrains/kotlin/resolve/MemberComparator.java | 4 ++++ .../kotlin/serialization/DescriptorSerializer.java | 4 ++-- .../src/org/jetbrains/kotlin/serialization/Flags.java | 11 ++++++----- .../descriptors/DeserializedClassDescriptor.kt | 6 ++++-- .../serialization/deserialization/protoEnumMapping.kt | 3 +-- .../kotlin/idea/JetDescriptorIconProvider.java | 2 -- .../extractionEngine/extractableAnalysisUtil.kt | 2 +- .../jetbrains/kotlin/js/translate/context/Namer.java | 1 - 17 files changed, 44 insertions(+), 34 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java index 1c5496370f2..c8d62bcd292 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java @@ -70,6 +70,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class @NotNull SourceElement source ) { super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source); + assert kind != ClassKind.OBJECT : "Fix isDefaultObject()"; + this.kind = kind; this.isInner = isInner; @@ -145,7 +147,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class @Override public boolean isDefaultObject() { - return getKind() == ClassKind.CLASS_OBJECT; + //TODO: + return false; } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/JetObjectInfo.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/JetObjectInfo.java index 3903b1b37b3..c596620ebdf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/JetObjectInfo.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/JetObjectInfo.java @@ -32,9 +32,7 @@ public class JetObjectInfo extends JetClassOrObjectInfo { protected JetObjectInfo(@NotNull JetObjectDeclaration element) { super(element); - this.kind = element.isObjectLiteral() - ? ClassKind.CLASS - : (element.isDefault() ? ClassKind.CLASS_OBJECT : ClassKind.OBJECT); + this.kind = element.isObjectLiteral() ? ClassKind.CLASS : ClassKind.OBJECT; } @Override @@ -59,4 +57,8 @@ public class JetObjectInfo extends JetClassOrObjectInfo { public ClassKind getClassKind() { return kind; } + + public boolean isDefaultObject() { + return element.isDefault(); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index 8613d0fc252..0799ec77095 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.resolve.lazy.LazyEntity; import org.jetbrains.kotlin.resolve.lazy.data.JetClassInfoUtil; import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.kotlin.resolve.lazy.data.JetClassOrObjectInfo; +import org.jetbrains.kotlin.resolve.lazy.data.JetObjectInfo; import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider; import org.jetbrains.kotlin.resolve.scopes.*; import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull; @@ -92,6 +93,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes private final NotNullLazyValue scopeForPropertyInitializerResolution; private final NullableLazyValue forceResolveAllContents; + private final boolean isDefaultObject; public LazyClassDescriptor( @NotNull LazyClassContext c, @@ -118,6 +120,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes this.typeConstructor = new LazyClassTypeConstructor(); this.kind = classLikeInfo.getClassKind(); + this.isDefaultObject = classLikeInfo instanceof JetObjectInfo && ((JetObjectInfo) classLikeInfo).isDefaultObject(); JetModifierList modifierList = classLikeInfo.getModifierList(); if (kind.isSingleton()) { @@ -441,7 +444,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes @Override public boolean isDefaultObject() { - return getKind() == ClassKind.CLASS_OBJECT; + return isDefaultObject; } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt index 9de2fb7d39d..7b98808e8b5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -303,8 +303,7 @@ public open class LazyClassMemberScope( ClassKind.ANNOTATION_CLASS, ClassKind.OBJECT, ClassKind.ENUM_CLASS, - ClassKind.ENUM_ENTRY, - ClassKind.CLASS_OBJECT) + ClassKind.ENUM_ENTRY) private val EXTRACT_FUNCTIONS: MemberExtractor = object : MemberExtractor { override fun extract(extractFrom: JetType, name: Name): Collection { diff --git a/compiler/tests/org/jetbrains/kotlin/test/util/DescriptorValidator.java b/compiler/tests/org/jetbrains/kotlin/test/util/DescriptorValidator.java index eec7844a39f..16f30f1fd0d 100644 --- a/compiler/tests/org/jetbrains/kotlin/test/util/DescriptorValidator.java +++ b/compiler/tests/org/jetbrains/kotlin/test/util/DescriptorValidator.java @@ -264,8 +264,8 @@ public class DescriptorValidator { } ClassDescriptor defaultObjectDescriptor = descriptor.getDefaultObjectDescriptor(); - if (defaultObjectDescriptor != null && defaultObjectDescriptor.getKind() != ClassKind.CLASS_OBJECT) { - report(collector, defaultObjectDescriptor, "Default object should be of kind " + ClassKind.CLASS_OBJECT); + if (defaultObjectDescriptor != null && !defaultObjectDescriptor.isDefaultObject()) { + report(collector, defaultObjectDescriptor, "Default object should be marked as such"); } return true; diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassKind.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassKind.java index 1f898ae78b3..6d2864ded86 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassKind.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassKind.java @@ -22,10 +22,9 @@ public enum ClassKind { ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, - OBJECT, - CLASS_OBJECT; + OBJECT; public boolean isSingleton() { - return this == OBJECT || this == CLASS_OBJECT || this == ENUM_ENTRY; + return this == OBJECT || this == ENUM_ENTRY; } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.java b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.java index 2ab5b1dd2ba..ef4a10a0410 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.java @@ -1001,6 +1001,9 @@ public class DescriptorRendererImpl implements DescriptorRenderer { @NotNull public static String getClassKindPrefix(@NotNull ClassDescriptor klass) { + if (klass.isDefaultObject()) { + return "class object"; + } switch (klass.getKind()) { case CLASS: return "class"; @@ -1012,8 +1015,6 @@ public class DescriptorRendererImpl implements DescriptorRenderer { return "object"; case ANNOTATION_CLASS: return "annotation class"; - case CLASS_OBJECT: - return "class object"; case ENUM_ENTRY: return "enum entry"; default: diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java index 4725ab786ea..1010bf328d0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java @@ -241,7 +241,7 @@ public class DescriptorUtils { } public static boolean isDefaultObject(@Nullable DeclarationDescriptor descriptor) { - return isKindOf(descriptor, ClassKind.CLASS_OBJECT); + return isKindOf(descriptor, ClassKind.OBJECT) && ((ClassDescriptor) descriptor).isDefaultObject(); } public static boolean isAnonymousObject(@NotNull DeclarationDescriptor descriptor) { @@ -249,11 +249,11 @@ public class DescriptorUtils { } public static boolean isNonDefaultObject(@NotNull DeclarationDescriptor descriptor) { - return isKindOf(descriptor, ClassKind.OBJECT); + return isKindOf(descriptor, ClassKind.OBJECT) && !((ClassDescriptor) descriptor).isDefaultObject(); } public static boolean isObject(@NotNull DeclarationDescriptor descriptor) { - return isDefaultObject(descriptor) || isNonDefaultObject(descriptor); + return isKindOf(descriptor, ClassKind.OBJECT); } public static boolean isEnumEntry(@NotNull DeclarationDescriptor descriptor) { @@ -284,7 +284,7 @@ public class DescriptorUtils { return isKindOf(descriptor, ClassKind.CLASS); } - public static boolean isKindOf(@Nullable DeclarationDescriptor descriptor, @NotNull ClassKind classKind) { + private static boolean isKindOf(@Nullable DeclarationDescriptor descriptor, @NotNull ClassKind classKind) { return descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == classKind; } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index 1009964c149..ea3bfc73967 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -60,7 +60,7 @@ public val ClassDescriptor.classId: ClassId public val ClassDescriptor.classObjectDescriptor: ClassDescriptor? get() { return when (this.getKind()) { - CLASS_OBJECT, OBJECT -> this + OBJECT -> this ENUM_ENTRY -> { val container = this.getContainingDeclaration() assert(container is ClassDescriptor && container.getKind() == ENUM_CLASS) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/MemberComparator.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/MemberComparator.java index 879c9e934eb..0d8a572cd7c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/MemberComparator.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/MemberComparator.java @@ -143,6 +143,10 @@ public class MemberComparator implements Comparator { if (class1.getKind().ordinal() != class2.getKind().ordinal()) { return class1.getKind().ordinal() - class2.getKind().ordinal(); } + + if (class1.isDefaultObject() != class2.isDefaultObject()) { + return class1.isDefaultObject() ? 1 : -1; + } } else { throw new AssertionError(String.format( diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java b/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java index dd23b96a387..242589fdf54 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java @@ -81,8 +81,8 @@ public class DescriptorSerializer { public ProtoBuf.Class.Builder classProto(@NotNull ClassDescriptor classDescriptor) { ProtoBuf.Class.Builder builder = ProtoBuf.Class.newBuilder(); - int flags = Flags.getClassFlags(hasAnnotations(classDescriptor), classDescriptor.getVisibility(), - classDescriptor.getModality(), classDescriptor.getKind(), classDescriptor.isInner()); + int flags = Flags.getClassFlags(hasAnnotations(classDescriptor), classDescriptor.getVisibility(), classDescriptor.getModality(), + classDescriptor.getKind(), classDescriptor.isInner(), classDescriptor.isDefaultObject()); builder.setFlags(flags); builder.setFqName(getClassId(classDescriptor)); diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/Flags.java b/core/serialization/src/org/jetbrains/kotlin/serialization/Flags.java index 4022d612549..ce026f40796 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/Flags.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/Flags.java @@ -73,17 +73,20 @@ public class Flags { Visibility visibility, Modality modality, ClassKind kind, - boolean inner + boolean inner, + boolean isDefaultObject ) { return HAS_ANNOTATIONS.toFlags(hasAnnotations) | MODALITY.toFlags(modality(modality)) | VISIBILITY.toFlags(visibility(visibility)) - | CLASS_KIND.toFlags(classKind(kind)) + | CLASS_KIND.toFlags(classKind(kind, isDefaultObject)) | INNER.toFlags(inner) ; } - private static ProtoBuf.Class.Kind classKind(ClassKind kind) { + private static ProtoBuf.Class.Kind classKind(ClassKind kind, boolean isDefaultObject) { + if (isDefaultObject) return ProtoBuf.Class.Kind.CLASS_OBJECT; + switch (kind) { case CLASS: return ProtoBuf.Class.Kind.CLASS; @@ -97,8 +100,6 @@ public class Flags { return ProtoBuf.Class.Kind.ANNOTATION_CLASS; case OBJECT: return ProtoBuf.Class.Kind.OBJECT; - case CLASS_OBJECT: - return ProtoBuf.Class.Kind.CLASS_OBJECT; } throw new IllegalArgumentException("Unknown class kind: " + kind); } diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index d8f67f333d6..ef1ca4cfff1 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -45,7 +45,9 @@ public class DeserializedClassDescriptor( ) { private val modality = deserialization.modality(Flags.MODALITY.get(classProto.getFlags())) private val visibility = deserialization.visibility(Flags.VISIBILITY.get(classProto.getFlags())) - private val kind = deserialization.classKind(Flags.CLASS_KIND.get(classProto.getFlags())) + private val kindFromProto = Flags.CLASS_KIND.get(classProto.getFlags()) + private val kind = deserialization.classKind(kindFromProto) + private val isDefault = kindFromProto == ProtoBuf.Class.Kind.CLASS_OBJECT private val isInner = Flags.INNER.get(classProto.getFlags()) val c = outerContext.childContext(this, classProto.getTypeParameterList(), nameResolver) @@ -88,7 +90,7 @@ public class DeserializedClassDescriptor( override fun getStaticScope() = staticScope - override fun isDefaultObject(): Boolean = getKind() == ClassKind.CLASS_OBJECT + override fun isDefaultObject(): Boolean = isDefault private fun computePrimaryConstructor(): ConstructorDescriptor? { if (!classProto.hasPrimaryConstructor()) return null diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt index 49be22a6a10..5187e317200 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt @@ -52,8 +52,7 @@ public fun classKind(kind: ProtoBuf.Class.Kind): ClassKind = when (kind) { ProtoBuf.Class.Kind.ENUM_CLASS -> ClassKind.ENUM_CLASS ProtoBuf.Class.Kind.ENUM_ENTRY -> ClassKind.ENUM_ENTRY ProtoBuf.Class.Kind.ANNOTATION_CLASS -> ClassKind.ANNOTATION_CLASS - ProtoBuf.Class.Kind.OBJECT -> ClassKind.OBJECT - ProtoBuf.Class.Kind.CLASS_OBJECT -> ClassKind.CLASS_OBJECT + ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.CLASS_OBJECT -> ClassKind.OBJECT } fun variance(variance: TypeParameter.Variance) = when (variance) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetDescriptorIconProvider.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetDescriptorIconProvider.java index 3ba5626fb34..5a366084b13 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetDescriptorIconProvider.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetDescriptorIconProvider.java @@ -111,8 +111,6 @@ public final class JetDescriptorIconProvider { return PlatformIcons.ANNOTATION_TYPE_ICON; case OBJECT: return JetIcons.OBJECT; - case CLASS_OBJECT: - return JetIcons.OBJECT; case CLASS: return JetIcons.CLASS; default: diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt index 8b25a658a3a..4b1d8b3f5fc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt @@ -599,7 +599,7 @@ private fun ExtractionData.inferParametersInfo( when (it) { is ClassDescriptor -> when(it.getKind()) { - ClassKind.CLASS_OBJECT, ClassKind.OBJECT, ClassKind.ENUM_CLASS -> it : ClassDescriptor + ClassKind.OBJECT, ClassKind.ENUM_CLASS -> it : ClassDescriptor ClassKind.ENUM_ENTRY -> it.getContainingDeclaration() as? ClassDescriptor else -> if (ref.getNonStrictParentOfType() != null) it : ClassDescriptor else null } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java index 6a538e1a5a0..a48e527611f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java @@ -364,7 +364,6 @@ public final class Namer { return enumClassCreationMethodReference(); case ENUM_ENTRY: case OBJECT: - case CLASS_OBJECT: return objectCreationMethodReference(); case ANNOTATION_CLASS: case CLASS: