Refine getClassObjectDescriptor()'s type

This reverts commit db3e5ed678.
This commit is contained in:
Alexander Udalov
2014-09-08 15:04:18 +04:00
parent b52f337f7f
commit 476dc78c16
10 changed files with 26 additions and 25 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.descriptors; package org.jetbrains.jet.lang.descriptors;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ReadOnly; import org.jetbrains.annotations.ReadOnly;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -35,6 +36,10 @@ public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor {
@NotNull @NotNull
JetScope getScopeForMemberLookup(); JetScope getScopeForMemberLookup();
@Nullable
@Override
ClassDescriptorWithResolutionScopes getClassObjectDescriptor();
@NotNull @NotNull
@ReadOnly @ReadOnly
Collection<CallableMemberDescriptor> getDeclaredCallableMembers(); Collection<CallableMemberDescriptor> getDeclaredCallableMembers();
@@ -44,7 +44,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
private List<TypeParameterDescriptor> typeParameters; private List<TypeParameterDescriptor> typeParameters;
private Collection<JetType> supertypes = new ArrayList<JetType>(); private Collection<JetType> supertypes = new ArrayList<JetType>();
private ClassDescriptor classObjectDescriptor; private MutableClassDescriptor classObjectDescriptor;
private final Set<ConstructorDescriptor> constructors = Sets.newLinkedHashSet(); private final Set<ConstructorDescriptor> constructors = Sets.newLinkedHashSet();
private ConstructorDescriptor primaryConstructor; private ConstructorDescriptor primaryConstructor;
@@ -90,7 +90,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
@Nullable @Nullable
@Override @Override
public ClassDescriptor getClassObjectDescriptor() { public MutableClassDescriptor getClassObjectDescriptor() {
return classObjectDescriptor; return classObjectDescriptor;
} }
@@ -304,8 +304,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
public void lockScopes() { public void lockScopes() {
getScopeForMemberLookupAsWritableScope().changeLockLevel(WritableScope.LockLevel.READING); getScopeForMemberLookupAsWritableScope().changeLockLevel(WritableScope.LockLevel.READING);
if (classObjectDescriptor instanceof MutableClassDescriptor) { if (classObjectDescriptor != null) {
((MutableClassDescriptor) classObjectDescriptor).lockScopes(); classObjectDescriptor.lockScopes();
} }
scopeForSupertypeResolution.changeLockLevel(WritableScope.LockLevel.READING); scopeForSupertypeResolution.changeLockLevel(WritableScope.LockLevel.READING);
scopeForMemberResolution.changeLockLevel(WritableScope.LockLevel.READING); scopeForMemberResolution.changeLockLevel(WritableScope.LockLevel.READING);
@@ -342,7 +342,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
} }
@Override @Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor) { public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) {
if (getKind() == ClassKind.CLASS_OBJECT || isInner()) { if (getKind() == ClassKind.CLASS_OBJECT || isInner()) {
return ClassObjectStatus.NOT_ALLOWED; return ClassObjectStatus.NOT_ALLOWED;
} }
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.descriptors.impl; package org.jetbrains.jet.lang.descriptors.impl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
@@ -38,5 +37,5 @@ public interface PackageLikeBuilder {
NOT_ALLOWED NOT_ALLOWED
} }
ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor); ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor);
} }
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.descriptors.impl; package org.jetbrains.jet.lang.descriptors.impl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
@@ -45,7 +44,7 @@ public class PackageLikeBuilderDummy implements PackageLikeBuilder {
} }
@Override @Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor) { public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
} }
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.descriptors.impl; package org.jetbrains.jet.lang.descriptors.impl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
@@ -57,7 +56,7 @@ public class ScopeBasedPackageLikeBuilder implements PackageLikeBuilder {
} }
@Override @Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor) { public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) {
throw new IllegalStateException("Must be guaranteed not to happen by the parser"); throw new IllegalStateException("Must be guaranteed not to happen by the parser");
} }
} }
@@ -347,10 +347,9 @@ public class DeclarationResolver {
Collection<DeclarationDescriptor> allDescriptors = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors(); Collection<DeclarationDescriptor> allDescriptors = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors();
ClassDescriptor classObj = classDescriptor.getClassObjectDescriptor(); ClassDescriptorWithResolutionScopes classObj = classDescriptor.getClassObjectDescriptor();
if (classObj instanceof ClassDescriptorWithResolutionScopes) { if (classObj != null) {
Collection<DeclarationDescriptor> classObjDescriptors = Collection<DeclarationDescriptor> classObjDescriptors = classObj.getScopeForMemberLookup().getOwnDeclaredDescriptors();
((ClassDescriptorWithResolutionScopes) classObj).getScopeForMemberLookup().getOwnDeclaredDescriptors();
if (!classObjDescriptors.isEmpty()) { if (!classObjDescriptors.isEmpty()) {
allDescriptors = Lists.newArrayList(allDescriptors); allDescriptors = Lists.newArrayList(allDescriptors);
allDescriptors.addAll(classObjDescriptors); allDescriptors.addAll(classObjDescriptors);
@@ -85,9 +85,9 @@ public class OverrideResolver {
if (ourClasses.contains(klass)) { if (ourClasses.contains(klass)) {
generateOverridesAndDelegationInAClass(klass, processed, ourClasses); generateOverridesAndDelegationInAClass(klass, processed, ourClasses);
ClassDescriptor classObject = klass.getClassObjectDescriptor(); MutableClassDescriptor classObject = klass.getClassObjectDescriptor();
if (classObject instanceof MutableClassDescriptor) { if (classObject != null) {
generateOverridesAndDelegationInAClass((MutableClassDescriptor) classObject, processed, ourClasses); generateOverridesAndDelegationInAClass(classObject, processed, ourClasses);
} }
} }
} }
@@ -238,7 +238,7 @@ public class TopDownAnalyzer {
} }
@Override @Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor) { public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) {
return ClassObjectStatus.NOT_ALLOWED; return ClassObjectStatus.NOT_ALLOWED;
} }
}, },
@@ -204,7 +204,7 @@ public class TypeHierarchyResolver {
ClassKind kind = descriptor.getKind(); ClassKind kind = descriptor.getKind();
if (kind == ClassKind.ENUM_ENTRY || kind == ClassKind.OBJECT) { if (kind == ClassKind.ENUM_ENTRY || kind == ClassKind.OBJECT) {
MutableClassDescriptor classObject = (MutableClassDescriptor) descriptor.getClassObjectDescriptor(); MutableClassDescriptor classObject = descriptor.getClassObjectDescriptor();
assert classObject != null : "Enum entries and named objects should have class objects: " + classOrObject.getText(); assert classObject != null : "Enum entries and named objects should have class objects: " + classOrObject.getText();
// This is a clever hack: each enum entry and object declaration (i.e. singleton) has a synthetic class object. // This is a clever hack: each enum entry and object declaration (i.e. singleton) has a synthetic class object.
@@ -83,7 +83,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
private final boolean isInner; private final boolean isInner;
private final Annotations annotations; private final Annotations annotations;
private final NullableLazyValue<ClassDescriptor> classObjectDescriptor; private final NullableLazyValue<LazyClassDescriptor> classObjectDescriptor;
private final MemoizedFunctionToNotNull<JetClassObject, ClassDescriptor> extraClassObjectDescriptors; private final MemoizedFunctionToNotNull<JetClassObject, ClassDescriptor> extraClassObjectDescriptors;
private final LazyClassMemberScope unsubstitutedMemberScope; private final LazyClassMemberScope unsubstitutedMemberScope;
@@ -158,9 +158,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
this.annotations = Annotations.EMPTY; this.annotations = Annotations.EMPTY;
} }
this.classObjectDescriptor = storageManager.createNullableLazyValue(new Function0<ClassDescriptor>() { this.classObjectDescriptor = storageManager.createNullableLazyValue(new Function0<LazyClassDescriptor>() {
@Override @Override
public ClassDescriptor invoke() { public LazyClassDescriptor invoke() {
return computeClassObjectDescriptor(declarationProvider.getOwnerInfo().getClassObject()); return computeClassObjectDescriptor(declarationProvider.getOwnerInfo().getClassObject());
} }
}); });
@@ -324,7 +324,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
} }
@Override @Override
public ClassDescriptor getClassObjectDescriptor() { public LazyClassDescriptor getClassObjectDescriptor() {
return classObjectDescriptor.invoke(); return classObjectDescriptor.invoke();
} }
@@ -351,7 +351,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
} }
@Nullable @Nullable
private ClassDescriptor computeClassObjectDescriptor(@Nullable JetClassObject classObject) { private LazyClassDescriptor computeClassObjectDescriptor(@Nullable JetClassObject classObject) {
JetClassLikeInfo classObjectInfo = getClassObjectInfo(classObject); JetClassLikeInfo classObjectInfo = getClassObjectInfo(classObject);
if (classObjectInfo != null) { if (classObjectInfo != null) {
return new LazyClassDescriptor(resolveSession, this, getClassObjectName(getName()), classObjectInfo); return new LazyClassDescriptor(resolveSession, this, getClassObjectName(getName()), classObjectInfo);