Enum entries are put into enum class, not its class object
This commit is contained in:
@@ -1677,9 +1677,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
return StackValue.singleton(classDescriptor, typeMapper);
|
return StackValue.singleton(classDescriptor, typeMapper);
|
||||||
}
|
}
|
||||||
if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
|
if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
|
||||||
DeclarationDescriptor enumClass = classDescriptor.getContainingDeclaration().getContainingDeclaration();
|
DeclarationDescriptor enumClass = classDescriptor.getContainingDeclaration();
|
||||||
assert enumClass != null && DescriptorUtils.isEnumClass(enumClass)
|
assert DescriptorUtils.isEnumClass(enumClass) : "Enum entry should be declared in enum class: " + descriptor;
|
||||||
: "Enum entry should be declared in enum class object: " + descriptor;
|
|
||||||
Type type = typeMapper.mapType((ClassDescriptor) enumClass);
|
Type type = typeMapper.mapType((ClassDescriptor) enumClass);
|
||||||
return StackValue.field(type, type, descriptor.getName().asString(), true);
|
return StackValue.field(type, type, descriptor.getName().asString(), true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,11 +279,10 @@ public class BodyResolver {
|
|||||||
delegationSpecifier.accept(visitor);
|
delegationSpecifier.accept(visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set<TypeConstructor> parentEnum =
|
||||||
Set<TypeConstructor> parentEnum = Collections.emptySet();
|
jetClass instanceof JetEnumEntry
|
||||||
if (jetClass instanceof JetEnumEntry) {
|
? Collections.singleton(((ClassDescriptor) descriptor.getContainingDeclaration()).getTypeConstructor())
|
||||||
parentEnum = Collections.singleton(((ClassDescriptor) descriptor.getContainingDeclaration().getContainingDeclaration()).getTypeConstructor());
|
: Collections.<TypeConstructor>emptySet();
|
||||||
}
|
|
||||||
|
|
||||||
checkSupertypeList(descriptor, supertypes, parentEnum);
|
checkSupertypeList(descriptor, supertypes, parentEnum);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,11 +104,11 @@ public class DeclarationsChecker {
|
|||||||
if (aClass.isTrait()) {
|
if (aClass.isTrait()) {
|
||||||
checkTraitModifiers(aClass);
|
checkTraitModifiers(aClass);
|
||||||
}
|
}
|
||||||
else if (classDescriptor.getKind() == ClassKind.ENUM_CLASS) {
|
else if (aClass.isEnum()) {
|
||||||
checkEnumModifiers(aClass);
|
checkEnumModifiers(aClass);
|
||||||
}
|
}
|
||||||
else if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
|
else if (aClass instanceof JetEnumEntry) {
|
||||||
checkEnumEntry(aClass, classDescriptor);
|
checkEnumEntry((JetEnumEntry) aClass, classDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,17 +332,16 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkEnumEntry(JetClass aClass, ClassDescriptor classDescriptor) {
|
private void checkEnumEntry(@NotNull JetEnumEntry enumEntry, @NotNull ClassDescriptor classDescriptor) {
|
||||||
DeclarationDescriptor declaration = classDescriptor.getContainingDeclaration().getContainingDeclaration();
|
DeclarationDescriptor declaration = classDescriptor.getContainingDeclaration();
|
||||||
assert declaration instanceof ClassDescriptor;
|
assert DescriptorUtils.isEnumClass(declaration) : "Enum entry should be declared in enum class: " + classDescriptor;
|
||||||
ClassDescriptor enumClass = (ClassDescriptor) declaration;
|
ClassDescriptor enumClass = (ClassDescriptor) declaration;
|
||||||
assert enumClass.getKind() == ClassKind.ENUM_CLASS;
|
|
||||||
|
|
||||||
List<JetDelegationSpecifier> delegationSpecifiers = aClass.getDelegationSpecifiers();
|
List<JetDelegationSpecifier> delegationSpecifiers = enumEntry.getDelegationSpecifiers();
|
||||||
ConstructorDescriptor constructor = enumClass.getUnsubstitutedPrimaryConstructor();
|
ConstructorDescriptor constructor = enumClass.getUnsubstitutedPrimaryConstructor();
|
||||||
assert constructor != null;
|
assert constructor != null;
|
||||||
if (!constructor.getValueParameters().isEmpty() && delegationSpecifiers.isEmpty()) {
|
if (!constructor.getValueParameters().isEmpty() && delegationSpecifiers.isEmpty()) {
|
||||||
trace.report(ENUM_ENTRY_SHOULD_BE_INITIALIZED.on(aClass, enumClass));
|
trace.report(ENUM_ENTRY_SHOULD_BE_INITIALIZED.on(enumEntry, enumClass));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (JetDelegationSpecifier delegationSpecifier : delegationSpecifiers) {
|
for (JetDelegationSpecifier delegationSpecifier : delegationSpecifiers) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.diagnostics.Errors;
|
import org.jetbrains.jet.lang.diagnostics.Errors;
|
||||||
import org.jetbrains.jet.lang.psi.JetClass;
|
import org.jetbrains.jet.lang.psi.JetClass;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetEnumEntry;
|
||||||
import org.jetbrains.jet.lang.psi.JetModifierList;
|
import org.jetbrains.jet.lang.psi.JetModifierList;
|
||||||
import org.jetbrains.jet.lang.psi.JetModifierListOwner;
|
import org.jetbrains.jet.lang.psi.JetModifierListOwner;
|
||||||
import org.jetbrains.jet.lexer.JetKeywordToken;
|
import org.jetbrains.jet.lexer.JetKeywordToken;
|
||||||
@@ -106,7 +107,7 @@ public class ModifiersChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (modifierListOwner instanceof JetClass && isIllegalNestedClass(descriptor)) {
|
if (modifierListOwner instanceof JetClass && !(modifierListOwner instanceof JetEnumEntry) && isIllegalNestedClass(descriptor)) {
|
||||||
PsiElement name = ((JetClass) modifierListOwner).getNameIdentifier();
|
PsiElement name = ((JetClass) modifierListOwner).getNameIdentifier();
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
trace.report(Errors.NESTED_CLASS_NOT_ALLOWED.on(name));
|
trace.report(Errors.NESTED_CLASS_NOT_ALLOWED.on(name));
|
||||||
|
|||||||
@@ -475,16 +475,13 @@ public class TypeHierarchyResolver {
|
|||||||
@Override
|
@Override
|
||||||
public void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration) {
|
public void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration) {
|
||||||
if (declaration.isObjectLiteral()) {
|
if (declaration.isObjectLiteral()) {
|
||||||
MutableClassDescriptor descriptor =
|
createClassDescriptorForSingleton(declaration, SpecialNames.NO_NAME_PROVIDED, ClassKind.CLASS);
|
||||||
createClassDescriptorForObject(declaration, SpecialNames.NO_NAME_PROVIDED, ClassKind.CLASS);
|
|
||||||
context.getClasses().put(declaration, descriptor);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MutableClassDescriptor descriptor =
|
MutableClassDescriptor descriptor =
|
||||||
createClassDescriptorForObject(declaration, JetPsiUtil.safeName(declaration.getName()), ClassKind.OBJECT);
|
createClassDescriptorForSingleton(declaration, JetPsiUtil.safeName(declaration.getName()), ClassKind.OBJECT);
|
||||||
|
|
||||||
context.getClasses().put(declaration, descriptor);
|
|
||||||
owner.addClassifierDescriptor(descriptor);
|
owner.addClassifierDescriptor(descriptor);
|
||||||
trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(declaration), descriptor);
|
trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(declaration), descriptor);
|
||||||
|
|
||||||
@@ -492,12 +489,13 @@ public class TypeHierarchyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitEnumEntry(@NotNull JetEnumEntry enumEntry) {
|
public void visitEnumEntry(@NotNull JetEnumEntry declaration) {
|
||||||
// TODO: Bad casting
|
MutableClassDescriptor descriptor =
|
||||||
MutableClassDescriptorLite enumClass = (MutableClassDescriptorLite) owner.getOwnerForChildren();
|
createClassDescriptorForSingleton(declaration, JetPsiUtil.safeName(declaration.getName()), ClassKind.ENUM_ENTRY);
|
||||||
MutableClassDescriptorLite enumClassObject = enumClass.getClassObjectDescriptor();
|
|
||||||
assert enumClassObject != null : enumEntry.getParent().getText();
|
owner.addClassifierDescriptor(descriptor);
|
||||||
createClassDescriptorForEnumEntry(enumEntry, enumClassObject);
|
|
||||||
|
descriptor.getBuilder().setClassObjectDescriptor(createSyntheticClassObject(descriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -511,9 +509,8 @@ public class TypeHierarchyResolver {
|
|||||||
if (objectDeclaration == null) return;
|
if (objectDeclaration == null) return;
|
||||||
|
|
||||||
MutableClassDescriptor classObjectDescriptor =
|
MutableClassDescriptor classObjectDescriptor =
|
||||||
createClassDescriptorForObject(objectDeclaration, getClassObjectName(owner.getOwnerForChildren().getName()),
|
createClassDescriptorForSingleton(objectDeclaration, getClassObjectName(owner.getOwnerForChildren().getName()),
|
||||||
ClassKind.CLASS_OBJECT);
|
ClassKind.CLASS_OBJECT);
|
||||||
context.getClasses().put(objectDeclaration, classObjectDescriptor);
|
|
||||||
|
|
||||||
NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(classObjectDescriptor);
|
NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(classObjectDescriptor);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
@@ -573,47 +570,20 @@ public class TypeHierarchyResolver {
|
|||||||
return mutableClassDescriptor;
|
return mutableClassDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private MutableClassDescriptor createClassDescriptorForObject(
|
|
||||||
@NotNull JetClassOrObject declaration,
|
|
||||||
@NotNull Name name,
|
|
||||||
@NotNull ClassKind kind
|
|
||||||
) {
|
|
||||||
return createClassDescriptorForSingleton(owner.getOwnerForChildren(), outerScope, declaration, name, kind);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private MutableClassDescriptor createClassDescriptorForSingleton(
|
private MutableClassDescriptor createClassDescriptorForSingleton(
|
||||||
@NotNull DeclarationDescriptor containingDeclaration,
|
|
||||||
@NotNull JetScope scope,
|
|
||||||
@NotNull JetClassOrObject declaration,
|
@NotNull JetClassOrObject declaration,
|
||||||
@NotNull Name name,
|
@NotNull Name name,
|
||||||
@NotNull ClassKind kind
|
@NotNull ClassKind kind
|
||||||
) {
|
) {
|
||||||
MutableClassDescriptor descriptor = new MutableClassDescriptor(containingDeclaration, scope, kind, false, name);
|
MutableClassDescriptor descriptor = new MutableClassDescriptor(owner.getOwnerForChildren(), outerScope, kind, false, name);
|
||||||
|
|
||||||
prepareForDeferredCall(descriptor.getScopeForMemberResolution(), descriptor, declaration);
|
prepareForDeferredCall(descriptor.getScopeForMemberResolution(), descriptor, declaration);
|
||||||
|
|
||||||
createPrimaryConstructorForObject(declaration, descriptor);
|
createPrimaryConstructorForObject(declaration, descriptor);
|
||||||
trace.record(BindingContext.CLASS, declaration, descriptor);
|
trace.record(BindingContext.CLASS, declaration, descriptor);
|
||||||
return descriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private MutableClassDescriptor createClassDescriptorForEnumEntry(
|
|
||||||
@NotNull JetEnumEntry declaration,
|
|
||||||
@NotNull MutableClassDescriptorLite enumClassObject
|
|
||||||
) {
|
|
||||||
JetScope scope = ((MutableClassDescriptor) enumClassObject).getScopeForMemberResolution();
|
|
||||||
|
|
||||||
MutableClassDescriptor descriptor =
|
|
||||||
createClassDescriptorForSingleton(enumClassObject, scope, declaration, JetPsiUtil.safeName(declaration.getName()),
|
|
||||||
ClassKind.ENUM_ENTRY);
|
|
||||||
|
|
||||||
context.getClasses().put(declaration, descriptor);
|
context.getClasses().put(declaration, descriptor);
|
||||||
enumClassObject.getBuilder().addClassifierDescriptor(descriptor);
|
|
||||||
|
|
||||||
descriptor.getBuilder().setClassObjectDescriptor(createSyntheticClassObject(descriptor));
|
|
||||||
|
|
||||||
return descriptor;
|
return descriptor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,17 +9,17 @@ internal final enum class In : jet.Enum<test.In> {
|
|||||||
/*primary*/ private constructor <class-object-for-In>()
|
/*primary*/ private constructor <class-object-for-In>()
|
||||||
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.In
|
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.In
|
||||||
public final /*synthesized*/ fun values(): jet.Array<test.In>
|
public final /*synthesized*/ fun values(): jet.Array<test.In>
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum entry A : test.In {
|
||||||
|
/*primary*/ private constructor A()
|
||||||
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public enum entry A : test.In {
|
public class object <class-object-for-A> : test.In.A {
|
||||||
/*primary*/ private constructor A()
|
/*primary*/ private constructor <class-object-for-A>()
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public class object <class-object-for-A> : test.In.A {
|
|
||||||
/*primary*/ private constructor <class-object-for-A>()
|
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -33,17 +33,17 @@ private final enum class Pr : jet.Enum<test.Pr> {
|
|||||||
/*primary*/ private constructor <class-object-for-Pr>()
|
/*primary*/ private constructor <class-object-for-Pr>()
|
||||||
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.Pr
|
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.Pr
|
||||||
public final /*synthesized*/ fun values(): jet.Array<test.Pr>
|
public final /*synthesized*/ fun values(): jet.Array<test.Pr>
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum entry A : test.Pr {
|
||||||
|
/*primary*/ private constructor A()
|
||||||
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public enum entry A : test.Pr {
|
public class object <class-object-for-A> : test.Pr.A {
|
||||||
/*primary*/ private constructor A()
|
/*primary*/ private constructor <class-object-for-A>()
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public class object <class-object-for-A> : test.Pr.A {
|
|
||||||
/*primary*/ private constructor <class-object-for-A>()
|
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,17 +57,17 @@ public final enum class Pu : jet.Enum<test.Pu> {
|
|||||||
/*primary*/ private constructor <class-object-for-Pu>()
|
/*primary*/ private constructor <class-object-for-Pu>()
|
||||||
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.Pu
|
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.Pu
|
||||||
public final /*synthesized*/ fun values(): jet.Array<test.Pu>
|
public final /*synthesized*/ fun values(): jet.Array<test.Pu>
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum entry A : test.Pu {
|
||||||
|
/*primary*/ private constructor A()
|
||||||
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public enum entry A : test.Pu {
|
public class object <class-object-for-A> : test.Pu.A {
|
||||||
/*primary*/ private constructor A()
|
/*primary*/ private constructor <class-object-for-A>()
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public class object <class-object-for-A> : test.Pu.A {
|
|
||||||
/*primary*/ private constructor <class-object-for-A>()
|
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,17 +16,17 @@ internal final class A {
|
|||||||
/*primary*/ private constructor <class-object-for-E>()
|
/*primary*/ private constructor <class-object-for-E>()
|
||||||
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.A.E
|
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.A.E
|
||||||
public final /*synthesized*/ fun values(): jet.Array<test.A.E>
|
public final /*synthesized*/ fun values(): jet.Array<test.A.E>
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum entry ENTRY : test.A.E {
|
||||||
|
/*primary*/ private constructor ENTRY()
|
||||||
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public enum entry ENTRY : test.A.E {
|
public class object <class-object-for-ENTRY> : test.A.E.ENTRY {
|
||||||
/*primary*/ private constructor ENTRY()
|
/*primary*/ private constructor <class-object-for-ENTRY>()
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public class object <class-object-for-ENTRY> : test.A.E.ENTRY {
|
|
||||||
/*primary*/ private constructor <class-object-for-ENTRY>()
|
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,17 +12,17 @@ internal final class A {
|
|||||||
/*primary*/ private constructor <class-object-for-E>()
|
/*primary*/ private constructor <class-object-for-E>()
|
||||||
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.A.E
|
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.A.E
|
||||||
public final /*synthesized*/ fun values(): jet.Array<test.A.E>
|
public final /*synthesized*/ fun values(): jet.Array<test.A.E>
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum entry ENTRY : test.A.E {
|
||||||
|
/*primary*/ private constructor ENTRY()
|
||||||
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public enum entry ENTRY : test.A.E {
|
public class object <class-object-for-ENTRY> : test.A.E.ENTRY {
|
||||||
/*primary*/ private constructor ENTRY()
|
/*primary*/ private constructor <class-object-for-ENTRY>()
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public class object <class-object-for-ENTRY> : test.A.E.ENTRY {
|
|
||||||
/*primary*/ private constructor <class-object-for-ENTRY>()
|
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,17 +9,17 @@ internal final enum class MyEnum : jet.Enum<test.MyEnum> {
|
|||||||
/*primary*/ private constructor <class-object-for-MyEnum>()
|
/*primary*/ private constructor <class-object-for-MyEnum>()
|
||||||
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.MyEnum
|
public final /*synthesized*/ fun valueOf(/*0*/ value: jet.String): test.MyEnum
|
||||||
public final /*synthesized*/ fun values(): jet.Array<test.MyEnum>
|
public final /*synthesized*/ fun values(): jet.Array<test.MyEnum>
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum entry ENTRY : test.MyEnum {
|
||||||
|
/*primary*/ private constructor ENTRY()
|
||||||
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public enum entry ENTRY : test.MyEnum {
|
public class object <class-object-for-ENTRY> : test.MyEnum.ENTRY {
|
||||||
/*primary*/ private constructor ENTRY()
|
/*primary*/ private constructor <class-object-for-ENTRY>()
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
||||||
|
|
||||||
public class object <class-object-for-ENTRY> : test.MyEnum.ENTRY {
|
|
||||||
/*primary*/ private constructor <class-object-for-ENTRY>()
|
|
||||||
public final override /*1*/ /*fake_override*/ fun name(): jet.String
|
|
||||||
public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -490,9 +490,7 @@ public class DescriptorUtils {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static JetScope getEnumEntriesScope(@NotNull ClassDescriptor enumClass) {
|
public static JetScope getEnumEntriesScope(@NotNull ClassDescriptor enumClass) {
|
||||||
assert enumClass.getKind() == ClassKind.ENUM_CLASS : "Only enum classes have enum entries: " + enumClass;
|
assert isEnumClass(enumClass) : "Only enum classes have enum entries: " + enumClass;
|
||||||
ClassDescriptor classObject = enumClass.getClassObjectDescriptor();
|
return enumClass.getUnsubstitutedInnerClassesScope();
|
||||||
assert classObject != null : "Enum class should have a class object: " + enumClass;
|
|
||||||
return classObject.getDefaultType().getMemberScope();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-23
@@ -17,10 +17,13 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.scopes;
|
package org.jetbrains.jet.lang.resolve.scopes;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.collect.Collections2;
|
import com.google.common.collect.Collections2;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
|
||||||
@@ -29,9 +32,11 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class InnerClassesScopeWrapper extends AbstractScopeAdapter {
|
public class InnerClassesScopeWrapper extends AbstractScopeAdapter {
|
||||||
|
private static final Predicate<Object> IS_CLASS = Predicates.instanceOf(ClassDescriptor.class);
|
||||||
|
|
||||||
private final JetScope actualScope;
|
private final JetScope actualScope;
|
||||||
|
|
||||||
public InnerClassesScopeWrapper(JetScope actualScope) {
|
public InnerClassesScopeWrapper(@NotNull JetScope actualScope) {
|
||||||
this.actualScope = actualScope;
|
this.actualScope = actualScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,32 +49,19 @@ public class InnerClassesScopeWrapper extends AbstractScopeAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public ClassifierDescriptor getClassifier(@NotNull Name name) {
|
public ClassifierDescriptor getClassifier(@NotNull Name name) {
|
||||||
ClassifierDescriptor classifier = actualScope.getClassifier(name);
|
ClassifierDescriptor classifier = actualScope.getClassifier(name);
|
||||||
if (isClass(classifier)) return classifier;
|
return IS_CLASS.apply(classifier) ? classifier : null;
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
|
||||||
Collection<DeclarationDescriptor> declarationsByLabel = actualScope.getDeclarationsByLabel(labelName);
|
return Collections2.filter(actualScope.getDeclarationsByLabel(labelName), IS_CLASS);
|
||||||
return Collections2.filter(declarationsByLabel, new Predicate<DeclarationDescriptor>() {
|
|
||||||
@Override
|
|
||||||
public boolean apply(@Nullable DeclarationDescriptor descriptor) {
|
|
||||||
return isClass(descriptor);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getAllDescriptors() {
|
public Collection<DeclarationDescriptor> getAllDescriptors() {
|
||||||
Collection<DeclarationDescriptor> allDescriptors = actualScope.getAllDescriptors();
|
return Collections2.filter(actualScope.getAllDescriptors(), IS_CLASS);
|
||||||
return Collections2.filter(allDescriptors, new Predicate<DeclarationDescriptor>() {
|
|
||||||
@Override
|
|
||||||
public boolean apply(@Nullable DeclarationDescriptor descriptor) {
|
|
||||||
return isClass(descriptor);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -82,8 +74,4 @@ public class InnerClassesScopeWrapper extends AbstractScopeAdapter {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return "Classes from " + actualScope;
|
return "Classes from " + actualScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isClass(@Nullable DeclarationDescriptor descriptor) {
|
|
||||||
return descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() != ClassKind.ENUM_ENTRY;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user