Skip to content

Commit 909f8a2

Browse files
committed
Added compiler tests for generic checks
1 parent 386bbcc commit 909f8a2

File tree

4 files changed

+181
-2
lines changed

4 files changed

+181
-2
lines changed

compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcServiceGenerator.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,10 @@ class FirRpcServiceGenerator(
187187
owner: FirClassSymbol<*>,
188188
name: Name,
189189
rpcServiceStubKey: RpcGeneratedStubKey,
190-
): FirClassLikeSymbol<*> {
190+
): FirClassLikeSymbol<*>? {
191191
val methodName = name.rpcMethodName
192-
val rpcMethod = rpcServiceStubKey.functions.single { it.name == methodName }
192+
val rpcMethod = rpcServiceStubKey.functions.singleOrNull { it.name == methodName }
193+
?: return null
193194
val rpcMethodClassKey = RpcGeneratedRpcMethodClassKey(rpcMethod)
194195
val classKind = if (rpcMethodClassKey.isObject) ClassKind.OBJECT else ClassKind.CLASS
195196

tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/DiagnosticTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ public void testRpcChecked() {
3636
runTest("src/testData/diagnostics/rpcChecked.kt");
3737
}
3838

39+
@Test
40+
@TestMetadata("rpcService.kt")
41+
public void testRpcService() {
42+
runTest("src/testData/diagnostics/rpcService.kt");
43+
}
44+
3945
@Test
4046
@TestMetadata("strictMode.kt")
4147
public void testStrictMode() {
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
FILE: rpcService.kt
2+
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlinx/rpc/internal/utils/ExperimentalRpcApi|)))
3+
@R|kotlinx/rpc/annotations/Rpc|() public abstract interface MyService : R|kotlin/Any|, R|kotlinx/rpc/RemoteService| {
4+
public abstract fun hello(): R|kotlin/Unit|
5+
6+
public abstract suspend fun <T> generic(a: R|T|): R|kotlin/Unit|
7+
8+
public abstract suspend fun <T, T2, T3, T4 : R|kotlin/collections/List<T>|> generic2(a: R|T|, b: R|kotlin/Int|, c: R|T4|, t2: R|T2|): R|T3|
9+
10+
public abstract suspend fun sameName(): R|kotlin/Unit|
11+
12+
public abstract suspend fun sameName(a: R|kotlin/Int|): R|kotlin/Unit|
13+
14+
public abstract suspend fun sameName(a: R|kotlin/Int|, b: R|kotlin/Int|): R|kotlin/Unit|
15+
16+
public abstract suspend fun sameName(a: R|kotlin/Int|, b: R|kotlin/Int|, c: R|kotlin/Int|): R|kotlin/Unit|
17+
18+
public abstract suspend fun sameName2(): R|kotlin/Unit|
19+
20+
public abstract suspend fun sameName2(a: R|kotlin/Int|): R|kotlin/Unit|
21+
22+
public final class $rpcServiceStub : R|kotlin/Any| {
23+
@R|kotlinx/serialization/Serializable|() public final object hello$rpcMethod : R|kotlin/Any| {
24+
public final fun serializer(): R|kotlinx/serialization/KSerializer<MyService.$rpcServiceStub.hello$rpcMethod>|
25+
26+
private constructor(): R|MyService.$rpcServiceStub.hello$rpcMethod| {
27+
super<R|kotlin/Any|>()
28+
}
29+
30+
}
31+
32+
@R|kotlinx/serialization/Serializable|() public final class generic$rpcMethod : R|kotlin/Any| {
33+
public final val a: R|T|
34+
public get(): R|T|
35+
36+
public constructor(a: R|T|): R|MyService.$rpcServiceStub.generic$rpcMethod|
37+
38+
public final companion object Companion : R|kotlin/Any| {
39+
public final fun serializer(): R|kotlinx/serialization/KSerializer<MyService.$rpcServiceStub.generic$rpcMethod>|
40+
41+
private constructor(): R|MyService.$rpcServiceStub.generic$rpcMethod.Companion| {
42+
super<R|kotlin/Any|>()
43+
}
44+
45+
}
46+
47+
@R|kotlin/Deprecated|(message = String(This synthesized declaration should not be used directly), level = Q|kotlin/DeprecationLevel|.R|kotlin/DeprecationLevel.HIDDEN|) public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<MyService.$rpcServiceStub.generic$rpcMethod>| {
48+
public final override fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|MyService.$rpcServiceStub.generic$rpcMethod|): R|kotlin/Unit|
49+
50+
public final override fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|MyService.$rpcServiceStub.generic$rpcMethod|
51+
52+
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
53+
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
54+
55+
public final override fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
56+
57+
private constructor(): R|MyService.$rpcServiceStub.generic$rpcMethod.$serializer| {
58+
super<R|kotlin/Any|>()
59+
}
60+
61+
}
62+
63+
}
64+
65+
@R|kotlinx/serialization/Serializable|() public final class generic2$rpcMethod : R|kotlin/Any| {
66+
public final val a: R|T|
67+
public get(): R|T|
68+
69+
public final val b: R|kotlin/Int|
70+
public get(): R|kotlin/Int|
71+
72+
public final val c: R|T4|
73+
public get(): R|T4|
74+
75+
public final val t2: R|T2|
76+
public get(): R|T2|
77+
78+
public constructor(a: R|T|, b: R|kotlin/Int|, c: R|T4|, t2: R|T2|): R|MyService.$rpcServiceStub.generic2$rpcMethod|
79+
80+
public final companion object Companion : R|kotlin/Any| {
81+
public final fun serializer(): R|kotlinx/serialization/KSerializer<MyService.$rpcServiceStub.generic2$rpcMethod>|
82+
83+
private constructor(): R|MyService.$rpcServiceStub.generic2$rpcMethod.Companion| {
84+
super<R|kotlin/Any|>()
85+
}
86+
87+
}
88+
89+
@R|kotlin/Deprecated|(message = String(This synthesized declaration should not be used directly), level = Q|kotlin/DeprecationLevel|.R|kotlin/DeprecationLevel.HIDDEN|) public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<MyService.$rpcServiceStub.generic2$rpcMethod>| {
90+
public final override fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|MyService.$rpcServiceStub.generic2$rpcMethod|): R|kotlin/Unit|
91+
92+
public final override fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|MyService.$rpcServiceStub.generic2$rpcMethod|
93+
94+
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
95+
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
96+
97+
public final override fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
98+
99+
private constructor(): R|MyService.$rpcServiceStub.generic2$rpcMethod.$serializer| {
100+
super<R|kotlin/Any|>()
101+
}
102+
103+
}
104+
105+
}
106+
107+
public final companion object Companion : R|kotlin/Any| {
108+
}
109+
110+
}
111+
112+
}
113+
@R|kotlinx/rpc/annotations/Rpc|() public abstract interface MyServiceT<T> : R|kotlin/Any|, R|kotlinx/rpc/RemoteService| {
114+
public final class $rpcServiceStub : R|kotlin/Any| {
115+
public final companion object Companion : R|kotlin/Any| {
116+
}
117+
118+
}
119+
120+
}
121+
@R|kotlinx/rpc/annotations/Rpc|() public abstract interface MyServiceT2<T, R, A, B> : R|kotlin/Any|, R|kotlinx/rpc/RemoteService| {
122+
public final class $rpcServiceStub : R|kotlin/Any| {
123+
public final companion object Companion : R|kotlin/Any| {
124+
}
125+
126+
}
127+
128+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
@file:OptIn(ExperimentalRpcApi::class)
6+
7+
import kotlin.coroutines.*
8+
import kotlinx.coroutines.*
9+
import kotlinx.coroutines.flow.*
10+
import kotlinx.serialization.Serializable
11+
import kotlinx.serialization.Contextual
12+
import kotlinx.rpc.annotations.Rpc
13+
import kotlinx.rpc.krpc.streamScoped
14+
import kotlinx.rpc.krpc.withStreamScope
15+
import kotlinx.rpc.krpc.StreamScope
16+
import kotlinx.rpc.krpc.invokeOnStreamScopeCompletion
17+
import kotlinx.rpc.internal.utils.ExperimentalRpcApi
18+
19+
@Rpc
20+
interface MyService {
21+
<!NON_SUSPENDING_REQUEST_WITHOUT_STREAMING_RETURN_TYPE!>fun hello()<!>
22+
23+
suspend fun <!TYPE_PARAMETERS_IN_RPC_FUNCTION!><T><!> generic(a: T)
24+
25+
suspend fun <!TYPE_PARAMETERS_IN_RPC_FUNCTION!><T, T2, T3, T4 : List<T>><!> generic2(a: T, b: Int, c: T4, t2: T2): T3
26+
27+
<!AD_HOC_POLYMORPHISM_IN_RPC_SERVICE!>suspend fun sameName()<!>
28+
29+
<!AD_HOC_POLYMORPHISM_IN_RPC_SERVICE!>suspend fun sameName(a: Int)<!>
30+
31+
<!AD_HOC_POLYMORPHISM_IN_RPC_SERVICE!>suspend fun sameName(a: Int, b: Int)<!>
32+
33+
<!AD_HOC_POLYMORPHISM_IN_RPC_SERVICE!>suspend fun sameName(a: Int, b: Int, c: Int)<!>
34+
35+
<!AD_HOC_POLYMORPHISM_IN_RPC_SERVICE!>suspend fun sameName2()<!>
36+
37+
<!AD_HOC_POLYMORPHISM_IN_RPC_SERVICE!>suspend fun sameName2(a: Int)<!>
38+
}
39+
40+
@Rpc
41+
interface MyServiceT<!TYPE_PARAMETERS_IN_RPC_INTERFACE!><T><!>
42+
43+
@Rpc
44+
interface MyServiceT2<!TYPE_PARAMETERS_IN_RPC_INTERFACE!><T, R, A, B><!>

0 commit comments

Comments
 (0)