Skip to content

Commit 8ab78bb

Browse files
committed
fix(kotlin-gen): companion object injection consistency
- Added `InjectKind` enumeration with `ELEMENT` and `COMPANION` types. - Updated `applyOf` and `inject` functions to include `InjectKind`. - Modified generation routines to distinguish between ELEMENT and COMPANION injections. - Refactored companion object handling with the new `addCompanionObject` utility.
1 parent a6dfdb4 commit 8ab78bb

21 files changed

Lines changed: 145 additions & 47 deletions

mmrpc-gen-kotlin/src/commonMain/kotlin/Declarations.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,14 @@ data class EmitNode(
129129
val emission: context(FinalStage) () -> Unit,
130130
)
131131

132+
enum class InjectKind {
133+
ELEMENT,
134+
COMPANION,
135+
}
136+
132137
data class InjectNode<T : Any>(
133138
val type: KClass<T>,
139+
val kind: InjectKind,
134140
val target: CanonicalName?,
135141
val declares: List<CanonicalName>,
136142
val injection: context(FinalStage) T.() -> Unit,

mmrpc-gen-kotlin/src/commonMain/kotlin/context/FinalStage.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.squareup.kotlinpoet.ClassName
44
import com.squareup.kotlinpoet.FileSpec
55
import org.cufy.mmrpc.CanonicalName
66
import org.cufy.mmrpc.gen.kotlin.EmitScope
7+
import org.cufy.mmrpc.gen.kotlin.InjectKind
78
import org.cufy.mmrpc.gen.kotlin.InjectNode
89
import org.cufy.mmrpc.gen.kotlin.NodeList
910

@@ -15,12 +16,15 @@ class FinalStage(val nodes: NodeList) {
1516
@EmitScope
1617
context(ctx: FinalStage)
1718
fun <T : Any> T.applyOf(
19+
kind: InjectKind,
1820
dummy: Unit = Unit,
1921
target: CanonicalName?,
2022
) {
2123
for (node in ctx.nodes.injections) {
2224
if (node.target != target)
2325
continue
26+
if (node.kind != kind)
27+
continue
2428
if (!node.type.isInstance(this))
2529
continue
2630
if (node in ctx.injected)

mmrpc-gen-kotlin/src/commonMain/kotlin/context/InitStage.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import com.squareup.kotlinpoet.TypeSpec
55
import com.squareup.kotlinpoet.TypeSpecHolder
66
import org.cufy.mmrpc.CanonicalName
77
import org.cufy.mmrpc.gen.kotlin.EmitNode
8+
import org.cufy.mmrpc.gen.kotlin.InjectKind
9+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
810
import org.cufy.mmrpc.gen.kotlin.InjectNode
911
import org.cufy.mmrpc.gen.kotlin.InjectScope
1012
import org.cufy.mmrpc.gen.kotlin.common.toPackageName
@@ -18,6 +20,7 @@ class InitStage {
1820
@InjectScope
1921
context(stage: InitStage)
2022
inline fun <reified T : Any> inject(
23+
kind: InjectKind,
2124
dummy: Unit = Unit,
2225
target: CanonicalName?,
2326
declares: List<CanonicalName> = emptyList(),
@@ -26,6 +29,7 @@ inline fun <reified T : Any> inject(
2629
val e = RuntimeException("Injection failed")
2730
stage.injections += InjectNode(
2831
type = T::class,
32+
kind = kind,
2933
target = target,
3034
declares = declares,
3135
injection = injection,
@@ -38,6 +42,7 @@ inline fun <reified T : Any> inject(
3842
@InjectScope
3943
context(stage: InitStage, _: Context)
4044
inline fun <reified T : Any> injectOrToplevel(
45+
kind: InjectKind,
4146
dummy: Unit = Unit,
4247
target: CanonicalName?,
4348
declares: List<CanonicalName> = emptyList(),
@@ -48,6 +53,7 @@ inline fun <reified T : Any> injectOrToplevel(
4853
}
4954
stage.injections += InjectNode(
5055
type = T::class,
56+
kind = kind,
5157
target = target,
5258
declares = declares,
5359
injection = injection,
@@ -70,6 +76,7 @@ fun declareType(
7076
) {
7177
stage.injections += InjectNode(
7278
type = TypeSpecHolder.Builder::class,
79+
kind = ELEMENT,
7380
target = target,
7481
declares = declares,
7582
injection = { addType(block()) },

mmrpc-gen-kotlin/src/commonMain/kotlin/gen/ArrayDefinitionGen.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.squareup.kotlinpoet.FileSpec
44
import com.squareup.kotlinpoet.LIST
55
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
66
import org.cufy.mmrpc.ArrayDefinition
7+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
78
import org.cufy.mmrpc.gen.kotlin.common.code.createKdocCode
89
import org.cufy.mmrpc.gen.kotlin.common.model.annotationSpec
910
import org.cufy.mmrpc.gen.kotlin.common.model.isGeneratingTypealias
@@ -37,6 +38,7 @@ private fun addTypealias(element: ArrayDefinition) {
3738
val target = LIST.parameterizedBy(element.type.typeName())
3839

3940
injectOrToplevel<FileSpec.Builder>(
41+
ELEMENT,
4042
target = element.namespace,
4143
declares = listOf(element.canonicalName),
4244
) {
@@ -47,7 +49,7 @@ private fun addTypealias(element: ArrayDefinition) {
4749
addAnnotation(usage.annotationSpec())
4850
}
4951

50-
applyOf(target = element.canonicalName)
52+
applyOf(ELEMENT, target = element.canonicalName)
5153
})
5254
}
5355
}

mmrpc-gen-kotlin/src/commonMain/kotlin/gen/ConstDefinitionGen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package org.cufy.mmrpc.gen.kotlin.gen
33
import com.squareup.kotlinpoet.KModifier
44
import com.squareup.kotlinpoet.MemberSpecHolder
55
import org.cufy.mmrpc.ConstDefinition
6+
import org.cufy.mmrpc.gen.kotlin.InjectKind.COMPANION
7+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
68
import org.cufy.mmrpc.gen.kotlin.common.code.createKdocCode
79
import org.cufy.mmrpc.gen.kotlin.common.code.createLiteralCode
810
import org.cufy.mmrpc.gen.kotlin.common.isCompileConst
@@ -36,6 +38,7 @@ private fun addProperty(element: ConstDefinition) {
3638
*/
3739

3840
injectOrToplevel<MemberSpecHolder.Builder<*>>(
41+
COMPANION,
3942
target = element.namespace,
4043
declares = listOf(element.canonicalName),
4144
) {
@@ -52,7 +55,7 @@ private fun addProperty(element: ConstDefinition) {
5255
addAnnotation(usage.annotationSpec())
5356
}
5457

55-
applyOf(target = element.canonicalName)
58+
applyOf(ELEMENT, target = element.canonicalName)
5659
})
5760
}
5861
}

mmrpc-gen-kotlin/src/commonMain/kotlin/gen/EnumDefinitionGen.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.cufy.mmrpc.gen.kotlin.gen
22

33
import org.cufy.mmrpc.EnumDefinition
4+
import org.cufy.mmrpc.gen.kotlin.InjectKind.COMPANION
5+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
46
import org.cufy.mmrpc.gen.kotlin.common.code.createKdocCode
57
import org.cufy.mmrpc.gen.kotlin.common.code.createLiteralCode
68
import org.cufy.mmrpc.gen.kotlin.common.isGeneratingClass
@@ -78,9 +80,11 @@ private fun addEnumClass(element: EnumDefinition) {
7880
addAnnotation(usage.annotationSpec())
7981
}
8082

81-
addType(companionObjectSpec {
82-
applyOf(target = element.canonicalName)
83-
})
83+
applyOf(ELEMENT, target = element.canonicalName)
84+
85+
addCompanionObject {
86+
applyOf(COMPANION, target = element.canonicalName)
87+
}
8488
}
8589
}
8690
}

mmrpc-gen-kotlin/src/commonMain/kotlin/gen/FaultDefinitionGen.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import com.squareup.kotlinpoet.KModifier
44
import com.squareup.kotlinpoet.STRING
55
import com.squareup.kotlinpoet.typeNameOf
66
import org.cufy.mmrpc.FaultDefinition
7+
import org.cufy.mmrpc.gen.kotlin.InjectKind.COMPANION
8+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
79
import org.cufy.mmrpc.gen.kotlin.common.code.createKdocCode
810
import org.cufy.mmrpc.gen.kotlin.common.isGeneratingClass
911
import org.cufy.mmrpc.gen.kotlin.common.model.annotationSpec
@@ -65,20 +67,22 @@ private fun addExceptionClass(element: FaultDefinition) {
6567
callThisConstructor("null", "cause")
6668
})
6769

68-
addType(companionObjectSpec {
70+
addCompanionObject {
6971
addProperty(propertySpec("CANONICAL_NAME", STRING) {
7072
addModifiers(KModifier.CONST)
7173
initializer("%S", element.canonicalName.value)
7274
})
73-
})
75+
76+
applyOf(COMPANION, target = element.canonicalName)
77+
}
7478

7579
addKdoc(createKdocCode(element))
7680

7781
for (usage in element.metadata) {
7882
addAnnotation(usage.annotationSpec())
7983
}
8084

81-
applyOf(target = element.canonicalName)
85+
applyOf(ELEMENT, target = element.canonicalName)
8286
}
8387
}
8488
}

mmrpc-gen-kotlin/src/commonMain/kotlin/gen/MapDefinitionGen.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.squareup.kotlinpoet.MAP
55
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
66
import com.squareup.kotlinpoet.STRING
77
import org.cufy.mmrpc.MapDefinition
8+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
89
import org.cufy.mmrpc.gen.kotlin.common.code.createKdocCode
910
import org.cufy.mmrpc.gen.kotlin.common.model.annotationSpec
1011
import org.cufy.mmrpc.gen.kotlin.common.model.isGeneratingTypealias
@@ -38,6 +39,7 @@ private fun addTypealias(element: MapDefinition) {
3839
val target = MAP.parameterizedBy(STRING, element.type.typeName())
3940

4041
injectOrToplevel<FileSpec.Builder>(
42+
ELEMENT,
4143
target = element.namespace,
4244
declares = listOf(element.canonicalName),
4345
) {
@@ -48,7 +50,7 @@ private fun addTypealias(element: MapDefinition) {
4850
addAnnotation(usage.annotationSpec())
4951
}
5052

51-
applyOf(target = element.canonicalName)
53+
applyOf(ELEMENT, target = element.canonicalName)
5254
})
5355
}
5456
}

