diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java index e8325a222dc..ad0efd0451e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.ReadOnly; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -35,6 +36,10 @@ public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor { @NotNull JetScope getScopeForMemberLookup(); + @Nullable + @Override + ClassDescriptorWithResolutionScopes getClassObjectDescriptor(); + @NotNull @ReadOnly Collection getDeclaredCallableMembers(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java index 04514d9fd69..8b496a0331a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java @@ -44,7 +44,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class private List typeParameters; private Collection supertypes = new ArrayList(); - private ClassDescriptor classObjectDescriptor; + private MutableClassDescriptor classObjectDescriptor; private final Set constructors = Sets.newLinkedHashSet(); private ConstructorDescriptor primaryConstructor; @@ -90,7 +90,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class @Nullable @Override - public ClassDescriptor getClassObjectDescriptor() { + public MutableClassDescriptor getClassObjectDescriptor() { return classObjectDescriptor; } @@ -304,8 +304,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class public void lockScopes() { getScopeForMemberLookupAsWritableScope().changeLockLevel(WritableScope.LockLevel.READING); - if (classObjectDescriptor instanceof MutableClassDescriptor) { - ((MutableClassDescriptor) classObjectDescriptor).lockScopes(); + if (classObjectDescriptor != null) { + classObjectDescriptor.lockScopes(); } scopeForSupertypeResolution.changeLockLevel(WritableScope.LockLevel.READING); scopeForMemberResolution.changeLockLevel(WritableScope.LockLevel.READING); @@ -342,7 +342,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class } @Override - public ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor) { + public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { if (getKind() == ClassKind.CLASS_OBJECT || isInner()) { return ClassObjectStatus.NOT_ALLOWED; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilder.java index a4cda695b60..7478999acc8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilder.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.descriptors.impl; 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.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; @@ -38,5 +37,5 @@ public interface PackageLikeBuilder { NOT_ALLOWED } - ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor); + ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilderDummy.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilderDummy.java index 7c278df932e..f64f02f74c4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilderDummy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/PackageLikeBuilderDummy.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.descriptors.impl; 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.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; @@ -45,7 +44,7 @@ public class PackageLikeBuilderDummy implements PackageLikeBuilder { } @Override - public ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor) { + public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { throw new IllegalStateException(); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/ScopeBasedPackageLikeBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/ScopeBasedPackageLikeBuilder.java index 3234fa4cfe4..973ce2efa5a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/ScopeBasedPackageLikeBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/ScopeBasedPackageLikeBuilder.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.descriptors.impl; 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.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; @@ -57,7 +56,7 @@ public class ScopeBasedPackageLikeBuilder implements PackageLikeBuilder { } @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"); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 782d1cd3ce3..276a5d9070e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -347,10 +347,9 @@ public class DeclarationResolver { Collection allDescriptors = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors(); - ClassDescriptor classObj = classDescriptor.getClassObjectDescriptor(); - if (classObj instanceof ClassDescriptorWithResolutionScopes) { - Collection classObjDescriptors = - ((ClassDescriptorWithResolutionScopes) classObj).getScopeForMemberLookup().getOwnDeclaredDescriptors(); + ClassDescriptorWithResolutionScopes classObj = classDescriptor.getClassObjectDescriptor(); + if (classObj != null) { + Collection classObjDescriptors = classObj.getScopeForMemberLookup().getOwnDeclaredDescriptors(); if (!classObjDescriptors.isEmpty()) { allDescriptors = Lists.newArrayList(allDescriptors); allDescriptors.addAll(classObjDescriptors); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index cd377154725..032eb8f8d6e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -85,9 +85,9 @@ public class OverrideResolver { if (ourClasses.contains(klass)) { generateOverridesAndDelegationInAClass(klass, processed, ourClasses); - ClassDescriptor classObject = klass.getClassObjectDescriptor(); - if (classObject instanceof MutableClassDescriptor) { - generateOverridesAndDelegationInAClass((MutableClassDescriptor) classObject, processed, ourClasses); + MutableClassDescriptor classObject = klass.getClassObjectDescriptor(); + if (classObject != null) { + generateOverridesAndDelegationInAClass(classObject, processed, ourClasses); } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 9008a973940..a157c2527b2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -238,7 +238,7 @@ public class TopDownAnalyzer { } @Override - public ClassObjectStatus setClassObjectDescriptor(@NotNull ClassDescriptor classObjectDescriptor) { + public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { return ClassObjectStatus.NOT_ALLOWED; } }, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 1e7a430e4f7..0470b9e626e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -204,7 +204,7 @@ public class TypeHierarchyResolver { ClassKind kind = descriptor.getKind(); 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(); // This is a clever hack: each enum entry and object declaration (i.e. singleton) has a synthetic class object. diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java index b62d93e6dbe..c53addf5d8f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -83,7 +83,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes private final boolean isInner; private final Annotations annotations; - private final NullableLazyValue classObjectDescriptor; + private final NullableLazyValue classObjectDescriptor; private final MemoizedFunctionToNotNull extraClassObjectDescriptors; private final LazyClassMemberScope unsubstitutedMemberScope; @@ -158,9 +158,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes this.annotations = Annotations.EMPTY; } - this.classObjectDescriptor = storageManager.createNullableLazyValue(new Function0() { + this.classObjectDescriptor = storageManager.createNullableLazyValue(new Function0() { @Override - public ClassDescriptor invoke() { + public LazyClassDescriptor invoke() { return computeClassObjectDescriptor(declarationProvider.getOwnerInfo().getClassObject()); } }); @@ -324,7 +324,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes } @Override - public ClassDescriptor getClassObjectDescriptor() { + public LazyClassDescriptor getClassObjectDescriptor() { return classObjectDescriptor.invoke(); } @@ -351,7 +351,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes } @Nullable - private ClassDescriptor computeClassObjectDescriptor(@Nullable JetClassObject classObject) { + private LazyClassDescriptor computeClassObjectDescriptor(@Nullable JetClassObject classObject) { JetClassLikeInfo classObjectInfo = getClassObjectInfo(classObject); if (classObjectInfo != null) { return new LazyClassDescriptor(resolveSession, this, getClassObjectName(getName()), classObjectInfo);