KT-1113 proper typeinfo(javaClass)

This commit is contained in:
Alex Tkachman
2012-01-24 18:11:29 +02:00
parent ad9ee0eda8
commit 7359388725
3 changed files with 33 additions and 2 deletions
@@ -1,12 +1,18 @@
package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.jet.codegen.CodegenUtil;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
import org.jetbrains.jet.lang.types.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetType;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter;
@@ -18,8 +24,21 @@ import java.util.List;
public class ValueTypeInfo implements IntrinsicMethod {
@Override
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, StackValue receiver) {
codegen.gen(arguments.get(0), JetTypeMapper.TYPE_JET_OBJECT);
v.invokeinterface(JetTypeMapper.TYPE_JET_OBJECT.getInternalName(), JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;");
JetExpression expr = arguments.get(0);
BindingContext bindingContext = codegen.getBindingContext();
JetType jetType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expr);
DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor();
PsiElement psiElement = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declarationDescriptor.getOriginal());
if(psiElement instanceof JetClassOrObject) {
codegen.gen(expr, JetTypeMapper.TYPE_JET_OBJECT);
v.invokeinterface(JetTypeMapper.TYPE_JET_OBJECT.getInternalName(), JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;");
}
else {
codegen.gen(expr, JetTypeMapper.TYPE_OBJECT);
v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;");
v.iconst(jetType.isNullable() ? 1 : 0);
v.invokestatic("jet/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/TypeInfo;");
}
return StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO);
}
}
@@ -0,0 +1,7 @@
class A
fun box():String {
System.out?.println(typeinfo("foo" as String?))
System.out?.println(typeinfo("foo"))
return "OK"
}
@@ -152,4 +152,9 @@ public class TypeInfoTest extends CodegenTestCase {
blackBoxFile("typeInfo/inheritance.jet");
System.out.println(generateToText());
}
public void testkt1113() throws Exception {
blackBoxFile("regressions/kt1113.kt");
System.out.println(generateToText());
}
}