fix for KT-1568 1.javaClass
This commit is contained in:
@@ -53,6 +53,7 @@ public class JetTypeMapper {
|
|||||||
public static final Type JL_STRING_TYPE = Type.getObjectType("java/lang/String");
|
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");
|
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");
|
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);
|
public static final Type ARRAY_GENERIC_TYPE = Type.getType(Object[].class);
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ public class IntrinsicMethods {
|
|||||||
myStdLib = stdlib;
|
myStdLib = stdlib;
|
||||||
|
|
||||||
namedMethods.put("\"kotlin.javaClass.function\"", new JavaClassFunction());
|
namedMethods.put("\"kotlin.javaClass.function\"", new JavaClassFunction());
|
||||||
|
namedMethods.put("\"kotlin.javaClass.property\"", new JavaClassProperty());
|
||||||
|
|
||||||
List<String> primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList();
|
List<String> primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList();
|
||||||
for (String method : primitiveCastMethods) {
|
for (String method : primitiveCastMethods) {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.jet.codegen.intrinsics;
|
|||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||||
|
import org.jetbrains.jet.codegen.JetTypeMapper;
|
||||||
import org.jetbrains.jet.codegen.StackValue;
|
import org.jetbrains.jet.codegen.StackValue;
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.JetCallExpression;
|
import org.jetbrains.jet.lang.psi.JetCallExpression;
|
||||||
@@ -42,6 +43,6 @@ public class JavaClassFunction implements IntrinsicMethod {
|
|||||||
CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor();
|
CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor();
|
||||||
Type type = codegen.getTypeMapper().mapType(resultingDescriptor.getReturnType().getArguments().get(0).getType());
|
Type type = codegen.getTypeMapper().mapType(resultingDescriptor.getReturnType().getArguments().get(0).getType());
|
||||||
v.aconst(type);
|
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 com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||||
|
import org.jetbrains.jet.codegen.JetTypeMapper;
|
||||||
import org.jetbrains.jet.codegen.StackValue;
|
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.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.Type;
|
||||||
import org.objectweb.asm.commons.InstructionAdapter;
|
import org.objectweb.asm.commons.InstructionAdapter;
|
||||||
|
|
||||||
@@ -32,6 +37,35 @@ import java.util.List;
|
|||||||
public class JavaClassProperty implements IntrinsicMethod {
|
public class JavaClassProperty implements IntrinsicMethod {
|
||||||
@Override
|
@Override
|
||||||
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, @Nullable PsiElement element, @Nullable List<JetExpression> arguments, StackValue receiver) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -1204,7 +1204,7 @@ public class JavaDescriptorResolver {
|
|||||||
|
|
||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
||||||
owner,
|
owner,
|
||||||
Collections.<AnnotationDescriptor>emptyList(),
|
resolveAnnotations(anyMember.getMember().psiMember),
|
||||||
modality,
|
modality,
|
||||||
resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
|
resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
|
||||||
isVar,
|
isVar,
|
||||||
@@ -1215,10 +1215,10 @@ public class JavaDescriptorResolver {
|
|||||||
PropertyGetterDescriptor getterDescriptor = null;
|
PropertyGetterDescriptor getterDescriptor = null;
|
||||||
PropertySetterDescriptor setterDescriptor = null;
|
PropertySetterDescriptor setterDescriptor = null;
|
||||||
if (members.getter != null) {
|
if (members.getter != null) {
|
||||||
getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
|
getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, resolveAnnotations(members.getter.getMember().psiMember), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
|
||||||
}
|
}
|
||||||
if (members.setter != null) {
|
if (members.setter != null) {
|
||||||
setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
|
setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, resolveAnnotations(members.setter.getMember().psiMember), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
|
propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
fun box() : String {
|
||||||
|
val i = 1
|
||||||
|
return if(i.javaClass.getSimpleName() == "int") "OK" else "fail"
|
||||||
|
}
|
||||||
@@ -120,4 +120,8 @@ public class StdlibTest extends CodegenTestCase {
|
|||||||
public void testKt1406() throws Exception {
|
public void testKt1406() throws Exception {
|
||||||
blackBoxFile("regressions/kt1406.kt");
|
blackBoxFile("regressions/kt1406.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testKt1568() throws Exception {
|
||||||
|
blackBoxFile("regressions/kt1568.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user