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 @Nullable
JetType getClassObjectType(); JetType getClassObjectType();
boolean isObject();
} }
@@ -90,6 +90,11 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl
return null; return null;
} }
@Override
public boolean isObject() {
return false;
}
@Override @Override
public boolean isClassObjectAValue() { public boolean isClassObjectAValue() {
return true; return true;
@@ -95,6 +95,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
return original.getClassObjectType(); return original.getClassObjectType();
} }
@Override
public boolean isObject() {
return original.isObject();
}
@Override @Override
public boolean isClassObjectAValue() { public boolean isClassObjectAValue() {
return original.isClassObjectAValue(); return original.isClassObjectAValue();
@@ -30,12 +30,18 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
private MutableClassDescriptor classObjectDescriptor; private MutableClassDescriptor classObjectDescriptor;
private JetType classObjectType; private JetType classObjectType;
private JetType defaultType; private JetType defaultType;
private final boolean isObject;
public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope) { 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); super(containingDeclaration);
this.scopeForMemberLookup = new WritableScopeImpl(JetScope.EMPTY, this, trace.getErrorHandler()).setDebugName("MemberLookup"); this.scopeForMemberLookup = new WritableScopeImpl(JetScope.EMPTY, this, trace.getErrorHandler()).setDebugName("MemberLookup");
this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, trace.getErrorHandler()).setDebugName("SupertypeResolution"); 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.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 @Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) {
if (this.classObjectDescriptor != null) return ClassObjectStatus.DUPLICATE; if (this.classObjectDescriptor != null) return ClassObjectStatus.DUPLICATE;
assert classObjectDescriptor.isObject();
this.classObjectDescriptor = classObjectDescriptor; this.classObjectDescriptor = classObjectDescriptor;
return ClassObjectStatus.OK; return ClassObjectStatus.OK;
} }
@@ -242,6 +249,11 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
return !constructors.isEmpty(); return !constructors.isEmpty();
} }
@Override
public boolean isObject() {
return isObject;
}
@Override @Override
public String toString() { public String toString() {
return DescriptorRenderer.TEXT_FOR_DEBUG.render(this) + "[" + getClass().getCanonicalName() + "@" + System.identityHashCode(this) + "]"; 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); MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner, outerScope);
if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) { 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.setName("class-object-for-" + klass.getName());
classObjectDescriptor.createTypeConstructor(); classObjectDescriptor.createTypeConstructor();
createPrimaryConstructor(classObjectDescriptor); createPrimaryConstructor(classObjectDescriptor);
@@ -213,7 +213,7 @@ public class TopDownAnalyzer {
} }
private MutableClassDescriptor createClassDescriptorForObject(@NotNull JetClassOrObject declaration, @NotNull NamespaceLike owner) { 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 @Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) { public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) {
return ClassObjectStatus.NOT_ALLOWED; return ClassObjectStatus.NOT_ALLOWED;
@@ -109,6 +109,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
return classObjectType; return classObjectType;
} }
@Override
public boolean isObject() {
return false;
}
@Override @Override
public boolean isClassObjectAValue() { public boolean isClassObjectAValue() {
return false; return false;