Skip to content

Commit f213992

Browse files
committed
Add return type to await()
1 parent 0012ba2 commit f213992

File tree

3 files changed

+122
-107
lines changed

3 files changed

+122
-107
lines changed

harness/tests/test/unit/test_coroutines.gd

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,25 @@ extends "res://addons/gut/test.gd"
44
func test_coroutine_await():
55
var test_script: Object = CoroutineTest.new()
66

7-
assert_eq(test_script.int, 0, "Property should be 0 at first.")
7+
assert_eq(test_script.step, 0, "Property should be 0 at first.")
88

99
test_script.start_coroutine_without_parameter()
10-
assert_eq(test_script.int, 1, "Property should be 1 after coroutine started but waiting.")
10+
assert_eq(test_script.step, 1, "Property should be 1 after coroutine started but waiting.")
1111

1212
test_script.signal_without_parameter.emit()
1313
await get_tree().create_timer(1).timeout
14-
assert_eq(test_script.int, 2, "Property should be 2 after coroutine ran and signal triggered.")
14+
assert_eq(test_script.step, 2, "Property should be 2 after coroutine ran and signal triggered.")
1515

1616
test_script.start_coroutine_with_parameters()
17-
assert_eq(test_script.int, 3, "Property should be 3 after coroutine started but waiting.")
17+
assert_eq(test_script.step, 3, "Property should be 3 after coroutine started but waiting.")
1818

19-
test_script.signal_with_parameters.emit()
19+
test_script.signal_with_parameters.emit(4, "test")
2020
await get_tree().create_timer(1).timeout
21-
assert_eq(test_script.int, 4, "Property should be 4 after coroutine ran.")
21+
assert_eq(test_script.step, 4, "Property should be 4 after coroutine ran.")
22+
23+
test_script.start_coroutine_with_many_parameters()
24+
assert_eq(test_script.step, 5, "Property should be 3 after coroutine started but waiting.")
25+
26+
test_script.signal_with_many_parameters.emit(6, 0.1, Vector2(0,0), "test")
27+
await get_tree().create_timer(1).timeout
28+
assert_eq(test_script.step, 6, "Property should be 4 after coroutine ran.")

kt/api-generator/src/main/kotlin/godot/codegen/services/impl/AwaitGenerationService.kt

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package godot.codegen.services.impl
22

3+
import com.squareup.kotlinpoet.ANY
34
import com.squareup.kotlinpoet.AnnotationSpec
45
import com.squareup.kotlinpoet.ClassName
56
import com.squareup.kotlinpoet.FileSpec
67
import com.squareup.kotlinpoet.FunSpec
78
import com.squareup.kotlinpoet.KModifier
9+
import com.squareup.kotlinpoet.LIST
810
import com.squareup.kotlinpoet.MemberName
911
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
12+
import com.squareup.kotlinpoet.TypeName
1013
import com.squareup.kotlinpoet.TypeVariableName
1114
import com.squareup.kotlinpoet.UNIT
1215
import godot.codegen.services.IAwaitGenerationService
@@ -29,7 +32,6 @@ object AwaitGenerationService : IAwaitGenerationService {
2932
}.toList()
3033

3134
for (argCount in 0..maxArgumentCount) {
32-
3335
val parameters = allParameters.take(argCount)
3436

3537
val baseReceiver = ClassName(godotCorePackage, signal + argCount)
@@ -39,6 +41,14 @@ object AwaitGenerationService : IAwaitGenerationService {
3941
baseReceiver
4042
}
4143

44+
val returnType = when (argCount) {
45+
1 -> parameters[0]
46+
2 -> ClassName("kotlin", "Pair").parameterizedBy(parameters)
47+
3 -> ClassName("kotlin", "Triple").parameterizedBy(parameters)
48+
in 4 .. maxArgumentCount -> LIST.parameterizedBy(ANY.copy(nullable = true))
49+
else -> UNIT
50+
}
51+
4252
awaitFile.addFunction(
4353
FunSpec.builder("await")
4454
.addModifiers(KModifier.SUSPEND, KModifier.INLINE)
@@ -48,7 +58,8 @@ object AwaitGenerationService : IAwaitGenerationService {
4858
addTypeVariables(parameters)
4959
}
5060
}
51-
.generateBody(argCount)
61+
.generateBody(argCount, returnType)
62+
.returns(returnType)
5263
.build()
5364
)
5465
}
@@ -63,7 +74,8 @@ object AwaitGenerationService : IAwaitGenerationService {
6374
}
6475

6576