mmrpc-gen-kotlin/src/commonMain/kotlin/gen/MetadataDefinitionGen.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.cufy.mmrpc.gen.kotlin.gen
22

33
import org.cufy.mmrpc.MetadataDefinition
4+
import org.cufy.mmrpc.gen.kotlin.InjectKind.COMPANION
5+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
46
import org.cufy.mmrpc.gen.kotlin.common.code.createKdocCode
57
import org.cufy.mmrpc.gen.kotlin.common.isGeneratingClass
68
import org.cufy.mmrpc.gen.kotlin.common.metaTypeName
@@ -9,6 +11,7 @@ import org.cufy.mmrpc.gen.kotlin.common.model.metaParameterSpec
911
import org.cufy.mmrpc.gen.kotlin.common.model.nameOfProperty
1012
import org.cufy.mmrpc.gen.kotlin.common.nameOfClass
1113
import org.cufy.mmrpc.gen.kotlin.context.*
14+
import org.cufy.mmrpc.gen.kotlin.util.addCompanionObject
1215
import org.cufy.mmrpc.gen.kotlin.util.annotationClassSpec
1316
import org.cufy.mmrpc.gen.kotlin.util.constructorSpec
1417
import org.cufy.mmrpc.gen.kotlin.util.propertySpec
@@ -75,7 +78,11 @@ private fun addAnnotationClass(element: MetadataDefinition) {
7578
addAnnotation(Repeatable::class)
7679
}
7780

