From 977b156a0d039ed9fc2c3b43fdff8d1b2be22c6f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 4 Feb 2014 19:55:30 +0400 Subject: [PATCH] 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 --- .../DeserializedClassDescriptor.java | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java index 04f54488c03..92435632efd 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java @@ -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.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.emptySet(), classObject, sink); + } + } + return classObject; }