Report a proper error on class object in enum entry or object

CLASS_OBJECT_NOT_ALLOWED instead of MANY_CLASS_OBJECTS
This commit is contained in:
Alexander Udalov
2013-11-21 16:25:10 +04:00
parent 2e4807856f
commit dce9fbb91c
3 changed files with 27 additions and 4 deletions
@@ -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));
@@ -0,0 +1,11 @@
enum class E {
FIRST
SECOND {
<!CLASS_OBJECT_NOT_ALLOWED!>class object {
fun foo() = 42
}<!>
}
}
fun f() = E.SECOND.<!UNRESOLVED_REFERENCE!>foo<!>()
@@ -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");