78-
applyOf(target = element.canonicalName)
81+
applyOf(ELEMENT, target = element.canonicalName)
82+
83+
addCompanionObject {
84+
applyOf(COMPANION, target = element.canonicalName)
85+
}
7986
}
8087
}
8188
}

mmrpc-gen-kotlin/src/commonMain/kotlin/gen/ProtocolDefinitionGen.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package org.cufy.mmrpc.gen.kotlin.gen
33
import com.squareup.kotlinpoet.KModifier
44
import com.squareup.kotlinpoet.STRING
55
import org.cufy.mmrpc.ProtocolDefinition
6+
import org.cufy.mmrpc.gen.kotlin.InjectKind.COMPANION
7+
import org.cufy.mmrpc.gen.kotlin.InjectKind.ELEMENT
68
import org.cufy.mmrpc.gen.kotlin.common.code.createKdocCode
79
import org.cufy.mmrpc.gen.kotlin.common.isGeneratingClass
810
import org.cufy.mmrpc.gen.kotlin.common.model.NAME_OF_REFLUX_CLASS
@@ -11,7 +13,7 @@ import org.cufy.mmrpc.gen.kotlin.common.model.nameOfMainFile
1113
import org.cufy.mmrpc.gen.kotlin.common.model.refluxCanonicalName
1214
import org.cufy.mmrpc.gen.kotlin.common.nameOfClass
1315
import org.cufy.mmrpc.gen.kotlin.context.*
14-
import org.cufy.mmrpc.gen.kotlin.util.companionObjectSpec
16+
import org.cufy.mmrpc.gen.kotlin.util.addCompanionObject
1517
import org.cufy.mmrpc.gen.kotlin.util.interfaceSpec
1618
import org.cufy.mmrpc.gen.kotlin.util.propertySpec
1719

@@ -38,19 +40,24 @@ private fun addInterface(element: ProtocolDefinition) {
3840
addAnnotation(usage.annotationSpec())
3941
}
4042

41-
addType(companionObjectSpec {
43+
addCompanionObject {
4244
addProperty(propertySpec("CANONICAL_NAME", STRING) {
4345
addModifiers(KModifier.CONST)
4446
initializer("%S", element.canonicalName.value)
4547
})
46-
})
48+
49+
applyOf(COMPANION, target = element.canonicalName)
50+
}
4751

4852
addType(interfaceSpec(NAME_OF_REFLUX_CLASS) {
49-
applyOf(target = element.refluxCanonicalName)
50-
addType(companionObjectSpec()) // this must be last for syntax compatibility
53+
applyOf(ELEMENT, target = element.refluxCanonicalName)
54+
55+
addCompanionObject(prune = false) {
56+
applyOf(COMPANION, target = element.refluxCanonicalName)
57+
}
5158
})
5259

53-
applyOf(target = element.canonicalName)
60+
applyOf(ELEMENT, target = element.canonicalName)
5461
})
5562
}
5663
}

0 commit comments

Comments
 (0)