Introduce EnumClassObjectDescriptor

Extract the duplicate logic in deserialization and descriptor.loader.java
This commit is contained in:
Alexander Udalov
2014-07-06 06:50:02 +04:00
parent 8efeb3ac6a
commit de21f76e10
5 changed files with 108 additions and 87 deletions
@@ -30,10 +30,9 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
import org.jetbrains.jet.lang.descriptors.impl.AbstractClassDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.ConstructorDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.EnumClassObjectDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.EnumEntrySyntheticClassDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.OverridingUtil;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -41,7 +40,6 @@ import org.jetbrains.jet.lang.types.AbstractClassTypeConstructor;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.storage.NotNullLazyValue;
import org.jetbrains.jet.storage.NullableLazyValue;
@@ -234,7 +232,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
}
if (getKind() == ClassKind.ENUM_CLASS) {
return createEnumClassObject();
return new EnumClassObjectDescriptor(context.getStorageManager(), this);
}
if (getKind() == ClassKind.OBJECT) {
@@ -249,49 +247,6 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
return ContextPackage.deserializeClass(context, classId.createNestedClassId(getClassObjectName(getName())));
}
@NotNull
private ClassDescriptorWithResolutionScopes createEnumClassObject() {
final MutableClassDescriptor classObject = new MutableClassDescriptor(this, getScopeForMemberLookup(), ClassKind.CLASS_OBJECT,
false, getClassObjectName(getName()));
JetType supertype = KotlinBuiltIns.getInstance().getAnyType();
classObject.setSupertypes(Collections.singleton(supertype));
classObject.setModality(Modality.FINAL);
classObject.setVisibility(DescriptorUtils.getSyntheticClassObjectVisibility());
classObject.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList());
classObject.setPrimaryConstructor(DescriptorFactory.createPrimaryConstructorForObject(classObject));
classObject.createTypeConstructor();
JetType enumType = getDefaultType();
JetType enumArrayType = KotlinBuiltIns.getInstance().getArrayType(enumType);
classObject.getBuilder().addFunctionDescriptor(DescriptorFactory.createEnumClassObjectValuesMethod(classObject, enumArrayType));
classObject.getBuilder().addFunctionDescriptor(DescriptorFactory.createEnumClassObjectValueOfMethod(classObject, enumType));
OverridingUtil.DescriptorSink sink = new OverridingUtil.DescriptorSink() {
@Override
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
OverridingUtil.resolveUnknownVisibilityForMember(fakeOverride, null);
classObject.getBuilder().addFunctionDescriptor((SimpleFunctionDescriptor) fakeOverride);
}
@Override
public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
throw new IllegalStateException("Conflict on enum class object override: " + fromSuper + " vs " + fromCurrent);
}
};
JetScope superScope = supertype.getMemberScope();
for (DeclarationDescriptor descriptor : superScope.getAllDescriptors()) {
if (descriptor instanceof FunctionDescriptor) {
Name name = descriptor.getName();
OverridingUtil.generateOverridesInFunctionGroup(name, superScope.getFunctions(name),
Collections.<FunctionDescriptor>emptySet(), classObject, sink);
}
}
return classObject;
}
@Nullable
@Override
public ClassDescriptor getClassObjectDescriptor() {