diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index fd11b886bdb..408d7f464e9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -30,6 +30,7 @@ import org.jetbrains.jet.descriptors.serialization.ClassId; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; @@ -55,8 +56,6 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import javax.inject.Inject; import java.util.*; -import static org.jetbrains.jet.lang.resolve.DescriptorResolver.createEnumClassObjectValueOfMethod; -import static org.jetbrains.jet.lang.resolve.DescriptorResolver.createEnumClassObjectValuesMethod; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName; import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_KOTLIN_SOURCES; @@ -460,11 +459,21 @@ public final class JavaClassResolver { } @NotNull - private ClassDescriptorFromJvmBytecode createClassObjectDescriptorForEnum(@NotNull ClassDescriptor containing, @NotNull JavaClass javaClass) { + private ClassDescriptorFromJvmBytecode createClassObjectDescriptorForEnum( + @NotNull ClassDescriptor containing, + @NotNull JavaClass javaClass + ) { ClassDescriptorFromJvmBytecode classObjectDescriptor = createSyntheticClassObject(containing, javaClass); - classObjectDescriptor.getBuilder().addFunctionDescriptor(createEnumClassObjectValuesMethod(classObjectDescriptor, trace)); - classObjectDescriptor.getBuilder().addFunctionDescriptor(createEnumClassObjectValueOfMethod(classObjectDescriptor, trace)); + JetType valuesReturnType = KotlinBuiltIns.getInstance().getArrayType(containing.getDefaultType()); + SimpleFunctionDescriptor valuesMethod = + DescriptorResolver.createEnumClassObjectValuesMethod(classObjectDescriptor, valuesReturnType); + classObjectDescriptor.getBuilder().addFunctionDescriptor(valuesMethod); + + JetType valueOfReturnType = containing.getDefaultType(); + SimpleFunctionDescriptor valueOfMethod = + DescriptorResolver.createEnumClassObjectValueOfMethod(classObjectDescriptor, valueOfReturnType); + classObjectDescriptor.getBuilder().addFunctionDescriptor(valueOfMethod); return classObjectDescriptor; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index e9e566a76c8..fe8e7b11c70 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -1423,47 +1423,59 @@ public class DescriptorResolver { } } + @NotNull public static SimpleFunctionDescriptor createEnumClassObjectValuesMethod( - @NotNull ClassDescriptor classObjectDescriptor, - BindingTrace trace + @NotNull ClassDescriptor classObject, + @NotNull BindingTrace trace ) { - final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObjectDescriptor.getContainingDeclaration(); - assert enumClassDescriptor.getKind() == ClassKind.ENUM_CLASS; - List annotations = Collections.emptyList(); - SimpleFunctionDescriptorImpl values = - new SimpleFunctionDescriptorImpl(classObjectDescriptor, annotations, - VALUES_METHOD_NAME, - CallableMemberDescriptor.Kind.DECLARATION); - JetType type = DeferredType.create(trace, new RecursionIntolerantLazyValue() { + final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObject.getContainingDeclaration(); + assert DescriptorUtils.isEnumClass(enumClassDescriptor) : "values should be created in enum class: " + enumClassDescriptor; + return createEnumClassObjectValuesMethod(classObject, DeferredType.create(trace, new RecursionIntolerantLazyValue() { @Override protected JetType compute() { return KotlinBuiltIns.getInstance().getArrayType(enumClassDescriptor.getDefaultType()); } - }); - values.initialize(null, classObjectDescriptor.getThisAsReceiverParameter(), Collections.emptyList(), - Collections.emptyList(), - type, Modality.FINAL, - Visibilities.PUBLIC, false); - return values; + })); } - public static SimpleFunctionDescriptor createEnumClassObjectValueOfMethod( - @NotNull ClassDescriptor classObjectDescriptor, - BindingTrace trace + @NotNull + public static SimpleFunctionDescriptor createEnumClassObjectValuesMethod( + @NotNull ClassDescriptor classObject, + @NotNull JetType returnType ) { - final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObjectDescriptor.getContainingDeclaration(); - assert enumClassDescriptor.getKind() == ClassKind.ENUM_CLASS; - List annotations = Collections.emptyList(); SimpleFunctionDescriptorImpl values = - new SimpleFunctionDescriptorImpl(classObjectDescriptor, annotations, - VALUE_OF_METHOD_NAME, + new SimpleFunctionDescriptorImpl(classObject, Collections.emptyList(), VALUES_METHOD_NAME, CallableMemberDescriptor.Kind.DECLARATION); - JetType type = DeferredType.create(trace, new RecursionIntolerantLazyValue() { + return values.initialize(null, classObject.getThisAsReceiverParameter(), Collections.emptyList(), + Collections.emptyList(), + returnType, Modality.FINAL, + Visibilities.PUBLIC, false); + } + + + @NotNull + public static SimpleFunctionDescriptor createEnumClassObjectValueOfMethod( + @NotNull ClassDescriptor classObject, + @NotNull BindingTrace trace + ) { + final ClassDescriptor enumClassDescriptor = (ClassDescriptor) classObject.getContainingDeclaration(); + assert DescriptorUtils.isEnumClass(enumClassDescriptor) : "valueOf should be created in enum class: " + enumClassDescriptor; + return createEnumClassObjectValueOfMethod(classObject, DeferredType.create(trace, new RecursionIntolerantLazyValue() { @Override protected JetType compute() { return enumClassDescriptor.getDefaultType(); } - }); + })); + } + + @NotNull + public static SimpleFunctionDescriptor createEnumClassObjectValueOfMethod( + @NotNull ClassDescriptor classObject, + @NotNull JetType returnType + ) { + SimpleFunctionDescriptorImpl values = + new SimpleFunctionDescriptorImpl(classObject, Collections.emptyList(), VALUE_OF_METHOD_NAME, + CallableMemberDescriptor.Kind.DECLARATION); ValueParameterDescriptor parameterDescriptor = new ValueParameterDescriptorImpl( values, 0, @@ -1472,12 +1484,11 @@ public class DescriptorResolver { KotlinBuiltIns.getInstance().getStringType(), false, null); - values.initialize(null, classObjectDescriptor.getThisAsReceiverParameter(), - Collections.emptyList(), - Collections.singletonList(parameterDescriptor), - type, Modality.FINAL, - Visibilities.PUBLIC, false); - return values; + return values.initialize(null, classObject.getThisAsReceiverParameter(), + Collections.emptyList(), + Collections.singletonList(parameterDescriptor), + returnType, Modality.FINAL, + Visibilities.PUBLIC, false); } public static ReceiverParameterDescriptor createLazyReceiverParameterDescriptor(@NotNull final ClassDescriptor classDescriptor) {