Introduce EnumClassObjectDescriptor
Extract the duplicate logic in deserialization and descriptor.loader.java
This commit is contained in:
+2
-47
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user