diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 227a9a43836..4913415398a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -45,6 +45,8 @@ import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.resolve.BindingContext.FQNAME_TO_CLASS_DESCRIPTOR; import static org.jetbrains.jet.lang.resolve.BindingContext.TYPE; +import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumEntry; +import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isObject; import static org.jetbrains.jet.lang.resolve.ModifiersChecker.getDefaultClassVisibility; import static org.jetbrains.jet.lang.resolve.ModifiersChecker.resolveVisibilityFromModifiers; import static org.jetbrains.jet.lang.resolve.name.SpecialNames.getClassObjectName; @@ -508,11 +510,16 @@ public class TypeHierarchyResolver { JetObjectDeclaration objectDeclaration = classObject.getObjectDeclaration(); if (objectDeclaration == null) return; - MutableClassDescriptor classObjectDescriptor = - createClassDescriptorForSingleton(objectDeclaration, getClassObjectName(owner.getOwnerForChildren().getName()), - ClassKind.CLASS_OBJECT); + DeclarationDescriptor container = owner.getOwnerForChildren(); + + MutableClassDescriptor classObjectDescriptor = + createClassDescriptorForSingleton(objectDeclaration, getClassObjectName(container.getName()), ClassKind.CLASS_OBJECT); + + NamespaceLikeBuilder.ClassObjectStatus status = + isEnumEntry(container) || isObject(container) ? + NamespaceLikeBuilder.ClassObjectStatus.NOT_ALLOWED : + owner.setClassObjectDescriptor(classObjectDescriptor); - NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(classObjectDescriptor); switch (status) { case DUPLICATE: trace.report(MANY_CLASS_OBJECTS.on(classObject)); diff --git a/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt b/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt new file mode 100644 index 00000000000..002b83dbc5d --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt @@ -0,0 +1,11 @@ +enum class E { + FIRST + + SECOND { + class object { + fun foo() = 42 + } + } +} + +fun f() = E.SECOND.foo() diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 129a1657917..d499806d223 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2542,6 +2542,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/enum/entryShouldBeOfEnumType.kt"); } + @TestMetadata("enumEntryCannotHaveClassObject.kt") + public void testEnumEntryCannotHaveClassObject() throws Exception { + doTest("compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt"); + } + @TestMetadata("enumInheritance.kt") public void testEnumInheritance() throws Exception { doTest("compiler/testData/diagnostics/tests/enum/enumInheritance.kt");