Class descriptors for objects marked explicitly

This commit is contained in:
Andrey Breslav
2011-06-16 19:44:58 +04:00
parent a502438771
commit 0c274a7651
6 changed files with 31 additions and 2 deletions
@@ -41,4 +41,6 @@ public interface ClassDescriptor extends ClassifierDescriptor {
@Nullable
JetType getClassObjectType();
boolean isObject();
}
@@ -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;
@@ -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();
@@ -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) + "]";
@@ -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;
@@ -109,6 +109,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
return classObjectType;
}
@Override
public boolean isObject() {
return false;
}
@Override
public boolean isClassObjectAValue() {
return false;