Skip to content

Commit 8a2374f

Browse files
authored
Expose RpcServiceDescriptor.callables (#516)
1 parent 5cd7466 commit 8a2374f

File tree

14 files changed

+438
-57
lines changed

14 files changed

+438
-57
lines changed

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,18 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildField
1111
import org.jetbrains.kotlin.ir.declarations.*
1212
import org.jetbrains.kotlin.ir.expressions.IrExpression
1313
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
14+
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
1415
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
16+
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
1517
import org.jetbrains.kotlin.ir.types.IrType
1618
import org.jetbrains.kotlin.ir.types.IrTypeArgument
1719
import org.jetbrains.kotlin.ir.types.IrTypeProjection
1820
import org.jetbrains.kotlin.ir.types.SimpleTypeNullability
1921
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
2022
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
2123
import org.jetbrains.kotlin.ir.util.dump
24+
import org.jetbrains.kotlin.ir.util.properties
2225
import org.jetbrains.kotlin.types.Variance
23-
import java.util.*
2426

2527
fun IrClassifierSymbol.typeWith(type: IrType, variance: Variance): IrType {
2628
return IrSimpleTypeImpl(
@@ -31,9 +33,10 @@ fun IrClassifierSymbol.typeWith(type: IrType, variance: Variance): IrType {
3133
)
3234
}
3335

34-
val IrProperty.getterOrFail: IrSimpleFunction get () {
35-
return getter ?: error("'getter' should be present, but was null: ${dump()}")
36-
}
36+
val IrProperty.getterOrFail: IrSimpleFunction
37+
get() {
38+
return getter ?: error("'getter' should be present, but was null: ${dump()}")
39+
}
3740

3841
fun IrProperty.addDefaultGetter(
3942
parentClass: IrClass,
@@ -95,3 +98,6 @@ fun <T> List<T>.compactIfPossible(): List<T> =
9598
@Suppress("EXTENSION_SHADOWED_BY_MEMBER") // TODO(KTIJ-26314): Remove this suppression
9699
fun IrFactory.createExpressionBody(expression: IrExpression): IrExpressionBody =
97100
createExpressionBody(expression.startOffset, expression.endOffset, expression)
101+
102+
fun IrClassSymbol.findPropertyByName(name: String): IrPropertySymbol? =
103+
owner.properties.singleOrNull { it.name.asString() == name }?.symbol

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

Lines changed: 75 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,64 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
1313
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
1414
import org.jetbrains.kotlin.descriptors.Modality
1515
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
16-
import org.jetbrains.kotlin.ir.builders.*
17-
import org.jetbrains.kotlin.ir.builders.declarations.*
18-
import org.jetbrains.kotlin.ir.declarations.*
19-
import org.jetbrains.kotlin.ir.expressions.*
20-
import org.jetbrains.kotlin.ir.expressions.impl.*
16+
import org.jetbrains.kotlin.ir.builders.IrBlockBodyBuilder
17+
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
18+
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
19+
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
20+
import org.jetbrains.kotlin.ir.builders.declarations.addProperty
21+
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
22+
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
23+
import org.jetbrains.kotlin.ir.builders.irAs
24+
import org.jetbrains.kotlin.ir.builders.irBlockBody
25+
import org.jetbrains.kotlin.ir.builders.irCall
26+
import org.jetbrains.kotlin.ir.builders.irCallConstructor
27+
import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall
28+
import org.jetbrains.kotlin.ir.builders.irGet
29+
import org.jetbrains.kotlin.ir.builders.irReturn
30+
import org.jetbrains.kotlin.ir.builders.irVararg
31+
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
32+
import org.jetbrains.kotlin.ir.declarations.IrClass
33+
import org.jetbrains.kotlin.ir.declarations.IrConstructor
34+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
35+
import org.jetbrains.kotlin.ir.declarations.IrFunction
36+
import org.jetbrains.kotlin.ir.declarations.IrProperty
37+
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
38+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
39+
import org.jetbrains.kotlin.ir.expressions.IrCall
40+
import org.jetbrains.kotlin.ir.expressions.IrClassReference
41+
import org.jetbrains.kotlin.ir.expressions.IrExpression
42+
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
43+
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
44+
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
45+
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
46+
import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl
47+
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
48+
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
49+
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionExpressionImpl
50+
import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl
51+
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
52+
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
53+
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
54+
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
55+
import org.jetbrains.kotlin.ir.expressions.putConstructorTypeArgument
2156
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
2257
import org.jetbrains.kotlin.ir.symbols.IrSymbol
2358
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
24-
import org.jetbrains.kotlin.ir.types.*
25-
import org.jetbrains.kotlin.ir.util.*
59+
import org.jetbrains.kotlin.ir.types.IrSimpleType
60+
import org.jetbrains.kotlin.ir.types.IrType
61+
import org.jetbrains.kotlin.ir.types.classOrNull
62+
import org.jetbrains.kotlin.ir.types.createType
63+
import org.jetbrains.kotlin.ir.types.defaultType
64+
import org.jetbrains.kotlin.ir.types.typeWith
65+
import org.jetbrains.kotlin.ir.util.classId
66+
import org.jetbrains.kotlin.ir.util.companionObject
67+
import org.jetbrains.kotlin.ir.util.constructors
68+
import org.jetbrains.kotlin.ir.util.defaultType
69+
import org.jetbrains.kotlin.ir.util.dumpKotlinLike
70+
import org.jetbrains.kotlin.ir.util.functions
71+
import org.jetbrains.kotlin.ir.util.getPropertyGetter
72+
import org.jetbrains.kotlin.ir.util.isObject
73+
import org.jetbrains.kotlin.ir.util.primaryConstructor
2674
import org.jetbrains.kotlin.name.Name
2775
import org.jetbrains.kotlin.name.SpecialNames
2876
import org.jetbrains.kotlin.types.Variance
@@ -35,7 +83,7 @@ private object Stub {
3583
}
3684

3785
private object Descriptor {
38-
const val CALLABLE_MAP = "callableMap"
86+
const val CALLABLES = "callables"
3987
const val FQ_NAME = "fqName"
4088
const val GET_CALLABLE = "getCallable"
4189
const val CREATE_INSTANCE = "createInstance"
@@ -476,7 +524,7 @@ internal class RpcStubGenerator(
476524

477525
generateInvokators()
478526

479-
generateCallableMapProperty()
527+
generateCallablesProperty()
480528

481529
generateGetCallableFunction()
482530

@@ -650,32 +698,37 @@ internal class RpcStubGenerator(
650698
}
651699
}
652700

653-
private var callableMap: IrProperty by Delegates.notNull()
701+
private var callables: IrProperty by Delegates.notNull()
654702

655703
/**
656704
* Callable names map.
657705
* A map that holds an RpcCallable that describes it.
658706
*
659707
* ```kotlin
660-
* private val callableMap: Map<String, RpcCallable<MyService>> = mapOf(
708+
* override val callables: Map<String, RpcCallable<MyService>> = mapOf(
661709
* Pair("<callable-name-1>", RpcCallable(...)),
662710
* ...
663711
* Pair("<callable-name-n>", RpcCallable(...)),
664712
* )
665713
*
666714
* // when n=0:
667-
* private val callableMap: Map<String, RpcCallable<MyService>> = emptyMap()
715+
* private val callables: Map<String, RpcCallable<MyService>> = emptyMap()
668716
* ```
669717
*
670718
* Where:
671719
* - `<callable-name-k>` - the name of the k-th callable in the service
672720
*/
673-
private fun IrClass.generateCallableMapProperty() {
674-
callableMap = addProperty {
675-
name = Name.identifier(Descriptor.CALLABLE_MAP)
721+
private fun IrClass.generateCallablesProperty() {
722+
val interfaceProperty = ctx.rpcServiceDescriptor.findPropertyByName(Descriptor.CALLABLES)
723+
?: error("Expected RpcServiceDescriptor.callables property to exist")
724+
725+
callables = addProperty {
726+
name = Name.identifier(Descriptor.CALLABLES)
676727
visibility = DescriptorVisibilities.PRIVATE
677728
modality = Modality.FINAL
678729
}.apply {
730+
overriddenSymbols = listOf(interfaceProperty)
731+
679732
val rpcCallableType = ctx.rpcCallable.typeWith(declaration.serviceType)
680733
val mapType = ctx.irBuiltIns.mapClass.typeWith(ctx.irBuiltIns.stringType, rpcCallableType)
681734

@@ -698,8 +751,10 @@ internal class RpcStubGenerator(
698751
)
699752
}
700753

701-
addDefaultGetter(this@generateCallableMapProperty, ctx.irBuiltIns) {
702-
visibility = DescriptorVisibilities.PRIVATE
754+
addDefaultGetter(this@generateCallablesProperty, ctx.irBuiltIns) {
755+
visibility =
756+
DescriptorVisibilities.PUBLIC
757+
overriddenSymbols = listOf(ctx.rpcServiceDescriptor.getPropertyGetter(Descriptor.CALLABLES)!!)
703758
}
704759
}
705760
}
@@ -887,11 +942,11 @@ internal class RpcStubGenerator(
887942
}
888943

889944
/**
890-
* Accessor function for the `callableMap` property
945+
* Accessor function for the `callables` property
891946
* Defined in `RpcServiceDescriptor`
892947
*
893948
* ```kotlin
894-
* final override fun getCallable(name: String): RpcCallable<MyService>? = callableMap[name]
949+
* final override fun getCallable(name: String): RpcCallable<MyService>? = callables[name]
895950
* ```
896951
*/
897952
private fun IrClass.generateGetCallableFunction() {
@@ -926,7 +981,7 @@ internal class RpcStubGenerator(
926981
arguments {
927982
dispatchReceiver = irCallProperty(
928983
clazz = this@generateGetCallableFunction,
929-
property = callableMap,
984+
property = callables,
930985
symbol = functionThisReceiver.symbol,
931986
)
932987

core/api/core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public abstract interface class kotlinx/rpc/descriptor/RpcParameter {
5555
public abstract interface class kotlinx/rpc/descriptor/RpcServiceDescriptor {
5656
public abstract fun createInstance (JLkotlinx/rpc/RpcClient;)Ljava/lang/Object;
5757
public abstract fun getCallable (Ljava/lang/String;)Lkotlinx/rpc/descriptor/RpcCallable;
58+
public abstract fun getCallableMap ()Ljava/util/Map;
5859
public abstract fun getFqName ()Ljava/lang/String;
5960
}
6061

core/api/core.klib.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ abstract interface <#A: kotlin/Any> kotlinx.rpc.descriptor/RpcCallable { // kotl
2828
}
2929

3030
abstract interface <#A: kotlin/Any> kotlinx.rpc.descriptor/RpcServiceDescriptor { // kotlinx.rpc.descriptor/RpcServiceDescriptor|null[0]
31+
abstract val callableMap // kotlinx.rpc.descriptor/RpcServiceDescriptor.callableMap|{}callableMap[0]
32+
abstract fun <get-callableMap>(): kotlin.collections/Map<kotlin/String, kotlinx.rpc.descriptor/RpcCallable<#A>> // kotlinx.rpc.descriptor/RpcServiceDescriptor.callableMap.<get-callableMap>|<get-callableMap>(){}[0]
3133
abstract val fqName // kotlinx.rpc.descriptor/RpcServiceDescriptor.fqName|{}fqName[0]
3234
abstract fun <get-fqName>(): kotlin/String // kotlinx.rpc.descriptor/RpcServiceDescriptor.fqName.<get-fqName>|<get-fqName>(){}[0]
3335

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public interface RpcServiceDescriptor<@Rpc T : Any> {
4444

4545
public fun getCallable(name: String): RpcCallable<T>?
4646

47+
public val callables: Map<String, RpcCallable<T>>
48+
4749
public fun createInstance(serviceId: Long, client: RpcClient): T
4850
}
4951

tests/compiler-plugin-tests/build.gradle.kts

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

5-
import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
5+
import org.jetbrains.kotlin.gradle.dsl.*
66
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
77

88
plugins {
@@ -110,6 +110,12 @@ tasks.test {
110110
dependsOn(project(":core").tasks.getByName("jvmJar"))
111111
dependsOn(project(":utils").tasks.getByName("jvmJar"))
112112
dependsOn(project(":krpc:krpc-core").tasks.getByName("jvmJar"))
113+
dependsOn("generateTests")
114+
115+
inputs.dir("src/testData")
116+
.ignoreEmptyDirectories()
117+
.normalizeLineEndings()
118+
.withPathSensitivity(PathSensitivity.RELATIVE)
113119

114120
useJUnitPlatform()
115121

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ public void testMultiModule() {
3939
runTest("src/testData/box/multiModule.kt");
4040
}
4141

42+
@Test
43+
@TestMetadata("serviceDescriptor.kt")
44+
public void testServiceDescriptor() {
45+
runTest("src/testData/box/serviceDescriptor.kt");
46+
}
47+
4248
@Test
4349
@TestMetadata("simple.kt")
4450
public void testSimple() {

tests/compiler-plugin-tests/src/testData/box/customParameterTypes.fir.ir.txt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,10 @@ FILE fqName:<root> fileName:/customParameterTypes.kt
179179
RETURN type=kotlin.Nothing from='private final fun <get-test2Invokator> (): kotlinx.rpc.descriptor.RpcInvokator.Method<<root>.BoxService> declared in <root>.BoxService.$rpcServiceStub.Companion'
180180
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test2Invokator type:kotlinx.rpc.descriptor.RpcInvokator.Method<<root>.BoxService> visibility:private [final]' type=kotlinx.rpc.descriptor.RpcInvokator.Method<<root>.BoxService> origin=null
181181
receiver: GET_VAR '<this>: <root>.BoxService.$rpcServiceStub.Companion declared in <root>.BoxService.$rpcServiceStub.Companion.<get-test2Invokator>' type=<root>.BoxService.$rpcServiceStub.Companion origin=null
182-
PROPERTY name:callableMap visibility:private modality:FINAL [val]
183-
FIELD PROPERTY_BACKING_FIELD name:callableMap type:kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> visibility:private [final]
182+
PROPERTY name:callables visibility:private modality:FINAL [val]
183+
overridden:
184+
public abstract callables: kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<T of kotlinx.rpc.descriptor.RpcServiceDescriptor>> declared in kotlinx.rpc.descriptor.RpcServiceDescriptor
185+
FIELD PROPERTY_BACKING_FIELD name:callables type:kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> visibility:private [final]
184186
EXPRESSION_BODY
185187
CALL 'public final fun mapOf <K, V> (vararg pairs: kotlin.Pair<K of kotlin.collections.mapOf, V of kotlin.collections.mapOf>): kotlin.collections.Map<K of kotlin.collections.mapOf, V of kotlin.collections.mapOf> declared in kotlin.collections' type=kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> origin=null
186188
TYPE_ARG K: kotlin.String
@@ -242,13 +244,15 @@ FILE fqName:<root> fileName:/customParameterTypes.kt
242244
ARG annotations: CALL 'public final fun emptyList <T> (): kotlin.collections.List<T of kotlin.collections.emptyList> declared in kotlin.collections' type=kotlin.collections.List<kotlin.Annotation> origin=null
243245
TYPE_ARG T: <none>
244246
ARG isNonSuspendFunction: CONST Boolean type=kotlin.Boolean value=false
245-
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-callableMap> visibility:private modality:FINAL returnType:kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>>
247+
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-callables> visibility:public modality:FINAL returnType:kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>>
246248
VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:<root>.BoxService.$rpcServiceStub.Companion
247-
correspondingProperty: PROPERTY name:callableMap visibility:private modality:FINAL [val]
249+
correspondingProperty: PROPERTY name:callables visibility:private modality:FINAL [val]
250+
overridden:
251+
public abstract fun <get-callables> (): kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<T of kotlinx.rpc.descriptor.RpcServiceDescriptor>> declared in kotlinx.rpc.descriptor.RpcServiceDescriptor
248252
BLOCK_BODY
249-
RETURN type=kotlin.Nothing from='private final fun <get-callableMap> (): kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> declared in <root>.BoxService.$rpcServiceStub.Companion'
250-
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:callableMap type:kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> visibility:private [final]' type=kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> origin=null
251-
receiver: GET_VAR '<this>: <root>.BoxService.$rpcServiceStub.Companion declared in <root>.BoxService.$rpcServiceStub.Companion.<get-callableMap>' type=<root>.BoxService.$rpcServiceStub.Companion origin=null
253+
RETURN type=kotlin.Nothing from='public final fun <get-callables> (): kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> declared in <root>.BoxService.$rpcServiceStub.Companion'
254+
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:callables type:kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> visibility:private [final]' type=kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> origin=null
255+
receiver: GET_VAR '<this>: <root>.BoxService.$rpcServiceStub.Companion declared in <root>.BoxService.$rpcServiceStub.Companion.<get-callables>' type=<root>.BoxService.$rpcServiceStub.Companion origin=null
252256
CONSTRUCTOR visibility:private returnType:<root>.BoxService.$rpcServiceStub.Companion [primary]
253257
BLOCK_BODY
254258
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () declared in kotlin.Any'
@@ -285,7 +289,7 @@ FILE fqName:<root> fileName:/customParameterTypes.kt
285289
BLOCK_BODY
286290
RETURN type=kotlin.Nothing from='public open fun getCallable (name: kotlin.String): kotlinx.rpc.descriptor.RpcCallable? declared in <root>.BoxService.$rpcServiceStub.Companion'
287291
CALL 'public abstract fun get (key: K of kotlin.collections.Map): V of kotlin.collections.Map? declared in kotlin.collections.Map' type=kotlinx.rpc.descriptor.RpcCallable? origin=GET_ARRAY_ELEMENT
288-
ARG <this>: CALL 'private final fun <get-callableMap> (): kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> declared in <root>.BoxService.$rpcServiceStub.Companion' type=kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> origin=GET_PROPERTY
292+
ARG <this>: CALL 'public final fun <get-callables> (): kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> declared in <root>.BoxService.$rpcServiceStub.Companion' type=kotlin.collections.Map<kotlin.String, kotlinx.rpc.descriptor.RpcCallable<<root>.BoxService>> origin=GET_PROPERTY
289293
ARG <this>: GET_VAR '<this>: <root>.BoxService.$rpcServiceStub.Companion declared in <root>.BoxService.$rpcServiceStub.Companion.getCallable' type=<root>.BoxService.$rpcServiceStub.Companion origin=null
290294
ARG key: GET_VAR 'name: kotlin.String declared in <root>.BoxService.$rpcServiceStub.Companion.getCallable' type=kotlin.String origin=null
291295
CONSTRUCTOR visibility:public returnType:<root>.BoxService.$rpcServiceStub [primary]

0 commit comments

Comments
 (0)