Skip to content

Commit db08c2e

Browse files
committed
Added @Rpc annotation checks
1 parent 671990d commit db08c2e

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed

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
@@ -29,4 +29,10 @@ public void testAllFilesPresentInDiagnostics() {
2929
public void testCheckedAnnotation() {
3030
runTest("src/testData/diagnostics/checkedAnnotation.kt");
3131
}
32+
33+
@Test
34+
@TestMetadata("rpcChecked.kt")
35+
public void testRpcChecked() {
36+
runTest("src/testData/diagnostics/rpcChecked.kt");
37+
}
3238
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
FILE: rpcChecked.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 final class $rpcServiceStub : R|kotlin/Any| {
5+
public final companion object Companion : R|kotlin/Any| {
6+
}
7+
8+
}
9+
10+
}
11+
public final class NotAService : R|kotlin/Any| {
12+
public constructor(coroutineContext: R|kotlin/coroutines/CoroutineContext|): R|NotAService| {
13+
super<R|kotlin/Any|>()
14+
}
15+
16+
public final val coroutineContext: R|kotlin/coroutines/CoroutineContext| = R|<local>/coroutineContext|
17+
public get(): R|kotlin/coroutines/CoroutineContext|
18+
19+
}
20+
public final class MyServiceImpl : R|MyService| {
21+
public constructor(coroutineContext: R|kotlin/coroutines/CoroutineContext|): R|MyServiceImpl| {
22+
super<R|kotlin/Any|>()
23+
}
24+
25+
public open override val coroutineContext: R|kotlin/coroutines/CoroutineContext| = R|<local>/coroutineContext|
26+
public get(): R|kotlin/coroutines/CoroutineContext|
27+
28+
}
29+
public final inline suspend fun <@R|kotlinx/rpc/annotations/Rpc|() reified T : R|kotlin/Any|> ok(client: R|kotlinx/rpc/RpcClient|, server: R|kotlinx/rpc/RpcServer|, impl: R|T|, myServiceImpl: R|MyService|): R|kotlin/Unit| {
30+
R|<local>/client|.R|kotlinx/rpc/withService|<R|MyService|>()
31+
R|<local>/client|.R|kotlinx/rpc/withService|<R|T|>()
32+
R|<local>/server|.R|kotlinx/rpc/registerService|<R|MyService|>(<L> = registerService@fun <anonymous>(it: R|kotlin/coroutines/CoroutineContext|): R|MyService| <inline=NoInline> {
33+
^ R|/MyServiceImpl.MyServiceImpl|(R|<local>/it|)
34+
}
35+
)
36+
R|<local>/server|.R|kotlinx/rpc/registerService|<R|T|>(<L> = registerService@fun <anonymous>(it: R|kotlin/coroutines/CoroutineContext|): R|T| <inline=NoInline> {
37+
^ R|<local>/impl|
38+
}
39+
)
40+
R|<local>/myServiceImpl|.R|kotlinx/rpc/awaitFieldInitialization|<R|MyService|>()
41+
R|<local>/myServiceImpl|.R|kotlinx/rpc/awaitFieldInitialization|<R|MyService|, R|kotlin/Int|>(<L> = awaitFieldInitialization@fun R|MyService|.<anonymous>(): R|kotlin/Int| <inline=NoInline> {
42+
^ Int(1)
43+
}
44+
)
45+
R|<local>/impl|.R|kotlinx/rpc/awaitFieldInitialization|<R|T|>()
46+
R|<local>/impl|.R|kotlinx/rpc/awaitFieldInitialization|<R|T|, R|kotlin/Int|>(<L> = awaitFieldInitialization@fun R|T|.<anonymous>(): R|kotlin/Int| <inline=NoInline> {
47+
^ Int(1)
48+
}
49+
)
50+
R|kotlinx/rpc/descriptor/serviceDescriptorOf|<R|MyService|>()
51+
R|kotlinx/rpc/descriptor/serviceDescriptorOf|<R|T|>()
52+
}
53+
public final inline suspend fun <reified T : R|kotlin/Any|> fail(client: R|kotlinx/rpc/RpcClient|, server: R|kotlinx/rpc/RpcServer|, impl: R|T|, myServiceImpl: R|MyServiceImpl|, notAServiceImpl: R|NotAService|): R|kotlin/Unit| {
54+
R|<local>/client|.R|kotlinx/rpc/withService|<R|MyServiceImpl|>()
55+
R|<local>/client|.R|kotlinx/rpc/withService|<R|NotAService|>()
56+
R|<local>/client|.R|kotlinx/rpc/withService|<R|T|>()
57+
R|<local>/server|.R|kotlinx/rpc/registerService|<R|MyServiceImpl|>(<L> = registerService@fun <anonymous>(it: R|kotlin/coroutines/CoroutineContext|): R|MyServiceImpl| <inline=NoInline> {
58+
^ R|/MyServiceImpl.MyServiceImpl|(R|<local>/it|)
59+
}
60+
)
61+
R|<local>/server|.R|kotlinx/rpc/registerService|<R|NotAService|>(<L> = registerService@fun <anonymous>(it: R|kotlin/coroutines/CoroutineContext|): R|NotAService| <inline=NoInline> {
62+
^ R|/NotAService.NotAService|(R|<local>/it|)
63+
}
64+
)
65+
R|<local>/server|.R|kotlinx/rpc/registerService|<R|T|>(<L> = registerService@fun <anonymous>(it: R|kotlin/coroutines/CoroutineContext|): R|T| <inline=NoInline> {
66+
^ R|<local>/impl|
67+
}
68+
)
69+
R|<local>/myServiceImpl|.R|kotlinx/rpc/awaitFieldInitialization|<R|MyServiceImpl|>()
70+
R|<local>/myServiceImpl|.R|kotlinx/rpc/awaitFieldInitialization|<R|MyServiceImpl|, R|kotlin/Int|>(<L> = awaitFieldInitialization@fun R|MyServiceImpl|.<anonymous>(): R|kotlin/Int| <inline=NoInline> {
71+
^ Int(1)
72+
}
73+
)
74+
R|<local>/notAServiceImpl|.R|kotlinx/rpc/awaitFieldInitialization|<R|NotAService|>()
75+
R|<local>/notAServiceImpl|.R|kotlinx/rpc/awaitFieldInitialization|<R|NotAService|, R|kotlin/Int|>(<L> = awaitFieldInitialization@fun R|NotAService|.<anonymous>(): R|kotlin/Int| <inline=NoInline> {
76+
^ Int(1)
77+
}
78+
)
79+
R|<local>/impl|.R|kotlinx/rpc/awaitFieldInitialization|<R|T|>()
80+
R|<local>/impl|.R|kotlinx/rpc/awaitFieldInitialization|<R|T|, R|kotlin/Int|>(<L> = awaitFieldInitialization@fun R|T|.<anonymous>(): R|kotlin/Int| <inline=NoInline> {
81+
^ Int(1)
82+
}
83+
)
84+
R|kotlinx/rpc/descriptor/serviceDescriptorOf|<R|MyServiceImpl|>()
85+
R|kotlinx/rpc/descriptor/serviceDescriptorOf|<R|NotAService|>()
86+
R|kotlinx/rpc/descriptor/serviceDescriptorOf|<R|T|>()
87+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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.rpc.annotations.Rpc
10+
import kotlinx.rpc.withService
11+
import kotlinx.rpc.RpcClient
12+
import kotlinx.rpc.RpcServer
13+
import kotlinx.rpc.registerService
14+
import kotlinx.rpc.descriptor.serviceDescriptorOf
15+
import kotlinx.rpc.awaitFieldInitialization
16+
import kotlinx.rpc.internal.utils.ExperimentalRpcApi
17+
18+
@Rpc
19+
interface MyService
20+
21+
class NotAService(val coroutineContext: CoroutineContext)
22+
23+
class MyServiceImpl(override val coroutineContext: CoroutineContext) : MyService
24+
25+
inline suspend fun <@Rpc reified T : Any> ok(client: RpcClient, server: RpcServer, impl: T, myServiceImpl: MyService) {
26+
client.withService<MyService>()
27+
client.withService<T>()
28+
29+
server.registerService<MyService> { MyServiceImpl(it) }
30+
server.registerService<T> { impl }
31+
32+
myServiceImpl.awaitFieldInitialization<MyService>()
33+
myServiceImpl.awaitFieldInitialization<MyService, Int> { 1 }
34+
35+
impl.awaitFieldInitialization<T>()
36+
impl.awaitFieldInitialization<T, Int> { 1 }
37+
38+
serviceDescriptorOf<MyService>()
39+
serviceDescriptorOf<T>()
40+
}
41+
42+
inline suspend fun <reified T : Any> fail(client: RpcClient, server: RpcServer, impl: T, myServiceImpl: MyServiceImpl, notAServiceImpl: NotAService) {
43+
client.withService<<!CHECKED_ANNOTATION_VIOLATION!>MyServiceImpl<!>>()
44+
client.withService<<!CHECKED_ANNOTATION_VIOLATION!>NotAService<!>>()
45+
client.withService<<!CHECKED_ANNOTATION_VIOLATION!>T<!>>()
46+
47+
server.registerService<<!CHECKED_ANNOTATION_VIOLATION!>MyServiceImpl<!>> { MyServiceImpl(it) }
48+
server.registerService<<!CHECKED_ANNOTATION_VIOLATION!>NotAService<!>> { NotAService(it) }
49+
server.registerService<<!CHECKED_ANNOTATION_VIOLATION!>T<!>> { impl }
50+
51+
myServiceImpl.awaitFieldInitialization<<!CHECKED_ANNOTATION_VIOLATION!>MyServiceImpl<!>>()
52+
myServiceImpl.awaitFieldInitialization<<!CHECKED_ANNOTATION_VIOLATION!>MyServiceImpl<!>, Int> { 1 }
53+
54+
notAServiceImpl.awaitFieldInitialization<<!CHECKED_ANNOTATION_VIOLATION!>NotAService<!>>()
55+
notAServiceImpl.awaitFieldInitialization<<!CHECKED_ANNOTATION_VIOLATION!>NotAService<!>, Int> { 1 }
56+
57+
impl.awaitFieldInitialization<<!CHECKED_ANNOTATION_VIOLATION!>T<!>>()
58+
impl.awaitFieldInitialization<<!CHECKED_ANNOTATION_VIOLATION!>T<!>, Int> { 1 }
59+
60+
serviceDescriptorOf<<!CHECKED_ANNOTATION_VIOLATION!>MyServiceImpl<!>>()
61+
serviceDescriptorOf<<!CHECKED_ANNOTATION_VIOLATION!>NotAService<!>>()
62+
serviceDescriptorOf<<!CHECKED_ANNOTATION_VIOLATION!>T<!>>()
63+
}

0 commit comments

Comments
 (0)