diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 95517f18efe..ffed04f9d63 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -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); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 838fd8c783c..0c51f50cb81 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -73,6 +73,7 @@ public class IntrinsicMethods { myStdLib = stdlib; namedMethods.put("\"kotlin.javaClass.function\"", new JavaClassFunction()); + namedMethods.put("\"kotlin.javaClass.property\"", new JavaClassProperty()); List primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList(); for (String method : primitiveCastMethods) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java index eab5c17819f..bd90355d2cf 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java @@ -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); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java index 9f29aa723d7..f554b3e8c1c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java @@ -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 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); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index ce1dd11eb75..ddb16117d67 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1204,7 +1204,7 @@ public class JavaDescriptorResolver { PropertyDescriptor propertyDescriptor = new PropertyDescriptor( owner, - Collections.emptyList(), + resolveAnnotations(anyMember.getMember().psiMember), modality, resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember), isVar, @@ -1215,10 +1215,10 @@ public class JavaDescriptorResolver { PropertyGetterDescriptor getterDescriptor = null; PropertySetterDescriptor setterDescriptor = null; if (members.getter != null) { - getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.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) { - setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.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); diff --git a/compiler/testData/codegen/regressions/kt1568.kt b/compiler/testData/codegen/regressions/kt1568.kt new file mode 100644 index 00000000000..11815979752 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1568.kt @@ -0,0 +1,4 @@ +fun box() : String { + val i = 1 + return if(i.javaClass.getSimpleName() == "int") "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java index 841c9fb52e4..b27543e36d4 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -120,4 +120,8 @@ public class StdlibTest extends CodegenTestCase { public void testKt1406() throws Exception { blackBoxFile("regressions/kt1406.kt"); } + + public void testKt1568() throws Exception { + blackBoxFile("regressions/kt1568.kt"); + } }