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; }