diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java index c1e631da433..6058eec9ff8 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java @@ -41,4 +41,6 @@ public interface ClassDescriptor extends ClassifierDescriptor { @Nullable JetType getClassObjectType(); + + boolean isObject(); } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java index 4ac2c055f56..0dc3449563c 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java @@ -90,6 +90,11 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl return null; } + @Override + public boolean isObject() { + return false; + } + @Override public boolean isClassObjectAValue() { return true; diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java index 4ebb5a6f46c..d161f2e5963 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java @@ -95,6 +95,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { return original.getClassObjectType(); } + @Override + public boolean isObject() { + return original.isObject(); + } + @Override public boolean isClassObjectAValue() { return original.isClassObjectAValue(); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 221d4709366..ad6278053e4 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -30,12 +30,18 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme private MutableClassDescriptor classObjectDescriptor; private JetType classObjectType; private JetType defaultType; + private final boolean isObject; public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope) { + this(trace, containingDeclaration, outerScope, false); + } + + public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope, boolean isObject) { super(containingDeclaration); this.scopeForMemberLookup = new WritableScopeImpl(JetScope.EMPTY, this, trace.getErrorHandler()).setDebugName("MemberLookup"); this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, trace.getErrorHandler()).setDebugName("SupertypeResolution"); this.scopeForMemberResolution = new WritableScopeImpl(new ChainedScope(this, scopeForMemberLookup, scopeForSupertypeResolution), this, trace.getErrorHandler()).setDebugName("MemberResolution"); + this.isObject = isObject; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -43,6 +49,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme @Override public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { if (this.classObjectDescriptor != null) return ClassObjectStatus.DUPLICATE; + assert classObjectDescriptor.isObject(); this.classObjectDescriptor = classObjectDescriptor; return ClassObjectStatus.OK; } @@ -242,6 +249,11 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme return !constructors.isEmpty(); } + @Override + public boolean isObject() { + return isObject; + } + @Override public String toString() { return DescriptorRenderer.TEXT_FOR_DEBUG.render(this) + "[" + getClass().getCanonicalName() + "@" + System.identityHashCode(this) + "]"; diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index ae6c3940658..1d02b9eacc5 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -171,7 +171,7 @@ public class TopDownAnalyzer { MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner, outerScope); if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) { - MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(trace, mutableClassDescriptor, outerScope); + MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(trace, mutableClassDescriptor, outerScope, true); classObjectDescriptor.setName("class-object-for-" + klass.getName()); classObjectDescriptor.createTypeConstructor(); createPrimaryConstructor(classObjectDescriptor); @@ -213,7 +213,7 @@ public class TopDownAnalyzer { } private MutableClassDescriptor createClassDescriptorForObject(@NotNull JetClassOrObject declaration, @NotNull NamespaceLike owner) { - MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner, outerScope) { + MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner, outerScope, true) { @Override public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { return ClassObjectStatus.NOT_ALLOWED; diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java index a3ce03a10b1..34d6f0d7a26 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java @@ -109,6 +109,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements return classObjectType; } + @Override + public boolean isObject() { + return false; + } + @Override public boolean isClassObjectAValue() { return false;