in generator/src/main/kotlin/space/jetbrains/api/generator/GenerateTypes.kt [24:71]
fun generateTypes(model: HttpApiEntitiesById): List<FileSpec> {
val fieldDescriptorsByDtoId = model.buildFieldsByDtoId()
Log.info { "Generating DTO classes for SDK" }
return model.dtoAndUrlParams.values.mapNotNull { root ->
if (root.extends != null) return@mapNotNull null
val rootClassName = root.getClassName()
if (rootClassName == batchInfoType) return@mapNotNull null
Log.info { "Generating file with DTO classes for '${root.name}' and its subclasses" }
FileSpec.builder(rootClassName.packageName, rootClassName.simpleNames.joinToString("")).also { fileBuilder ->
fileBuilder.indent(INDENT)
fileBuilder.addAnnotation(
AnnotationSpec.builder(ClassName("kotlin", "OptIn")).also { ann ->
model.featureFlags.values.forEach {
ann.addMember("%T::class", it.annotationClassName())
}
}.build()
)
fileBuilder.addImport(ROOT_PACKAGE, "getValue")
root.topLevelSubclasses(model).forEach { dto ->
fileBuilder.addType(dtoDeclaration(dto, model, fieldDescriptorsByDtoId))
}
}.build()
} + model.enums.values.map { enumType ->
val enumClassName = enumType.name.kotlinClassNameJoined()
FileSpec.builder(TYPES_PACKAGE, enumClassName).apply {
addAnnotation(
AnnotationSpec.builder(ClassName("kotlin", "OptIn")).also { ann ->
model.featureFlags.values.forEach {
ann.addMember("%T::class", it.annotationClassName())
}
}.build()
)
addType(TypeSpec.enumBuilder(enumClassName).apply {
enumType.values.forEach {
addEnumConstant(it)
}
annotationSpecs.deprecation(enumType.deprecation)
}.build())
}.build()
}
}