Skip to content

Commit 674b6df

Browse files
committed
simplify the API
1 parent b093dac commit 674b6df

File tree

11 files changed

+144
-318
lines changed

11 files changed

+144
-318
lines changed

docs/code/example/example-polymorphic-static-types-02.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ val module = SerializersModule {
2222
}
2323

2424
fun main() {
25-
val tsGenerator = KxsTsGenerator(serializersModule = module)
25+
val config = KxsTsConfig(serializersModule = module)
26+
27+
val tsGenerator = KxsTsGenerator(config)
28+
2629
println(tsGenerator.generate(Project.serializer()))
2730
}

docs/polymorphism.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,10 @@ val module = SerializersModule {
105105
}
106106

107107
fun main() {
108-
val tsGenerator = KxsTsGenerator(serializersModule = module)
108+
val config = KxsTsConfig(serializersModule = module)
109+
110+
val tsGenerator = KxsTsGenerator(config)
111+
109112
println(tsGenerator.generate(Project.serializer()))
110113
}
111114
```

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev.adamko.kxstsgen/KxsTsConvertorContext.kt

Lines changed: 0 additions & 54 deletions
This file was deleted.
Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,47 @@
11
package dev.adamko.kxstsgen
22

33
import kotlinx.serialization.KSerializer
4-
import kotlinx.serialization.modules.SerializersModule
54

65

7-
class KxsTsGenerator(
8-
private val config: KxsTsConfig = KxsTsConfig(),
9-
) {
6+
open class KxsTsGenerator(
7+
val config: KxsTsConfig = KxsTsConfig(),
108

11-
constructor(
12-
serializersModule: SerializersModule,
13-
) : this(KxsTsConfig(serializersModule = serializersModule))
9+
val descriptorsExtractor: SerializerDescriptorsExtractor = SerializerDescriptorsExtractor.Default,
1410

11+
val elementIdConverter: TsElementIdConverter = TsElementIdConverter.Default,
1512

16-
fun generate(vararg serializers: KSerializer<*>): String {
13+
val mapTypeConverter: TsMapTypeConverter = TsMapTypeConverter.Default,
1714

18-
val processor = KxsTsProcessor(config)
15+
val typeRefConverter: TsTypeRefConverter =
16+
TsTypeRefConverter.Default(elementIdConverter, mapTypeConverter),
1917

20-
serializers.forEach { processor.addSerializer(it) }
18+
val elementConverter: TsElementConverter =
19+
TsElementConverter.Default(
20+
elementIdConverter,
21+
mapTypeConverter,
22+
typeRefConverter,
23+
),
24+
25+
val sourceCodeGenerator: KxsTsSourceCodeGenerator = KxsTsSourceCodeGenerator.Default(config)
26+
) {
2127

22-
return processor.process()
28+
fun generate(vararg serializers: KSerializer<*>): String {
29+
30+
val descriptors = serializers.flatMap { descriptorsExtractor(it) }.toSet()
31+
32+
val elements = descriptors.map { elementConverter(it) }
33+
34+
return elements
35+
.groupBy { element -> sourceCodeGenerator.groupElementsBy(element) }
36+
.mapValues { (_, elements) ->
37+
elements
38+
.filterIsInstance<TsDeclaration>()
39+
.map { element -> sourceCodeGenerator.generateDeclaration(element) }
40+
.filter { it.isNotBlank() }
41+
.joinToString(config.declarationSeparator)
42+
}
43+
.values// TODO create namespaces
44+
.joinToString(config.declarationSeparator)
2345
}
46+
2447
}

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev.adamko.kxstsgen/KxsTsProcessor.kt

Lines changed: 0 additions & 62 deletions
This file was deleted.

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev.adamko.kxstsgen/KxsTsSourceCodeGenerator.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ package dev.adamko.kxstsgen
55
* Writes [TsElement]s as TypeScript source code.
66
*/
77
abstract class KxsTsSourceCodeGenerator(
8-
val config: KxsTsConfig,
9-
val context: KxsTsConvertorContext,
8+
val config: KxsTsConfig = KxsTsConfig(),
109
) {
1110

1211
abstract fun groupElementsBy(element: TsElement): String?
@@ -32,8 +31,7 @@ abstract class KxsTsSourceCodeGenerator(
3231

3332
open class Default(
3433
config: KxsTsConfig,
35-
context: KxsTsConvertorContext,
36-
) : KxsTsSourceCodeGenerator(config, context) {
34+
) : KxsTsSourceCodeGenerator(config) {
3735

3836

3937
override fun groupElementsBy(element: TsElement): String {

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev.adamko.kxstsgen/TsElementConverter.kt

Lines changed: 29 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,20 @@ import kotlinx.serialization.descriptors.elementNames
1212
fun interface TsElementConverter {
1313

1414
operator fun invoke(
15-
context: KxsTsConvertorContext,
1615
descriptor: SerialDescriptor,
17-
descriptorData: DescriptorData?,
1816
): TsElement
1917

20-
object Default : TsElementConverter {
18+
open class Default(
19+
val elementIdConverter: TsElementIdConverter,
20+
val mapTypeConverter: TsMapTypeConverter,
21+
val typeRefConverter: TsTypeRefConverter,
22+
) : TsElementConverter {
2123

2224
override operator fun invoke(
23-
context: KxsTsConvertorContext,
24-
descriptor: SerialDescriptor,
25-
descriptorData: DescriptorData?,
26-
): TsElement {
27-
return convertMonomorphicDescriptor(context, descriptor)
28-
29-
// return when (descriptorData) {
30-
// is DescriptorData.Polymorphic -> convertPolymorphicDescriptor(
31-
// context,
32-
// descriptorData,
33-
// )
34-
// null,
35-
// is DescriptorData.Monomorphic -> setOf(convertMonomorphicDescriptor(context, descriptor))
36-
// }
37-
38-
}
39-
40-
41-
private fun convertMonomorphicDescriptor(
42-
context: KxsTsConvertorContext,
4325
descriptor: SerialDescriptor,
4426
): TsElement {
4527
return when (descriptor.kind) {
46-
SerialKind.ENUM -> convertEnum(context, descriptor)
28+
SerialKind.ENUM -> convertEnum(descriptor)
4729

4830
PrimitiveKind.BOOLEAN -> TsLiteral.Primitive.TsBoolean
4931

@@ -57,31 +39,30 @@ fun interface TsElementConverter {
5739
PrimitiveKind.FLOAT,
5840
PrimitiveKind.DOUBLE -> TsLiteral.Primitive.TsNumber
5941

60-
StructureKind.LIST -> convertList(context, descriptor)
61-
StructureKind.MAP -> convertMap(context, descriptor)
42+
StructureKind.LIST -> convertList(descriptor)
43+
StructureKind.MAP -> convertMap(descriptor)
6244

6345
StructureKind.CLASS,
6446
StructureKind.OBJECT -> when {
65-
descriptor.isInline -> convertTypeAlias(context, descriptor)
66-
else -> convertInterface(context, descriptor, null)
47+
descriptor.isInline -> convertTypeAlias(descriptor)
48+
else -> convertInterface(descriptor, null)
6749
}
6850

6951

70-
PolymorphicKind.SEALED -> convertPolymorphic(context, descriptor)
52+
PolymorphicKind.SEALED -> convertPolymorphic(descriptor)
7153

7254
// TODO handle contextual
7355
// TODO handle polymorphic open
7456
SerialKind.CONTEXTUAL,
7557
PolymorphicKind.OPEN -> {
76-
val resultId = context.elementId(descriptor)
58+
val resultId = elementIdConverter(descriptor)
7759
val fieldTypeRef = TsTypeRef.Literal(TsLiteral.Primitive.TsAny, false)
7860
TsDeclaration.TsTypeAlias(resultId, fieldTypeRef)
7961
}
8062
}
8163
}
8264

83-
private fun convertPolymorphic(
84-
context: KxsTsConvertorContext,
65+
fun convertPolymorphic(
8566
descriptor: SerialDescriptor,
8667
): TsDeclaration {
8768

@@ -95,7 +76,7 @@ fun interface TsElementConverter {
9576
.elementDescriptors
9677

9778
val subclassInterfaces = subclasses
98-
.map { convertMonomorphicDescriptor(context, it) }
79+
.map { this(it) }
9980
.filterIsInstance<TsDeclaration.TsInterface>()
10081
.map { it.copy(id = TsElementId("${descriptor.serialName}.${it.id.name}")) }
10182
.toSet()
@@ -106,31 +87,29 @@ fun interface TsElementConverter {
10687
else -> error("Can't convert non-polymorphic SerialKind ${descriptor.kind} to polymorphic interface")
10788
}
10889

109-
return convertInterface(context, descriptor, polymorphism)
90+
return convertInterface(descriptor, polymorphism)
11091
}
11192

11293

113-
private fun convertTypeAlias(
114-
context: KxsTsConvertorContext,
94+
fun convertTypeAlias(
11595
structDescriptor: SerialDescriptor,
11696
): TsDeclaration {
117-
val resultId = context.elementId(structDescriptor)
97+
val resultId = elementIdConverter(structDescriptor)
11898
val fieldDescriptor = structDescriptor.elementDescriptors.first()
119-
val fieldTypeRef = context.typeRef(fieldDescriptor)
99+
val fieldTypeRef = typeRefConverter(fieldDescriptor)
120100
return TsDeclaration.TsTypeAlias(resultId, fieldTypeRef)
121101
}
122102

123103

124-
private fun convertInterface(
125-
context: KxsTsConvertorContext,
104+
fun convertInterface(
126105
descriptor: SerialDescriptor,
127106
polymorphism: TsPolymorphism?,
128107
): TsDeclaration {
129-
val resultId = context.elementId(descriptor)
108+
val resultId = elementIdConverter(descriptor)
130109

131110
val properties = descriptor.elementDescriptors.mapIndexed { index, fieldDescriptor ->
132111
val name = descriptor.getElementName(index)
133-
val fieldTypeRef = context.typeRef(fieldDescriptor)
112+
val fieldTypeRef = typeRefConverter(fieldDescriptor)
134113
when {
135114
descriptor.isElementOptional(index) -> TsProperty.Optional(name, fieldTypeRef)
136115
else -> TsProperty.Required(name, fieldTypeRef)
@@ -140,36 +119,33 @@ fun interface TsElementConverter {
140119
}
141120

142121

143-
private fun convertEnum(
144-
context: KxsTsConvertorContext,
122+
fun convertEnum(
145123
enumDescriptor: SerialDescriptor,
146124
): TsDeclaration.TsEnum {
147-
val resultId = context.elementId(enumDescriptor)
125+
val resultId = elementIdConverter(enumDescriptor)
148126
return TsDeclaration.TsEnum(resultId, enumDescriptor.elementNames.toSet())
149127
}
150128

151129

152-
private fun convertList(
153-
context: KxsTsConvertorContext,
130+
fun convertList(
154131
listDescriptor: SerialDescriptor,
155132
): TsLiteral.TsList {
156133
val elementDescriptor = listDescriptor.elementDescriptors.first()
157-
val elementTypeRef = context.typeRef(elementDescriptor)
134+
val elementTypeRef = typeRefConverter(elementDescriptor)
158135
return TsLiteral.TsList(elementTypeRef)
159136
}
160137

161138

162-
private fun convertMap(
163-
context: KxsTsConvertorContext,
139+
fun convertMap(
164140
mapDescriptor: SerialDescriptor,
165141
): TsLiteral.TsMap {
166142

167143
val (keyDescriptor, valueDescriptor) = mapDescriptor.elementDescriptors.toList()
168144

169-
val keyTypeRef = context.typeRef(keyDescriptor)
170-
val valueTypeRef = context.typeRef(valueDescriptor)
145+
val keyTypeRef = typeRefConverter(keyDescriptor)
146+
val valueTypeRef = typeRefConverter(valueDescriptor)
171147

172-
val type = context.mapType(keyDescriptor)
148+
val type = mapTypeConverter(keyDescriptor)
173149

174150
return TsLiteral.TsMap(keyTypeRef, valueTypeRef, type)
175151
}

0 commit comments

Comments
 (0)