@@ -12,38 +12,20 @@ import kotlinx.serialization.descriptors.elementNames
1212fun 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