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.diagnostics.Errors.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContext.FQNAME_TO_CLASS_DESCRIPTOR;
|
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.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.getDefaultClassVisibility;
|
||||||
import static org.jetbrains.jet.lang.resolve.ModifiersChecker.resolveVisibilityFromModifiers;
|
import static org.jetbrains.jet.lang.resolve.ModifiersChecker.resolveVisibilityFromModifiers;
|
||||||
import static org.jetbrains.jet.lang.resolve.name.SpecialNames.getClassObjectName;
|
import static org.jetbrains.jet.lang.resolve.name.SpecialNames.getClassObjectName;
|
||||||
@@ -508,11 +510,16 @@ public class TypeHierarchyResolver {
|
|||||||
JetObjectDeclaration objectDeclaration = classObject.getObjectDeclaration();
|
JetObjectDeclaration objectDeclaration = classObject.getObjectDeclaration();
|
||||||
if (objectDeclaration == null) return;
|
if (objectDeclaration == null) return;
|
||||||
|
|
||||||
MutableClassDescriptor classObjectDescriptor =
|
DeclarationDescriptor container = owner.getOwnerForChildren();
|
||||||
createClassDescriptorForSingleton(objectDeclaration, getClassObjectName(owner.getOwnerForChildren().getName()),
|
|
||||||
ClassKind.CLASS_OBJECT);
|
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) {
|
switch (status) {
|
||||||
case DUPLICATE:
|
case DUPLICATE:
|
||||||
trace.report(MANY_CLASS_OBJECTS.on(classObject));
|
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");
|
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")
|
@TestMetadata("enumInheritance.kt")
|
||||||
public void testEnumInheritance() throws Exception {
|
public void testEnumInheritance() throws Exception {
|
||||||
doTest("compiler/testData/diagnostics/tests/enum/enumInheritance.kt");
|
doTest("compiler/testData/diagnostics/tests/enum/enumInheritance.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user