Drop ClassKind.CLASS_OBJECT
Default and non-default objects now have ClassKind.OBJECT
This commit is contained in:
+4
-1
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -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
|
||||||
|
|||||||
+1
-2
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -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
|
||||||
|
|||||||
+1
-2
@@ -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:
|
||||||
|
|||||||
+1
-1
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user