fix javaClass function and property
#KT-2318 Fixed #KT-2593 Fixed
This commit is contained in:
@@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
|
|||||||
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
|
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
|
||||||
import org.jetbrains.asm4.Type;
|
import org.jetbrains.asm4.Type;
|
||||||
import org.jetbrains.asm4.commons.InstructionAdapter;
|
import org.jetbrains.asm4.commons.InstructionAdapter;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -42,7 +43,13 @@ public class JavaClassFunction implements IntrinsicMethod {
|
|||||||
CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor();
|
CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor();
|
||||||
Type type = state.getInjector().getJetTypeMapper().mapType(
|
Type type = state.getInjector().getJetTypeMapper().mapType(
|
||||||
resultingDescriptor.getReturnType().getArguments().get(0).getType(), MapTypeMode.VALUE);
|
resultingDescriptor.getReturnType().getArguments().get(0).getType(), MapTypeMode.VALUE);
|
||||||
v.aconst(type);
|
JvmPrimitiveType primitiveType = JvmPrimitiveType.getByAsmType(type);
|
||||||
|
if (primitiveType != null) {
|
||||||
|
v.getstatic(primitiveType.getWrapper().getAsmType().getInternalName(), "TYPE", "Ljava/lang/Class;");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v.aconst(type);
|
||||||
|
}
|
||||||
return StackValue.onStack(JetTypeMapper.JL_CLASS_TYPE);
|
return StackValue.onStack(JetTypeMapper.JL_CLASS_TYPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.jetbrains.jet.codegen.StackValue;
|
|||||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
import org.jetbrains.asm4.Type;
|
import org.jetbrains.asm4.Type;
|
||||||
import org.jetbrains.asm4.commons.InstructionAdapter;
|
import org.jetbrains.asm4.commons.InstructionAdapter;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -36,33 +37,13 @@ public class JavaClassProperty implements IntrinsicMethod {
|
|||||||
@Override
|
@Override
|
||||||
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, @Nullable PsiElement element, @Nullable List<JetExpression> arguments, StackValue receiver, @NotNull GenerationState state) {
|
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, @Nullable PsiElement element, @Nullable List<JetExpression> arguments, StackValue receiver, @NotNull GenerationState state) {
|
||||||
receiver.put(receiver.type, v);
|
receiver.put(receiver.type, v);
|
||||||
switch (receiver.type.getSort()) {
|
JvmPrimitiveType primitiveType = JvmPrimitiveType.getByAsmType(receiver.type);
|
||||||
case Type.BOOLEAN:
|
if (primitiveType != null) {
|
||||||
v.getstatic("java/lang/Boolean", "TYPE", "Ljava/lang/Class;");
|
v.pop();
|
||||||
break;
|
v.getstatic(primitiveType.getWrapper().getAsmType().getInternalName(), "TYPE", "Ljava/lang/Class;");
|
||||||
case Type.BYTE:
|
}
|
||||||
v.getstatic("java/lang/Byte", "TYPE", "Ljava/lang/Class;");
|
else {
|
||||||
break;
|
v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;");
|
||||||
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);
|
return StackValue.onStack(JetTypeMapper.JL_CLASS_TYPE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fun box(): String {
|
||||||
|
javaClass<Boolean>()
|
||||||
|
javaClass<Byte>()
|
||||||
|
javaClass<Short>()
|
||||||
|
javaClass<Char>()
|
||||||
|
javaClass<Int>()
|
||||||
|
javaClass<Long>()
|
||||||
|
javaClass<Float>()
|
||||||
|
javaClass<Double>()
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun foo() {
|
||||||
|
if (1==1) {
|
||||||
|
1.javaClass
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = "OK"
|
||||||
@@ -361,4 +361,12 @@ public class StdlibTest extends CodegenTestCase {
|
|||||||
blackBoxFile("regressions/kt2210.kt");
|
blackBoxFile("regressions/kt2210.kt");
|
||||||
// System.out.println(generateToText());
|
// System.out.println(generateToText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testKt2593() {
|
||||||
|
blackBoxFile("regressions/kt2593.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testKt2318() {
|
||||||
|
blackBoxFile("regressions/kt2318.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user