Skip to content

Commit 347534f

Browse files
committed
Mismatch between nullable and optional parameter #378
1 parent 390b0d7 commit 347534f

File tree

10 files changed

+33
-13
lines changed

10 files changed

+33
-13
lines changed

compiler-plugin/compiler-plugin-backend/src/main/kotlin/kotlinx/rpc/codegen/extension/RpcDeclarationScanner.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclaration
1212
import org.jetbrains.kotlin.ir.declarations.IrProperty
1313
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
1414
import org.jetbrains.kotlin.ir.util.dumpKotlinLike
15+
import org.jetbrains.kotlin.ir.util.hasDefaultValue
1516

1617
/**
1718
* This class scans user declared RPC service
@@ -35,7 +36,7 @@ internal object RpcDeclarationScanner {
3536
function = declaration,
3637
arguments = ctx.versionSpecificApi.run {
3738
declaration.valueParametersVS().memoryOptimizedMap { param ->
38-
ServiceDeclaration.Method.Argument(param, param.type)
39+
ServiceDeclaration.Method.Argument(param, param.type, param.hasDefaultValue())
3940
}
4041
},
4142
)

compiler-plugin/compiler-plugin-backend/src/main/kotlin/kotlinx/rpc/codegen/extension/RpcStubGenerator.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ internal class RpcStubGenerator(
815815
values {
816816
+stringConst(parameter.value.name.asString())
817817
+irRpcTypeCall(parameter.type)
818+
+booleanConst(parameter.isOptional)
818819
+irListOfAnnotations(parameter.value)
819820
}
820821
}

compiler-plugin/compiler-plugin-backend/src/main/kotlin/kotlinx/rpc/codegen/extension/ServiceDeclaration.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class ServiceDeclaration(
3434
class Argument(
3535
val value: IrValueParameter,
3636
val type: IrType,
37+
val isOptional: Boolean,
3738
)
3839
}
3940
}

core/src/commonMain/kotlin/kotlinx/rpc/descriptor/RpcServiceDescriptor.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public sealed interface RpcInvokator<@Rpc T : Any> {
6868
public interface RpcParameter {
6969
public val name: String
7070
public val type: RpcType
71+
public val isOptional: Boolean
7172

7273
/**
7374
* List of annotations with target [AnnotationTarget.VALUE_PARAMETER].

core/src/commonMain/kotlin/kotlinx/rpc/descriptor/RpcServiceDescriptorDefault.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class RpcCallableDefault<@Rpc T : Any>(
2121
public class RpcParameterDefault(
2222
override val name: String,
2323
override val type: RpcType,
24+
override val isOptional: Boolean,
2425
override val annotations: List<Annotation>,
2526
) : RpcParameter
2627

krpc/krpc-core/src/commonMain/kotlin/kotlinx/rpc/krpc/internal/SerializationUtils.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package kotlinx.rpc.krpc.internal
@@ -15,6 +15,7 @@ import kotlinx.serialization.descriptors.buildClassSerialDescriptor
1515
import kotlinx.serialization.encoding.*
1616
import kotlinx.serialization.modules.SerializersModule
1717
import kotlin.reflect.KType
18+
import kotlin.reflect.KTypeParameter
1819

1920
@OptIn(ExperimentalSerializationApi::class)
2021
internal fun SerializersModule.buildContextualInternal(type: KType): KSerializer<Any?>? {
@@ -113,7 +114,7 @@ public class CallableParametersSerializer(
113114
elementName = param.name,
114115
descriptor = callableSerializers[i].descriptor,
115116
annotations = param.type.annotations,
116-
isOptional = param.type.kType.isMarkedNullable,
117+
isOptional = param.isOptional,
117118
)
118119
}
119120
}

krpc/krpc-test/src/commonMain/kotlin/kotlinx/rpc/krpc/test/KrpcTestService.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ interface KrpcTestService {
6060
suspend fun doubleGenericParams(arg1: List<List<String>>)
6161
suspend fun mapParams(arg1: Map<String, Map<Int, List<String>>>)
6262
suspend fun customType(arg1: TestClass): TestClass
63-
suspend fun nullable(arg1: String?): TestClass?
63+
suspend fun nullableParam(arg1: String?): String
64+
suspend fun nullableReturn(returnNull: Boolean): TestClass?
6465
suspend fun variance(arg2: TestList<in TestClass>, arg3: TestList2<TestClass>): TestList<out TestClass>?
6566

6667
suspend fun nonSerializableClass(localDate: LocalDate): LocalDate

krpc/krpc-test/src/commonMain/kotlin/kotlinx/rpc/krpc/test/KrpcTestServiceBackend.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,12 @@ class KrpcTestServiceBackend : KrpcTestService {
9797
return arg1
9898
}
9999

100-
override suspend fun nullable(arg1: String?): TestClass? {
101-
return if (arg1 == null) null else TestClass()
100+
override suspend fun nullableParam(arg1: String?): String {
101+
return arg1 ?: "null"
102+
}
103+
104+
override suspend fun nullableReturn(returnNull: Boolean): TestClass? {
105+
return if (returnNull) null else TestClass()
102106
}
103107

104108
override suspend fun variance(

krpc/krpc-test/src/commonMain/kotlin/kotlinx/rpc/krpc/test/KrpcTransportTestBase.kt

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,21 @@ abstract class KrpcTransportTestBase {
226226
}
227227

228228
@Test
229-
open fun nullable() = runTest {
230-
val result = client.nullable("test")
231-
assertEquals(TestClass(), result)
229+
open fun nullableParameter() = runTest {
230+
val result = client.nullableParam("test")
231+
assertEquals("test", result)
232+
233+
val result2 = client.nullableParam(null)
234+
assertEquals("null", result2)
235+
}
236+
237+
@Test
238+
open fun nullableReturn() = runTest {
239+
val result = client.nullableReturn(returnNull = true)
240+
assertEquals(null, result)
232241

233-
val result2 = client.nullable(null)
234-
assertEquals(null, result2)
242+
val result2 = client.nullableReturn(returnNull = false)
243+
assertEquals(TestClass(), result2)
235244
}
236245

237246
@Test
@@ -345,7 +354,7 @@ abstract class KrpcTransportTestBase {
345354
@Test
346355
open fun testNullables() = runTest {
347356
assertEquals(1, client.nullableInt(1))
348-
assertNull(client.nullable(null))
357+
assertNull(client.nullableReturn(returnNull = true))
349358
}
350359

351360
@Test

krpc/krpc-test/src/commonTest/kotlin/kotlinx/rpc/krpc/test/LocalTransportTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ProtoBufLocalTransportTest : LocalTransportTest() {
5252

5353
// 'null' is not supported in ProtoBuf
5454
@Test
55-
override fun nullable(): TestResult = runTest { }
55+
override fun nullableReturn(): TestResult = runTest { }
5656

5757
@Test
5858
override fun testByteArraySerialization(): TestResult = runTest { }

0 commit comments

Comments
 (0)