Skip to content

Commit 38842ee

Browse files
udalovSpace Team
authored andcommitted
Reflection: support basic context parameters
#KT-74529
1 parent 92a566b commit 38842ee

21 files changed

Lines changed: 243 additions & 6 deletions

File tree

analysis/low-level-api-fir/tests-gen/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLBlackBoxTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analysis/low-level-api-fir/tests-gen/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLReversedBlackBoxTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KParameterState.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ internal class KParameterState(
4242
override fun toString(): String {
4343
return buildString {
4444
when (kind) {
45-
KParameter.Kind.EXTENSION_RECEIVER -> append("extension receiver parameter")
4645
KParameter.Kind.INSTANCE -> append("instance parameter")
46+
// Can't use `@OptIn(ExperimentalContextParameters::class)` as long as the project is compiled with API version 2.1.
47+
@Suppress("OPT_IN_USAGE_ERROR")
48+
KParameter.Kind.CONTEXT,
49+
-> append("context parameter ${irParameter.name}")
50+
KParameter.Kind.EXTENSION_RECEIVER -> append("extension receiver parameter")
4751
KParameter.Kind.VALUE -> append("parameter #$index ${irParameter.name}")
4852
}
4953

@@ -57,4 +61,4 @@ internal class KParameterState(
5761
}
5862
}
5963
}
60-
}
64+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// LANGUAGE: +ContextParameters
2+
// OPT_IN: kotlin.ExperimentalContextParameters
3+
// TARGET_BACKEND: JVM
4+
// IGNORE_BACKEND_K1: ANY
5+
// WITH_REFLECT
6+
7+
import kotlin.reflect.*
8+
import kotlin.reflect.KParameter.Kind.*
9+
import kotlin.test.assertEquals
10+
11+
interface A
12+
interface B
13+
interface C
14+
object D
15+
16+
class Z {
17+
context(a: A, b: B?)
18+
fun C.f(d: D) {}
19+
20+
context(a: A, b: B?)
21+
var C.p: D
22+
get() = D
23+
set(d) {}
24+
}
25+
26+
fun checkABC(params: List<KParameter>) {
27+
assertEquals(listOf(INSTANCE, CONTEXT, CONTEXT, EXTENSION_RECEIVER), params.map { it.kind })
28+
assertEquals(listOf(null, "a", "b", null), params.map { it.name })
29+
assertEquals(listOf(typeOf<Z>(), typeOf<A>(), typeOf<B?>(), typeOf<C>()), params.map { it.type })
30+
assertEquals(params.indices.toList(), params.map { it.index })
31+
}
32+
33+
fun checkABCD(params: List<KParameter>) {
34+
assertEquals(listOf(INSTANCE, CONTEXT, CONTEXT, EXTENSION_RECEIVER, VALUE), params.map { it.kind })
35+
assertEquals(listOf(null, "a", "b", null, "d"), params.map { it.name })
36+
assertEquals(listOf(typeOf<Z>(), typeOf<A>(), typeOf<B?>(), typeOf<C>(), typeOf<D>()), params.map { it.type })
37+
assertEquals(params.indices.toList(), params.map { it.index })
38+
}
39+
40+
fun box(): String {
41+
val f = Z::class.members.single { it.name == "f" }
42+
checkABCD(f.parameters)
43+
44+
val p = Z::class.members.single { it.name == "p" } as KMutableProperty<*>
45+
checkABC(p.parameters)
46+
checkABC(p.getter.parameters)
47+
checkABCD(p.setter.parameters)
48+
return "OK"
49+
}

compiler/testData/codegen/box/reflection/parameters/isOptional.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
// LANGUAGE: +ContextParameters
12
// TARGET_BACKEND: JVM
2-
3+
// IGNORE_BACKEND_K1: JVM_IR
34
// WITH_REFLECT
45

56
import kotlin.test.*
@@ -17,12 +18,20 @@ class C : A()
1718

1819
fun Int.extFun() {}
1920

21+
class Z {
22+
context(c: String)
23+
fun context() {}
24+
}
25+
2026
fun box(): String {
2127
assertEquals(listOf(false, false, true), A::foo.parameters.map { it.isOptional })
2228
assertEquals(listOf(false, false, true), B::foo.parameters.map { it.isOptional })
2329
assertEquals(listOf(false, false, true), C::foo.parameters.map { it.isOptional })
2430

2531
assertFalse(Int::extFun.parameters.single().isOptional)
2632

33+
val context = Z::class.members.single { it.name == "context" }
34+
assertEquals(listOf(false, false), context.parameters.map { it.isOptional })
35+
2736
return "OK"
2837
}

compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)