diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 2dc17723740..141c427e8ae 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -908,7 +908,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { FunctionDescriptor valuesFunction = findEnumFunction("values", new Function1() { @Override public Boolean invoke(FunctionDescriptor descriptor) { - return DescriptorUtils.isEnumValuesMethod(descriptor); + return isEnumValuesMethod(descriptor); } }); MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valuesFunction), ACC_PUBLIC | ACC_STATIC, "values", "()" + type.getDescriptor(), null, null); @@ -926,7 +926,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { FunctionDescriptor valueOfFunction = findEnumFunction("valueOf", new Function1() { @Override public Boolean invoke(FunctionDescriptor descriptor) { - return DescriptorUtils.isEnumValueOfMethod(descriptor); + return isEnumValueOfMethod(descriptor); } }); MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valueOfFunction), diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/JvmCodegenUtil.java index 199b1063cd2..606e281122d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JvmCodegenUtil.java @@ -36,6 +36,8 @@ import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil; import org.jetbrains.jet.lang.resolve.kotlin.incremental.IncrementalPackageFragmentProvider; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.Arrays; @@ -250,4 +252,18 @@ public class JvmCodegenUtil { return null; } + + public static boolean isEnumValueOfMethod(@NotNull FunctionDescriptor functionDescriptor) { + List methodTypeParameters = functionDescriptor.getValueParameters(); + JetType nullableString = TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getStringType()); + return "valueOf".equals(functionDescriptor.getName().asString()) + && methodTypeParameters.size() == 1 + && JetTypeChecker.DEFAULT.isSubtypeOf(methodTypeParameters.get(0).getType(), nullableString); + } + + public static boolean isEnumValuesMethod(@NotNull FunctionDescriptor functionDescriptor) { + List methodTypeParameters = functionDescriptor.getValueParameters(); + return "values".equals(functionDescriptor.getName().asString()) + && methodTypeParameters.isEmpty(); + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 0e2df56943c..50bcb93347c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -19,7 +19,9 @@ package org.jetbrains.jet.codegen.intrinsics; import com.google.common.collect.ImmutableList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.codegen.JvmCodegenUtil; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.resolve.CompileTimeConstantUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; @@ -33,9 +35,10 @@ import org.jetbrains.jet.lang.types.lang.PrimitiveType; import java.util.HashMap; import java.util.Map; -import static org.jetbrains.org.objectweb.asm.Opcodes.*; -import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; +import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject; +import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClass; import static org.jetbrains.jet.lang.types.lang.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME; +import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class IntrinsicMethods { private static final IntrinsicMethod UNARY_MINUS = new UnaryMinus(); @@ -192,12 +195,14 @@ public class IntrinsicMethods { if (descriptor instanceof SimpleFunctionDescriptor) { SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) descriptor; - if (isEnumClassObject(functionDescriptor.getContainingDeclaration())) { - if (isEnumValuesMethod(functionDescriptor)) { + DeclarationDescriptor container = descriptor.getContainingDeclaration(); + //noinspection ConstantConditions + if (isClassObject(container) && isEnumClass(container.getContainingDeclaration())) { + if (JvmCodegenUtil.isEnumValuesMethod(functionDescriptor)) { return ENUM_VALUES; } - if (isEnumValueOfMethod(functionDescriptor)) { + if (JvmCodegenUtil.isEnumValueOfMethod(functionDescriptor)) { return ENUM_VALUE_OF; } } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java index b9c443231cb..dfa6c4fddc5 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -27,8 +27,10 @@ import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.SpecialNames; import org.jetbrains.jet.lang.resolve.scopes.FilteringScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope; -import org.jetbrains.jet.lang.types.*; -import org.jetbrains.jet.lang.types.checker.JetTypeChecker; +import org.jetbrains.jet.lang.types.ErrorUtils; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.LazyType; +import org.jetbrains.jet.lang.types.TypeConstructor; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.ArrayList; @@ -269,16 +271,6 @@ public class DescriptorUtils { return superClassDescriptor.equals(KotlinBuiltIns.getInstance().getAny()); } - public static boolean isEnumClassObject(@NotNull DeclarationDescriptor descriptor) { - if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == ClassKind.CLASS_OBJECT) { - DeclarationDescriptor containing = descriptor.getContainingDeclaration(); - if ((containing instanceof ClassDescriptor) && ((ClassDescriptor) containing).getKind() == ClassKind.ENUM_CLASS) { - return true; - } - } - return false; - } - public static boolean isSyntheticClassObject(@NotNull DeclarationDescriptor descriptor) { if (isClassObject(descriptor)) { DeclarationDescriptor containing = descriptor.getContainingDeclaration(); @@ -343,20 +335,6 @@ public class DescriptorUtils { }); } - public static boolean isEnumValueOfMethod(@NotNull FunctionDescriptor functionDescriptor) { - List methodTypeParameters = functionDescriptor.getValueParameters(); - JetType nullableString = TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getStringType()); - return "valueOf".equals(functionDescriptor.getName().asString()) - && methodTypeParameters.size() == 1 - && JetTypeChecker.DEFAULT.isSubtypeOf(methodTypeParameters.get(0).getType(), nullableString); - } - - public static boolean isEnumValuesMethod(@NotNull FunctionDescriptor functionDescriptor) { - List methodTypeParameters = functionDescriptor.getValueParameters(); - return "values".equals(functionDescriptor.getName().asString()) - && methodTypeParameters.isEmpty(); - } - /** * @return true iff {@code descriptor}'s first non-class container is a package */