@@ -8,74 +8,89 @@ import kotlinx.rpc.protobuf.CodeGenerator.DeclarationType
8
8
import kotlinx.rpc.protobuf.model.*
9
9
import org.slf4j.Logger
10
10
11
+ private const val RPC_INTERNAL_PACKAGE_SUFFIX = " _rpc_internal"
12
+
11
13
class ModelToKotlinGenerator (
12
14
private val model : Model ,
13
15
private val logger : Logger ,
14
16
private val codeGenerationParameters : CodeGenerationParameters ,
15
17
) {
16
18
fun generateKotlinFiles (): List <FileGenerator > {
17
- return model.files.map { it.generateKotlinFile() }
19
+ return model.files.flatMap { it.generateKotlinFiles() }
20
+ }
21
+
22
+ private fun FileDeclaration.generateKotlinFiles (): List <FileGenerator > {
23
+ return listOf (
24
+ generatePublicKotlinFile(),
25
+ generateInternalKotlinFile(),
26
+ )
18
27
}
19
28
20
- private fun FileDeclaration.generateKotlinFile (): FileGenerator {
29
+ private fun FileDeclaration.generatePublicKotlinFile (): FileGenerator {
21
30
return file(codeGenerationParameters, logger = logger) {
22
31
filename = name.simpleName
23
32
packageName = name.packageName
24
- fileOptIns = listOf ( " ExperimentalRpcApi::class " , " InternalRpcApi::class " )
33
+ packagePath = name.packageName
25
34
26
35
dependencies.forEach { dependency ->
27
36
importPackage(dependency.name.packageName)
28
37
}
29
38
30
- generateDeclaredEntities (this @generateKotlinFile )
39
+ generatePublicDeclaredEntities (this @generatePublicKotlinFile )
31
40
32
- additionalImports .forEach {
41
+ additionalPublicImports .forEach {
33
42
import(it)
34
43
}
44
+ }
45
+ }
46
+
47
+ private fun FileDeclaration.generateInternalKotlinFile (): FileGenerator {
48
+ return file(codeGenerationParameters, logger = logger) {
49
+ filename = name.simpleName
50
+ packageName = name.packageName
51
+ packagePath = name.packageName.packageNameSuffixed(RPC_INTERNAL_PACKAGE_SUFFIX )
52
+
53
+ fileOptIns = listOf (" ExperimentalRpcApi::class" , " InternalRpcApi::class" )
54
+
55
+ dependencies.forEach { dependency ->
56
+ importPackage(dependency.name.packageName)
57
+ }
58
+
59
+ generateInternalDeclaredEntities(this @generateInternalKotlinFile)
60
+
35
61
import(" kotlinx.rpc.internal.utils.*" )
36
62
}
37
63
}
38
64
39
- private val additionalImports = mutableSetOf<String >()
65
+ private val additionalPublicImports = mutableSetOf<String >()
40
66
41
- private fun CodeGenerator.generateDeclaredEntities (fileDeclaration : FileDeclaration ) {
42
- fileDeclaration.messageDeclarations.forEach { generateMessage (it) }
67
+ private fun CodeGenerator.generatePublicDeclaredEntities (fileDeclaration : FileDeclaration ) {
68
+ fileDeclaration.messageDeclarations.forEach { generatePublicMessage (it) }
43
69
// KRPC-141 Enum Types
44
70
// fileDeclaration.enumDeclarations.forEach { generateEnum(it) }
45
- fileDeclaration.serviceDeclarations.forEach { generateService (it) }
71
+ fileDeclaration.serviceDeclarations.forEach { generatePublicService (it) }
46
72
}
47
73
48
- @Suppress(" detekt.CyclomaticComplexMethod" )
49
- private fun CodeGenerator.generateMessage (declaration : MessageDeclaration ) {
50
- val fields = declaration.actualFields.map { it.generateFieldDeclaration() to it.type.defaultValue }
51
-
52
- val isInterfaceMode = parameters.messageMode == RpcProtobufPlugin .MessageMode .Interface
53
-
54
- val (declarationType, modifiers) = when {
55
- isInterfaceMode -> {
56
- DeclarationType .Interface to " "
57
- }
58
-
59
- fields.isEmpty() -> {
60
- DeclarationType .Object to " "
61
- }
74
+ private fun CodeGenerator.generateInternalDeclaredEntities (fileDeclaration : FileDeclaration ) {
75
+ fileDeclaration.messageDeclarations.forEach { generateInternalMessage(it) }
76
+ // KRPC-141 Enum Types
77
+ // fileDeclaration.enumDeclarations.forEach { generateEnum(it) }
78
+ fileDeclaration.serviceDeclarations.forEach { generateInternalService(it) }
79
+ }
62
80
63
- else -> {
64
- DeclarationType .Class to " data"
65
- }
66
- }
81
+ private fun MessageDeclaration.fields () = actualFields.map {
82
+ it.transformToFieldDeclaration() to it.type.defaultValue
83
+ }
67
84
85
+ @Suppress(" detekt.CyclomaticComplexMethod" )
86
+ private fun CodeGenerator.generatePublicMessage (declaration : MessageDeclaration ) {
68
87
clazz(
69
88
name = declaration.name.simpleName,
70
- modifiers = modifiers,
71
- constructorArgs = if (isInterfaceMode) emptyList() else fields.map { " val ${it.first} " to it.second },
72
- declarationType = declarationType,
89
+ declarationType = DeclarationType .Interface ,
73
90
) {
74
- if (isInterfaceMode) {
75
- fields.forEach {
76
- code(" val ${it.first} " )
77
- newLine()
78
- }
91
+ declaration.fields().forEach {
92
+ code(" val ${it.first} " )
93
+ newLine()
79
94
}
80
95
81
96
// KRPC-147 OneOf Types
@@ -93,32 +108,31 @@ class ModelToKotlinGenerator(
93
108
// generateEnum(enum)
94
109
// }
95
110
96
- if (isInterfaceMode) {
97
- clazz(" " , modifiers = " companion" , declarationType = DeclarationType .Object )
98
- }
111
+ clazz(" " , modifiers = " companion" , declarationType = DeclarationType .Object )
99
112
}
113
+ }
100
114
101
- if (isInterfaceMode) {
102
- clazz(
103
- name = " ${declaration.name.simpleName} Builder " ,
104
- declarationType = DeclarationType . Class ,
105
- superTypes = listOf (declaration.name.simpleName) ,
106
- ) {
107
- fields.forEach {
108
- code( " override var ${it.first} = ${it.second} " )
109
- newLine( )
110
- }
115
+ @Suppress( " detekt.CyclomaticComplexMethod " )
116
+ private fun CodeGenerator. generateInternalMessage ( declaration : MessageDeclaration ) {
117
+ clazz(
118
+ name = " ${declaration.name.simpleName} Builder " ,
119
+ declarationType = DeclarationType . Class ,
120
+ superTypes = listOf (declaration.name.simpleName),
121
+ ) {
122
+ declaration.fields().forEach {
123
+ code( " override var ${it.first} = ${it.second} " )
124
+ newLine()
111
125
}
126
+ }
112
127
113
- function(
114
- name = " invoke" ,
115
- modifiers = " operator" ,
116
- args = " body: ${declaration.name.simpleName} Builder.() -> Unit" ,
117
- contextReceiver = " ${declaration.name.simpleName} .Companion" ,
118
- returnType = declaration.name.simpleName,
119
- ) {
120
- code(" return ${declaration.name.simpleName} Builder().apply(body)" )
121
- }
128
+ function(
129
+ name = " invoke" ,
130
+ modifiers = " operator" ,
131
+ args = " body: ${declaration.name.simpleName} Builder.() -> Unit" ,
132
+ contextReceiver = " ${declaration.name.simpleName} .Companion" ,
133
+ returnType = declaration.name.simpleName,
134
+ ) {
135
+ code(" return ${declaration.name.simpleName} Builder().apply(body)" )
122
136
}
123
137
124
138
val platformType = " ${declaration.outerClassName.simpleName} .${declaration.name.simpleName} "
@@ -175,7 +189,7 @@ class ModelToKotlinGenerator(
175
189
}
176
190
}
177
191
178
- private fun FieldDeclaration.generateFieldDeclaration (): String {
192
+ private fun FieldDeclaration.transformToFieldDeclaration (): String {
179
193
return " ${name} : ${typeFqName()} "
180
194
}
181
195
@@ -219,7 +233,7 @@ class ModelToKotlinGenerator(
219
233
superTypes = listOf (interfaceName),
220
234
)
221
235
222
- additionalImports .add(" kotlin.jvm.JvmInline" )
236
+ additionalPublicImports .add(" kotlin.jvm.JvmInline" )
223
237
}
224
238
}
225
239
}
@@ -247,7 +261,7 @@ class ModelToKotlinGenerator(
247
261
}
248
262
249
263
@Suppress(" detekt.LongMethod" )
250
- private fun CodeGenerator.generateService (service : ServiceDeclaration ) {
264
+ private fun CodeGenerator.generatePublicService (service : ServiceDeclaration ) {
251
265
code(" @kotlinx.rpc.grpc.annotations.Grpc" )
252
266
clazz(service.name.simpleName, declarationType = DeclarationType .Interface ) {
253
267
service.methods.forEach { method ->
@@ -262,9 +276,9 @@ class ModelToKotlinGenerator(
262
276
)
263
277
}
264
278
}
279
+ }
265
280
266
- newLine()
267
-
281
+ private fun CodeGenerator.generateInternalService (service : ServiceDeclaration ) {
268
282
code(" @Suppress(\" unused\" , \" all\" )" )
269
283
clazz(
270
284
modifiers = " private" ,
@@ -373,3 +387,7 @@ class ModelToKotlinGenerator(
373
387
return " ${outerClassName.simpleName} .${name.simpleName.removePrefix(name.parentNameAsPrefix)} "
374
388
}
375
389
}
390
+
391
+ internal fun String.packageNameSuffixed (suffix : String ): String {
392
+ return if (isEmpty()) suffix else " $this .$suffix "
393
+ }
0 commit comments