fix for KT-1568 1.javaClass

This commit is contained in:
Alex Tkachman
2012-03-13 09:35:56 +02:00
parent dc37fca143
commit 9aa992c209
7 changed files with 50 additions and 5 deletions
@@ -53,6 +53,7 @@ public class JetTypeMapper {
public static final Type JL_STRING_TYPE = Type.getObjectType("java/lang/String");
public static final Type JL_CHAR_SEQUENCE_TYPE = Type.getObjectType("java/lang/CharSequence");
private static final Type JL_COMPARABLE_TYPE = Type.getObjectType("java/lang/Comparable");
public static final Type JL_CLASS_TYPE = Type.getObjectType("java/lang/Class");
public static final Type ARRAY_GENERIC_TYPE = Type.getType(Object[].class);
@@ -73,6 +73,7 @@ public class IntrinsicMethods {
myStdLib = stdlib;
namedMethods.put("\"kotlin.javaClass.function\"", new JavaClassFunction());
namedMethods.put("\"kotlin.javaClass.property\"", new JavaClassProperty());
List<String> primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList();
for (String method : primitiveCastMethods) {
@@ -19,6 +19,7 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.psi.JetCallExpression;
@@ -42,6 +43,6 @@ public class JavaClassFunction implements IntrinsicMethod {
CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor();
Type type = codegen.getTypeMapper().mapType(resultingDescriptor.getReturnType().getArguments().get(0).getType());
v.aconst(type);
return StackValue.onStack(type);
return StackValue.onStack(JetTypeMapper.JL_CLASS_TYPE);
}
}
@@ -19,8 +19,13 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.psi.JetCallExpression;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter;
@@ -32,6 +37,35 @@ import java.util.List;
public class JavaClassProperty implements IntrinsicMethod {
@Override
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, @Nullable PsiElement element, @Nullable List<JetExpression> arguments, StackValue receiver) {
return null;
receiver.put(receiver.type, v);
switch (receiver.type.getSort()) {
case Type.BOOLEAN:
v.getstatic("java/lang/Boolean", "TYPE", "Ljava/lang/Class;");
break;
case Type.BYTE:
v.getstatic("java/lang/Byte", "TYPE", "Ljava/lang/Class;");
break;
case Type.SHORT:
v.getstatic("java/lang/Short", "TYPE", "Ljava/lang/Class;");
break;
case Type.CHAR:
v.getstatic("java/lang/Character", "TYPE", "Ljava/lang/Class;");
break;
case Type.INT:
v.getstatic("java/lang/Integer", "TYPE", "Ljava/lang/Class;");
break;
case Type.LONG:
v.getstatic("java/lang/Long", "TYPE", "Ljava/lang/Class;");
break;
case Type.FLOAT:
v.getstatic("java/lang/Float", "TYPE", "Ljava/lang/Class;");
break;
case Type.DOUBLE:
v.getstatic("java/lang/Double", "TYPE", "Ljava/lang/Class;");
break;
default:
v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;");
}
return StackValue.onStack(JetTypeMapper.JL_CLASS_TYPE);
}
}