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:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user