66-
private fun FunSpec.Builder.generateBody(argCount: Int): FunSpec.Builder {
77+
private fun FunSpec.Builder.generateBody(argCount: Int, returnType: TypeName): FunSpec.Builder {
78+
// Build `p0, p1, ..., px`
6779
val lambdaParameters = buildString {
6880
for (i in 0 until argCount) {
6981
if (i != 0) {
@@ -73,12 +85,21 @@ object AwaitGenerationService : IAwaitGenerationService {
7385
}
7486
}
7587

88+
// Build what is inserted into the `resume()` method : `Unit`, `po`, `Pair(p0, P1)`, `Triple(p0, p1, p2)`, `listOf(p0, p1, p2, p3), etc..`
89+
val resumeParameters = when (argCount) {
90+
0 -> "Unit"
91+
1 -> lambdaParameters
92+
2 -> "Pair($lambdaParameters)"
93+
3 -> "Triple($lambdaParameters)"
94+
in 4 .. Int.MAX_VALUE -> "listOf($lambdaParameters)"
95+
else -> ""
96+
}
97+
7698
return this
77-
.addStatement("%M { cont: %T<%T> ->", suspendCancellableCoroutine, cancellableContinuationClass, UNIT)
78-
.addStatement(" %M(%T.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { $lambdaParameters ->", connect, GODOT_OBJECT)
79-
.addStatement(" cont.%M(%T)", resume, UNIT)
80-
.addStatement(" }")
81-
.addStatement("}")
82-
.returns(UNIT)
99+
.beginControlFlow("return %M { cont: %T<%T> ->", suspendCancellableCoroutine, cancellableContinuationClass, returnType)
100+
.beginControlFlow("%M(%T.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { $lambdaParameters ->", connect, GODOT_OBJECT)
101+
.addStatement("cont.%M($resumeParameters)", resume)
102+
.endControlFlow()
103+
.endControlFlow()
83104
}
84105
}

kt/godot-coroutine-library/src/main/kotlin/gen/godot/coroutines/Await.kt

Lines changed: 79 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -21,174 +21,161 @@ import godot.core.Signal7
2121
import godot.core.Signal8
2222
import godot.core.Signal9
2323
import godot.core.connect
24+
import kotlin.Any
25+
import kotlin.Pair
2426
import kotlin.Suppress
27+
import kotlin.Triple
2528
import kotlin.Unit
29+
import kotlin.collections.List
2630
import kotlin.coroutines.resume
2731
import kotlinx.coroutines.CancellableContinuation
2832
import kotlinx.coroutines.suspendCancellableCoroutine
2933

30-
public suspend inline fun Signal0.await(): Unit {
31-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
32-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { ->
33-
cont.resume(Unit)
34-
}
34+
public suspend inline fun Signal0.await(): Unit = suspendCancellableCoroutine { cont:
35+
CancellableContinuation<Unit> ->
36+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { ->
37+
cont.resume(Unit)
3538
}
3639
}
3740

38-
public suspend inline fun <reified P0> Signal1<P0>.await(): Unit {
39-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
40-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0 ->
41-
cont.resume(Unit)
42-
}
41+
public suspend inline fun <reified P0> Signal1<P0>.await(): P0 = suspendCancellableCoroutine { cont:
42+
CancellableContinuation<P0> ->
43+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0 ->
44+
cont.resume(p0)
4345
}
4446
}
4547

46-
public suspend inline fun <reified P0, reified P1> Signal2<P0, P1>.await(): Unit {
47-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
48-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1 ->
49-
cont.resume(Unit)
50-
}
48+
public suspend inline fun <reified P0, reified P1> Signal2<P0, P1>.await(): Pair<P0, P1> =
49+
suspendCancellableCoroutine { cont: CancellableContinuation<Pair<P0, P1>> ->
50+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1 ->
51+
cont.resume(Pair(p0, p1))
5152
}
5253
}
5354

54-
public suspend inline fun <reified P0, reified P1, reified P2> Signal3<P0, P1, P2>.await(): Unit {
55-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
56-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2 ->
57-
cont.resume(Unit)
58-
}
55+
public suspend inline fun <reified P0, reified P1, reified P2> Signal3<P0, P1, P2>.await():
56+
Triple<P0, P1, P2> = suspendCancellableCoroutine { cont:
57+
CancellableContinuation<Triple<P0, P1, P2>> ->
58+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2 ->
59+
cont.resume(Triple(p0, p1, p2))
5960
}
6061
}
6162

6263
public suspend inline fun <reified P0, reified P1, reified P2, reified P3>
63-
Signal4<P0, P1, P2, P3>.await(): Unit {
64-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
65-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3 ->
66-
cont.resume(Unit)
67-
}
64+
Signal4<P0, P1, P2, P3>.await(): List<Any?> = suspendCancellableCoroutine { cont:
65+
CancellableContinuation<List<Any?>> ->
66+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3 ->
67+
cont.resume(listOf(p0, p1, p2, p3))
6868
}
6969
}
7070

7171
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4>
72-
Signal5<P0, P1, P2, P3, P4>.await(): Unit {
73-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
74-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4 ->
75-
cont.resume(Unit)
76-
}
72+
Signal5<P0, P1, P2, P3, P4>.await(): List<Any?> = suspendCancellableCoroutine { cont:
73+
CancellableContinuation<List<Any?>> ->
74+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4 ->
75+
cont.resume(listOf(p0, p1, p2, p3, p4))
7776
}
7877
}
7978

