Move/inline enum class object related methods in DescriptorUtils
This commit is contained in:
@@ -908,7 +908,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
FunctionDescriptor valuesFunction = findEnumFunction("values", new Function1<FunctionDescriptor, Boolean>() {
|
FunctionDescriptor valuesFunction = findEnumFunction("values", new Function1<FunctionDescriptor, Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public Boolean invoke(FunctionDescriptor descriptor) {
|
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);
|
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<FunctionDescriptor, Boolean>() {
|
FunctionDescriptor valueOfFunction = findEnumFunction("valueOf", new Function1<FunctionDescriptor, Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public Boolean invoke(FunctionDescriptor descriptor) {
|
public Boolean invoke(FunctionDescriptor descriptor) {
|
||||||
return DescriptorUtils.isEnumValueOfMethod(descriptor);
|
return isEnumValueOfMethod(descriptor);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valueOfFunction),
|
MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valueOfFunction),
|
||||||
|
|||||||
@@ -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.kotlin.incremental.IncrementalPackageFragmentProvider;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
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 org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -250,4 +252,18 @@ public class JvmCodegenUtil {
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isEnumValueOfMethod(@NotNull FunctionDescriptor functionDescriptor) {
|
||||||
|
List<ValueParameterDescriptor> 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<ValueParameterDescriptor> methodTypeParameters = functionDescriptor.getValueParameters();
|
||||||
|
return "values".equals(functionDescriptor.getName().asString())
|
||||||
|
&& methodTypeParameters.isEmpty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,9 @@ package org.jetbrains.jet.codegen.intrinsics;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.codegen.JvmCodegenUtil;
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
|
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.descriptors.SimpleFunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.CompileTimeConstantUtils;
|
import org.jetbrains.jet.lang.resolve.CompileTimeConstantUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
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.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject;
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
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.jet.lang.types.lang.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME;
|
||||||
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
|
|
||||||
public class IntrinsicMethods {
|
public class IntrinsicMethods {
|
||||||
private static final IntrinsicMethod UNARY_MINUS = new UnaryMinus();
|
private static final IntrinsicMethod UNARY_MINUS = new UnaryMinus();
|
||||||
@@ -192,12 +195,14 @@ public class IntrinsicMethods {
|
|||||||
if (descriptor instanceof SimpleFunctionDescriptor) {
|
if (descriptor instanceof SimpleFunctionDescriptor) {
|
||||||
SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) descriptor;
|
SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) descriptor;
|
||||||
|
|
||||||
if (isEnumClassObject(functionDescriptor.getContainingDeclaration())) {
|
DeclarationDescriptor container = descriptor.getContainingDeclaration();
|
||||||
if (isEnumValuesMethod(functionDescriptor)) {
|
//noinspection ConstantConditions
|
||||||
|
if (isClassObject(container) && isEnumClass(container.getContainingDeclaration())) {
|
||||||
|
if (JvmCodegenUtil.isEnumValuesMethod(functionDescriptor)) {
|
||||||
return ENUM_VALUES;
|
return ENUM_VALUES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isEnumValueOfMethod(functionDescriptor)) {
|
if (JvmCodegenUtil.isEnumValueOfMethod(functionDescriptor)) {
|
||||||
return ENUM_VALUE_OF;
|
return ENUM_VALUE_OF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.name.SpecialNames;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.FilteringScope;
|
import org.jetbrains.jet.lang.resolve.scopes.FilteringScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.ErrorUtils;
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
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 org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -269,16 +271,6 @@ public class DescriptorUtils {
|
|||||||
return superClassDescriptor.equals(KotlinBuiltIns.getInstance().getAny());
|
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) {
|
public static boolean isSyntheticClassObject(@NotNull DeclarationDescriptor descriptor) {
|
||||||
if (isClassObject(descriptor)) {
|
if (isClassObject(descriptor)) {
|
||||||
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
|
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
|
||||||
@@ -343,20 +335,6 @@ public class DescriptorUtils {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isEnumValueOfMethod(@NotNull FunctionDescriptor functionDescriptor) {
|
|
||||||
List<ValueParameterDescriptor> 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<ValueParameterDescriptor> methodTypeParameters = functionDescriptor.getValueParameters();
|
|
||||||
return "values".equals(functionDescriptor.getName().asString())
|
|
||||||
&& methodTypeParameters.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff {@code descriptor}'s first non-class container is a package
|
* @return true iff {@code descriptor}'s first non-class container is a package
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user