diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java index 720419993c2..83d4a214ac2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java @@ -68,6 +68,8 @@ public class IntrinsicMethods { public IntrinsicMethods(JvmTarget jvmTarget, boolean shouldThrowNpeOnExplicitEqualsForBoxedNull) { intrinsicsMap.registerIntrinsic(KOTLIN_JVM, RECEIVER_PARAMETER_FQ_NAME, "javaClass", -1, JavaClassProperty.INSTANCE); intrinsicsMap.registerIntrinsic(KOTLIN_JVM, KotlinBuiltIns.FQ_NAMES.kClass, "java", -1, new KClassJavaProperty()); + intrinsicsMap.registerIntrinsic(KOTLIN_JVM, KotlinBuiltIns.FQ_NAMES.kClass, "javaObjectType", -1, new KClassJavaObjectTypeProperty()); + intrinsicsMap.registerIntrinsic(KOTLIN_JVM, KotlinBuiltIns.FQ_NAMES.kClass, "javaPrimitiveType", -1, new KClassJavaPrimitiveTypeProperty()); intrinsicsMap.registerIntrinsic(KotlinBuiltIns.FQ_NAMES.kCallable.toSafe(), null, "name", -1, new KCallableNameProperty()); intrinsicsMap.registerIntrinsic(new FqName("kotlin.jvm.internal.unsafe"), null, "monitorEnter", 1, MonitorInstruction.MONITOR_ENTER); intrinsicsMap.registerIntrinsic(new FqName("kotlin.jvm.internal.unsafe"), null, "monitorExit", 1, MonitorInstruction.MONITOR_EXIT); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaObjectTypeProperty.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaObjectTypeProperty.kt new file mode 100644 index 00000000000..a4d1cc08189 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaObjectTypeProperty.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.codegen.intrinsics + +import org.jetbrains.kotlin.codegen.AsmUtil +import org.jetbrains.kotlin.codegen.ExpressionCodegen +import org.jetbrains.kotlin.codegen.StackValue +import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner +import org.jetbrains.kotlin.psi.KtClassLiteralExpression +import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver +import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.types.expressions.DoubleColonLHS +import org.jetbrains.org.objectweb.asm.Type + +class KClassJavaObjectTypeProperty : IntrinsicPropertyGetter() { + override fun generate(resolvedCall: ResolvedCall<*>?, codegen: ExpressionCodegen, returnType: Type, receiver: StackValue): StackValue? { + val receiverValue = resolvedCall!!.extensionReceiver as? ExpressionReceiver ?: return null + val classLiteralExpression = receiverValue.expression as? KtClassLiteralExpression ?: return null + val receiverExpression = classLiteralExpression.receiverExpression ?: return null + val lhs = codegen.bindingContext.get(DOUBLE_COLON_LHS, receiverExpression) ?: return null + return StackValue.operation(returnType) { iv -> + if (lhs is DoubleColonLHS.Expression && !lhs.isObjectQualifier) { + val receiverStackValue = codegen.gen(receiverExpression) + val extensionReceiverType = receiverStackValue.type + receiverStackValue.put(extensionReceiverType, iv) + when { + extensionReceiverType == Type.VOID_TYPE -> { + iv.aconst(AsmTypes.UNIT_TYPE) + } + AsmUtil.isPrimitive(extensionReceiverType) || + AsmUtil.unboxPrimitiveTypeOrNull(extensionReceiverType) != null -> { + AsmUtil.pop(iv, extensionReceiverType) + iv.aconst(AsmUtil.boxType(extensionReceiverType)) + } + else -> { + iv.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;", false) + } + } + } else { + if (TypeUtils.isTypeParameter(lhs.type)) { + assert(TypeUtils.isReifiedTypeParameter(lhs.type)) { + "Non-reified type parameter under ::class should be rejected by type checker: ${lhs.type}" + } + codegen.putReifiedOperationMarkerIfTypeIsReifiedParameter(lhs.type, ReifiedTypeInliner.OperationKind.JAVA_CLASS) + } + iv.aconst(AsmUtil.boxType(codegen.asmType(lhs.type))) + } + } + } +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaPrimitiveTypeProperty.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaPrimitiveTypeProperty.kt new file mode 100644 index 00000000000..7806db91048 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaPrimitiveTypeProperty.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.codegen.intrinsics + +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.codegen.AsmUtil +import org.jetbrains.kotlin.codegen.ExpressionCodegen +import org.jetbrains.kotlin.codegen.StackValue +import org.jetbrains.kotlin.psi.KtClassLiteralExpression +import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver +import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.types.expressions.DoubleColonLHS +import org.jetbrains.org.objectweb.asm.Type + +class KClassJavaPrimitiveTypeProperty : IntrinsicPropertyGetter() { + override fun generate(resolvedCall: ResolvedCall<*>?, codegen: ExpressionCodegen, returnType: Type, receiver: StackValue): StackValue? { + val receiverValue = resolvedCall!!.extensionReceiver as? ExpressionReceiver ?: return null + val classLiteralExpression = receiverValue.expression as? KtClassLiteralExpression ?: return null + val receiverExpression = classLiteralExpression.receiverExpression ?: return null + val lhs = codegen.bindingContext.get(DOUBLE_COLON_LHS, receiverExpression) ?: return null + if (TypeUtils.isTypeParameter(lhs.type)) { + // TODO: add new operation kind to ReifiedTypeInliner.OperationKind to generate a null value or a field access to TYPE + return null + } + if (lhs is DoubleColonLHS.Expression && !lhs.isObjectQualifier) { + val receiverType = codegen.bindingContext.getType(receiverExpression) ?: return null + if (!KotlinBuiltIns.isPrimitiveTypeOrNullablePrimitiveType(receiverType)) return null + } + val lhsType = codegen.asmType(lhs.type) + return StackValue.operation(returnType) { iv -> + when { + lhs is DoubleColonLHS.Expression && !lhs.isObjectQualifier -> { + codegen.gen(receiverExpression).put(lhsType, iv) + AsmUtil.pop(iv, lhsType) + iv.getstatic(AsmUtil.boxType(lhsType).internalName, "TYPE", "Ljava/lang/Class;") + } + AsmUtil.isPrimitive(lhsType) || + AsmUtil.unboxPrimitiveTypeOrNull(lhsType) != null || + AsmTypes.VOID_WRAPPER_TYPE == lhsType -> { + iv.getstatic(AsmUtil.boxType(lhsType).internalName, "TYPE", "Ljava/lang/Class;") + } + else -> iv.aconst(null) + } + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java index 57d9d32a909..b22967c171b 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java @@ -34,6 +34,7 @@ public class AsmTypes { public static final Type NUMBER_TYPE = getType(Number.class); public static final Type BOOLEAN_WRAPPER_TYPE = getType(Boolean.class); public static final Type CHARACTER_WRAPPER_TYPE = getType(Character.class); + public static final Type VOID_WRAPPER_TYPE = getType(Void.class); public static final Type UNIT_TYPE = Type.getObjectType("kotlin/Unit"); diff --git a/compiler/testData/codegen/box/intrinsics/javaObjectType.kt b/compiler/testData/codegen/box/intrinsics/javaObjectType.kt new file mode 100644 index 00000000000..5a5b3c9da19 --- /dev/null +++ b/compiler/testData/codegen/box/intrinsics/javaObjectType.kt @@ -0,0 +1,96 @@ +// IGNORE_BACKEND: JS + +// WITH_RUNTIME + +class A { +} + +fun m() { +} + +fun getJavaObjectType1():Class<*> { + return Int::class.javaObjectType +} + +fun getJavaObjectType2():Class<*> { + return Integer::class.javaObjectType +} + +fun getJavaObjectType3():Class<*> { + return Void::class.javaObjectType +} + +fun getJavaObjectType4():Class<*> { + return Boolean::class.javaObjectType +} + +fun getJavaObjectType5():Class<*>? { + return A::class.javaObjectType +} + +inline fun getJavaObjectType6():Class<*> { + return T::class.javaObjectType +} + +fun getJavaObjectType7():Class<*> { + return A()::class.javaObjectType +} + +fun getJavaObjectType8():Class<*> { + val i: Int? = 1 + return i!!::class.javaObjectType +} + +fun getJavaObjectType9():Class<*> { + val i: Int = 1 + return i::class.javaObjectType +} + +fun getJavaObjectType10():Class<*> { + return m()::class.javaObjectType +} + +fun box(): String { + if (getJavaObjectType1() !== Int::class.javaObjectType) { + return "Failure 1" + } + if (getJavaObjectType2() !== Int::class.javaObjectType) { + return "Failure 2" + } + if (getJavaObjectType3() !== Void::class.javaObjectType) { + return "Failure 3" + } + if (getJavaObjectType4() !== java.lang.Boolean::class.javaObjectType) { + return "Failure 4" + } + if (getJavaObjectType5() !== A::class.javaObjectType) { + return "Failure 5" + } + if (getJavaObjectType6() !== A::class.javaObjectType) { + return "Failure 6 (A)" + } + if (getJavaObjectType6() !== Int::class.javaObjectType) { + return "Failure 6 (Int)" + } + if (getJavaObjectType6() !== Int::class.javaObjectType) { + return "Failure 6 (Integer)" + } + if (getJavaObjectType7() !== A::class.javaObjectType) { + return "Failure 7" + } + if (getJavaObjectType8() !== Int::class.javaObjectType) { + return "Failure 8" + } + if (getJavaObjectType9() !== Int::class.javaObjectType) { + return "Failure 9" + } + if (getJavaObjectType10() !== Unit::class.javaObjectType) { + return "Failure 10" + } + var x = 42 + if ({ x *= 2; x }()::class.javaObjectType != Int::class.javaObjectType || x != 84) { + return "Failure 11" + } + + return "OK" +} diff --git a/compiler/testData/codegen/box/intrinsics/javaPrimitiveType.kt b/compiler/testData/codegen/box/intrinsics/javaPrimitiveType.kt new file mode 100644 index 00000000000..a8a297af823 --- /dev/null +++ b/compiler/testData/codegen/box/intrinsics/javaPrimitiveType.kt @@ -0,0 +1,93 @@ +// IGNORE_BACKEND: JS + +// WITH_RUNTIME + +class A { +} + +fun m() { +} + +fun getJavaPrimitiveType1():Class<*>? { + return Int::class.javaPrimitiveType +} + +fun getJavaPrimitiveType2():Class<*>? { + return Integer::class.javaPrimitiveType +} + +fun getJavaPrimitiveType3():Class<*>? { + return Void::class.javaPrimitiveType +} + +fun getJavaPrimitiveType4():Class<*>? { + return Boolean::class.javaPrimitiveType +} + +fun getJavaPrimitiveType5():Class<*>? { + return A::class.javaPrimitiveType +} + +inline fun getJavaPrimitiveType6():Class<*>? { + return T::class.javaPrimitiveType +} + +fun getJavaPrimitiveType7():Class<*>? { + return A()::class.javaPrimitiveType +} + +fun getJavaPrimitiveType8():Class<*>? { + val i:Int? = 1 + return i!!::class.javaPrimitiveType +} + +fun getJavaPrimitiveType9():Class<*>? { + val i:Int = 1 + return i::class.javaPrimitiveType +} + +fun getJavaPrimitiveType10():Class<*>? { + return m()::class.javaPrimitiveType +} + +fun box(): String { + if (getJavaPrimitiveType1() !== Int::class.javaPrimitiveType) { + return "Failure 1" + } + if (getJavaPrimitiveType2() !== Int::class.javaPrimitiveType) { + return "Failure 2" + } + if (getJavaPrimitiveType3() !== Void::class.javaPrimitiveType) { + return "Failure 3" + } + if (getJavaPrimitiveType4() !== Boolean::class.javaPrimitiveType) { + return "Failure 4" + } + if (getJavaPrimitiveType5() !== null) { + return "Failure 5" + } + if (getJavaPrimitiveType6() !== null) { + return "Failure 6 (A)" + } + if (getJavaPrimitiveType6() !== Int::class.javaPrimitiveType) { + return "Failure 6 (Int)" + } + if (getJavaPrimitiveType7() !== null) { + return "Failure 7" + } + if (getJavaPrimitiveType8() !== Int::class.javaPrimitiveType) { + return "Failure 8" + } + if (getJavaPrimitiveType9() !== Int::class.javaPrimitiveType) { + return "Failure 9" + } + if (getJavaPrimitiveType10() !== null) { + return "Failure 10" + } + var x = 42 + if ({ x *= 2; x }()::class.javaPrimitiveType !== Int::class.javaPrimitiveType || x != 84) { + return "Failure 11" + } + + return "OK" +} diff --git a/compiler/testData/codegen/bytecodeText/intrinsics/javaObjectType.kt b/compiler/testData/codegen/bytecodeText/intrinsics/javaObjectType.kt new file mode 100644 index 00000000000..2f4e548c4ff --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/intrinsics/javaObjectType.kt @@ -0,0 +1,69 @@ +// WITH_RUNTIME + +class A { +} + +fun m() { +} + +fun getJavaObjectType1():Class<*> { + // LDC Ljava/lang/Integer;.class + return Int::class.javaObjectType +} + +fun getJavaObjectType2():Class<*> { + // LDC Ljava/lang/Integer;.class + return Integer::class.javaObjectType +} + +fun getJavaObjectType3():Class<*> { + // LDC Ljava/lang/Void;.class + return Void::class.javaObjectType +} + +fun getJavaObjectType4():Class<*> { + // LDC Ljava/lang/Boolean;.class + return Boolean::class.javaObjectType +} + +fun getJavaObjectType5():Class<*>? { + // LDC LA;.class + return A::class.javaObjectType +} + +inline fun getJavaObjectType6(): Class<*> { + // INVOKESTATIC kotlin/jvm/internal/Intrinsics.reifiedOperationMarker + // LDC Ljava/lang/Object;.class + return T::class.javaObjectType +} + +fun getJavaObjectType7():Class<*> { + // INVOKEVIRTUAL java/lang/Object.getClass + return A()::class.javaObjectType +} + +fun getJavaObjectType8():Class<*> { + val i: Int? = 1 + // LDC Ljava/lang/Integer;.class + return i!!::class.javaObjectType +} + +fun getJavaObjectType9():Class<*> { + val i: Int = 1 + // LDC Ljava/lang/Integer;.class + return i::class.javaObjectType +} + +fun getJavaObjectType10():Class<*> { + // GETSTATIC kotlin/Unit.INSTANCE + // INVOKEVIRTUAL java/lang/Object.getClass + return m()::class.javaObjectType +} + +// 4 LDC Ljava/lang/Integer;.class +// 1 LDC Ljava/lang/Object;.class +// 1 LDC Ljava/lang/Void;.class +// 1 LDC Ljava/lang/Boolean;.class +// 1 INVOKESTATIC kotlin/jvm/internal/Intrinsics.reifiedOperationMarker +// 0 INVOKESTATIC kotlin/jvm/internal/Reflection.getOrCreateKotlinClass +// 0 INVOKESTATIC kotlin/jvm/JvmClassMappingKt.getJavaObjectType diff --git a/compiler/testData/codegen/bytecodeText/intrinsics/javaPrimitiveType.kt b/compiler/testData/codegen/bytecodeText/intrinsics/javaPrimitiveType.kt new file mode 100644 index 00000000000..f6d6d7538c5 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/intrinsics/javaPrimitiveType.kt @@ -0,0 +1,77 @@ +// WITH_RUNTIME + +class A { +} + +fun m() { +} + + +fun getJavaPrimitiveType1():Class<*>? { + // GETSTATIC java/lang/Integer.TYPE + return Int::class.javaPrimitiveType +} + +fun getJavaPrimitiveType2():Class<*>? { + // GETSTATIC java/lang/Integer.TYPE + return Integer::class.javaPrimitiveType +} + +fun getJavaPrimitiveType3():Class<*>? { + // GETSTATIC java/lang/Void.TYPE + return Void::class.javaPrimitiveType +} + +fun getJavaPrimitiveType4():Class<*>? { + // GETSTATIC java/lang/Boolean.TYPE + return Boolean::class.javaPrimitiveType +} + +fun getJavaPrimitiveType5():Class<*>? { + // ACONST_NULL + return A::class.javaPrimitiveType +} + +inline fun getJavaPrimitiveType6():Class<*>? { + // INVOKESTATIC kotlin/jvm/internal/Intrinsics.reifiedOperationMarker + // LDC Ljava/lang/Object;.class + // INVOKESTATIC kotlin/jvm/internal/Reflection.getOrCreateKotlinClass + // INVOKESTATIC kotlin/jvm/JvmClassMappingKt.getJavaPrimitiveType + return T::class.javaPrimitiveType +} + +fun getJavaPrimitiveType7():Class<*>? { + // INVOKEVIRTUAL java/lang/Object.getClass + // INVOKESTATIC kotlin/jvm/internal/Reflection.getOrCreateKotlinClass + // INVOKESTATIC kotlin/jvm/JvmClassMappingKt.getJavaPrimitiveType + return A()::class.javaPrimitiveType +} + +fun getJavaPrimitiveType8():Class<*>? { + val i:Int? = 1 + // GETSTATIC java/lang/Integer.TYPE + return i!!::class.javaPrimitiveType +} + +fun getJavaPrimitiveType9():Class<*>? { + val i:Int = 1 + // GETSTATIC java/lang/Integer.TYPE + return i::class.javaPrimitiveType +} + +fun getJavaPrimitiveType10():Class<*>? { + // INVOKEVIRTUAL java/lang/Object.getClass + // INVOKESTATIC kotlin/jvm/internal/Reflection.getOrCreateKotlinClass + // INVOKESTATIC kotlin/jvm/JvmClassMappingKt.getJavaPrimitiveType + return m()::class.javaPrimitiveType +} + +// 1 ACONST_NULL +// 4 GETSTATIC java/lang/Integer.TYPE +// 1 GETSTATIC java/lang/Void.TYPE +// 1 GETSTATIC java/lang/Boolean.TYPE +// 1 LDC Ljava/lang/Object;.class +// 1 INVOKESTATIC kotlin/jvm/internal/Intrinsics.reifiedOperationMarker +// 2 INVOKEVIRTUAL java/lang/Object.getClass +// 3 INVOKESTATIC kotlin/jvm/internal/Reflection.getOrCreateKotlinClass +// 3 INVOKESTATIC kotlin/jvm/JvmClassMappingKt.getJavaPrimitiveType diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 9688f504ff5..7eede3c52c3 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11150,6 +11150,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("javaObjectType.kt") + public void testJavaObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaObjectType.kt"); + doTest(fileName); + } + + @TestMetadata("javaPrimitiveType.kt") + public void testJavaPrimitiveType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaPrimitiveType.kt"); + doTest(fileName); + } + @TestMetadata("kt10131.kt") public void testKt10131() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt10131.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 94eaac6eab1..b8679901eb2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11150,6 +11150,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("javaObjectType.kt") + public void testJavaObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaObjectType.kt"); + doTest(fileName); + } + + @TestMetadata("javaPrimitiveType.kt") + public void testJavaPrimitiveType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaPrimitiveType.kt"); + doTest(fileName); + } + @TestMetadata("kt10131.kt") public void testKt10131() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt10131.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 2d3abe67339..01027ccbcd3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -2188,6 +2188,27 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { } } + @TestMetadata("compiler/testData/codegen/bytecodeText/intrinsics") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Intrinsics extends AbstractBytecodeTextTest { + public void testAllFilesPresentInIntrinsics() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeText/intrinsics"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("javaObjectType.kt") + public void testJavaObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/intrinsics/javaObjectType.kt"); + doTest(fileName); + } + + @TestMetadata("javaPrimitiveType.kt") + public void testJavaPrimitiveType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/intrinsics/javaPrimitiveType.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/bytecodeText/intrinsicsCompare") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f8938d81ee0..2031e0b3986 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11150,6 +11150,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("javaObjectType.kt") + public void testJavaObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaObjectType.kt"); + doTest(fileName); + } + + @TestMetadata("javaPrimitiveType.kt") + public void testJavaPrimitiveType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaPrimitiveType.kt"); + doTest(fileName); + } + @TestMetadata("kt10131.kt") public void testKt10131() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt10131.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 40afccadeab..2e4edbda31e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -13101,6 +13101,30 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("javaObjectType.kt") + public void testJavaObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaObjectType.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive or add it to whitelist for that."); + } + + @TestMetadata("javaPrimitiveType.kt") + public void testJavaPrimitiveType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/javaPrimitiveType.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive or add it to whitelist for that."); + } + @TestMetadata("kt10131.kt") public void testKt10131() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt10131.kt");