Introduce ClassKind#CLASS_OBJECT and ClassKind#isObject and usages.
Rename LazyClassDescriptor#onlyEnumEntries -> enumClassObjectInfo. Determine ClassKind in JetClassInfo and JetObjectInfo constructor. Remove complex constructor for enum entry in enum test. Logic simplified in LazyClassMemberScope. Minor refactorings.
This commit is contained in:
@@ -22,7 +22,6 @@ import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
||||
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
@@ -219,10 +218,9 @@ public class ClosureAnnotator {
|
||||
}
|
||||
|
||||
public boolean hasThis0(ClassDescriptor classDescriptor) {
|
||||
if (DescriptorUtils.isClassObject(classDescriptor)) {
|
||||
return false;
|
||||
}
|
||||
if (classDescriptor.getKind() == ClassKind.ENUM_CLASS || classDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
|
||||
if (classDescriptor.getKind() == ClassKind.ENUM_CLASS
|
||||
|| classDescriptor.getKind() == ClassKind.ENUM_ENTRY
|
||||
|| classDescriptor.getKind() == ClassKind.CLASS_OBJECT) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -375,7 +375,7 @@ public class JetTypeMapper {
|
||||
|
||||
if (descriptor instanceof ClassDescriptor) {
|
||||
ClassDescriptor klass = (ClassDescriptor) descriptor;
|
||||
if (klass.getKind() == ClassKind.OBJECT) {
|
||||
if (klass.getKind() == ClassKind.OBJECT || klass.getKind() == ClassKind.CLASS_OBJECT) {
|
||||
if (klass.getContainingDeclaration() instanceof ClassDescriptor) {
|
||||
ClassDescriptor containingKlass = (ClassDescriptor) klass.getContainingDeclaration();
|
||||
if (containingKlass.getKind() == ClassKind.ENUM_CLASS) {
|
||||
|
||||
+3
-3
@@ -451,7 +451,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
||||
PsiMethod[] psiConstructors = psiClass.getConstructors();
|
||||
|
||||
boolean isStatic = psiClass.hasModifierProperty(PsiModifier.STATIC);
|
||||
if (classData.classDescriptor.getKind() == ClassKind.OBJECT) {
|
||||
if (classData.classDescriptor.getKind() == ClassKind.OBJECT || classData.classDescriptor.getKind() == ClassKind.CLASS_OBJECT) {
|
||||
// TODO: wrong: class objects do not need visible constructors
|
||||
ConstructorDescriptorImpl constructor = new ConstructorDescriptorImpl(classData.classDescriptor, new ArrayList<AnnotationDescriptor>(0), true);
|
||||
Visibility visibility = psiConstructors.length != 0
|
||||
@@ -592,7 +592,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
||||
|
||||
FqName fqName = new FqName(classObjectPsiClass.getQualifiedName());
|
||||
ResolverClassData classData = new ClassDescriptorFromJvmBytecode(
|
||||
containing, ClassKind.OBJECT, classObjectPsiClass, fqName, this)
|
||||
containing, ClassKind.CLASS_OBJECT, classObjectPsiClass, fqName, this)
|
||||
.getResolverBinaryClassData();
|
||||
|
||||
ClassDescriptorFromJvmBytecode classObjectDescriptor = classData.classDescriptor;
|
||||
@@ -608,7 +608,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
||||
assert psiClassQualifiedName != null : "Reading java class with no qualified name";
|
||||
FqNameUnsafe fqName = new FqNameUnsafe(psiClassQualifiedName + "." + getClassObjectName(psiClass.getName()).getName());
|
||||
ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(
|
||||
containing, ClassKind.OBJECT, psiClass, null, this);
|
||||
containing, ClassKind.CLASS_OBJECT, psiClass, null, this);
|
||||
|
||||
ResolverEnumClassObjectClassData data = new ResolverEnumClassObjectClassData(psiClass, null, classObjectDescriptor);
|
||||
setUpClassObjectDescriptor(containing, fqName, data, getClassObjectName(containing.getName().getName()));
|
||||
|
||||
@@ -25,5 +25,10 @@ public enum ClassKind {
|
||||
ENUM_CLASS,
|
||||
ENUM_ENTRY,
|
||||
ANNOTATION_CLASS,
|
||||
OBJECT
|
||||
OBJECT,
|
||||
CLASS_OBJECT;
|
||||
|
||||
public boolean isObject() {
|
||||
return this == OBJECT || this == CLASS_OBJECT || this == ENUM_ENTRY;
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -107,7 +107,7 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase
|
||||
}
|
||||
else if (declarationDescriptor instanceof ClassDescriptor) {
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor;
|
||||
return classDescriptor.getKind() == ClassKind.OBJECT || classDescriptor.getKind() == ClassKind.ENUM_CLASS;
|
||||
return classDescriptor.getKind().isObject() || classDescriptor.getKind() == ClassKind.ENUM_CLASS;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
@@ -296,7 +296,7 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase
|
||||
|
||||
@Override
|
||||
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) {
|
||||
if (getKind() == ClassKind.OBJECT) {
|
||||
if (getKind().isObject()) {
|
||||
return ClassObjectStatus.NOT_ALLOWED;
|
||||
}
|
||||
|
||||
@@ -308,7 +308,7 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase
|
||||
return ClassObjectStatus.NOT_ALLOWED;
|
||||
}
|
||||
|
||||
assert classObjectDescriptor.getKind() == ClassKind.OBJECT;
|
||||
assert classObjectDescriptor.getKind() == ClassKind.CLASS_OBJECT;
|
||||
MutableClassDescriptorLite.this.classObjectDescriptor = classObjectDescriptor;
|
||||
|
||||
return ClassObjectStatus.OK;
|
||||
|
||||
@@ -231,19 +231,6 @@ public class DescriptorUtils {
|
||||
return expectedType != null ? expectedType : TypeUtils.NO_EXPECTED_TYPE;
|
||||
}
|
||||
|
||||
public static boolean isObject(@NotNull ClassifierDescriptor classifier) {
|
||||
if (classifier instanceof ClassDescriptor) {
|
||||
ClassDescriptor clazz = (ClassDescriptor) classifier;
|
||||
return clazz.getKind() == ClassKind.OBJECT || clazz.getKind() == ClassKind.ENUM_ENTRY;
|
||||
}
|
||||
else if (classifier instanceof TypeParameterDescriptor) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
throw new IllegalStateException("unknown classifier: " + classifier);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isSubclass(@NotNull ClassDescriptor subClass, @NotNull ClassDescriptor superClass) {
|
||||
return isSubtypeOfClass(subClass.getDefaultType(), superClass.getOriginal());
|
||||
}
|
||||
@@ -292,18 +279,8 @@ public class DescriptorUtils {
|
||||
}
|
||||
|
||||
public static boolean isClassObject(@NotNull DeclarationDescriptor descriptor) {
|
||||
if (descriptor instanceof ClassDescriptor) {
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) descriptor;
|
||||
if (classDescriptor.getKind() == ClassKind.OBJECT) {
|
||||
if (classDescriptor.getContainingDeclaration() instanceof ClassDescriptor) {
|
||||
ClassDescriptor containingDeclaration = (ClassDescriptor) classDescriptor.getContainingDeclaration();
|
||||
if (classDescriptor.getDefaultType().equals(containingDeclaration.getClassObjectType())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return descriptor instanceof ClassDescriptor
|
||||
&& ((ClassDescriptor) descriptor).getKind() == ClassKind.CLASS_OBJECT;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -340,7 +317,7 @@ public class DescriptorUtils {
|
||||
if (containingDeclaration instanceof ClassDescriptor) {
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
|
||||
|
||||
if (classDescriptor.getKind() == ClassKind.OBJECT) {
|
||||
if (classDescriptor.getKind().isObject()) {
|
||||
return inStaticContext(classDescriptor.getContainingDeclaration());
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -120,7 +120,7 @@ public class QualifiedExpressionResolver {
|
||||
if (descriptor instanceof NamespaceDescriptor) {
|
||||
return true;
|
||||
}
|
||||
if (descriptor instanceof ClassDescriptor && ((ClassDescriptor)descriptor).getKind() != ClassKind.OBJECT) {
|
||||
if (descriptor instanceof ClassDescriptor && !((ClassDescriptor)descriptor).getKind().isObject()) {
|
||||
return true;
|
||||
}
|
||||
trace.report(CANNOT_IMPORT_FROM_ELEMENT.on(reference, descriptor));
|
||||
|
||||
@@ -168,7 +168,7 @@ public class TypeHierarchyResolver {
|
||||
|
||||
if (ownerDescriptor instanceof MutableClassDescriptor) {
|
||||
MutableClassDescriptor classDescriptor = (MutableClassDescriptor) ownerDescriptor;
|
||||
if (classDescriptor.getKind() == ClassKind.OBJECT) {
|
||||
if (classDescriptor.getKind() == ClassKind.CLASS_OBJECT) {
|
||||
return classDescriptor.getScopeForMemberResolution();
|
||||
}
|
||||
|
||||
@@ -231,8 +231,9 @@ public class TypeHierarchyResolver {
|
||||
|
||||
@Override
|
||||
public void visitObjectDeclaration(JetObjectDeclaration declaration) {
|
||||
final MutableClassDescriptor objectDescriptor =
|
||||
createClassDescriptorForObject(declaration, owner, outerScope, JetPsiUtil.safeName(declaration.getName()));
|
||||
MutableClassDescriptor objectDescriptor =
|
||||
createClassDescriptorForObject(declaration, owner, outerScope, JetPsiUtil.safeName(declaration.getName()),
|
||||
ClassKind.OBJECT);
|
||||
owner.addObjectDescriptor(objectDescriptor);
|
||||
trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(declaration), objectDescriptor);
|
||||
}
|
||||
@@ -274,7 +275,8 @@ public class TypeHierarchyResolver {
|
||||
if (objectDeclaration != null) {
|
||||
Name classObjectName = getClassObjectName(owner.getOwnerForChildren().getName());
|
||||
MutableClassDescriptor classObjectDescriptor =
|
||||
createClassDescriptorForObject(objectDeclaration, owner, getStaticScope(classObject, owner), classObjectName);
|
||||
createClassDescriptorForObject(objectDeclaration, owner, getStaticScope(classObject, owner),
|
||||
classObjectName, ClassKind.CLASS_OBJECT);
|
||||
NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(classObjectDescriptor);
|
||||
switch (status) {
|
||||
case DUPLICATE:
|
||||
@@ -293,7 +295,7 @@ public class TypeHierarchyResolver {
|
||||
private void createClassObjectForEnumClass(JetClass klass, MutableClassDescriptor mutableClassDescriptor) {
|
||||
if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) {
|
||||
MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(
|
||||
mutableClassDescriptor, outerScope, ClassKind.OBJECT,
|
||||
mutableClassDescriptor, outerScope, ClassKind.CLASS_OBJECT,
|
||||
getClassObjectName(klass.getName()));
|
||||
mutableClassDescriptor.getBuilder().setClassObjectDescriptor(classObjectDescriptor);
|
||||
classObjectDescriptor.setModality(Modality.FINAL);
|
||||
@@ -310,10 +312,10 @@ public class TypeHierarchyResolver {
|
||||
|
||||
private MutableClassDescriptor createClassDescriptorForObject(
|
||||
@NotNull JetObjectDeclaration declaration, @NotNull NamespaceLikeBuilder owner,
|
||||
@NotNull JetScope scope, @NotNull Name name
|
||||
@NotNull JetScope scope, @NotNull Name name, @NotNull ClassKind kind
|
||||
) {
|
||||
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(
|
||||
owner.getOwnerForChildren(), scope, ClassKind.OBJECT, name);
|
||||
owner.getOwnerForChildren(), scope, kind, name);
|
||||
context.getObjects().put(declaration, mutableClassDescriptor);
|
||||
|
||||
JetScope classScope = mutableClassDescriptor.getScopeForMemberResolution();
|
||||
|
||||
@@ -40,6 +40,7 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject;
|
||||
import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor.NO_RECEIVER;
|
||||
|
||||
/**
|
||||
@@ -209,7 +210,7 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor
|
||||
assert containingDeclaration != null;
|
||||
containingDeclaration = containingDeclaration.getContainingDeclaration();
|
||||
}
|
||||
if (containingDeclaration instanceof ClassDescriptor && DescriptorUtils.isClassObject(containingDeclaration)) {
|
||||
if (containingDeclaration != null && isClassObject(containingDeclaration)) {
|
||||
ResolutionCandidate<D> candidate = ResolutionCandidate.create(descriptor);
|
||||
candidate.setThisObject(new ClassReceiver((ClassDescriptor) containingDeclaration));
|
||||
candidate.setExplicitReceiverKind(ExplicitReceiverKind.NO_EXPLICIT_RECEIVER);
|
||||
|
||||
@@ -25,7 +25,10 @@ import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.*;
|
||||
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.ModifiersChecker;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.data.FilteringClassLikeInfo;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo;
|
||||
@@ -102,7 +105,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
this.typeConstructor = new LazyClassTypeConstructor();
|
||||
|
||||
this.kind = classLikeInfo.getClassKind();
|
||||
if (kind == ClassKind.OBJECT) {
|
||||
if (kind.isObject()) {
|
||||
this.modality = Modality.FINAL;
|
||||
}
|
||||
else {
|
||||
@@ -241,7 +244,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
else {
|
||||
if (getKind() == ClassKind.ENUM_CLASS) {
|
||||
// Enum classes always have class objects, and enum constants are their members
|
||||
return onlyEnumEntries(originalClassInfo);
|
||||
return enumClassObjectInfo(originalClassInfo);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -395,7 +398,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
return new FilteringClassLikeInfo(classLikeInfo, Predicates.not(ONLY_ENUM_ENTRIES));
|
||||
}
|
||||
|
||||
private static JetClassLikeInfo onlyEnumEntries(JetClassLikeInfo classLikeInfo) {
|
||||
private static JetClassLikeInfo enumClassObjectInfo(JetClassLikeInfo classLikeInfo) {
|
||||
return new FilteringClassLikeInfo(classLikeInfo, ONLY_ENUM_ENTRIES) {
|
||||
@Override
|
||||
public JetClassOrObject getCorrespondingClassOrObject() {
|
||||
@@ -405,7 +408,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
@NotNull
|
||||
@Override
|
||||
public ClassKind getClassKind() {
|
||||
return ClassKind.OBJECT;
|
||||
return ClassKind.CLASS_OBJECT;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+27
-26
@@ -39,6 +39,11 @@ import java.util.*;
|
||||
*/
|
||||
public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescriptor, ClassMemberDeclarationProvider> {
|
||||
|
||||
@NotNull
|
||||
private static final Set<ClassKind> GENERATE_CONSTRUCTORS_FOR =
|
||||
EnumSet.of(ClassKind.CLASS, ClassKind.ANNOTATION_CLASS, ClassKind.OBJECT,
|
||||
ClassKind.ENUM_CLASS, ClassKind.ENUM_ENTRY, ClassKind.CLASS_OBJECT);
|
||||
|
||||
private interface MemberExtractor<T extends CallableMemberDescriptor> {
|
||||
MemberExtractor<FunctionDescriptor> EXTRACT_FUNCTIONS = new MemberExtractor<FunctionDescriptor>() {
|
||||
@NotNull
|
||||
@@ -277,33 +282,29 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
|
||||
@Nullable
|
||||
public ConstructorDescriptor getPrimaryConstructor() {
|
||||
if (!primaryConstructorResolved) {
|
||||
Set<ClassKind> generateConstructorsFor =
|
||||
EnumSet.of(ClassKind.CLASS, ClassKind.ANNOTATION_CLASS, ClassKind.OBJECT, ClassKind.ENUM_CLASS, ClassKind.ENUM_ENTRY);
|
||||
if (generateConstructorsFor.contains(thisDescriptor.getKind())) {
|
||||
JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject();
|
||||
if (
|
||||
thisDescriptor.getKind() != ClassKind.OBJECT // a fake class object of an enum class
|
||||
&& !declaresObjectOrEnumConstant(classOrObject) // normal objects and enum entries with no constructors
|
||||
) {
|
||||
JetClass jetClass = (JetClass) classOrObject;
|
||||
ConstructorDescriptorImpl constructor = resolveSession.getInjector().getDescriptorResolver()
|
||||
.resolvePrimaryConstructorDescriptor(thisDescriptor.getScopeForClassHeaderResolution(),
|
||||
thisDescriptor,
|
||||
jetClass,
|
||||
resolveSession.getTrace());
|
||||
primaryConstructor = constructor;
|
||||
setDeferredReturnType(constructor);
|
||||
}
|
||||
else {
|
||||
ConstructorDescriptorImpl constructor =
|
||||
DescriptorResolver.createPrimaryConstructorForObject(classOrObject, thisDescriptor, resolveSession.getTrace());
|
||||
setDeferredReturnType(constructor);
|
||||
primaryConstructor = constructor;
|
||||
}
|
||||
}
|
||||
primaryConstructorResolved = true;
|
||||
if (primaryConstructorResolved) {
|
||||
return primaryConstructor;
|
||||
}
|
||||
if (GENERATE_CONSTRUCTORS_FOR.contains(thisDescriptor.getKind())) {
|
||||
JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject();
|
||||
if (!thisDescriptor.getKind().isObject()) {
|
||||
JetClass jetClass = (JetClass) classOrObject;
|
||||
ConstructorDescriptorImpl constructor = resolveSession.getInjector().getDescriptorResolver()
|
||||
.resolvePrimaryConstructorDescriptor(thisDescriptor.getScopeForClassHeaderResolution(),
|
||||
thisDescriptor,
|
||||
jetClass,
|
||||
resolveSession.getTrace());
|
||||
primaryConstructor = constructor;
|
||||
setDeferredReturnType(constructor);
|
||||
}
|
||||
else {
|
||||
ConstructorDescriptorImpl constructor =
|
||||
DescriptorResolver.createPrimaryConstructorForObject(classOrObject, thisDescriptor, resolveSession.getTrace());
|
||||
setDeferredReturnType(constructor);
|
||||
primaryConstructor = constructor;
|
||||
}
|
||||
}
|
||||
primaryConstructorResolved = true;
|
||||
return primaryConstructor;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,8 +28,26 @@ import java.util.List;
|
||||
*/
|
||||
public class JetClassInfo extends JetClassOrObjectInfo<JetClass> {
|
||||
|
||||
@NotNull
|
||||
private final ClassKind kind;
|
||||
|
||||
protected JetClassInfo(@NotNull JetClass classOrObject) {
|
||||
super(classOrObject);
|
||||
if (element instanceof JetEnumEntry) {
|
||||
this.kind = ClassKind.ENUM_ENTRY;
|
||||
}
|
||||
else if (element.isTrait()) {
|
||||
this.kind = ClassKind.TRAIT;
|
||||
}
|
||||
else if (element.hasModifier(JetTokens.ANNOTATION_KEYWORD)) {
|
||||
this.kind = ClassKind.ANNOTATION_CLASS;
|
||||
}
|
||||
else if (element.hasModifier(JetTokens.ENUM_KEYWORD)) {
|
||||
this.kind = ClassKind.ENUM_CLASS;
|
||||
}
|
||||
else {
|
||||
this.kind = ClassKind.CLASS;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -52,10 +70,6 @@ public class JetClassInfo extends JetClassOrObjectInfo<JetClass> {
|
||||
@NotNull
|
||||
@Override
|
||||
public ClassKind getClassKind() {
|
||||
if (element instanceof JetEnumEntry) return ClassKind.ENUM_ENTRY;
|
||||
if (element.isTrait()) return ClassKind.TRAIT;
|
||||
if (element.hasModifier(JetTokens.ANNOTATION_KEYWORD)) return ClassKind.ANNOTATION_CLASS;
|
||||
if (element.hasModifier(JetTokens.ENUM_KEYWORD)) return ClassKind.ENUM_CLASS;
|
||||
return ClassKind.CLASS;
|
||||
return kind;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-4
@@ -28,12 +28,10 @@ public class JetClassInfoUtil {
|
||||
|
||||
public static JetClassLikeInfo createClassLikeInfo(@NotNull JetClassOrObject classOrObject) {
|
||||
if (classOrObject instanceof JetClass) {
|
||||
JetClass jetClass = (JetClass) classOrObject;
|
||||
return new JetClassInfo(jetClass);
|
||||
return new JetClassInfo((JetClass) classOrObject);
|
||||
}
|
||||
if (classOrObject instanceof JetObjectDeclaration) {
|
||||
JetObjectDeclaration objectDeclaration = (JetObjectDeclaration) classOrObject;
|
||||
return new JetObjectInfo(objectDeclaration);
|
||||
return new JetObjectInfo(classOrObject);
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown declaration type: " + classOrObject + classOrObject.getText());
|
||||
}
|
||||
|
||||
@@ -18,7 +18,10 @@ package org.jetbrains.jet.lang.resolve.lazy.data;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassKind;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.psi.JetClassObject;
|
||||
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
||||
import org.jetbrains.jet.lang.psi.JetParameter;
|
||||
import org.jetbrains.jet.lang.psi.JetTypeParameter;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@@ -28,8 +31,13 @@ import java.util.List;
|
||||
*/
|
||||
public class JetObjectInfo extends JetClassOrObjectInfo<JetClassOrObject> {
|
||||
|
||||
@NotNull
|
||||
private final ClassKind kind;
|
||||
|
||||
protected JetObjectInfo(@NotNull JetClassOrObject element) {
|
||||
super(element);
|
||||
boolean isClassObject = element.getParent() instanceof JetClassObject;
|
||||
this.kind = isClassObject ? ClassKind.CLASS_OBJECT : ClassKind.OBJECT;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -52,6 +60,6 @@ public class JetObjectInfo extends JetClassOrObjectInfo<JetClassOrObject> {
|
||||
@NotNull
|
||||
@Override
|
||||
public ClassKind getClassKind() {
|
||||
return ClassKind.OBJECT;
|
||||
return kind;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -21,7 +21,6 @@ import com.google.common.collect.Collections2;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassKind;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||
import org.jetbrains.jet.lang.resolve.AbstractScopeAdapter;
|
||||
@@ -49,7 +48,7 @@ public class InnerClassesScopeWrapper extends AbstractScopeAdapter {
|
||||
}
|
||||
|
||||
private boolean isClass(DeclarationDescriptor descriptor) {
|
||||
return descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() != ClassKind.OBJECT;
|
||||
return descriptor instanceof ClassDescriptor && !((ClassDescriptor) descriptor).getKind().isObject();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,7 +20,6 @@ import com.google.common.collect.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||
@@ -314,7 +313,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
||||
public void addClassifierDescriptor(@NotNull ClassifierDescriptor classDescriptor) {
|
||||
checkMayWrite();
|
||||
|
||||
if (DescriptorUtils.isObject(classDescriptor)) {
|
||||
if (isObject(classDescriptor)) {
|
||||
throw new IllegalStateException("must not be object: " + classDescriptor);
|
||||
}
|
||||
|
||||
@@ -325,7 +324,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
||||
public void addObjectDescriptor(@NotNull ClassDescriptor objectDescriptor) {
|
||||
checkMayWrite();
|
||||
|
||||
if (!DescriptorUtils.isObject(objectDescriptor)) {
|
||||
if (!objectDescriptor.getKind().isObject()) {
|
||||
throw new IllegalStateException("must be object: " + objectDescriptor);
|
||||
}
|
||||
|
||||
@@ -539,4 +538,17 @@ public class WritableScopeImpl extends WritableScopeWithImports {
|
||||
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
|
||||
return declaredDescriptorsAccessibleBySimpleName.values();
|
||||
}
|
||||
|
||||
private static boolean isObject(@NotNull ClassifierDescriptor classifier) {
|
||||
if (classifier instanceof ClassDescriptor) {
|
||||
ClassDescriptor clazz = (ClassDescriptor) classifier;
|
||||
return clazz.getKind().isObject();
|
||||
}
|
||||
else if (classifier instanceof TypeParameterDescriptor) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
throw new IllegalStateException("unknown classifier: " + classifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -541,6 +541,9 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
|
||||
case ANNOTATION_CLASS:
|
||||
keyword = "annotation class";
|
||||
break;
|
||||
case CLASS_OBJECT:
|
||||
keyword = "class object";
|
||||
break;
|
||||
default:
|
||||
keyword = "class";
|
||||
}
|
||||
@@ -548,25 +551,16 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean isClassObjectDescriptor(ClassDescriptor descriptor) {
|
||||
if (descriptor.getKind() == ClassKind.OBJECT) {
|
||||
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
|
||||
if (containing instanceof ClassDescriptor) {
|
||||
return ((ClassDescriptor)containing).getClassObjectDescriptor() == descriptor;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void renderClassDescriptor(ClassDescriptor descriptor, StringBuilder builder, String keyword) {
|
||||
if (!isClassObjectDescriptor(descriptor)) {
|
||||
if (descriptor.getKind() != ClassKind.CLASS_OBJECT) {
|
||||
renderVisibility(descriptor.getVisibility(), builder);
|
||||
}
|
||||
if (descriptor.getKind() != ClassKind.TRAIT && descriptor.getKind() != ClassKind.OBJECT) {
|
||||
if (descriptor.getKind() != ClassKind.TRAIT && descriptor.getKind() != ClassKind.OBJECT
|
||||
&& descriptor.getKind() != ClassKind.CLASS_OBJECT) {
|
||||
renderModality(descriptor.getModality(), builder);
|
||||
}
|
||||
builder.append(renderKeyword(keyword));
|
||||
if (descriptor.getKind() != ClassKind.OBJECT) {
|
||||
if (descriptor.getKind() != ClassKind.CLASS_OBJECT) {
|
||||
builder.append(" ");
|
||||
renderName(descriptor, builder);
|
||||
renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder);
|
||||
|
||||
@@ -4,4 +4,4 @@ trait TheTrait {
|
||||
}
|
||||
|
||||
//internal trait TheTrait defined in root package
|
||||
//object defined in TheTrait
|
||||
//class object defined in TheTrait
|
||||
@@ -2,6 +2,5 @@ package test
|
||||
|
||||
enum class Test(a : Int) {
|
||||
A : Test(0)
|
||||
B(x : Int) : Test(x)
|
||||
C : Test(0) {}
|
||||
B : Test(0) {}
|
||||
}
|
||||
|
||||
@@ -7,19 +7,14 @@ internal final enum class test.Test : jet.Enum<test.Test> {
|
||||
internal final class object test.Test.<class-object-for-Test> {
|
||||
internal final /*constructor*/ fun <init>(): test.Test.<class-object-for-Test>
|
||||
internal final val A: test.Test.<class-object-for-Test>.A
|
||||
internal final val C: test.Test.<class-object-for-Test>.C
|
||||
internal final val B: test.Test.<class-object-for-Test>.B
|
||||
internal final enum entry test.Test.<class-object-for-Test>.A : test.Test {
|
||||
internal final /*constructor*/ fun <init>(): test.Test.<class-object-for-Test>.A
|
||||
public final override /*1*/ fun name(): jet.String
|
||||
public final override /*1*/ fun ordinal(): jet.Int
|
||||
}
|
||||
internal final enum entry test.Test.<class-object-for-Test>.B : test.Test {
|
||||
public final /*constructor*/ fun <init>(/*0*/ x: jet.Int): test.Test.<class-object-for-Test>.B
|
||||
public final override /*1*/ fun name(): jet.String
|
||||
public final override /*1*/ fun ordinal(): jet.Int
|
||||
}
|
||||
internal final enum entry test.Test.<class-object-for-Test>.C : test.Test {
|
||||
internal final /*constructor*/ fun <init>(): test.Test.<class-object-for-Test>.C
|
||||
internal final /*constructor*/ fun <init>(): test.Test.<class-object-for-Test>.B
|
||||
public final override /*1*/ fun name(): jet.String
|
||||
public final override /*1*/ fun ordinal(): jet.Int
|
||||
}
|
||||
|
||||
@@ -37,5 +37,5 @@ trait TheTrait {
|
||||
//internal final class InternalClass defined in rendererTest
|
||||
//internal trait TheTrait defined in rendererTest
|
||||
//internal abstract fun abstractFun() : Unit defined in rendererTest.TheTrait
|
||||
//object : rendererTest.TheClass<jet.Int, jet.Int> defined in rendererTest.TheTrait
|
||||
//class object : rendererTest.TheClass<jet.Int, jet.Int> defined in rendererTest.TheTrait
|
||||
//internal final fun classObjectFunction() : jet.Int defined in rendererTest.TheTrait.<class-object-for-TheTrait>
|
||||
@@ -779,7 +779,7 @@ public class NamespaceComparator {
|
||||
|
||||
@Override
|
||||
public void serialize(ClassKind kind) {
|
||||
assert kind == ClassKind.OBJECT : "Must be called for class objects only";
|
||||
assert kind == ClassKind.CLASS_OBJECT : "Must be called for class objects only";
|
||||
sb.append("class object");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,6 +96,8 @@ 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:
|
||||
|
||||
@@ -150,7 +150,7 @@ class DecompiledDataFactory {
|
||||
String subindent = indent + " ";
|
||||
if (classDescriptor.getClassObjectDescriptor() != null) {
|
||||
firstPassed = true;
|
||||
myBuilder.append(subindent).append("class ");
|
||||
myBuilder.append(subindent);
|
||||
appendDescriptor(classDescriptor.getClassObjectDescriptor(), subindent);
|
||||
}
|
||||
for (DeclarationDescriptor member : sortDeclarations(classDescriptor.getDefaultType().getMemberScope().getAllDescriptors())) {
|
||||
|
||||
@@ -116,7 +116,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent {
|
||||
}
|
||||
|
||||
private DeclarationDescriptor findCurrentDescriptorForClass(@NotNull ClassDescriptor originalDescriptor) {
|
||||
if (originalDescriptor.getKind() == ClassKind.OBJECT) {
|
||||
if (originalDescriptor.getKind().isObject()) {
|
||||
DeclarationDescriptor currentParent = findCurrentDescriptor(originalDescriptor.getContainingDeclaration());
|
||||
if (currentParent == null) return null;
|
||||
return ((ClassDescriptor) currentParent).getClassObjectDescriptor();
|
||||
|
||||
Reference in New Issue
Block a user