8079
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5>
81-
Signal6<P0, P1, P2, P3, P4, P5>.await(): Unit {
82-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
83-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5 ->
84-
cont.resume(Unit)
85-
}
80+
Signal6<P0, P1, P2, P3, P4, P5>.await(): List<Any?> = suspendCancellableCoroutine { cont:
81+
CancellableContinuation<List<Any?>> ->
82+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5 ->
83+
cont.resume(listOf(p0, p1, p2, p3, p4, p5))
8684
}
8785
}
8886

8987
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
90-
reified P6> Signal7<P0, P1, P2, P3, P4, P5, P6>.await(): Unit {
91-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
92-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6 ->
93-
cont.resume(Unit)
94-
}
88+
reified P6> Signal7<P0, P1, P2, P3, P4, P5, P6>.await(): List<Any?> =
89+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
90+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6 ->
91+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6))
9592
}
9693
}
9794

9895
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
99-
reified P6, reified P7> Signal8<P0, P1, P2, P3, P4, P5, P6, P7>.await(): Unit {
100-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
101-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7 ->
102-
cont.resume(Unit)
103-
}
96+
reified P6, reified P7> Signal8<P0, P1, P2, P3, P4, P5, P6, P7>.await(): List<Any?> =
97+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
98+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7 ->
99+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7))
104100
}
105101
}
106102

107103
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
108-
reified P6, reified P7, reified P8> Signal9<P0, P1, P2, P3, P4, P5, P6, P7, P8>.await(): Unit {
109-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
110-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7,
111-
p8 ->
112-
cont.resume(Unit)
113-
}
104+
reified P6, reified P7, reified P8> Signal9<P0, P1, P2, P3, P4, P5, P6, P7, P8>.await():
105+
List<Any?> = suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
106+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8 ->
107+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8))
114108
}
115109
}
116110

117111
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
118112
reified P6, reified P7, reified P8, reified P9>
119-
Signal10<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9>.await(): Unit {
120-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
121-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
113+
Signal10<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9>.await(): List<Any?> =
114+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
115+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
122116
p9 ->
123-
cont.resume(Unit)
124-
}
117+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9))
125118
}
126119
}
127120

128121
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
129122
reified P6, reified P7, reified P8, reified P9, reified P10>
130-
Signal11<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>.await(): Unit {
131-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
132-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
133-
p9, p10 ->
134-
cont.resume(Unit)
135-
}
123+
Signal11<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>.await(): List<Any?> =
124+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
125+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
126+
p10 ->
127+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))
136128
}
137129
}
138130

139131
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
140132
reified P6, reified P7, reified P8, reified P9, reified P10, reified P11>
141-
Signal12<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11>.await(): Unit {
142-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
143-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
144-
p9, p10, p11 ->
145-
cont.resume(Unit)
146-
}
133+
Signal12<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11>.await(): List<Any?> =
134+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
135+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
136+
p10, p11 ->
137+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11))
147138
}
148139
}
149140

150141
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
151142
reified P6, reified P7, reified P8, reified P9, reified P10, reified P11, reified P12>
152-
Signal13<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12>.await(): Unit {
153-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
154-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
155-
p9, p10, p11, p12 ->
156-
cont.resume(Unit)
157-
}
143+
Signal13<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12>.await(): List<Any?> =
144+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
145+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
146+
p10, p11, p12 ->
147+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12))
158148
}
159149
}
160150

161151
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
162152
reified P6, reified P7, reified P8, reified P9, reified P10, reified P11, reified P12, reified
163-
P13> Signal14<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13>.await(): Unit {
164-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
165-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
166-
p9, p10, p11, p12, p13 ->
167-
cont.resume(Unit)
168-
}
153+
P13> Signal14<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13>.await(): List<Any?> =
154+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
155+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
156+
p10, p11, p12, p13 ->
157+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13))
169158
}
170159
}
171160

172161
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
173162
reified P6, reified P7, reified P8, reified P9, reified P10, reified P11, reified P12, reified
174163
P13, reified P14>
175-
Signal15<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14>.await(): Unit {
176-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
177-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
178-
p9, p10, p11, p12, p13, p14 ->
179-
cont.resume(Unit)
180-
}
164+
Signal15<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14>.await(): List<Any?> =
165+
suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
166+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
167+
p10, p11, p12, p13, p14 ->
168+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14))
181169
}
182170
}
183171

184172
public suspend inline fun <reified P0, reified P1, reified P2, reified P3, reified P4, reified P5,
185173
reified P6, reified P7, reified P8, reified P9, reified P10, reified P11, reified P12, reified
186174
P13, reified P14, reified P15>
187-
Signal16<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15>.await(): Unit {
188-
suspendCancellableCoroutine { cont: CancellableContinuation<Unit> ->
189-
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8,
190-
p9, p10, p11, p12, p13, p14, p15 ->
191-
cont.resume(Unit)
192-
}
175+
Signal16<P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15>.await():
176+
List<Any?> = suspendCancellableCoroutine { cont: CancellableContinuation<List<Any?>> ->
177+
connect(Object.ConnectFlags.CONNECT_ONE_SHOT.id.toInt()) { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
178+
p10, p11, p12, p13, p14, p15 ->
179+
cont.resume(listOf(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15))
193180
}
194181
}

0 commit comments

Comments
 (0)