Skip to content

Commit 7572128

Browse files
committed
fix #193
1 parent d444119 commit 7572128

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

src/main/kotlin/wu/seal/jsontokotlin/utils/KotlinDataClassFileGenerator.kt

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -170,25 +170,36 @@ class KotlinDataClassFileGenerator(private val interceptors: List<IKotlinDataCla
170170
}
171171

172172
fun buildTypeReference(classes: List<ParsedKotlinDataClass>): List<ParsedKotlinDataClass> {
173-
val classNameList = classes.map { it.name }
173+
val notBeenReferencedClass = mutableListOf<ParsedKotlinDataClass>().apply {
174+
addAll(classes)
175+
removeAt(0)
176+
}
174177

175-
/**
176-
* Build Property Type reference to ParsedKotlinDataClass
177-
* Only pre class property type could reference behind classes
178-
*/
179-
classes.forEachIndexed { index, kotlinDataClass ->
180-
kotlinDataClass.properties.forEachIndexed { _, property ->
181-
val indexOfClassName =
182-
classNameList.firstIndexAfterSpecificIndex(getRawType(getChildType(property.propertyType)), index)
183-
if (indexOfClassName != -1) {
184-
property.kotlinDataClassPropertyTypeRef = classes[indexOfClassName]
185-
}
186-
}
178+
val classNameList = notBeenReferencedClass.map { it.name }.toMutableList()
179+
180+
classes.forEach {
181+
buildClassTypeReference(it, classNameList, notBeenReferencedClass)
187182
}
188183

189184
return classes
190185
}
191186

187+
private fun buildClassTypeReference(tobeBuildTypeReferenceClass: ParsedKotlinDataClass, classNameList: MutableList<String>, notBeenReferencedClass: MutableList<ParsedKotlinDataClass>) {
188+
tobeBuildTypeReferenceClass.properties.forEach { property ->
189+
val indexOfClassName =
190+
classNameList.indexOf(getRawType(getChildType(property.propertyType)))
191+
if (indexOfClassName != -1) {
192+
val referencedClass = notBeenReferencedClass[indexOfClassName]
193+
notBeenReferencedClass.remove(referencedClass)
194+
classNameList.removeAt(indexOfClassName)
195+
property.kotlinDataClassPropertyTypeRef = referencedClass
196+
197+
buildClassTypeReference(referencedClass,classNameList,notBeenReferencedClass)
198+
199+
}
200+
}
201+
}
202+
192203
private fun generateKotlinDataClassFile(
193204
fileName: String,
194205
packageDeclare: String,
@@ -243,7 +254,7 @@ class KotlinDataClassFileGenerator(private val interceptors: List<IKotlinDataCla
243254
private fun changeClassNameIfCurrentListContains(classesNames: List<String>, className: String): String {
244255
var newClassName = className
245256

246-
var fileNamesInLowerCase = classesNames.map { it.toLowerCase() }
257+
val fileNamesInLowerCase = classesNames.map { it.toLowerCase() }
247258
while (fileNamesInLowerCase.contains(newClassName.toLowerCase())) {
248259
newClassName += "X"
249260
}

0 commit comments

Comments
 (0)