Move JVM8 box test to common

This commit is contained in:
Mikhael Bogdanov
2018-10-16 11:06:27 +02:00
parent b61608aba7
commit ac8e1a0124
110 changed files with 0 additions and 0 deletions
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// JVM_TARGET: 1.8
// FILE: A.java
import java.util.List;
public class A<@Anno(1) T> {}
// FILE: Anno.kt
import kotlin.test.assertEquals
@Target(AnnotationTarget.TYPE_PARAMETER)
annotation class Anno(val value: Int = 0)
fun box(): String {
val typeParameter = A::class.java.typeParameters.single()
assertEquals("[@Anno(value=1)]", typeParameter.annotations.toList().toString())
return "OK"
}
@@ -1,30 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// JVM_TARGET: 1.8
// FILE: A.java
import java.util.List;
public class A {
public static @Anno(1) String test(List<@Anno(2) String> list) {
return list.get(0);
}
}
// FILE: Anno.kt
import java.lang.reflect.AnnotatedParameterizedType
import kotlin.test.assertEquals
@Target(AnnotationTarget.TYPE)
annotation class Anno(val value: Int = 0)
fun box(): String {
val method = A::class.java.declaredMethods.single()
assertEquals("[@Anno(value=1)]", method.annotatedReturnType.annotations.toList().toString())
val parameterType = method.parameters.single().annotatedType as AnnotatedParameterizedType
assertEquals("[@Anno(value=2)]", parameterType.annotatedActualTypeArguments.single().annotations.toList().toString())
return "OK"
}
-75
View File
@@ -1,75 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// COMMON_COROUTINES_TEST
// FULL_JDK
// WITH_COROUTINES
import java.util.concurrent.CompletableFuture
import COROUTINES_PACKAGE.*
import COROUTINES_PACKAGE.intrinsics.*
fun foo(): CompletableFuture<String> = CompletableFuture.supplyAsync { "foo" }
fun bar(v: String): CompletableFuture<String> = CompletableFuture.supplyAsync { "bar with $v" }
fun exception(v: String): CompletableFuture<String> = CompletableFuture.supplyAsync { throw RuntimeException(v) }
fun foobar(x: String, y: String) = x + y
fun box(): String {
var result = ""
fun log(x: String) {
if (result.isNotEmpty()) result += "\n"
result += x
}
val future = async<String> {
log("start")
val x = await(foo())
log("got '$x'")
val y = foobar("123 ", await(bar(x)))
log("got '$y' after '$x'")
y
}
future.whenComplete { value, t ->
log("completed with '$value'")
}.join()
val expectedResult =
"""
|start
|got 'foo'
|got '123 bar with foo' after 'foo'
|completed with '123 bar with foo'""".trimMargin().trim('\n', ' ')
if (expectedResult != result) return result
return "OK"
}
// LIBRARY CODE
fun <T> async(c: suspend () -> T): CompletableFuture<T> {
val future = CompletableFuture<T>()
c.startCoroutine(object : helpers.ContinuationAdapter<T>() {
override val context = EmptyCoroutineContext
override fun resume(data: T) {
future.complete(data)
}
override fun resumeWithException(exception: Throwable) {
future.completeExceptionally(exception)
}
})
return future
}
suspend fun <V> await(f: CompletableFuture<V>) = suspendCoroutineUninterceptedOrReturn<V> { machine ->
f.whenComplete { value, throwable ->
if (throwable == null)
machine.resume(value)
else
machine.resumeWithException(throwable)
}
COROUTINE_SUSPENDED
}
-72
View File
@@ -1,72 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// COMMON_COROUTINES_TEST
// FULL_JDK
// WITH_COROUTINES
import java.util.concurrent.CompletableFuture
import COROUTINES_PACKAGE.*
import COROUTINES_PACKAGE.intrinsics.*
fun exception(v: String): CompletableFuture<String> = CompletableFuture.supplyAsync { throw RuntimeException(v) }
fun foobar(x: String, y: String) = x + y
fun box(): String {
var result = ""
val future = async<String>() {
try {
await(exception("OK"))
} catch (e: Exception) {
result = e.cause?.message!!
}
"56"
}
future.join()
if (future.get() != "56") return "fail: ${future.get()}"
if (result != "OK") return "fail notOk"
val future2 = async<String>() {
await(exception("OK"))
"fail"
}
try {
future2.get()
} catch (e: Exception) {
if (e.cause!!.message != "OK") return "fail message: ${e.cause!!.message}"
return "OK"
}
return "No exception"
}
fun <T> async(c: suspend () -> T): CompletableFuture<T> {
val future = CompletableFuture<T>()
c.startCoroutine(object : helpers.ContinuationAdapter<T>() {
override val context = EmptyCoroutineContext
override fun resume(data: T) {
future.complete(data)
}
override fun resumeWithException(exception: Throwable) {
future.completeExceptionally(exception)
}
})
return future
}
suspend fun <V> await(f: CompletableFuture<V>) = suspendCoroutineUninterceptedOrReturn<V> { machine ->
f.whenComplete { value, throwable ->
if (throwable == null)
machine.resume(value)
else
machine.resumeWithException(throwable)
}
COROUTINE_SUSPENDED
}
@@ -1,52 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
interface ImmutableCollection<out E> : Collection<E> {
fun add(element: @UnsafeVariance E): ImmutableCollection<E>
fun addAll(elements: Collection<@UnsafeVariance E>): ImmutableCollection<E>
fun remove(element: @UnsafeVariance E): ImmutableCollection<E>
}
class ImmutableCollectionmpl<E> : ImmutableCollection<E> {
override val size: Int
get() = throw UnsupportedOperationException()
override fun contains(element: E): Boolean {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun containsAll(elements: Collection<E>): Boolean {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun isEmpty(): Boolean {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun iterator(): Iterator<E> {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun add(element: E): ImmutableCollection<E> = this
override fun addAll(elements: Collection<E>): ImmutableCollection<E> = this
override fun remove(element: E): ImmutableCollection<E> = this
}
fun box(): String {
val c = ImmutableCollectionmpl<String>()
if (c.remove("") !== c) return "fail 1"
if (c.add("") !== c) return "fail 2"
if (c.addAll(java.util.ArrayList()) !== c) return "fail 3"
val method = c.javaClass.methods.single { it.name == "remove" && it.returnType == Boolean::class.javaPrimitiveType }
try {
method.invoke(c, "")
return "fail 4"
} catch (e: java.lang.reflect.InvocationTargetException) {
if (e.cause!!.message != "Operation is not supported for read-only collection") return "fail 5: ${e.cause!!.message}"
}
return "OK"
}
@@ -1,30 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: IBase.java
interface IBase {
default String bar() {
return "OK";
}
}
// FILE: Kotlin.kt
// JVM_TARGET: 1.8
open class Base {
fun foo() = "OK"
}
class C : Base(), IBase {
val lambda1 = {
super.foo()
}
val lambda2 = {
super.bar()
}
}
fun box(): String {
if (C().lambda1() != "OK") return "fail 1"
return C().lambda2()
}
@@ -1,29 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple {
default String test(String s) {
return s + "K";
}
static String testStatic(String s) {
return s + "K";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
interface KInterface : Simple {
fun bar(): String {
return test("O") + Simple.testStatic("O")
}
}
class Test : KInterface {}
fun box(): String {
val test = Test().bar()
if (test != "OKOK") return "fail $test"
return "OK"
}
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Simple.java
interface Simple {
default String test(String s) {
return s + "K";
}
static String testStatic(String s) {
return s + "K";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
class Test : Simple {}
fun box(): String {
val test = Test().test("O")
if (test != "OK") return "fail $test"
return Simple.testStatic("O")
}
@@ -1,24 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple {
default String test(String s) {
return s + "K";
}
static String testStatic(String s) {
return s + "K";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
interface TestInterface : Simple {}
class Test : TestInterface {}
fun box(): String {
val test = Test().test("O")
if (test != "OK") return "fail $test"
return Simple.testStatic("O")
}
@@ -1,24 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple {
default String test(String s) {
return s + "Fail";
}
}
// FILE: main.kt
interface KInterface: Simple {
override fun test(s: String): String {
return s + "K"
}
}
class Test : KInterface {
}
fun box(): String {
return Test().test("O")
}
@@ -1,28 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base {
String getValue();
default String test() {
return getValue();
}
}
// FILE: main.kt
public interface BaseKotlin : Base {
}
class Fail : BaseKotlin {
override fun getValue() = "Fail"
}
fun box(): String {
val z = object : BaseKotlin by Fail() {
override fun getValue() = "OK"
}
return z.test()
}
@@ -1,32 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base {
String getValue();
default String test() {
return getValue();
}
}
// FILE: main.kt
public interface BaseKotlin : Base {
override fun getValue() = "OK"
override fun test(): String {
return getValue();
}
}
class OK : BaseKotlin {
override fun getValue() = "OK"
}
fun box(): String {
val ok = object : BaseKotlin by OK() {
override fun getValue() = "Fail"
}
return ok.test()
}
@@ -1,24 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
class MapWithBadDefaults : HashMap<String, String>() {
override fun getOrDefault(key: String, defaultValue: String): String {
throw RuntimeException("Shouldn't be executed")
}
override fun remove(key: String, value: String): Boolean {
throw RuntimeException("Shouldn't be executed")
}
}
class Test(map: MutableMap<String, String>) : MutableMap<String, String> by map
fun box(): String {
val test = Test(MapWithBadDefaults())
test.put("O", "K")
if (!test.containsKey("O")) return "fail 1: can't find value for key 'O'"
if (!test.remove("O", "K")) return "fail 2: entry wasn't removed"
return test.getOrDefault("absent", "OK")
}
@@ -1,36 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base {
String getValue();
default String test() {
return getValue();
}
}
// FILE: Base2.java
public interface Base2 extends Base {
default String test() {
return "O" + getValue();
}
}
// FILE: main.kt
interface KBase : Base
interface Derived : KBase, Base2
class Fail : Derived {
override fun getValue() = "Fail"
}
fun box(): String {
val z = object : Derived by Fail() {
override fun getValue() = "K"
}
return z.test()
}
@@ -1,36 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base {
String getValue();
default String test()
{
return getValue();
}
}
// FILE: Base2.java
public interface Base2 extends Base {
}
// FILE: main.kt
interface KBase : Base {
override fun test() = "O" + getValue()
}
interface Derived : KBase, Base2
class K : Derived {
override fun getValue() = "K"
}
fun box(): String {
val z = object : Derived by K() {
override fun getValue() = "Fail"
}
return z.test()
}
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base {
String getValue();
default String test() {
return getValue();
}
}
// FILE: main.kt
class Fail : Base {
override fun getValue() = "Fail"
}
class Derived : Base by Fail() {
override fun getValue() = "OK"
}
fun box(): String {
return Derived().test()
}
@@ -1,33 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base extends KBase {
String getValue();
default String test() {
return getValue();
}
}
// FILE: main.kt
interface KBase {
fun getValue(): String
fun test(): String
}
class Fail : Base {
override fun getValue() = "Fail"
}
fun box(): String {
val z1 = object : KBase by Fail() {
override fun getValue() = "OK"
}
if (z1.test() != "Fail") return "fail 1"
val z2 = object : Base by Fail() {
override fun getValue() = "OK"
}
return z2.test()
}
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base {
String getValue();
default String test() {
return getValue();
}
}
// FILE: main.kt
class Fail : Base {
override fun getValue() = "Fail"
}
fun box(): String {
val z = object : Base by Fail() {
override fun getValue() = "OK"
}
return z.test()
}
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM
// LANGUAGE_VERSION: 1.0
// FILE: Base.java
public interface Base {
String getValue();
default String test() {
return getValue();
}
}
// FILE: main.kt
class OK : Base {
override fun getValue() = "OK"
}
fun box(): String {
val z = object : Base by OK() {
override fun getValue() = "Fail"
}
return z.test()
}
@@ -1,25 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Test.java
interface Test<T> {
T call();
default T testDefault(T p) {
return p;
}
}
// FILE: main.kt
class Child : Test<String> {
override fun call() : String {
return "OK"
}
}
fun box(): String {
val res = Child().call()
if (res != "OK") return "fail $res"
return Child().testDefault("OK")
}
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: F.java
import java.util.function.Function;
public class F {
public static <T, U> U passNull(Function<? super T, ? extends U> f) {
return f.apply(null);
}
}
// FILE: test.kt
// WITH_RUNTIME
// FULL_JDK
fun test(f: (Int?) -> String): String {
return F.passNull(f)
}
fun box(): String {
return test {
it?.toString() ?: "OK"
}
}
-32
View File
@@ -1,32 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Simple.java
interface Simple extends KInterface {
default String test() {
return "simple";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
interface KInterface {
fun test(): String {
return "base";
}
}
class Test : Simple {
fun bar(): String {
return super.test()
}
}
fun box(): String {
val test = Test().test()
if (test != "simple") return "fail $test"
val bar = Test().bar()
if (bar != "simple") return "fail 2 $bar"
return "OK"
}
@@ -1,43 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Test.java
public interface Test {
default String test() {
return "OK";
}
}
// FILE: test.kt
// JVM_TARGET: 1.8
interface KInterface : Test {
}
class KClass : Test {
fun ktest(): String {
return super.test() + test()
}
}
class KTClass : KInterface {
fun ktest(): String {
return super.test() + test()
}
}
fun box(): String {
val p = object : KInterface {
fun ktest(): String {
return super.test() + test()
}
}.ktest()
if (p != "OKOK") return "fail1: $p"
if (KClass().ktest() != "OKOK") return "fail 2: ${KClass().ktest()}"
if (KTClass().ktest() != "OKOK") return "fail 3: ${KTClass().ktest()}"
return "OK"
}
@@ -1,46 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Test.java
public interface Test {
default String test() {
return "OK";
}
}
// FILE: test.kt
interface KInterface : Test {
}
class KClass : Test {
@kotlin.Suppress("DEFAULT_METHOD_CALL_FROM_JAVA6_TARGET_ERROR")
fun ktest(): String {
return super.test() + test()
}
}
class KTClass : KInterface {
@kotlin.Suppress("DEFAULT_METHOD_CALL_FROM_JAVA6_TARGET_ERROR")
fun ktest(): String {
return super.test() + test()
}
}
fun box(): String {
val p = object : KInterface {
@kotlin.Suppress("DEFAULT_METHOD_CALL_FROM_JAVA6_TARGET_ERROR")
fun ktest(): String {
return super.test() + test()
}
}.ktest()
if (p != "OKOK") return "fail1: $p"
if (KClass().ktest() != "OKOK") return "fail 2: ${KClass().ktest()}"
if (KTClass().ktest() != "OKOK") return "fail 3: ${KTClass().ktest()}"
return "OK"
}
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Test<T> {
fun test(p: T): T {
return p
}
}
class TestClass : Test<String> {
override fun test(p: String): String {
return p + "K"
}
}
fun <T> execute(t: Test<T>, p: T): T {
return t.test(p)
}
fun box(): String {
return execute(TestClass(), "O")
}
@@ -1,25 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Test<T> {
fun test(p: T): T {
return p
}
}
interface Test2: Test<String> {
override fun test(p: String): String {
return p + "K"
}
}
class TestClass : Test2 {
}
fun <T> execute(t: Test<T>, p: T): T {
return t.test(p)
}
fun box(): String {
return execute(TestClass(), "O")
}
@@ -1,30 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// FILE: IBase.java
interface IBase {
default String bar() {
return "OK";
}
}
// FILE: Kotlin.kt
open class Base {
fun foo() = "OK"
}
class C : Base(), IBase {
val lambda1 = {
super.foo()
}
val lambda2 = {
super.bar()
}
}
fun box(): String {
if (C().lambda1() != "OK") return "fail 1"
return C().lambda2()
}
-14
View File
@@ -1,14 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Z {
fun test(s: String = "OK"): String {
return s
}
}
class Test: Z
fun box(): String {
return Test().test()
}
@@ -1,38 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
var storage = "fail"
interface Test {
@JvmDefault
private var foo: String
get() = storage
set(value) {
storage = value
}
@JvmDefault
private fun bar(): String {
return "K"
}
@JvmDefault
fun call(): String {
return {
foo = "O"
foo + bar()
} ()
}
}
class TestClass : Test {
}
fun box(): String {
return TestClass().call()
}
@@ -1,28 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
private val foo: String
get() = "O"
@JvmDefault
private fun bar(): String {
return "K"
}
companion object {
fun call(test: Test): String {
return test.foo + test.bar()
}
}
}
class TestClass : Test
fun box(): String {
return Test.call(TestClass())
}
@@ -1,28 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
private val foo: String
get() = "O"
@JvmDefault
private fun bar(): String {
return "K"
}
fun call(): String {
return { foo + bar()} ()
}
}
class TestClass : Test {
}
fun box(): String {
return TestClass().call()
}
@@ -1,26 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test<T> {
@JvmDefault
fun test(p: T): T {
return p
}
}
class TestClass : Test<String> {
override fun test(p: String): String {
return p + "K"
}
}
fun <T> execute(t: Test<T>, p: T): T {
return t.test(p)
}
fun box(): String {
return execute(TestClass(), "O")
}
@@ -1,30 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test<T> {
@JvmDefault
fun test(p: T): T {
return p
}
}
interface Test2: Test<String> {
@JvmDefault
override fun test(p: String): String {
return p + "K"
}
}
class TestClass : Test2 {
}
fun <T> execute(t: Test<T>, p: T): T {
return t.test(p)
}
fun box(): String {
return execute(TestClass(), "O")
}
@@ -1,68 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
interface Test<T> {
@JvmDefault
fun test(p: T): T {
return null!!
}
fun foo(p: T): T {
return null!!
}
}
interface Test2: Test<String> {
@JvmDefault
override fun test(p: String): String {
return p
}
override fun foo(p: String): String {
return p
}
}
class TestClass : Test2
fun box(): String {
checkNoMethod(Test2::class.java, "foo", Any::class.java)
checkMethodExists(Test2::class.java, "test", Any::class.java)
checkNoMethod(TestClass::class.java, "test", Any::class.java)
checkMethodExists(TestClass::class.java, "foo", String::class.java)
checkMethodExists(TestClass::class.java, "foo", Any::class.java)
val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls")
checkNoMethod(test2DefaultImpls, "test", Any::class.java)
checkNoMethod(test2DefaultImpls, "test", String::class.java)
checkMethodExists(test2DefaultImpls, "foo", Test2::class.java, String::class.java)
return "OK"
}
fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) {
try {
clazz.getDeclaredMethod(name, *parameterTypes)
}
catch (e: NoSuchMethodException) {
return
}
throw AssertionError("fail: method $name was found in " + clazz)
}
fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) {
try {
clazz.getDeclaredMethod(name, *parameterTypes)
return
}
catch (e: NoSuchMethodException) {
throw AssertionError("fail: method $name was not found in " + clazz, e)
}
}
@@ -1,35 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test<T> {
@JvmDefault
var test: T
get() = null!!
set(value) {
null!!
}
}
var result = "fail"
interface Test2 : Test<String> {
@JvmDefault
override var test: String
get() = result
set(value) {
result = value
}
}
class TestClass : Test2
fun <T> execute(t: Test<T>, p: T): T {
t.test = p
return t.test
}
fun box(): String {
return execute(TestClass(), "OK")
}
@@ -1,82 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
interface Test<T> {
@JvmDefault
var T.test: T
get() = null!!
set(value) {
null!!
}
var T.foo: T
get() = null!!
set(value) {
null!!
}
}
interface Test2 : Test<String> {
@JvmDefault
override var String.test: String
get() = ""
set(value) {}
override var String.foo: String
get() = ""
set(value) {}
}
class TestClass : Test2
fun box(): String {
checkMethodExists(Test2::class.java, "getTest", String::class.java)
checkMethodExists(Test2::class.java, "getTest", Any::class.java)
checkMethodExists(Test2::class.java, "setTest", Any::class.java, Any::class.java)
checkMethodExists(Test2::class.java, "setTest", String::class.java, String::class.java)
checkNoMethod(Test2::class.java, "setFoo", Any::class.java, Any::class.java)
checkNoMethod(TestClass::class.java, "getTest", String::class.java)
checkNoMethod(TestClass::class.java, "getTest", Any::class.java)
checkNoMethod(TestClass::class.java, "setTest", Any::class.java, Any::class.java)
checkNoMethod(TestClass::class.java, "setTest", String::class.java, String::class.java)
checkMethodExists(TestClass::class.java, "getFoo", String::class.java)
checkMethodExists(TestClass::class.java, "getFoo", Any::class.java)
checkMethodExists(TestClass::class.java, "setFoo", Any::class.java, Any::class.java)
checkMethodExists(TestClass::class.java, "setFoo", String::class.java, String::class.java)
val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls")
checkNoMethod(test2DefaultImpls, "getTest", String::class.java)
checkNoMethod(test2DefaultImpls, "getTest", Any::class.java)
checkNoMethod(test2DefaultImpls, "setTest", Any::class.java, Any::class.java)
checkNoMethod(test2DefaultImpls, "setTest", String::class.java, String::class.java)
return "OK"
}
fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) {
try {
clazz.getDeclaredMethod(name, *parameterTypes)
}
catch (e: NoSuchMethodException) {
return
}
throw AssertionError("fail: method $name was found in " + clazz)
}
fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) {
try {
clazz.getDeclaredMethod(name, *parameterTypes)
return
}
catch (e: NoSuchMethodException) {
throw AssertionError("fail: method $name was not found in " + clazz, e)
}
}
@@ -1,60 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
// FILE: Test.java
public interface Test<T> {
default T test(T p) {
return null;
}
}
// FILE: kotlin.kt
interface Test2: Test<String> {
@JvmDefault
override fun test(p: String): String {
return p
}
fun forDefaultImpls() {}
}
class TestClass : Test2
fun box(): String {
checkMethodExists(Test2::class.java, "test", String::class.java)
checkMethodExists(Test2::class.java, "test", Any::class.java)
checkNoMethod(TestClass::class.java, "test", String::class.java)
checkNoMethod(TestClass::class.java, "test", Any::class.java)
val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls")
checkNoMethod(test2DefaultImpls, "test", Any::class.java)
checkNoMethod(test2DefaultImpls, "test", String::class.java)
return "OK"
}
fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) {
try {
clazz.getDeclaredMethod(name, *parameterTypes)
}
catch (e: NoSuchMethodException) {
return
}
throw AssertionError("fail: method $name was found in " + clazz)
}
fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) {
try {
clazz.getDeclaredMethod(name, *parameterTypes)
return
}
catch (e: NoSuchMethodException) {
throw AssertionError("fail: method $name was not found in " + clazz, e)
}
}
@@ -1,26 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
fun foo(): String = "O"
@JvmDefault
val bar: String
get() = "K"
fun test(): String {
return (::foo)() + (::bar)()
}
}
class TestClass : Test {
}
fun box(): String {
return TestClass().test()
}
@@ -1,30 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface IBase {
@JvmDefault
fun bar() = "OK"
}
open class Base {
fun foo() = "OK"
}
class C : Base(), IBase {
val lambda1 = {
super.foo()
}
val lambda2 = {
super.bar()
}
}
fun box(): String {
if (C().lambda1() != "OK") return "fail 1"
return C().lambda2()
}
@@ -1,39 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface2 {
default String test() {
return KInterface2.DefaultImpls.test2(this, "OK");
}
}
// FILE: Foo.java
public class Foo implements Simple {
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface<T> {
@JvmDefault
fun test2(p: T): T {
return p
}
}
interface KInterface2 : KInterface<String> {
}
fun box(): String {
val result = Foo().test()
if (result != "OK") return "fail 1: ${result}"
return Foo().test2("OK")
}
@@ -1,37 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface2 {
default String test() {
return KInterface2.DefaultImpls.test2(this, "OK");
}
}
// FILE: Foo.java
public class Foo implements Simple {
public String test2(String p) {
return "fail";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface<T> {
@JvmDefault
fun test2(p: T): T {
return p
}
}
interface KInterface2 : KInterface<String> {
}
fun box(): String {
return Foo().test()
}
@@ -1,41 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface3 {
default String test() {
return KInterface3.DefaultImpls.test2(this, "OK");
}
}
// FILE: Foo.java
public class Foo implements Simple {
public String test2(String p) {
return "fail";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface<T> {
@JvmDefault
fun test2(p: T): T {
return p
}
}
interface KInterface2 : KInterface<String> {
}
interface KInterface3 : KInterface2 {
}
fun box(): String {
return Foo().test()
}
@@ -1,44 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface2 {
default String test() {
return KInterface2.DefaultImpls.getBar(this);
}
}
// FILE: Foo.java
public class Foo implements Simple {
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface<T> {
val foo: T
@JvmDefault
val bar: T
get() = foo
}
interface KInterface2 : KInterface<String> {
@JvmDefault
override val foo: String
get() = "OK"
}
fun box(): String {
val result = Foo().test()
if (result != "OK") return "fail 1: ${result}"
return Foo().bar
}
@@ -1,41 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface2 {
default String test() {
return KInterface2.DefaultImpls.getBar(this);
}
}
// FILE: Foo.java
public class Foo implements Simple {
public String getBar() {
return "fail";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface<T> {
val foo: T
@JvmDefault
val bar: T
get() = foo
}
interface KInterface2 : KInterface<String> {
@JvmDefault
override val foo: String
get() = "OK"
}
fun box(): String {
return Foo().test()
}
@@ -1,43 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface3 {
default String test() {
return KInterface3.DefaultImpls.getBar(this);
}
}
// FILE: Foo.java
public class Foo implements Simple {
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface<T> {
val foo: T
@JvmDefault
val bar: T
get() = foo
}
interface KInterface2 : KInterface<String> {
@JvmDefault
override val foo: String
get() = "OK"
}
interface KInterface3 : KInterface2 {
}
fun box(): String {
return Foo().test()
}
@@ -1,23 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
interface Test {
@JvmDefault
fun test(s: String ="OK"): String {
return s
}
}
class TestClass : Test {
}
fun box(): String {
val defaultImpls = java.lang.Class.forName(Test::class.java.canonicalName + "\$DefaultImpls")
val declaredMethod = defaultImpls.getDeclaredMethod("test\$default", Test::class.java, String::class.java, Int::class.java, Any::class.java)
return declaredMethod.invoke(null, TestClass(), null, 1, null) as String
}
@@ -1,38 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface2 {
default String test() {
return KInterface2.DefaultImpls.test2(this);
}
}
// FILE: Foo.java
public class Foo implements Simple {
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface {
@JvmDefault
fun test2(): String {
return "OK"
}
}
interface KInterface2 : KInterface {
}
fun box(): String {
val result = Foo().test()
if (result != "OK") return "fail 1: ${result}"
return Foo().test2()
}
@@ -1,25 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_REFLECT
annotation class Property(val value: String)
annotation class Accessor(val value: String)
interface Z {
@Property("OK")
@JvmDefault
val z: String
@Accessor("OK")
get() = "OK"
}
class Test : Z
fun box() : String {
val value = Z::z.annotations.filterIsInstance<Property>().single().value
if (value != "OK") return value
return (Z::z.getter.annotations.single() as Accessor).value
}
@@ -1,34 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: compatibility
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple extends KInterface {
default String test() {
return KInterface.DefaultImpls.test2(this);
}
}
// FILE: Foo.java
public class Foo implements Simple {
}
// FILE: main.kt
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KInterface {
@JvmDefault
fun test2(): String {
return "OK"
}
}
fun box(): String {
val result = Foo().test()
if (result != "OK") return "fail 1: ${result}"
return Foo().test2()
}
@@ -1,17 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z {
@JvmDefault
fun test(s: String = "OK"): String {
return s
}
}
class Test: Z
fun box(): String {
return Test().test()
}
@@ -1,33 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
fun test(): String {
return "O"
}
fun delegatedTest(): String {
return "fail"
}
}
class Delegate : Test {
override fun test(): String {
return "Fail"
}
override fun delegatedTest(): String {
return "K"
}
}
class TestClass(val foo: Test) : Test by foo
fun box(): String {
val testClass = TestClass(Delegate())
return testClass.test() + testClass.delegatedTest()
}
@@ -1,30 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
val test: String
get() = "O"
val testDelegated: String
get() = "fail"
}
class Delegate : Test {
override val test: String
get() = "fail"
override val testDelegated: String
get() = "K"
}
class TestClass(val foo: Test) : Test by foo
fun box(): String {
val testClass = TestClass(Delegate())
return testClass.test + testClass.testDelegated
}
@@ -1,54 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_REFLECT
// FULL_JDK
interface Test {
@JvmDefault
fun test(): String {
return "Test"
}
}
open class TestClass : Test {
}
interface Test2 : Test {
@JvmDefault
override fun test(): String {
return "Test2"
}
}
interface Test3 : Test2 {
}
class TestClass2 : TestClass(), Test3 {
}
fun box(): String {
val test = TestClass2().test()
if (test != "Test2") return "fail 1: $test"
checkNoMethod(TestClass::class.java, "test")
checkNoMethod(Test3::class.java, "test")
checkNoMethod(TestClass2::class.java, "test")
return "OK"
}
fun checkNoMethod(clazz: Class<*>, name: String) {
try {
clazz.getDeclaredMethod(name)
}
catch (e: NoSuchMethodException) {
return
}
throw AssertionError("fail " + clazz)
}
@@ -1,29 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
fun test(): String {
return inlineFun { "O" }
}
fun testDefaultImpls(): String {
return inlineFun { "K" }
}
@JvmDefault
private inline fun inlineFun(s: () -> String) = s()
}
class TestClass : Test {
}
fun box(): String {
val foo = TestClass()
return foo.test() + foo.testDefaultImpls()
}
@@ -1,31 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
fun test(): String {
return inlineProp
}
fun testDefaultImpls(): String {
return inlineProp
}
@JvmDefault
private inline val inlineProp: String
get() = "OK"
}
class TestClass : Test {
}
fun box(): String {
val foo = TestClass()
if (foo.test() != "OK") return "fail: ${foo.test()}"
return foo.testDefaultImpls()
}
@@ -1,62 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z {
@JvmDefault
private fun privateFun() = { "OK" }
@JvmDefault
fun callPrivateFun() = privateFun()
@JvmDefault
fun publicFun() = { "OK" }
@JvmDefault
fun funWithDefaultArgs(s: () -> Unit = {}): () -> Unit
@JvmDefault
val property: () -> Unit
get() = {}
class Nested
}
class Test : Z {
override fun funWithDefaultArgs(s: () -> Unit): () -> Unit {
return s
}
}
fun box(): String {
val privateFun = Test().callPrivateFun()
var enclosing = privateFun.javaClass.enclosingMethod!!
if (enclosing.name != "privateFun") return "fail 1: ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "Z") return "fail 2: ${enclosing.getDeclaringClass().simpleName}"
val publicFun = Test().publicFun()
enclosing = publicFun.javaClass.enclosingMethod!!
if (enclosing.name != "publicFun") return "fail 3: ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "Z") return "fail 4: ${enclosing.getDeclaringClass().simpleName}"
val property = Test().property
enclosing = property.javaClass.enclosingMethod!!
if (enclosing.name != "getProperty") return "fail 4: ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "Z") return "fail 5: ${enclosing.getDeclaringClass().simpleName}"
val defaultArgs = Test().funWithDefaultArgs()
enclosing = defaultArgs.javaClass.enclosingMethod!!
if (enclosing.name != "funWithDefaultArgs\$default") return "fail 6: ${enclosing.name}"
if (enclosing.parameterTypes.size != 4) return "fail 7: not default method ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "Z") return "fail 8: ${enclosing.getDeclaringClass().simpleName}"
val nested = Z.Nested::class.java
val enclosingClass = nested.enclosingClass!!
if (enclosingClass.name != "Z") return "fail 9: ${enclosingClass.name}"
return "OK"
}
@@ -1,25 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z<T> {
@JvmDefault
fun test(p: T): T {
return p
}
}
open class ZImpl : Z<String>
class ZImpl2 : ZImpl() {
override fun test(p: String): String {
return super.test(p)
}
}
fun box(): String {
return ZImpl2().test("OK")
}
@@ -1,27 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z<T> {
@JvmDefault
fun test(p: T): T {
return p
}
}
open class ZImpl : Z<String>
open class ZImpl2 : Z<String>, ZImpl()
class ZImpl3 : ZImpl2() {
override fun test(p: String): String {
return super.test(p)
}
}
fun box(): String {
return ZImpl3().test("OK")
}
@@ -1,29 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z<T> {
val value: T
@JvmDefault
val z: T
get() = value
}
open class ZImpl : Z<String> {
override val value: String
get() = "OK"
}
open class ZImpl2 : ZImpl() {
override val z: String
get() = super.z
}
fun box(): String {
return ZImpl2().value
}
@@ -1,26 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
interface Test {
@JvmDefault
fun test() {
}
}
class TestClass : Test {
}
fun box(): String {
try {
TestClass::class.java.getDeclaredMethod("test")
}
catch (e: NoSuchMethodException) {
return "OK"
}
return "fail"
}
@@ -1,26 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
interface Test {
@JvmDefault
fun test() {
}
}
interface Test2 : Test {
}
fun box(): String {
try {
Test2::class.java.getDeclaredMethod("test")
}
catch (e: NoSuchMethodException) {
return "OK"
}
return "fail"
}
@@ -1,30 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
interface Test {
@JvmDefault
fun test() {
}
}
interface Test2 : Test {
}
interface Test3 : Test2 {
}
fun box(): String {
try {
Test3::class.java.getDeclaredMethod("test")
}
catch (e: NoSuchMethodException) {
return "OK"
}
return "fail"
}
@@ -1,26 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KCallable {
@JvmDefault
val returnType: String
}
interface KCallableImpl : KCallable {
@JvmDefault
override val returnType: String
get() = "OK"
}
interface KCallableImpl2 : KCallableImpl
open class DescriptorBasedProperty : KCallableImpl
open class KProperty1Impl : DescriptorBasedProperty(), KCallableImpl2
open class KMutableProperty1Impl : KProperty1Impl(), KCallable
fun box(): String {
return KMutableProperty1Impl().returnType
}
@@ -1,31 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface KCallable {
@JvmDefault
val returnType: String
}
interface KCallableImpl : KCallable {
@JvmDefault
override val returnType: String
get() = "OK"
}
interface KProperty : KCallable
interface KPropertyImpl : KProperty, KCallableImpl
interface KMutableProperty : KProperty
interface KProperty1 : KProperty
interface KMutableProperty1 : KProperty1, KMutableProperty
interface KMutablePropertyImpl : KPropertyImpl
open class DescriptorBasedProperty : KCallableImpl
open class KProperty1Impl : DescriptorBasedProperty(), KProperty1, KPropertyImpl
open class KMutableProperty1Impl : KProperty1Impl(), KMutableProperty1, KMutablePropertyImpl
fun box(): String {
return KMutableProperty1Impl().returnType
}
@@ -1,26 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
fun test(): String {
return privateFun() + privateProp
}
@JvmDefault
private fun privateFun(): String {
return "O"
}
@JvmDefault
private val privateProp: String
get() = "K"
}
class TestImpl: Test
fun box(): String {
return TestImpl().test()
}
@@ -1,25 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
fun test(): String {
return privateFun() + privateProp
}
private fun privateFun(): String {
return "O"
}
private val privateProp: String
get() = "K"
}
class TestImpl: Test
fun box(): String {
return TestImpl().test()
}
@@ -1,25 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_REFLECT
annotation class Property(val value: String)
annotation class Accessor(val value: String)
interface Z {
@Property("OK")
@JvmDefault
val z: String
@Accessor("OK")
get() = "OK"
}
class Test : Z
fun box() : String {
val value = Z::z.annotations.filterIsInstance<Property>().single().value
if (value != "OK") return value
return (Z::z.getter.annotations.single() as Accessor).value
}
@@ -1,20 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
fun test(): String {
return "OK"
}
}
class TestClass : Test {
}
fun box(): String {
return TestClass().test()
}
@@ -1,18 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z {
@JvmDefault
val z: String
get() = "OK"
}
class Test : Z
fun box() : String {
return Test().z
}
@@ -1,29 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Test {
@JvmDefault
fun test(): String {
return "OK"
}
}
interface Test2 : Test {
@JvmDefault
override fun test(): String {
return super.test()
}
}
class TestClass : Test2 {
}
fun box(): String {
return TestClass().test()
}
@@ -1,20 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
//WITH_RUNTIME
// FILE: 1.kt
package test
public inline fun <T, R> Iterable<T>.fold2(initial: R, operation: (R, T) -> R): R {
var accumulator = initial
for (element in this) accumulator = operation(accumulator, element)
return accumulator
}
// FILE: 2.kt
import test.*
fun box(): String {
val list = listOf("O", "K")
return list.fold2("") {a, b -> a +b}
}
@@ -1,9 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
//WITH_RUNTIME
fun box(): String {
val list = listOf("O", "K")
return list.fold("") {a, b -> a +b}
}
@@ -1,25 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple {
default String test() {
return "O";
}
static String testStatic() {
return "K";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
class TestClass : Simple {
override fun test(): String {
return super.test()
}
}
fun box(): String {
return TestClass().test() + Simple.testStatic()
}
@@ -1,27 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Simple.java
public interface Simple {
default String test() {
return "O";
}
static String testStatic() {
return "K";
}
}
// FILE: main.kt
// JVM_TARGET: 1.8
interface KSimple : Simple {}
class TestClass : KSimple {
override fun test(): String {
return super.test()
}
}
fun box(): String {
return TestClass().test() + Simple.testStatic()
}
-54
View File
@@ -1,54 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z {
private fun privateFun() = { "OK" }
fun callPrivateFun() = privateFun()
fun publicFun() = { "OK" }
fun funWithDefaultArgs(s: () -> Unit = {}): () -> Unit
val property: () -> Unit
get() = {}
class Nested
}
class Test : Z {
override fun funWithDefaultArgs(s: () -> Unit): () -> Unit {
return s
}
}
fun box(): String {
val privateFun = Test().callPrivateFun()
var enclosing = privateFun.javaClass.enclosingMethod!!
if (enclosing.name != "privateFun") return "fail 1: ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "DefaultImpls") return "fail 2: ${enclosing.getDeclaringClass().simpleName}"
val publicFun = Test().publicFun()
enclosing = publicFun.javaClass.enclosingMethod!!
if (enclosing.name != "publicFun") return "fail 3: ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "DefaultImpls") return "fail 4: ${enclosing.getDeclaringClass().simpleName}"
val property = Test().property
enclosing = property.javaClass.enclosingMethod!!
if (enclosing.name != "getProperty") return "fail 4: ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "DefaultImpls") return "fail 5: ${enclosing.getDeclaringClass().simpleName}"
val defaultArgs = Test().funWithDefaultArgs()
enclosing = defaultArgs.javaClass.enclosingMethod!!
if (enclosing.name != "funWithDefaultArgs\$default") return "fail 6: ${enclosing.name}"
if (enclosing.parameterTypes.size != 4) return "fail 7: not default method ${enclosing.name}"
if (enclosing.getDeclaringClass().simpleName != "DefaultImpls") return "fail 8: ${enclosing.getDeclaringClass().simpleName}"
val nested = Z.Nested::class.java
val enclosingClass = nested.enclosingClass!!
if (enclosingClass.name != "Z") return "fail 9: ${enclosingClass.name}"
return "OK"
}
-21
View File
@@ -1,21 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Z<T> {
fun test(p: T): T {
return p
}
}
open class ZImpl : Z<String>
class ZImpl2 : ZImpl() {
override fun test(p: String): String {
return super.test(p)
}
}
fun box(): String {
return ZImpl2().test("OK")
}
-23
View File
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Z<T> {
fun test(p: T): T {
return p
}
}
open class ZImpl : Z<String>
open class ZImpl2 : Z<String>, ZImpl()
class ZImpl3 : ZImpl2() {
override fun test(p: String): String {
return super.test(p)
}
}
fun box(): String {
return ZImpl3().test("OK")
}
@@ -1,24 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Z<T> {
val value: T
val z: T
get() = value
}
open class ZImpl : Z<String> {
override val value: String
get() = "OK"
}
open class ZImpl2 : ZImpl() {
override val z: String
get() = super.z
}
fun box(): String {
return ZImpl2().value
}
-10
View File
@@ -1,10 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
fun failAtRuntime(numberArg: Number = 0.0): Number {
return numberArg
}
fun box(): String {
failAtRuntime()
return "OK"
}
-18
View File
@@ -1,18 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
fun test(o: Number) {}
fun test2(o: Number) {
val p: Int = 1
val o = if (z < 1) p else o
test(o)
}
var z = 1
fun box(): String {
val x: Number = 1
test2(x)
return "OK"
}
-13
View File
@@ -1,13 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
fun number(doLong: Boolean): Number = when {
doLong -> 1.toLong()
else -> 0
}
fun box(): String {
number(true)
return "OK"
}
-27
View File
@@ -1,27 +0,0 @@
// !LANGUAGE: +JvmStaticInInterface
// WITH_RUNTIME
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// FILE: test.kt
fun box(): String {
return Java.test()
}
interface Foo {
companion object {
@JvmStatic
fun foo() = "O"
@JvmStatic
var fooProp = ""
}
}
// FILE: Java.java
public class Java {
public static String test() {
Foo.setFooProp("K");
return Foo.foo() + Foo.getFooProp();
}
}
-27
View File
@@ -1,27 +0,0 @@
// !LANGUAGE: +JvmStaticInInterface
// WITH_RUNTIME
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// FILE: test.kt
fun box(): String {
return Java.test()
}
interface Foo {
companion object {
@JvmStatic
fun foo() = "O"
val fooProp = "K"
@JvmStatic get
}
}
// FILE: Java.java
public class Java {
public static String test() {
return Foo.foo() + Foo.getFooProp();
}
}
@@ -1,20 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface KCallable {
val returnType: String
}
interface KCallableImpl : KCallable {
override val returnType: String
get() = "OK"
}
interface KCallableImpl2 : KCallableImpl
open class DescriptorBasedProperty : KCallableImpl
open class KProperty1Impl : DescriptorBasedProperty(), KCallableImpl2
open class KMutableProperty1Impl : KProperty1Impl(), KCallable
fun box(): String {
return KMutableProperty1Impl().returnType
}
@@ -1,25 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface KCallable {
val returnType: String
}
interface KCallableImpl : KCallable {
override val returnType: String
get() = "OK"
}
interface KProperty : KCallable
interface KPropertyImpl : KProperty, KCallableImpl
interface KMutableProperty : KProperty
interface KProperty1 : KProperty
interface KMutableProperty1 : KProperty1, KMutableProperty
interface KMutablePropertyImpl : KPropertyImpl
open class DescriptorBasedProperty : KCallableImpl
open class KProperty1Impl : DescriptorBasedProperty(), KProperty1, KPropertyImpl
open class KMutableProperty1Impl : KProperty1Impl(), KMutableProperty1, KMutablePropertyImpl
fun box(): String {
return KMutableProperty1Impl().returnType
}
@@ -1,16 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
fun box(): String {
true.hashCode()
1.toByte().hashCode()
1.toChar().hashCode()
1.toShort().hashCode()
1.hashCode()
1L.hashCode()
1.0F.hashCode()
1.0.hashCode()
"".hashCode()
return "OK"
}
-16
View File
@@ -1,16 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Test {
fun test(): String {
return "OK"
}
}
class TestClass : Test {
}
fun box(): String {
return TestClass().test()
}
@@ -1,14 +0,0 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
interface Z {
val z: String
get() = "OK"
}
class Test : Z
fun box() : String {
return Test().z
}
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
public interface Base {
default String foo() {
return "OK";
}
}
// FILE: derived.kt
// JVM_TARGET: 1.8
interface K1 : Base
interface K2 : K1
interface K3 : K2
class C : K3 {
override fun foo() = super.foo()
}
fun box(): String = C().foo()
@@ -1,67 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
class A : MutableMap<Any, Any?> {
override val entries: MutableSet<MutableMap.MutableEntry<Any, Any?>>
get() = throw UnsupportedOperationException()
override val keys: MutableSet<Any>
get() = throw UnsupportedOperationException()
override val values: MutableCollection<Any?>
get() = throw UnsupportedOperationException()
override fun clear() {
throw UnsupportedOperationException()
}
override fun put(key: Any, value: Any?): Any? {
throw UnsupportedOperationException()
}
override fun putAll(from: Map<out Any, Any?>) {
throw UnsupportedOperationException()
}
override fun remove(key: Any): Any? {
throw UnsupportedOperationException()
}
override val size: Int
get() = throw UnsupportedOperationException()
override fun containsKey(key: Any): Boolean {
throw UnsupportedOperationException()
}
override fun containsValue(value: Any?): Boolean {
throw UnsupportedOperationException()
}
override fun get(key: Any): Any? {
throw UnsupportedOperationException()
}
override fun isEmpty(): Boolean {
throw UnsupportedOperationException()
}
override fun getOrDefault(key: Any, defaultValue: Any?): Any? {
if (key == "abc") return "cde"
return defaultValue
}
}
fun box(): String {
val a = A()
if (a.getOrDefault("abc", "xyz") != "cde") return "fail 1"
if (a.getOrDefault("56", "123") != "123") return "fail 2"
val mm = a as MutableMap<Any?, Any?>
if (mm.getOrDefault("abc", "xyz") != "cde") return "fail 3"
if (mm.getOrDefault("56", 123) != 123) return "fail 4"
if (mm.getOrDefault(1, "456") != "456") return "fail 5"
if (mm.getOrDefault(null, "qwe") != "qwe") return "fail 6"
if (mm.getOrDefault("abc", null) != "cde") return "fail 7"
return "OK"
}
@@ -1,75 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
class A : MutableMap<String, String> {
override val entries: MutableSet<MutableMap.MutableEntry<String, String>>
get() = throw UnsupportedOperationException()
override val keys: MutableSet<String>
get() = throw UnsupportedOperationException()
override val values: MutableCollection<String>
get() = throw UnsupportedOperationException()
override fun clear() {
throw UnsupportedOperationException()
}
override fun put(key: String, value: String): String? {
throw UnsupportedOperationException()
}
override fun putAll(from: Map<out String, String>) {
throw UnsupportedOperationException()
}
override fun remove(key: String): String? {
throw UnsupportedOperationException()
}
override val size: Int
get() = throw UnsupportedOperationException()
override fun containsKey(key: String): Boolean {
throw UnsupportedOperationException()
}
override fun containsValue(value: String): Boolean {
throw UnsupportedOperationException()
}
override fun get(key: String): String? {
throw UnsupportedOperationException()
}
override fun isEmpty(): Boolean {
throw UnsupportedOperationException()
}
override fun getOrDefault(key: String, defaultValue: String): String {
if (key == "abc") return "cde"
return defaultValue
}
}
fun box(): String {
val a = A()
if (a.getOrDefault("abc", "xyz") != "cde") return "fail 1"
if (a.getOrDefault("56", "123") != "123") return "fail 2"
val mm = a as MutableMap<Any?, Any?>
if (mm.getOrDefault("abc", "xyz") != "cde") return "fail 3"
if (mm.getOrDefault("56", "123") != "123") return "fail 4"
if (mm.getOrDefault(1, "456") != "456") return "fail 5"
if (mm.getOrDefault(null, "qwe") != "qwe") return "fail 6"
try {
// This is a known problem, there's no way to implement type-safe bridge/barrier properly:
// 'override fun getOrDefault(key: String, defaultValue: String): String' expects two strings,
// and returning defaultValue if Int was received seems incorrect here
mm.getOrDefault("abc", 123)
return "fail 7"
} catch (e: java.lang.ClassCastException) {
}
return "OK"
}
@@ -1,81 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
class A : MutableMap<Any, Any> {
override val entries: MutableSet<MutableMap.MutableEntry<Any, Any>>
get() = throw UnsupportedOperationException()
override val keys: MutableSet<Any>
get() = throw UnsupportedOperationException()
override val values: MutableCollection<Any>
get() = throw UnsupportedOperationException()
override fun clear() {
throw UnsupportedOperationException()
}
override fun put(key: Any, value: Any): Any? {
throw UnsupportedOperationException()
}
override fun putAll(from: Map<out Any, Any>) {
throw UnsupportedOperationException()
}
override fun remove(key: Any): Any? {
throw UnsupportedOperationException()
}
override val size: Int
get() = throw UnsupportedOperationException()
override fun containsKey(key: Any): Boolean {
throw UnsupportedOperationException()
}
override fun containsValue(value: Any): Boolean {
throw UnsupportedOperationException()
}
override fun get(key: Any): Any? {
throw UnsupportedOperationException()
}
override fun isEmpty(): Boolean {
throw UnsupportedOperationException()
}
override fun getOrDefault(key: Any, defaultValue: Any): Any {
// this condition can not be true because of checkParameterIsNotNull checks in the begin of every method, but it's left here
// to emphasize that we expect these parameters are not null
if (key == null || defaultValue == null) {
throw IllegalArgumentException("fail")
}
if (key == "abc") return "cde"
return defaultValue
}
}
fun box(): String {
val a = A()
if (a.getOrDefault("abc", "xyz") != "cde") return "fail 1"
if (a.getOrDefault("56", "123") != "123") return "fail 2"
val mm = a as MutableMap<Any?, Any?>
if (mm.getOrDefault("abc", "xyz") != "cde") return "fail 3"
if (mm.getOrDefault("56", 123) != 123) return "fail 4"
if (mm.getOrDefault(1, "456") != "456") return "fail 5"
if (mm.getOrDefault(null, "qwe") != "qwe") return "fail 6"
try {
// This is a known problem, there's no way to implement type-safe bridge/barrier properly:
// 'override fun getOrDefault(key: Any, defaultValue: Any): Any' expects two not-nullable values,
// and returning defaultValue if null was received seems incorrect here
mm.getOrDefault("abc", null)
return "fail 7"
} catch (e: java.lang.IllegalArgumentException) {
// Parameter specified as non-null is null
}
return "OK"
}
@@ -1,34 +0,0 @@
// !API_VERSION: 1.3
// !JVM_DEFAULT_MODE: enable
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
// There should be no DefaultImpls method for MutableMap.remove(K;V)
interface A<K, V> : MutableMap<K, V>
class B : A<String, String>, java.util.AbstractMap<String, String>() {
override val entries: MutableSet<MutableMap.MutableEntry<String, String>>
get() = java.util.HashSet()
}
interface C<K, V> : MutableMap<K, V> {
@JvmDefault
override fun remove(key: K, value: V) = true
}
class D : A<String, String>, java.util.AbstractMap<String, String>() {
override val entries: MutableSet<MutableMap.MutableEntry<String, String>>
get() = java.util.HashSet()
}
fun box(): String {
val x1 = B().remove("1", "2")
if (x1) return "fail 1"
val x2 = D().remove("3", "4")
if (x1) return "fail 2"
return "OK"
}
@@ -1,46 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
// FILE: A.java
public class A {
public static void foo(java.util.Map<String, String> x) {
x.remove("abc", "cde");
}
}
// FILE: main.kt
class ReadOnlyMap<K, V>(val x: K, val y: V) : Map<K, V> {
override val entries: Set<Map.Entry<K, V>>
get() = throw UnsupportedOperationException()
override val keys: Set<K>
get() = throw UnsupportedOperationException()
override val size: Int
get() = throw UnsupportedOperationException()
override val values: Collection<V>
get() = throw UnsupportedOperationException()
override fun containsKey(key: K) = key == x
override fun containsValue(value: V) = value == y
override fun get(key: K): V? = if (key == x) y else null
override fun isEmpty() = false
}
fun box(): String {
try {
A.foo(ReadOnlyMap("abc", "cde"))
return "fail 1"
} catch (e: UnsupportedOperationException) { }
try {
// Default Map 'remove' implenetation actually does remove iff entry exists
A.foo(ReadOnlyMap("abc", "123"))
return "fail 2"
} catch (e: UnsupportedOperationException) { }
return "OK"
}
@@ -1,69 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
class A : MutableMap<String, String> {
override val entries: MutableSet<MutableMap.MutableEntry<String, String>>
get() = throw UnsupportedOperationException()
override val keys: MutableSet<String>
get() = throw UnsupportedOperationException()
override val values: MutableCollection<String>
get() = throw UnsupportedOperationException()
override fun clear() {
throw UnsupportedOperationException()
}
override fun put(key: String, value: String): String? {
throw UnsupportedOperationException()
}
override fun putAll(from: Map<out String, String>) {
throw UnsupportedOperationException()
}
override fun remove(key: String): String? {
throw UnsupportedOperationException()
}
override val size: Int
get() = throw UnsupportedOperationException()
override fun containsKey(key: String): Boolean {
throw UnsupportedOperationException()
}
override fun containsValue(value: String): Boolean {
throw UnsupportedOperationException()
}
override fun get(key: String): String? {
throw UnsupportedOperationException()
}
override fun isEmpty(): Boolean {
throw UnsupportedOperationException()
}
override fun remove(key: String, value: String): Boolean {
val h = key.hashCode() + value.hashCode()
if (h != ("abc".hashCode() + "cde".hashCode())) return false
return key == "abc" && value == "cde"
}
}
fun box(): String {
val a = A()
if (!a.remove("abc", "cde")) return "fail 1"
if (a.remove("abc", "123")) return "fail 2"
val mm = a as MutableMap<Any?, Any?>
if (!mm.remove("abc", "cde")) return "fail 3"
if (mm.remove("abc", "123")) return "fail 4"
if (mm.remove(1, "cde")) return "fail 5"
if (mm.remove(null, "cde")) return "fail 6"
if (mm.remove("abc", null)) return "fail 7"
if (mm.remove(null, null)) return "fail 8"
return "OK"
}
@@ -1,69 +0,0 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
class A : MutableMap<Any, Any> {
override val entries: MutableSet<MutableMap.MutableEntry<Any, Any>>
get() = throw UnsupportedOperationException()
override val keys: MutableSet<Any>
get() = throw UnsupportedOperationException()
override val values: MutableCollection<Any>
get() = throw UnsupportedOperationException()
override fun clear() {
throw UnsupportedOperationException()
}
override fun put(key: Any, value: Any): Any? {
throw UnsupportedOperationException()
}
override fun putAll(from: Map<out Any, Any>) {
throw UnsupportedOperationException()
}
override fun remove(key: Any): Any? {
throw UnsupportedOperationException()
}
override val size: Int
get() = throw UnsupportedOperationException()
override fun containsKey(key: Any): Boolean {
throw UnsupportedOperationException()
}
override fun containsValue(value: Any): Boolean {
throw UnsupportedOperationException()
}
override fun get(key: Any): Any? {
throw UnsupportedOperationException()
}
override fun isEmpty(): Boolean {
throw UnsupportedOperationException()
}
override fun remove(key: Any, value: Any): Boolean {
val h = key.hashCode() + value.hashCode()
if (h != ("abc".hashCode() + "cde".hashCode())) return false
return key == "abc" && value == "cde"
}
}
fun box(): String {
val a = A()
if (!a.remove("abc", "cde")) return "fail 1"
if (a.remove("abc", "123")) return "fail 2"
val mm = a as MutableMap<Any?, Any?>
if (!mm.remove("abc", "cde")) return "fail 3"
if (mm.remove("abc", "123")) return "fail 4"
if (mm.remove(1, "cde")) return "fail 5"
if (mm.remove(null, "cde")) return "fail 6"
if (mm.remove("abc", null)) return "fail 7"
if (mm.remove(null, null)) return "fail 8"
return "OK"
}
@@ -1,20 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
interface Test {
fun test(OK: String) = "123"
}
fun box(): String {
val testMethod = Class.forName("Test\$DefaultImpls").declaredMethods.single()
val parameters = testMethod.getParameters()
if (!parameters[0].isSynthetic()) return "wrong modifier on receiver parameter: ${parameters[0].modifiers}"
if (parameters[1].modifiers != 0) return "wrong modifier on value parameter: ${parameters[1].modifiers}"
return parameters[1].name
}
@@ -1,36 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// JAVAC_OPTIONS: -parameters
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
// FILE: JavaInterface.java
public interface JavaInterface {
void plugin(String id);
}
// FILE: test.kt
import kotlin.test.assertEquals
interface KotlinInterface {
fun plugin(id: String)
}
class KotlinDelegate(impl: KotlinInterface) : KotlinInterface by impl
class JavaDelegate(impl: JavaInterface) : JavaInterface by impl
private fun check(javaClass: Class<*>) {
val pluginMethod = javaClass.getDeclaredMethod("plugin", String::class.java)
assertEquals(listOf("id"), pluginMethod.parameters.map { it.name }, "Incorrect parameters for $javaClass")
}
fun box(): String {
check(JavaInterface::class.java)
check(KotlinInterface::class.java)
check(KotlinDelegate::class.java)
check(JavaDelegate::class.java)
return "OK"
}
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
enum class A(val OK: String) {
}
fun box(): String {
val clazz = A::class.java
val constructor = clazz.getDeclaredConstructor(String::class.java, Int::class.java, String::class.java)
val parameters = constructor.getParameters()
if (parameters[0].name != "\$enum\$name") return "wrong entry name: ${parameters[0].name}"
if (!parameters[0].isSynthetic() || parameters[0].isImplicit()) return "wrong name flags: ${parameters[0].modifiers}"
if (parameters[1].name != "\$enum\$ordinal") return "wrong ordinal name: ${parameters[1].name}"
if (!parameters[1].isSynthetic() || parameters[1].isImplicit()) return "wrong ordinal flags: ${parameters[1].modifiers}"
if (parameters[2].modifiers != 0) return "wrong modifier on value parameter: ${parameters[2].modifiers}"
return parameters[2].name
}
@@ -1,20 +0,0 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
class A() {
fun String.test(OK: String) {
}
}
fun box(): String {
val clazz = A::class.java
val method = clazz.getDeclaredMethod("test", String::class.java, String::class.java)
val parameters = method.getParameters()
if (!parameters[0].isImplicit() || parameters[0].isSynthetic()) return "wrong modifier on receiver parameter: ${parameters[0].modifiers}"
return parameters[1].name
}

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