[Test] Properly merge box against java testdata into codegen/box

Previous commit about it was 3199ce03 and it was completely wrong
This commit is contained in:
Dmitriy Novozhilov
2021-02-04 10:43:33 +03:00
parent 21c493a854
commit 29b96aa15d
173 changed files with 120524 additions and 115185 deletions
@@ -0,0 +1,26 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// KOTLIN_CONFIGURATION_FLAGS: +JVM.USE_PSI_CLASS_FILES_READING
// MODULE: lib
// FILE: J.java
public @interface J {
double minusInf() default Double.NEGATIVE_INFINITY;
double plusInf() default Double.POSITIVE_INFINITY;
double nan() default Double.NaN;
double divisionByZero() default 1.0 / 0.0;
float minusInfFloat() default Float.NEGATIVE_INFINITY;
float plusInfFloat() default Float.POSITIVE_INFINITY;
float nanFloat() default Float.NaN;
float divisionByZeroFloat() default 1.0f / 0.0f;
}
// MODULE: main(lib)
// FILE: K.kt
fun box(): String {
// Only check that the compiler loads the class for J
J::class
return "OK"
}
@@ -0,0 +1,43 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// IGNORE_BACKEND_FIR: JVM_IR
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
String[] value() default {"d1", "d2"};
}
// MODULE: main(lib)
// FILE: 1.kt
@JavaAnn class MyClass1
@JavaAnn() class MyClass2
@JavaAnn("asd") class MyClass3
@JavaAnn(*arrayOf()) class MyClass4
fun box(): String {
val value1 = MyClass1::class.java.getAnnotation(JavaAnn::class.java).value
if (value1.size != 2) return "fail1: ${value1.size}"
if (value1[0] != "d1") return "fail2: ${value1[0]}"
if (value1[1] != "d2") return "fail3: ${value1[1]}"
val value2 = MyClass2::class.java.getAnnotation(JavaAnn::class.java).value
if (value2.size != 2) return "fail4: ${value2.size}"
if (value2[0] != "d1") return "fail5: ${value2[0]}"
if (value2[1] != "d2") return "fail6: ${value2[1]}"
val value3 = MyClass3::class.java.getAnnotation(JavaAnn::class.java).value
if (value3.size != 1) return "fail7: ${value3.size}"
if (value3[0] != "asd") return "fail8: ${value3[0]}"
val value4 = MyClass4::class.java.getAnnotation(JavaAnn::class.java).value
if (value4.size != 0) return "fail 9: ${value4.size}"
return "OK"
}
@@ -0,0 +1,39 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
String[] value();
}
// MODULE: main(lib)
// FILE: 1.kt
@JavaAnn class MyClass1
@JavaAnn() class MyClass2
@JavaAnn("asd") class MyClass3
@JavaAnn(*arrayOf()) class MyClass4
fun box(): String {
val value1 = MyClass1::class.java.getAnnotation(JavaAnn::class.java).value
if (value1.size != 0) return "fail1: ${value1.size}"
val value2 = MyClass2::class.java.getAnnotation(JavaAnn::class.java).value
if (value2.size != 0) return "fail2: ${value2.size}"
val value3 = MyClass3::class.java.getAnnotation(JavaAnn::class.java).value
if (value3.size != 1) return "fail3: ${value3.size}"
if (value3[0] != "asd") return "fail4: ${value3[0]}"
val value4 = MyClass4::class.java.getAnnotation(JavaAnn::class.java).value
if (value4.size != 0) return "fail 5: ${value4.size}"
return "OK"
}
@@ -0,0 +1,25 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
String value();
}
// MODULE: main(lib)
// FILE: 1.kt
@JavaAnn("value") class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(JavaAnn::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.value != "value") return "fail: annotation parameter i should be 'value', but was ${ann.value}"
return "OK"
}
@@ -0,0 +1,53 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
String value() default "default";
}
// FILE: JavaAnn2.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn2 {
int a() default 1;
byte b() default 1;
short c() default 1;
double d() default 1;
float e() default 1;
long j() default 1;
String f() default "default";
}
// MODULE: main(lib)
// FILE: 1.kt
@JavaAnn class MyClass
@JavaAnn2 class MyClass2
fun box(): String {
val ann = MyClass::class.java.getAnnotation(JavaAnn::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.value != "default") return "fail: annotation parameter i should be 'default', but was ${ann.value}"
val ann2 = MyClass2::class.java.getAnnotation(JavaAnn2::class.java)
if (ann2 == null) return "fail: cannot find Ann on MyClass}"
if (ann2.a != 1) return "fail for a: expected = 1, but was ${ann2.a}"
if (ann2.b != 1.toByte()) return "fail for b: expected = 1, but was ${ann2.b}"
if (ann2.c != 1.toShort()) return "fail for c: expected = 1, but was ${ann2.c}"
if (ann2.d != 1.0) return "fail for d: expected = 1, but was ${ann2.d}"
if (ann2.e != 1F) return "fail for e: expected = 1, but was ${ann2.e}"
if (ann2.j != 1L) return "fail for j: expected = 1, but was ${ann2.j}"
if (ann2.f != "default") return "fail for f: expected = default, but was ${ann2.f}"
return "OK"
}
@@ -0,0 +1,41 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: Foo.java
class Foo {
public static final int i = -2;
public static final short s = -2;
public static final float f = -2f;
public static final double d = -2.0;
public static final long l = -2L;
public static final byte b = -2;
}
// MODULE: main(lib)
// FILE: 1.kt
@Ann(Foo.i, Foo.s, Foo.f, Foo.d, Foo.l, Foo.b) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass}"
if (ann.i != -2) return "fail: annotation parameter i should be -2, but was ${ann.i}"
if (ann.s != (-2).toShort()) return "fail: annotation parameter i should be -2, but was ${ann.i}"
if (ann.f != -2.toFloat()) return "fail: annotation parameter i should be -2, but was ${ann.i}"
if (ann.d != -2.toDouble()) return "fail: annotation parameter i should be -2, but was ${ann.i}"
if (ann.l != -2.toLong()) return "fail: annotation parameter i should be -2, but was ${ann.i}"
if (ann.b != (-2).toByte()) return "fail: annotation parameter i should be -2, but was ${ann.i}"
return "OK"
}
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(
val i: Int,
val s: Short,
val f: Float,
val d: Double,
val l: Long,
val b: Byte
)
@@ -0,0 +1,56 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: Foo.java
class Foo {
public static final int i = 2;
public static final short s = 2;
public static final float f = 2f;
public static final double d = 2.0;
public static final long l = 2L;
public static final byte b = 2;
public static final boolean bool = true;
public static final char c = 'c';
public static final String str = "str";
public static final int charAsInt = '3';
public static final char intAsChar = 3;
}
// MODULE: main(lib)
// FILE: 1.kt
@Ann(Foo.i, Foo.s, Foo.f, Foo.d, Foo.l, Foo.b, Foo.bool, Foo.c, Foo.str, Foo.charAsInt, Foo.intAsChar) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass"
if (ann.i != 2) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.s != 2.toShort()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.f != 2.toFloat()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.d != 2.toDouble()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.l != 2.toLong()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.b != 2.toByte()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (!ann.bool) return "fail: annotation parameter i should be true, but was ${ann.i}"
if (ann.c != 'c') return "fail: annotation parameter i should be c, but was ${ann.i}"
if (ann.str != "str") return "fail: annotation parameter i should be str, but was ${ann.i}"
if (ann.i2 != '3'.toInt()) return "fail: annotation parameter i2 should be ${'3'.toInt()}, but was ${ann.i}"
if (ann.c2 != 3.toChar()) return "fail: annotation parameter c2 should be 3, but was ${ann.i}"
return "OK"
}
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(
val i: Int,
val s: Short,
val f: Float,
val d: Double,
val l: Long,
val b: Byte,
val bool: Boolean,
val c: Char,
val str: String,
val i2: Int,
val c2: Char
)
@@ -0,0 +1,44 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: Foo.java
class Foo {
public static final int i = 2;
public static final short s = 2;
public static final float f = 2;
public static final double d = 2;
public static final long l = 2;
public static final byte b = 2;
public static final char c = 99;
}
// MODULE: main(lib)
// FILE: 1.kt
@Ann(Foo.i, Foo.s, Foo.f, Foo.d, Foo.l, Foo.b, Foo.c) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(Ann::class.java)
if (ann == null) return "fail: cannot find Ann on MyClass"
if (ann.i != 2) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.s != 2.toShort()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.f != 2.toFloat()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.d != 2.toDouble()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.l != 2.toLong()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.b != 2.toByte()) return "fail: annotation parameter i should be 2, but was ${ann.i}"
if (ann.c != 'c') return "fail: annotation parameter i should be c, but was ${ann.i}"
return "OK"
}
@Retention(AnnotationRetention.RUNTIME)
annotation class Ann(
val i: Int,
val s: Short,
val f: Float,
val d: Double,
val l: Long,
val b: Byte,
val c: Char
)
@@ -0,0 +1,28 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
Class<?>[] args();
}
// MODULE: main(lib)
// FILE: 1.kt
class O
class K
@JavaAnn(args = arrayOf(O::class, K::class)) class MyClass
fun box(): String {
val args = MyClass::class.java.getAnnotation(JavaAnn::class.java).args
val argName1 = args[0].java.simpleName ?: "fail 1"
val argName2 = args[1].java.simpleName ?: "fail 2"
return argName1 + argName2
}
@@ -0,0 +1,31 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
Class<?>[] args();
}
// FILE: MyJavaClass.java
class O {}
class K {}
@JavaAnn(args = {O.class, K.class})
class MyJavaClass {}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val args = MyJavaClass::class.java.getAnnotation(JavaAnn::class.java).args
val argName1 = args[0].java.simpleName ?: "fail 1"
val argName2 = args[1].java.simpleName ?: "fail 2"
return argName1 + argName2
}
@@ -0,0 +1,26 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
Class<?> value();
}
// MODULE: main(lib)
// FILE: 1.kt
class OK
@JavaAnn(OK::class) class MyClass
fun box(): String {
val ann = MyClass::class.java.getAnnotation(JavaAnn::class.java)
if (ann == null) return "fail: cannot find JavaAnn on MyClass"
return ann.value.java.simpleName!!
}
@@ -0,0 +1,29 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
Class<?> value();
}
// FILE: MyJavaClass.java
class OK {}
@JavaAnn(OK.class)
class MyJavaClass {}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val ann = MyJavaClass::class.java.getAnnotation(JavaAnn::class.java)
if (ann == null) return "fail: cannot find JavaAnn on MyClass"
return ann.value.java.simpleName!!
}
@@ -0,0 +1,28 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
Class<?>[] value();
}
// MODULE: main(lib)
// FILE: 1.kt
class O
class K
@JavaAnn(O::class, K::class) class MyClass
fun box(): String {
val args = MyClass::class.java.getAnnotation(JavaAnn::class.java).value
val argName1 = args[0].java.simpleName ?: "fail 1"
val argName2 = args[1].java.simpleName ?: "fail 2"
return argName1 + argName2
}
@@ -0,0 +1,34 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaAnn.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface JavaAnn {
Class<?>[] value();
}
class O {}
class K {}
// FILE: MyJavaClass.java
@JavaAnn({O.class, K.class})
class MyJavaClass {}
// MODULE: main(lib)
// FILE: 1.kt
class O
class K
fun box(): String {
val args = MyJavaClass::class.java.getAnnotation(JavaAnn::class.java).value
val argName1 = args[0].java.simpleName ?: "fail 1"
val argName2 = args[1].java.simpleName ?: "fail 2"
return argName1 + argName2
}
@@ -0,0 +1,20 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.CLASS)
@interface Foo {
}
// MODULE: main(lib)
// FILE: 1.kt
@Foo class Bar
fun box(): String {
Bar()
return "OK"
}
@@ -0,0 +1,78 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// KOTLIN_CONFIGURATION_FLAGS: +JVM.EMIT_JVM_TYPE_ANNOTATIONS
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
// JVM_TARGET: 1.8
// WITH_REFLECT
// FULL_JDK
// MODULE: lib
// FILE: ImplicitReturn.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class ImplicitReturn {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @ interface TypeAnn {}
@ImplicitReturn.TypeAnn
public String bar() {
return "OK";
}
}
// MODULE: main(lib)
// FILE: Kotlin.kt
import java.lang.reflect.AnnotatedType
import kotlin.reflect.jvm.javaMethod
import kotlin.reflect.jvm.javaField
import kotlin.test.fail
class Kotlin {
fun foo() = ImplicitReturn().bar()
@JvmField
val field = ImplicitReturn().bar()
}
fun box(): String {
checkTypeAnnotation(
Kotlin::foo.javaMethod!!.annotatedReturnType,
"class java.lang.String",
"@ImplicitReturn\$TypeAnn()",
"foo"
)
checkTypeAnnotation(
Kotlin::field.javaField!!.annotatedType,
"class java.lang.String",
"@ImplicitReturn\$TypeAnn()",
"foo"
)
return Kotlin().foo()
}
fun checkTypeAnnotation(
annotatedType: AnnotatedType,
type: String,
annotations: String,
message: String
) {
if (annotatedType.annotation() != annotations) fail("check $message (1): ${annotatedType.annotation()} != $annotations")
if (annotatedType.type.toString() != type) fail("check $message (2): ${annotatedType.type} != $type")
}
fun AnnotatedType.annotation() = annotations.joinToString()
@@ -0,0 +1,15 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: A.java
class A {
public A(double x, int y) { }
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
(::A)(0.0, 0)
return "OK"
}
@@ -0,0 +1,23 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: MFunction.java
public interface MFunction<T, R> {
R invoke(T t);
}
// MODULE: main(lib)
// FILE: 1.kt
object Foo {
class Requester(val dealToBeOffered: String)
}
class Bar {
val foo = MFunction(Foo::Requester)
}
fun box(): String {
return Bar().foo("OK").dealToBeOffered
}
@@ -0,0 +1,12 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: A.java
public class A {
public final String field = "OK";
}
// MODULE: main(lib)
// FILE: 1.kt
fun box() = (A::field).get(A())
@@ -0,0 +1,20 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: A.java
public class A {
public int field = 239;
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val a = A()
val f = A::field
if (f.get(a) != 239) return "Fail 1: ${f.get(a)}"
f.set(a, 42)
if (f.get(a) != 42) return "Fail 2: ${f.get(a)}"
if (f.get(a) != 42) return "Fail 2: ${f.get(a)}"
return "OK"
}
@@ -0,0 +1,18 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: A.java
class A {
public static void main(String[] args) {
args[0] = "OK";
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val args = arrayOf("Fail")
(A::main)(args)
return args[0]
}
@@ -0,0 +1,22 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/Foo.java
package test;
public class Foo<T extends Number> {
public Foo(T number) {}
}
// MODULE: main(lib)
// FILE: 1.kt
import test.Foo
class Subclass : Foo<Int>(42) {
}
fun box(): String {
Subclass()
return "OK"
}
@@ -0,0 +1,51 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/Foo.java
package test;
public class Foo {
private final String x;
private final String y;
public Foo(String x, String y) {
this.x = x;
this.y = y;
}
public Foo(String x) {
this(x, "def_y");
}
public Foo() {
this("def_x");
}
@Override
public String toString() {
return x + "#" + y;
}
}
// MODULE: main(lib)
// FILE: 1.kt
import test.Foo;
class Child : Foo {
constructor(): super() {}
constructor(x: String): super(x) {}
constructor(x: String, y: String): super(x, y) {}
}
fun box(): String {
val c1 = Child().toString()
if (c1 != "def_x#def_y") return "fail1: $c1"
val c2 = Child("abc").toString()
if (c2 != "abc#def_y") return "fail2: $c2"
val c3 = Child("abc", "def").toString()
if (c3 != "abc#def") return "fail3: $c3"
return "OK"
}
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
import java.util.Set;
public class Foo {
public interface A extends Set<String> {}
public interface B extends Set<String> {}
}
// MODULE: main(lib)
// FILE: 1.kt
import Foo.*
import java.util.HashSet
class Impl(b: B): A, B by b
fun box() = "OK"
+22
View File
@@ -0,0 +1,22 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: C.java
public enum C {
OK(0);
private final int ordinal;
C(int ordinal) { this.ordinal = ordinal; }
public int getOrdinal() { return ordinal; }
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val ok = C.OK
return when (ok) {
C.OK -> "OK"
else -> "fail"
}
}
+18
View File
@@ -0,0 +1,18 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/En.java
package test;
public enum En {
A;
}
// MODULE: main(lib)
// FILE: 1.kt
import test.*
fun box() =
if (En.A.toString() == "A") "OK"
else "fail"
@@ -0,0 +1,31 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/En.java
package test;
import java.lang.Override;
import java.lang.String;
public enum En {
A {
@Override
public String repr() {
return "A";
}
},
B;
public String repr() {
return "ololol" + toString();
}
}
// MODULE: main(lib)
// FILE: 1.kt
import test.En.*
fun box() =
if (A.repr() == "A" && B.repr() == "olololB") "OK"
else "fail"
@@ -0,0 +1,18 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/En.java
package test;
public enum En {
A;
}
// MODULE: main(lib)
// FILE: 1.kt
import test.En.A
fun box() =
if (A.toString() == "A") "OK"
else "fail"
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/Foo.java
package test;
public class Foo {
public enum MyEnum {
A;
}
}
// MODULE: main(lib)
// FILE: 1.kt
import test.*
import test.Foo.MyEnum.A
fun box() =
if (Foo.MyEnum.A.toString() == "A" && A.toString() == "A") "OK"
else "fail"
+32
View File
@@ -0,0 +1,32 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/E.java
package test;
import java.util.Set;
import java.util.EnumSet;
public enum E {
INSTANCE;
public static int foo = 42;
public static final Set<E> INSTANCES = EnumSet.of(INSTANCE);
}
// MODULE: main(lib)
// FILE: 1.kt
import test.E
fun box(): String {
val instances = E.INSTANCES
if (E.foo != 42)
return "Wrong foo ${E.foo}"
if (instances.size != 1)
return "Wrong size ${instances.size}"
if (E.INSTANCES.iterator().next() != E.INSTANCE)
return "Wrong instance ${E.INSTANCES.iterator().next()}"
return "OK"
}
+18
View File
@@ -0,0 +1,18 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/En.java
package test;
public enum En {
ENTRY;
public static String foo() {
return "OK";
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box() = test.En.foo()
+21
View File
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: A.java
class A {
public A() {}
public A(String x) {}
public A(long l, double z) {}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
A()
A("")
A(0.toLong(), 0.0)
return "OK"
}
+18
View File
@@ -0,0 +1,18 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
import java.util.*;
public class Foo {
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
return Collections.max(coll);
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
return Foo.max(java.util.Arrays.asList("AK", "OK", "EK"))!!
}
@@ -0,0 +1,15 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: R.java
class R {
public static class id {
public static final int main = 17;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box() =
if (R.id.main == 17) "OK" else "fail"
@@ -0,0 +1,17 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: R.java
class R {
public static class id {
public static class zzz {
public static final int main = 17;
}
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box() =
if (R.id.zzz.main == 17) "OK" else "fail"
@@ -0,0 +1,18 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
import java.util.Collection;
public class Foo {
public static <T extends CharSequence & java.io.Serializable> T id(T p) {
return p;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
return Foo.id("OK" as java.lang.String)!! as kotlin.String
}
@@ -0,0 +1,30 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Object minus0()
{
return -0.0;
}
public Object plus0()
{
return 0.0;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if ((jClass.minus0() as Double) < (jClass.plus0() as Double)) return "fail 1"
if ((jClass.minus0() as Double) != (jClass.plus0() as Double)) return "fail 2"
return "OK"
}
@@ -0,0 +1,29 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Double minus0()
{
return -0.0;
}
public Double plus0()
{
return 0.0;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if ((jClass.minus0() as Comparable<Double>) >= jClass.plus0()) return "fail 1"
if ((jClass.minus0() as Comparable<Double>) == jClass.plus0()) return "fail 2"
if (jClass.minus0() == (jClass.plus0() as Comparable<Double>)) return "fail 3"
return "OK"
}
+52
View File
@@ -0,0 +1,52 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Double minus0(){
return -0.0;
}
public Double plus0(){
return 0.0;
}
public Double null0(){
return null;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if (jClass.minus0() < jClass.plus0()) return "fail 1"
//TODO: KT-14989
//if (jClass.null0() < jClass.plus0()) return "fail 2"
if (jClass.plus0() > jClass.minus0()) return "fail 3"
//TODO: KT-14989
//if (jClass.null0() < jClass.plus0()) return "fail 4"
if (jClass.minus0() != jClass.plus0()) return "fail 5"
var value = jClass.minus0() == jClass.plus0()
if (!value) return "fail 6"
if (jClass.null0() == jClass.plus0()) return "fail 7"
if (jClass.plus0() == jClass.null0()) return "fail 8"
value = jClass.null0() == jClass.null0()
if (!value) return "fail 9"
return "OK"
}
@@ -0,0 +1,41 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Double minus0(){
return -0.0;
}
public Double plus0(){
return 0.0;
}
public Double null0(){
return null;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if (jClass.minus0().compareTo(jClass.plus0()) != -1) return "fail 1"
//TODO: KT-14989
//if (jClass.null0().compareTo(jClass.plus0())) return "fail 2"
try {
if (jClass.minus0().compareTo(jClass.null0()) != -2) return "fail 3"
return "fail: exception expected";
} catch (e: NullPointerException) {
}
return "OK"
}
@@ -0,0 +1,29 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Double minus0(){
return -0.0;
}
public Double plus0(){
return 0.0;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if (jClass.minus0().equals(jClass.plus0())) return "fail 1"
if (jClass.plus0().equals(jClass.minus0())) return "fail 2"
return "OK"
}
+55
View File
@@ -0,0 +1,55 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Float minus0()
{
return -0.0F;
}
public Float plus0()
{
return 0.0F;
}
public Float null0()
{
return null;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if (jClass.minus0() < jClass.plus0()) return "fail 1"
//TODO: KT-14989
//if (jClass.null0() < jClass.plus0()) return "fail 2"
if (jClass.plus0() > jClass.minus0()) return "fail 3"
//TODO: KT-14989
//if (jClass.null0() < jClass.plus0()) return "fail 4"
if (jClass.minus0() != jClass.plus0()) return "fail 5"
var value = jClass.minus0() == jClass.plus0()
if (!value) return "fail 6"
if (jClass.null0() == jClass.plus0()) return "fail 7"
if (jClass.plus0() == jClass.null0()) return "fail 8"
value = jClass.null0() == jClass.null0()
if (!value) return "fail 9"
return "OK"
}
@@ -0,0 +1,39 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass<T> {
private T minus0;
private T plus0;
JavaClass(T minus0, T plus0)
{
this.minus0 = minus0;
this.plus0 = plus0;
}
public T minus0()
{
return minus0;
}
public T plus0()
{
return plus0;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass<Double>(-0.0, 0.0)
if (jClass.minus0() < jClass.plus0()) return "fail 2"
if (jClass.minus0() != jClass.plus0()) return "fail 5"
return "OK"
}
@@ -0,0 +1,29 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Object minus0()
{
return -0.0;
}
public Object plus0()
{
return 0.0;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if ((jClass.minus0() as Double) < (jClass.plus0() as Double)) return "fail 2"
if ((jClass.minus0() as Double) != (jClass.plus0() as Double)) return "fail 5"
return "OK"
}
+41
View File
@@ -0,0 +1,41 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// FULL_JDK
// WITH_RUNTIME
// TARGET_BACKEND: JVM
// MODULE: lib
// FILE: J.java
public class J {
public interface Consumer {
void accept(String p);
}
public static void invokeWithNull(Consumer x) {
x.accept(null);
}
}
// MODULE: main(lib)
// FILE: Kotlin.kt
inline fun makeRunnable(crossinline lambda: () -> Unit) =
object : Runnable {
override fun run() {
lambda()
}
}
fun box(): String {
try {
makeRunnable {
J.invokeWithNull(object : J.Consumer {
override fun accept(t: String) {
println(t)
}
})
}.run()
} catch (e: NullPointerException) {
return "OK"
}
return "fail: exception expected"
}
+15
View File
@@ -0,0 +1,15 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
public class Foo {
public class Inner { }
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
Foo().Inner()
return "OK"
}
+21
View File
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
public class Foo {
public class Inner {
}
public class Inner$ {
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
Foo().Inner()
Foo().`Inner$`()
return "OK"
}
+20
View File
@@ -0,0 +1,20 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
public class Foo {
public class Inner1$class {
}
public class Inner2$class {
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
Foo().`Inner1$class`()
Foo().`Inner2$class`()
return "OK"
}
@@ -0,0 +1,25 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// JVM_TARGET: 1.8
// MODULE: lib
// FILE: A.java
public interface A {
default String getMessage() {
return "OK";
}
}
// MODULE: main(lib)
// FILE: 1.kt
interface I : A
class B : A
open class C(a : A) : I, A by a
fun box(): String {
val a = B()
return C(a).message
}
@@ -0,0 +1,27 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: A.java
interface A {
void foo();
}
// MODULE: main(lib)
// FILE: 1.kt
internal interface B : A {
fun bar() = 1
}
internal interface C : B
internal class D : C {
override fun foo() {}
}
fun box(): String {
val d = D()
d.foo()
d.bar()
return "OK"
}
@@ -0,0 +1,96 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// !LANGUAGE: +MultiPlatformProjects
// WITH_REFLECT
// MODULE: lib
// FILE: Jnno.java
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Jnno {
byte b() default 1;
char c() default 'x';
double d() default 3.14;
float f() default -2.72f;
int i() default 42424242;
int i2() default 21212121 + 32323232;
long j() default 239239239239239L;
long j2() default 239239;
short s() default 42;
boolean z() default true;
byte[] ba() default {-1};
char[] ca() default {'y'};
double[] da() default {-3.14159};
float[] fa() default {2.7218f};
int[] ia() default {424242};
long[] ja() default {239239239239L, 239239};
short[] sa() default {-43};
boolean[] za() default {false, true};
String str() default "fi" + "zz";
Class<?> k() default Number.class;
// E e() default E.E1;
// TODO: A a() default @A("1");
String[] stra() default {"bu", "zz"};
Class<?>[] ka() default {double.class, String.class, long[].class, Integer[][][].class, void.class};
// E[] ea() default {E.E2, E.E3};
// TODO: A[] aa() default {@A("2"), @A("3")};
}
// MODULE: main(lib)
// FILE: main.kt
// See compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt
// This test checks the same behavior but against the Java implementation compiled to the .class file (as opposed to a .java source file).
// Enum annotation argument is commented below, because to be able to resolve E in Jnno.java we have to have a multi-module test where
// one of the modules also contains Java files, and that is too complicated for our test infrastructure at the moment.
import kotlin.reflect.KClass
expect annotation class Anno(
val b: Byte = 1.toByte(),
val c: Char = 'x',
val d: Double = 3.14,
val f: Float = -2.72f,
val i: Int = 42424242,
val i2: Int = 53535353,
val j: Long = 239239239239239L,
val j2: Long = 239239L,
val s: Short = 42.toShort(),
val z: Boolean = true,
val ba: ByteArray = [(-1).toByte()],
val ca: CharArray = ['y'],
val da: DoubleArray = [-3.14159],
val fa: FloatArray = [2.7218f],
val ia: IntArray = [424242],
val ja: LongArray = [239239239239L, 239239L],
val sa: ShortArray = [(-43).toShort()],
val za: BooleanArray = [false, true],
val str: String = "fizz",
val k: KClass<*> = Number::class,
// val e: E = E.E1,
// TODO: val a: A = A("1"),
val stra: Array<String> = ["bu", "zz"],
val ka: Array<KClass<*>> = [Double::class, String::class, LongArray::class, Array<Array<Array<Int>>>::class, Unit::class]
// val ea: Array<E> = [E.E2, E.E3],
// TODO: val aa: Array<A> = [A("2"), A("3")]
)
// enum class E { E1, E2, E3 }
annotation class A(val value: String)
@Anno
fun test() {}
actual typealias Anno = Jnno
fun box(): String {
// We don't need to check the contents, just check that there are no anomalities in the bytecode by loading annotations
::test.annotations.toString()
return "OK"
}
@@ -0,0 +1,129 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// IGNORE_BACKEND_FIR: JVM_IR
// KOTLIN_CONFIGURATION_FLAGS: +JVM.DISABLE_PARAM_ASSERTIONS
// MODULE: lib
// FILE: A.java
import org.jetbrains.annotations.NotNull;
public class A {
@NotNull
public final String NULL = null;
@NotNull
public static final String STATIC_NULL = null;
public String foo() {
return null;
}
public static String staticFoo() {
return null;
}
public A plus(A a) {
return null;
}
public A inc() {
return null;
}
public Object get(Object o) {
return null;
}
public A a() { return this; }
public static class B {
public static B b() { return null; }
}
public static class C {
public static C c() { return null; }
}
}
// MODULE: main(lib)
// FILE: callAssertions.kt
class AssertionChecker(val nullPointerExceptionExpected: Boolean) {
operator fun invoke(name: String, f: () -> Any) {
try {
f()
} catch (e: NullPointerException) {
if (!nullPointerExceptionExpected) throw AssertionError("Unexpected NullPointerException on calling $name")
return
}
if (nullPointerExceptionExpected) throw AssertionError("NullPointerException expected on calling $name")
}
}
interface Tr {
fun foo(): String
}
class Derived : A(), Tr {
override fun foo() = super<A>.foo()
}
class Delegated : Tr by Derived() {
}
fun checkAssertions(illegalStateExpected: Boolean) {
val check = AssertionChecker(illegalStateExpected)
// simple call
check("foo") { A().foo() }
// simple static call
check("staticFoo") { A.staticFoo() }
// supercall
check("foo") { Derived().foo() }
// delegated call
check("foo") { Delegated().foo() }
// collection element
check("get") { A()[""] }
// binary expression
check("plus") { A() + A() }
// field
check("NULL") { A().NULL }
// static field
check("STATIC_NULL") { A.STATIC_NULL }
// postfix expression
// TODO:
// check("inc") { var a = A().a(); a++ }
// prefix expression
check("inc-b") { var a = A.B.b(); a++ }
// prefix expression
check("inc-c") { var a = A.C.c(); a++ }
// prefix expression
check("inc") { var a = A().a(); ++a }
// prefix expression
check("inc-b") { var a = A.B.b(); ++a }
// prefix expression
// TODO:
// check("inc-c") { var a = A.C.c(); ++a }
}
operator fun A.C.inc(): A.C = A.C()
operator fun <T> T.inc(): T = null as T
fun box(): String {
checkAssertions(true)
return "OK"
}
@@ -0,0 +1,36 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// IGNORE_BACKEND_FIR: JVM_IR
// MODULE: lib
// FILE: Delegation.java
public class Delegation {
public static class ReturnNull {
public String foo() {
return null;
}
}
}
// MODULE: main(lib)
// FILE: delegation.kt
interface Tr {
fun foo(): String
}
class DelegateTo : Delegation.ReturnNull(), Tr {
override fun foo() = super<Delegation.ReturnNull>.foo()
}
class DelegateFrom : Tr by DelegateTo()
fun box(): String {
try {
DelegateFrom().foo()
return "Fail: should have been an exception"
}
catch(e: NullPointerException) {
return "OK"
}
}
@@ -0,0 +1,39 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// KOTLIN_CONFIGURATION_FLAGS: +JVM.DISABLE_CALL_ASSERTIONS
// MODULE: lib
// FILE: C.java
package test;
import org.jetbrains.annotations.NotNull;
public abstract class C<Type> {
public abstract void doTest(@NotNull Type s);
public static void runTest(C a) {
try {
a.doTest(null);
} catch (NullPointerException e) {
return;
}
throw new AssertionError("Fail: NullPointerException expected");
}
}
// MODULE: main(lib)
// FILE: B.kt
import test.C
class TestString : C<String>() {
override fun doTest(s: String) { }
}
class TestUnit : C<Unit>() {
override fun doTest(s: Unit) { }
}
fun box(): String {
C.runTest(TestString())
C.runTest(TestUnit())
return "OK"
}
@@ -0,0 +1,128 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// KOTLIN_CONFIGURATION_FLAGS: +JVM.DISABLE_PARAM_ASSERTIONS, +JVM.DISABLE_CALL_ASSERTIONS
// MODULE: lib
// FILE: A.java
import org.jetbrains.annotations.NotNull;
public class A {
@NotNull
public final String NULL = null;
@NotNull
public static final String STATIC_NULL = null;
public String foo() {
return null;
}
public static String staticFoo() {
return null;
}
public A plus(A a) {
return null;
}
public A inc() {
return null;
}
public Object get(Object o) {
return null;
}
public A a() { return this; }
public static class B {
public static B b() { return null; }
}
public static class C {
public static C c() { return null; }
}
}
// MODULE: main(lib)
// FILE: noCallAssertions.kt
class AssertionChecker(val nullPointerExceptionExpected: Boolean) {
operator fun invoke(name: String, f: () -> Any) {
try {
f()
} catch (e: NullPointerException) {
if (!nullPointerExceptionExpected) throw AssertionError("Unexpected NullPointerException on calling $name")
return
}
if (nullPointerExceptionExpected) throw AssertionError("NullPointerException expected on calling $name")
}
}
interface Tr {
fun foo(): String
}
class Derived : A(), Tr {
override fun foo() = super<A>.foo()
}
class Delegated : Tr by Derived() {
}
fun checkAssertions(nullPointerExceptionExpected: Boolean) {
val check = AssertionChecker(nullPointerExceptionExpected)
// simple call
check("foo") { A().foo() }
// simple static call
check("staticFoo") { A.staticFoo() }
// supercall
check("foo") { Derived().foo() }
// delegated call
check("foo") { Delegated().foo() }
// collection element
check("get") { A()[""] }
// binary expression
check("plus") { A() + A() }
// field
check("NULL") { A().NULL }
// static field
check("STATIC_NULL") { A.STATIC_NULL }
// postfix expression
// TODO:
// check("inc") { var a = A().a(); a++ }
// prefix expression
check("inc-b") { var a = A.B.b(); a++ }
// prefix expression
check("inc-c") { var a = A.C.c(); a++ }
// prefix expression
check("inc") { var a = A().a(); ++a }
// prefix expression
check("inc-b") { var a = A.B.b(); ++a }
// prefix expression
// TODO:
// check("inc-c") { var a = A.C.c(); ++a }
}
operator fun A.C.inc(): A.C = A.C()
operator fun <T> T.inc(): T = null as T
fun box(): String {
checkAssertions(false)
return "OK"
}
@@ -0,0 +1,35 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// IGNORE_BACKEND_FIR: JVM_IR
// MODULE: lib
// FILE: RightElvisOperand.java
class RightElvisOperand {
static String foo() {
return null;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun baz(): String? = null
fun bar(): String = baz() ?: RightElvisOperand.foo()
fun foo(x: String) {}
fun box(): String {
try {
foo(baz() ?: RightElvisOperand.foo())
return "Fail: should have been an exception in `foo(baz() ?: RightElvisOperand.foo())`"
}
catch(e: NullPointerException) {}
try {
bar()
return "Fail: should have been an exception in `bar()`"
}
catch(e: NullPointerException) {
return "OK"
}
}
@@ -0,0 +1,34 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// !LANGUAGE: -ThrowNpeOnExplicitEqualsForBoxedNull
// IGNORE_BACKEND: JVM_IR
// ^ ThrowNpeOnExplicitEqualsForBoxedNull is introduced in 1.2.
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Double minus0(){
return -0.0;
}
public Double plus0(){
return 0.0;
}
public Double null0(){
return null;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun box(): String {
val jClass = JavaClass()
if (jClass.null0().equals(jClass.plus0())) return "fail 6"
if (jClass.minus0().equals(jClass.null0())) return "fail 7"
return "OK"
}
@@ -0,0 +1,36 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Foo.java
public class Foo {
public static class Key<T> {}
public static <T> T getNull(Key<T> key) {
return null;
}
public static <T> T get(Key<T> key, T t) {
return t;
}
}
// MODULE: main(lib)
// FILE: 1.kt
import Foo.*
val key = Key<Unit>()
fun box(): String {
val n1 = getNull(key)
if (n1 != null) return "Fail 1: $n1"
val n2 = get(key, null)
if (n2 != null) return "Fail 2: $n2"
val n3 = get(key, Unit)
if (n3 == null) return "Fail 3.0: $n3"
if (n3 != Unit) return "Fail 3.1: $n3"
return "OK"
}
+29
View File
@@ -0,0 +1,29 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
//WITH_RUNTIME
// MODULE: lib
// FILE: JavaClass.java
public class JavaClass {
public Double test() {
return null;
}
}
// MODULE: main(lib)
// FILE: b.kt
fun test(s: Double) {
}
fun box(): String {
try {
test(JavaClass().test())
}
catch (e: NullPointerException) {
return "OK"
}
return "fail"
}
@@ -0,0 +1,123 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// IGNORE_BACKEND_FIR: JVM_IR
// MODULE: lib
// FILE: AbstractSpecializedMap.java
public abstract class AbstractSpecializedMap implements java.util.Map<Integer, Double> {
public abstract double put(int x, double y);
public abstract double remove(int k);
public abstract double get(int k);
public abstract boolean containsKey(int k);
public boolean containsKey(Object x) {
return false;
}
public abstract boolean containsValue(double v);
public boolean containsValue(Object x) {
return false;
}
}
// FILE: SpecializedMap.java
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
public class SpecializedMap extends AbstractSpecializedMap {
public double put(int x, double y) {
return 123.0;
}
@Override
public Double get(Object key) {
return null;
}
@Override
public Double put(Integer key, Double value) {
return null;
}
public double remove(int k) {
return 456.0;
}
public Double remove(Object ok) {
return null;
}
public double get(int k) {
return 789.0;
}
public boolean containsKey(int k) {
return true;
}
public boolean containsValue(double v) {
return true;
}
@Override
public void putAll(Map<? extends Integer, ? extends Double> m) {
}
@Override
public void clear() {
}
@NotNull
@Override
public Set<Integer> keySet() {
return null;
}
@NotNull
@Override
public Collection<Double> values() {
return null;
}
@NotNull
@Override
public Set<Entry<Integer, Double>> entrySet() {
return null;
}
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
}
// MODULE: main(lib)
// FILE: main.kt
fun box(): String {
val x = SpecializedMap()
if (!x.containsKey(1)) return "fail 1"
if (x.containsKey(null)) return "fail 2"
if (!x.containsValue(2.0)) return "fail 3"
if (x.containsValue(null)) return "fail 4"
if (x.put(1, 5.0) != 123.0) return "fail 5"
if (x.put(1, null) != null) return "fail 6"
if (x.remove(1) != 456.0) return "fail 7"
if (x.remove(null) != null) return "fail 8"
if (x.get(1) != 789.0) return "fail 9"
if (x.get(null) != null) return "fail 10"
return "OK"
}
@@ -0,0 +1,25 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// IGNORE_BACKEND_FIR: JVM_IR
// MODULE: lib
// FILE: A.java
import java.util.HashMap;
public class A extends HashMap<Integer, Double> {
public double put(int x, double y) {
return 1.0;
}
@Override
public Double put(Integer key, Double value) {
return super.put(key, value);
}
}
// MODULE: main(lib)
// FILE: main.kt
fun box(): String {
val o = A()
o.put(1, 2.0)
return "OK"
}
@@ -0,0 +1,22 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: D.java
public class D {
public final String result = "OK";
}
// MODULE: main(lib)
// FILE: 1.kt
// KT-4878
interface T {
fun Int.foo(d: D) = d.result!!
}
class A : T {
fun bar() = 42.foo(D())
}
fun box() = A().bar()
@@ -0,0 +1,24 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: D.java
public class D {
public String fieldO;
public static String fieldK;
}
// MODULE: main(lib)
// FILE: 1.kt
// KT-3492
class MyWrongClass : D() {
}
fun box() : String {
val clazz = MyWrongClass()
clazz.fieldO = "O"
D.fieldK = "K"
return clazz.fieldO!! + D.fieldK!!
}
@@ -0,0 +1,24 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: test/D.java
package test;
public class D {
protected String field = "OK";
}
// MODULE: main(lib)
// FILE: 1.kt
import test.D
class A : D() {
fun a(): String {
return {field!!}()
}
}
fun box(): String {
return A().a()
}
@@ -0,0 +1,22 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaScriptParser.java
public class JavaScriptParser<T extends JSPsiTypeParser> {
public String foo() {return "OK";}
}
// FILE: JSPsiTypeParser.java
public class JSPsiTypeParser<T extends JavaScriptParser> {}
// FILE: ES6Parser.java
public class ES6Parser<T extends JSPsiTypeParser> extends JavaScriptParser<T> {}
// MODULE: main(lib)
// FILE: main.kt
fun createParser(): JavaScriptParser<*> {
return ES6Parser<JSPsiTypeParser<*>>()
}
fun box(): String = createParser().foo()
@@ -0,0 +1,25 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: Device.java
import java.util.Collection;
public class Device<D extends Device, S extends Service> {
public static Collection<Device<Device, Service>> getLoop() {
return null;
}
}
// FILE: Service.java
public class Service<D extends Device, S extends Service> {
}
// MODULE: main(lib)
// FILE: loop.kt
fun box(): String {
val x = Device.getLoop()?.firstOrNull() // compilation error
return "OK"
}
@@ -0,0 +1,17 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_REFLECT
// MODULE: lib
// FILE: J.java
public class J {
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val j = J::class
if (j.simpleName != "J") return "Fail: ${j.simpleName}"
return "OK"
}
@@ -0,0 +1,19 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: J.java
public class J {}
// MODULE: main(lib)
// FILE: 1.kt
import kotlin.test.assertEquals
fun box(): String {
val j = J::class.java
assertEquals(j, j.kotlin.java)
return "OK"
}
@@ -0,0 +1,28 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_REFLECT
// MODULE: lib
// FILE: J.java
public class J {
public final String result;
public J(String result) {
this.result = result;
}
}
// MODULE: main(lib)
// FILE: 1.kt
import kotlin.reflect.*
import kotlin.reflect.jvm.*
fun box(): String {
val reference = ::J
val javaConstructor = reference.javaConstructor ?: return "Fail: no Constructor for reference"
val j = javaConstructor.newInstance("OK")
val kotlinConstructor = javaConstructor.kotlinFunction
if (reference != kotlinConstructor) return "Fail: reference != kotlinConstructor"
return j.result
}
@@ -0,0 +1,61 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_REFLECT
// FULL_JDK
// MODULE: lib
// FILE: J.java
public class J {
public final int i;
public String s;
public J(int i, String s) {
this.i = i;
this.s = s;
}
}
// MODULE: main(lib)
// FILE: 1.kt
import java.lang.reflect.*
import kotlin.reflect.*
import kotlin.reflect.jvm.*
fun box(): String {
val i = J::i
val s = J::s
// Check that correct reflection objects are created
assert(i !is KMutableProperty<*>) { "Fail i class: ${i.javaClass}" }
assert(s is KMutableProperty<*>) { "Fail s class: ${s.javaClass}" }
// Check that no Method objects are created for such properties
assert(i.javaGetter == null) { "Fail i getter" }
assert(s.javaGetter == null) { "Fail s getter" }
assert(s.javaSetter == null) { "Fail s setter" }
// Check that correct Field objects are created
val ji = i.javaField!!
val js = s.javaField!!
assert(Modifier.isFinal(ji.getModifiers())) { "Fail i final" }
assert(!Modifier.isFinal(js.getModifiers())) { "Fail s final" }
// Check that those Field objects work as expected
val a = J(42, "abc")
assert(ji.get(a) == 42) { "Fail ji get" }
assert(js.get(a) == "abc") { "Fail js get" }
js.set(a, "def")
assert(js.get(a) == "def") { "Fail js set" }
assert(a.s == "def") { "Fail js access" }
// Check that valid Kotlin reflection objects are created by those Field objects
val ki = ji.kotlinProperty as KProperty1<J, Int>
val ks = js.kotlinProperty as KMutableProperty1<J, String>
assert(ki.get(a) == 42) { "Fail ki get" }
assert(ks.get(a) == "def") { "Fail ks get" }
ks.set(a, "ghi")
assert(ks.get(a) == "ghi") { "Fail ks set" }
return "OK"
}
@@ -0,0 +1,36 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_REFLECT
// MODULE: lib
// FILE: J.java
public class J {
public String f(String s) {
return s;
}
public static String g(String s) {
return s;
}
}
// MODULE: main(lib)
// FILE: 1.kt
import kotlin.reflect.*
import kotlin.reflect.jvm.*
fun box(): String {
val f = J::f
val fm = f.javaMethod ?: return "Fail: no Method for f"
if (fm.invoke(J(), "abc") != "abc") return "Fail fm"
val ff = fm.kotlinFunction ?: return "Fail: no KFunction for fm"
if (f != ff) return "Fail f != ff"
val g = J::g
val gm = g.javaMethod ?: return "Fail: no Method for g"
if (gm.invoke(null, "ghi") != "ghi") return "Fail gm"
val gg = gm.kotlinFunction ?: return "Fail: no KFunction for gm"
if (g != gg) return "Fail g != gg"
return "OK"
}
@@ -0,0 +1,36 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_REFLECT
// MODULE: lib
// FILE: test/J.java
package test;
public class J {
public final boolean b;
public char c;
public J() {
this.b = false;
this.c = '0';
}
}
// MODULE: main(lib)
// FILE: 1.kt
package test
import kotlin.test.*
fun box(): String {
assertEquals("val test.J.b: kotlin.Boolean", (J::b).toString())
assertEquals("var test.J.c: kotlin.Char", (J::c).toString())
assertTrue(J::b == J::b)
assertFalse(J::c == J::b)
assertTrue(J::b.hashCode() == J::b.hashCode())
assertFalse(J::b.hashCode() == J::c.hashCode())
return "OK"
}
@@ -0,0 +1,40 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
public interface Super1<T> {
Thread call(T t);
}
public interface Super2<T> {
T call(String s);
}
public interface Sub extends Super1<String>, Super2<Thread> {
Thread call(String s);
}
static void samAdapter(Sub sub) {
((Super1) sub).call("");
((Super2) sub).call("");
sub.call("");
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String? {
var s: String?
s = "FAIL for function literal"
JavaClass.samAdapter { s = "OK"; null }
if (s != "OK") return s
s = "FAIL for wrapper"
val function: (String?) -> Thread? = { s = "OK"; null }
JavaClass.samAdapter(function)
if (s != "OK") return s
return "OK"
}
@@ -0,0 +1,31 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
// KT-5912
class JavaClass<T> {
public static interface Action<T> {
void call(T t);
}
public static class Some<T> {
public Some(T t) {
}
}
public static interface OnSubscribe<T> extends Action<Some<T>> {}
void perform(T t, OnSubscribe<T> subscribe) {
subscribe.call(new Some(t));
}
}
// MODULE: main(lib)
// FILE: 1.kt
// KT-5912
fun box(): String {
var s = "Failt"
JavaClass<String>().perform("") { s = "OK" }
return s
}
@@ -0,0 +1,22 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaInterface.java
interface JavaInterface {
void run(Runnable r);
}
// MODULE: main(lib)
// FILE: 1.kt
class Impl: JavaInterface {
override fun run(r: Runnable?) {
r?.run()
}
}
fun box(): String {
var v = "FAIL"
Impl().run { v = "OK" }
return v
}
@@ -0,0 +1,23 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
import java.util.*;
class JavaClass {
public static void sortIntList(List<Integer> list, Comparator<Integer> comparator) {
Collections.sort(list, comparator);
}
}
// MODULE: main(lib)
// FILE: 1.kt
import java.util.*
fun box(): String {
val list = ArrayList(Arrays.asList(3, 2, 4, 8, 1, 5))
val expected = ArrayList(Arrays.asList(8, 5, 4, 3, 2, 1))
JavaClass.sortIntList(list, { a, b -> b - a })
return if (list == expected) "OK" else list.toString()
}
@@ -0,0 +1,24 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
private Runnable r;
public JavaClass(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var v = "FAIL"
JavaClass { v = "OK" }.run()
return v
}
@@ -0,0 +1,20 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: GenericInterface.java
interface GenericInterface<T> {
public T foo(double d, int i, long j, short s);
}
// MODULE: main(lib)
// FILE: 1.kt
internal fun getInterface(): GenericInterface<String> {
return GenericInterface { d, i, j, s ->
"OK"
}
}
fun box(): String {
return getInterface().foo(0.0, 0, 0, 0)
}
@@ -0,0 +1,26 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
import java.io.*;
class JavaClass {
public static String invokeFilter(FileFilter f, File file1, File file2) {
return f.accept(file1) + " " + f.accept(file2);
}
}
// MODULE: main(lib)
// FILE: 1.kt
import java.io.*
fun box(): String {
val ACCEPT_NAME = "test"
val WRONG_NAME = "wrong"
val result = JavaClass.invokeFilter({ file -> ACCEPT_NAME == file?.getName() }, File(ACCEPT_NAME), File(WRONG_NAME))
if (result != "true false") return "Wrong result: $result"
return "OK"
}
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
import java.util.Arrays;
import java.util.Comparator;
class JavaClass {
public static String foo(Comparator<String> comparator) {
return Arrays.toString(comparator.getClass().getGenericInterfaces());
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val supertypes = JavaClass.foo { a, b -> a.compareTo(b) }
if (supertypes != "[java.util.Comparator<java.lang.String>]") return "Fail: $supertypes"
return "OK"
}
@@ -0,0 +1,25 @@
// IGNORE_BACKEND_FIR: JVM_IR
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// WITH_RUNTIME
// MODULE: lib
// FILE: JavaInterface.java
interface JavaInterface {
void foo(Runnable r);
}
// MODULE: main(lib)
// FILE: 1.kt
class Impl: JavaInterface {
override fun foo(r: Runnable?) {
r?.run()
}
}
fun box(): String {
val fooMethods = Impl::class.java.getMethods().filter { it.getName() == "foo" }
if (fooMethods.size != 1) return fooMethods.toString()
return "OK"
}
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
public void run(Runnable r) {
r.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
internal class KotlinSubclass: JavaClass() {
}
fun box(): String {
var v = "FAIL"
KotlinSubclass().run { v = "OK" }
return v
}
@@ -0,0 +1,44 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// IGNORE_BACKEND_FIR: JVM_IR
// WITH_RUNTIME
// MODULE: lib
// FILE: Super.java
class Super {
public String lastCalled = null;
void foo(Runnable r) {
lastCalled = "super";
}
}
// FILE: Sub.java
import kotlin.jvm.functions.Function0;
import kotlin.Unit;
class Sub extends Super {
void foo(Function0<Unit> r) {
lastCalled = "sub";
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val sub = Sub()
val sup: Super = sub
sup.foo{ }
if (sub.lastCalled != "super") {
return "FAIL: ${sub.lastCalled} instead of super"
}
sub.foo{ }
if (sub.lastCalled != "sub") {
return "FAIL: ${sub.lastCalled} instead of sub"
}
return "OK"
}
@@ -0,0 +1,23 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: Sub.java
class Super {
void safeInvoke(Runnable r) {
if (r != null) r.run();
}
}
class Sub extends Super {
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var r = "FAIL"
val sub = Sub()
sub.safeInvoke(null)
sub.safeInvoke { r = "OK" }
return r
}
@@ -0,0 +1,26 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
private Runnable r;
public JavaClass(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
var status: String = "fail" // global property to avoid issues with accessing closure from local class (KT-4174)
fun box(): String {
class C() : JavaClass({status = "OK"}) {}
C().run()
return status
}
@@ -0,0 +1,25 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
private Runnable r;
public JavaClass(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var v = "FAIL"
val x = object : JavaClass({-> v = "OK"}) {}
x.run()
return v
}
@@ -0,0 +1,26 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
private Runnable r;
public JavaClass(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var v = "FAIL"
val f = {-> v = "OK"}
val x = object : JavaClass(f) {}
x.run()
return v
}
@@ -0,0 +1,20 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
public static void run(Runnable r1, Runnable r2) {
r1.run();
r2.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var v = "FAIL"
val f = { v = "O" }
JavaClass.run(f, { v += "K" })
return v
}
@@ -0,0 +1,25 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
import java.util.*;
class JavaClass {
public static void sortIntList(List<Integer> list, Comparator<Integer> comparator) {
Collections.sort(list, comparator);
}
}
// MODULE: main(lib)
// FILE: 1.kt
import java.util.*
fun box(): String {
val list = ArrayList(Arrays.asList(3, 2, 4, 8, 1, 5))
val expected = ArrayList(Arrays.asList(8, 5, 4, 3, 2, 1))
val f = { a: Int, b: Int -> b - a }
JavaClass.sortIntList(list, f)
return if (list == expected) "OK" else list.toString()
}
@@ -0,0 +1,25 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
private Runnable r;
public JavaClass(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var v = "FAIL"
val f = { v = "OK" }
JavaClass(f).run()
return v
}
@@ -0,0 +1,17 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
public static String run(Runnable r) {
return r == null ? "OK" : "FAIL";
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val f: (() -> Unit)? = null
return JavaClass.run(f)!!
}
@@ -0,0 +1,19 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
public static void run(Runnable r) {
r.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var v = "FAIL"
val f = { v = "OK" }
JavaClass.run(f)
return v
}
@@ -0,0 +1,54 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
void plusAssign(Runnable i) {
i.run();
}
void minusAssign(Runnable i) {
i.run();
}
void timesAssign(Runnable i) {
i.run();
}
void divAssign(Runnable i) {
i.run();
}
void remAssign(Runnable i) {
i.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val obj = JavaClass()
var v1 = "FAIL"
obj += { v1 = "OK" }
if (v1 != "OK") return "plus: $v1"
var v2 = "FAIL"
obj -= { v2 = "OK" }
if (v2 != "OK") return "minus: $v2"
var v3 = "FAIL"
obj *= { v3 = "OK" }
if (v3 != "OK") return "times: $v3"
var v4 = "FAIL"
obj /= { v4 = "OK" }
if (v4 != "OK") return "div: $v4"
var v5 = "FAIL"
obj %= { v5 = "OK" }
if (v5 != "OK") return "mod: $v5"
return "OK"
}
@@ -0,0 +1,61 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
import org.jetbrains.annotations.NotNull;
class JavaClass {
@NotNull JavaClass plus(Runnable i) {
i.run();
return this;
}
@NotNull JavaClass minus(Runnable i) {
i.run();
return this;
}
@NotNull JavaClass times(Runnable i) {
i.run();
return this;
}
@NotNull JavaClass div(Runnable i) {
i.run();
return this;
}
@NotNull JavaClass rem(Runnable i) {
i.run();
return this;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
var obj = JavaClass()
var v1 = "FAIL"
obj += { v1 = "OK" }
if (v1 != "OK") return "plus: $v1"
var v2 = "FAIL"
obj -= { v2 = "OK" }
if (v2 != "OK") return "minus: $v2"
var v3 = "FAIL"
obj *= { v3 = "OK" }
if (v3 != "OK") return "times: $v3"
var v4 = "FAIL"
obj /= { v4 = "OK" }
if (v4 != "OK") return "div: $v4"
var v5 = "FAIL"
obj %= { v5 = "OK" }
if (v5 != "OK") return "mod: $v5"
return "OK"
}
@@ -0,0 +1,68 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
JavaClass plus(Runnable i) {
i.run();
return this;
}
JavaClass minus(Runnable i) {
i.run();
return this;
}
JavaClass times(Runnable i) {
i.run();
return this;
}
JavaClass div(Runnable i) {
i.run();
return this;
}
JavaClass rem(Runnable i) {
i.run();
return this;
}
JavaClass rangeTo(Runnable i) {
i.run();
return this;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val obj = JavaClass()
var v1 = "FAIL"
obj + { v1 = "OK" }
if (v1 != "OK") return "plus: $v1"
var v2 = "FAIL"
obj - { v2 = "OK" }
if (v2 != "OK") return "minus: $v2"
var v3 = "FAIL"
obj * { v3 = "OK" }
if (v3 != "OK") return "times: $v3"
var v4 = "FAIL"
obj / { v4 = "OK" }
if (v4 != "OK") return "div: $v4"
var v5 = "FAIL"
obj % { v5 = "OK" }
if (v5 != "OK") return "mod: $v5"
var v6 = "FAIL"
obj .. { v6 = "OK" }
if (v6 != "OK") return "rangeTo: $v6"
return "OK"
}
@@ -0,0 +1,35 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
int compareTo(Runnable i) {
i.run();
return 239;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val obj = JavaClass()
var v1 = "FAIL"
obj < { v1 = "OK" }
if (v1 != "OK") return "<: $v1"
var v2 = "FAIL"
obj > { v2 = "OK" }
if (v2 != "OK") return ">: $v2"
var v3 = "FAIL"
obj <= { v3 = "OK" }
if (v3 != "OK") return "<=: $v3"
var v4 = "FAIL"
obj >= { v4 = "OK" }
if (v4 != "OK") return ">=: $v4"
return "OK"
}
@@ -0,0 +1,22 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
boolean contains(Runnable i) {
i.run();
return true;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val obj = JavaClass()
var v = "FAIL"
{ v = "O" } in obj
{ v += "K" } !in obj
return v
}
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
int get(Runnable i) {
i.run();
return 239;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val obj = JavaClass()
var v = "FAIL"
obj[{ v = "OK" }]
return v
}
@@ -0,0 +1,21 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// MODULE: lib
// FILE: JavaClass.java
class JavaClass {
void invoke(Runnable i) {
i.run();
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val obj = JavaClass()
var v = "FAIL"
obj({ v = "O" })
obj { v += "K" }
return v
}
@@ -0,0 +1,49 @@
// DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE
// !LANGUAGE: -ProhibitOperatorMod
// IGNORE_BACKEND_FIR: JVM_IR
// MODULE: lib
// FILE: Java.java
import org.jetbrains.annotations.NotNull;
class AugmentedAssignmentPure {
void modAssign(Runnable i) {
i.run();
}
}
class AugmentedAssignmentViaSimpleBinary {
@NotNull AugmentedAssignmentViaSimpleBinary rem(Runnable i) {
i.run();
return this;
}
}
class Binary {
Binary rem(Runnable i) {
i.run();
return this;
}
}
// MODULE: main(lib)
// FILE: 1.kt
fun box(): String {
val augAssignmentPure = AugmentedAssignmentPure()
var v1 = "FAIL"
augAssignmentPure %= { v1 = "OK" }
if (v1 != "OK") return "assignment pure: $v1"
var augmentedAssignmentViaSimpleBinary = AugmentedAssignmentViaSimpleBinary()
var v2 = "FAIL"
augmentedAssignmentViaSimpleBinary %= { v2 = "OK" }
if (v2 != "OK") return "assignment via simple binary: $v2"
val binary = Binary()
var v3 = "FAIL"
binary % { v3 = "OK" }
if (v3 != "OK") return "binary: $v3"
return "OK"
}

Some files were not shown because too many files have changed in this diff Show More