fun generateTypes()

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()
    }
}