Create fake overrides for deserialized enum class object

Now that Any has members, we need to make sure fake overrides are properly
generated in every class descriptor we create automatically or manually.

This fixes DescriptorSerializationTestGenerated
This commit is contained in:
Alexander Udalov
2014-02-04 19:55:30 +04:00
parent 304129f9c9
commit 977b156a0d
@@ -262,9 +262,10 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@NotNull
private ClassDescriptorWithResolutionScopes createEnumClassObject() {
MutableClassDescriptor classObject = new MutableClassDescriptor(this, getScopeForMemberLookup(), ClassKind.CLASS_OBJECT,
false, getClassObjectName(getName()));
classObject.setSupertypes(Collections.singleton(KotlinBuiltIns.getInstance().getAnyType()));
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());
@@ -276,6 +277,34 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
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, new OverridingUtil.NotInferredVisibilitySink() {
@Override
public void cannotInferVisibility(@NotNull CallableMemberDescriptor descriptor) {
throw new IllegalStateException("Cannot infer visibility for " + descriptor + " in " + classObject);
}
});
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;
}