Drop ClassKind.CLASS_OBJECT

Default and non-default objects now have ClassKind.OBJECT
This commit is contained in:
Pavel V. Talanov
2015-03-04 17:05:28 +03:00
parent f72f548a93
commit ed4c265564
17 changed files with 44 additions and 34 deletions
@@ -70,6 +70,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
@NotNull SourceElement source @NotNull SourceElement source
) { ) {
super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source); super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source);
assert kind != ClassKind.OBJECT : "Fix isDefaultObject()";
this.kind = kind; this.kind = kind;
this.isInner = isInner; this.isInner = isInner;
@@ -145,7 +147,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
@Override @Override
public boolean isDefaultObject() { public boolean isDefaultObject() {
return getKind() == ClassKind.CLASS_OBJECT; //TODO:
return false;
} }
@NotNull @NotNull
@@ -32,9 +32,7 @@ public class JetObjectInfo extends JetClassOrObjectInfo<JetObjectDeclaration> {
protected JetObjectInfo(@NotNull JetObjectDeclaration element) { protected JetObjectInfo(@NotNull JetObjectDeclaration element) {
super(element); super(element);
this.kind = element.isObjectLiteral() this.kind = element.isObjectLiteral() ? ClassKind.CLASS : ClassKind.OBJECT;
? ClassKind.CLASS
: (element.isDefault() ? ClassKind.CLASS_OBJECT : ClassKind.OBJECT);
} }
@Override @Override
@@ -59,4 +57,8 @@ public class JetObjectInfo extends JetClassOrObjectInfo<JetObjectDeclaration> {
public ClassKind getClassKind() { public ClassKind getClassKind() {
return kind; return kind;
} }
public boolean isDefaultObject() {
return element.isDefault();
}
} }
@@ -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.JetClassInfoUtil;
import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo;
import org.jetbrains.kotlin.resolve.lazy.data.JetClassOrObjectInfo; 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.lazy.declarations.ClassMemberDeclarationProvider;
import org.jetbrains.kotlin.resolve.scopes.*; import org.jetbrains.kotlin.resolve.scopes.*;
import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull; import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull;
@@ -92,6 +93,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
private final NotNullLazyValue<JetScope> scopeForPropertyInitializerResolution; private final NotNullLazyValue<JetScope> scopeForPropertyInitializerResolution;
private final NullableLazyValue<Void> forceResolveAllContents; private final NullableLazyValue<Void> forceResolveAllContents;
private final boolean isDefaultObject;
public LazyClassDescriptor( public LazyClassDescriptor(
@NotNull LazyClassContext c, @NotNull LazyClassContext c,
@@ -118,6 +120,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
this.typeConstructor = new LazyClassTypeConstructor(); this.typeConstructor = new LazyClassTypeConstructor();
this.kind = classLikeInfo.getClassKind(); this.kind = classLikeInfo.getClassKind();
this.isDefaultObject = classLikeInfo instanceof JetObjectInfo && ((JetObjectInfo) classLikeInfo).isDefaultObject();
JetModifierList modifierList = classLikeInfo.getModifierList(); JetModifierList modifierList = classLikeInfo.getModifierList();
if (kind.isSingleton()) { if (kind.isSingleton()) {
@@ -441,7 +444,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@Override @Override
public boolean isDefaultObject() { public boolean isDefaultObject() {
return getKind() == ClassKind.CLASS_OBJECT; return isDefaultObject;
} }
@NotNull @NotNull
@@ -303,8 +303,7 @@ public open class LazyClassMemberScope(
ClassKind.ANNOTATION_CLASS, ClassKind.ANNOTATION_CLASS,
ClassKind.OBJECT, ClassKind.OBJECT,
ClassKind.ENUM_CLASS, ClassKind.ENUM_CLASS,
ClassKind.ENUM_ENTRY, ClassKind.ENUM_ENTRY)
ClassKind.CLASS_OBJECT)
private val EXTRACT_FUNCTIONS: MemberExtractor<FunctionDescriptor> = object : MemberExtractor<FunctionDescriptor> { private val EXTRACT_FUNCTIONS: MemberExtractor<FunctionDescriptor> = object : MemberExtractor<FunctionDescriptor> {
override fun extract(extractFrom: JetType, name: Name): Collection<FunctionDescriptor> { override fun extract(extractFrom: JetType, name: Name): Collection<FunctionDescriptor> {
@@ -264,8 +264,8 @@ public class DescriptorValidator {
} }
ClassDescriptor defaultObjectDescriptor = descriptor.getDefaultObjectDescriptor(); ClassDescriptor defaultObjectDescriptor = descriptor.getDefaultObjectDescriptor();
if (defaultObjectDescriptor != null && defaultObjectDescriptor.getKind() != ClassKind.CLASS_OBJECT) { if (defaultObjectDescriptor != null && !defaultObjectDescriptor.isDefaultObject()) {
report(collector, defaultObjectDescriptor, "Default object should be of kind " + ClassKind.CLASS_OBJECT); report(collector, defaultObjectDescriptor, "Default object should be marked as such");
} }
return true; return true;
@@ -22,10 +22,9 @@ public enum ClassKind {
ENUM_CLASS, ENUM_CLASS,
ENUM_ENTRY, ENUM_ENTRY,
ANNOTATION_CLASS, ANNOTATION_CLASS,
OBJECT, OBJECT;
CLASS_OBJECT;
public boolean isSingleton() { public boolean isSingleton() {
return this == OBJECT || this == CLASS_OBJECT || this == ENUM_ENTRY; return this == OBJECT || this == ENUM_ENTRY;
} }
} }
@@ -1001,6 +1001,9 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
@NotNull @NotNull
public static String getClassKindPrefix(@NotNull ClassDescriptor klass) { public static String getClassKindPrefix(@NotNull ClassDescriptor klass) {
if (klass.isDefaultObject()) {
return "class object";
}
switch (klass.getKind()) { switch (klass.getKind()) {
case CLASS: case CLASS:
return "class"; return "class";
@@ -1012,8 +1015,6 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
return "object"; return "object";
case ANNOTATION_CLASS: case ANNOTATION_CLASS:
return "annotation class"; return "annotation class";
case CLASS_OBJECT:
return "class object";
case ENUM_ENTRY: case ENUM_ENTRY:
return "enum entry"; return "enum entry";
default: default:
@@ -241,7 +241,7 @@ public class DescriptorUtils {
} }
public static boolean isDefaultObject(@Nullable DeclarationDescriptor descriptor) { 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) { public static boolean isAnonymousObject(@NotNull DeclarationDescriptor descriptor) {
@@ -249,11 +249,11 @@ public class DescriptorUtils {
} }
public static boolean isNonDefaultObject(@NotNull DeclarationDescriptor descriptor) { 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) { public static boolean isObject(@NotNull DeclarationDescriptor descriptor) {
return isDefaultObject(descriptor) || isNonDefaultObject(descriptor); return isKindOf(descriptor, ClassKind.OBJECT);
} }
public static boolean isEnumEntry(@NotNull DeclarationDescriptor descriptor) { public static boolean isEnumEntry(@NotNull DeclarationDescriptor descriptor) {
@@ -284,7 +284,7 @@ public class DescriptorUtils {
return isKindOf(descriptor, ClassKind.CLASS); 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; return descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == classKind;
} }
@@ -60,7 +60,7 @@ public val ClassDescriptor.classId: ClassId
public val ClassDescriptor.classObjectDescriptor: ClassDescriptor? public val ClassDescriptor.classObjectDescriptor: ClassDescriptor?
get() { get() {
return when (this.getKind()) { return when (this.getKind()) {
CLASS_OBJECT, OBJECT -> this OBJECT -> this
ENUM_ENTRY -> { ENUM_ENTRY -> {
val container = this.getContainingDeclaration() val container = this.getContainingDeclaration()
assert(container is ClassDescriptor && container.getKind() == ENUM_CLASS) assert(container is ClassDescriptor && container.getKind() == ENUM_CLASS)
@@ -143,6 +143,10 @@ public class MemberComparator implements Comparator<DeclarationDescriptor> {
if (class1.getKind().ordinal() != class2.getKind().ordinal()) { if (class1.getKind().ordinal() != class2.getKind().ordinal()) {
return class1.getKind().ordinal() - class2.getKind().ordinal(); return class1.getKind().ordinal() - class2.getKind().ordinal();
} }
if (class1.isDefaultObject() != class2.isDefaultObject()) {
return class1.isDefaultObject() ? 1 : -1;
}
} }
else { else {
throw new AssertionError(String.format( throw new AssertionError(String.format(
@@ -81,8 +81,8 @@ public class DescriptorSerializer {
public ProtoBuf.Class.Builder classProto(@NotNull ClassDescriptor classDescriptor) { public ProtoBuf.Class.Builder classProto(@NotNull ClassDescriptor classDescriptor) {
ProtoBuf.Class.Builder builder = ProtoBuf.Class.newBuilder(); ProtoBuf.Class.Builder builder = ProtoBuf.Class.newBuilder();
int flags = Flags.getClassFlags(hasAnnotations(classDescriptor), classDescriptor.getVisibility(), int flags = Flags.getClassFlags(hasAnnotations(classDescriptor), classDescriptor.getVisibility(), classDescriptor.getModality(),
classDescriptor.getModality(), classDescriptor.getKind(), classDescriptor.isInner()); classDescriptor.getKind(), classDescriptor.isInner(), classDescriptor.isDefaultObject());
builder.setFlags(flags); builder.setFlags(flags);
builder.setFqName(getClassId(classDescriptor)); builder.setFqName(getClassId(classDescriptor));
@@ -73,17 +73,20 @@ public class Flags {
Visibility visibility, Visibility visibility,
Modality modality, Modality modality,
ClassKind kind, ClassKind kind,
boolean inner boolean inner,
boolean isDefaultObject
) { ) {
return HAS_ANNOTATIONS.toFlags(hasAnnotations) return HAS_ANNOTATIONS.toFlags(hasAnnotations)
| MODALITY.toFlags(modality(modality)) | MODALITY.toFlags(modality(modality))
| VISIBILITY.toFlags(visibility(visibility)) | VISIBILITY.toFlags(visibility(visibility))
| CLASS_KIND.toFlags(classKind(kind)) | CLASS_KIND.toFlags(classKind(kind, isDefaultObject))
| INNER.toFlags(inner) | 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) { switch (kind) {
case CLASS: case CLASS:
return ProtoBuf.Class.Kind.CLASS; return ProtoBuf.Class.Kind.CLASS;
@@ -97,8 +100,6 @@ public class Flags {
return ProtoBuf.Class.Kind.ANNOTATION_CLASS; return ProtoBuf.Class.Kind.ANNOTATION_CLASS;
case OBJECT: case OBJECT:
return ProtoBuf.Class.Kind.OBJECT; return ProtoBuf.Class.Kind.OBJECT;
case CLASS_OBJECT:
return ProtoBuf.Class.Kind.CLASS_OBJECT;
} }
throw new IllegalArgumentException("Unknown class kind: " + kind); throw new IllegalArgumentException("Unknown class kind: " + kind);
} }
@@ -45,7 +45,9 @@ public class DeserializedClassDescriptor(
) { ) {
private val modality = deserialization.modality(Flags.MODALITY.get(classProto.getFlags())) private val modality = deserialization.modality(Flags.MODALITY.get(classProto.getFlags()))
private val visibility = deserialization.visibility(Flags.VISIBILITY.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()) private val isInner = Flags.INNER.get(classProto.getFlags())
val c = outerContext.childContext(this, classProto.getTypeParameterList(), nameResolver) val c = outerContext.childContext(this, classProto.getTypeParameterList(), nameResolver)
@@ -88,7 +90,7 @@ public class DeserializedClassDescriptor(
override fun getStaticScope() = staticScope override fun getStaticScope() = staticScope
override fun isDefaultObject(): Boolean = getKind() == ClassKind.CLASS_OBJECT override fun isDefaultObject(): Boolean = isDefault
private fun computePrimaryConstructor(): ConstructorDescriptor? { private fun computePrimaryConstructor(): ConstructorDescriptor? {
if (!classProto.hasPrimaryConstructor()) return null if (!classProto.hasPrimaryConstructor()) return null
@@ -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_CLASS -> ClassKind.ENUM_CLASS
ProtoBuf.Class.Kind.ENUM_ENTRY -> ClassKind.ENUM_ENTRY ProtoBuf.Class.Kind.ENUM_ENTRY -> ClassKind.ENUM_ENTRY
ProtoBuf.Class.Kind.ANNOTATION_CLASS -> ClassKind.ANNOTATION_CLASS ProtoBuf.Class.Kind.ANNOTATION_CLASS -> ClassKind.ANNOTATION_CLASS
ProtoBuf.Class.Kind.OBJECT -> ClassKind.OBJECT ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.CLASS_OBJECT -> ClassKind.OBJECT
ProtoBuf.Class.Kind.CLASS_OBJECT -> ClassKind.CLASS_OBJECT
} }
fun variance(variance: TypeParameter.Variance) = when (variance) { fun variance(variance: TypeParameter.Variance) = when (variance) {
@@ -111,8 +111,6 @@ public final class JetDescriptorIconProvider {
return PlatformIcons.ANNOTATION_TYPE_ICON; return PlatformIcons.ANNOTATION_TYPE_ICON;
case OBJECT: case OBJECT:
return JetIcons.OBJECT; return JetIcons.OBJECT;
case CLASS_OBJECT:
return JetIcons.OBJECT;
case CLASS: case CLASS:
return JetIcons.CLASS; return JetIcons.CLASS;
default: default:
@@ -599,7 +599,7 @@ private fun ExtractionData.inferParametersInfo(
when (it) { when (it) {
is ClassDescriptor -> is ClassDescriptor ->
when(it.getKind()) { 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 ClassKind.ENUM_ENTRY -> it.getContainingDeclaration() as? ClassDescriptor
else -> if (ref.getNonStrictParentOfType<JetTypeReference>() != null) it : ClassDescriptor else null else -> if (ref.getNonStrictParentOfType<JetTypeReference>() != null) it : ClassDescriptor else null
} }
@@ -364,7 +364,6 @@ public final class Namer {
return enumClassCreationMethodReference(); return enumClassCreationMethodReference();
case ENUM_ENTRY: case ENUM_ENTRY:
case OBJECT: case OBJECT:
case CLASS_OBJECT:
return objectCreationMethodReference(); return objectCreationMethodReference();
case ANNOTATION_CLASS: case ANNOTATION_CLASS:
case CLASS: case CLASS: