Remove special source generation for js stdlib, use same template, rename generated file.

This commit is contained in:
Ilya Gorbunov
2016-09-23 04:51:57 +03:00
parent 8cd35f67fd
commit ab2facf030
4 changed files with 345 additions and 356 deletions
@@ -1,37 +0,0 @@
package generators
import java.io.*
import templates.Family.*
import templates.*
import templates.PrimitiveType.*
fun generateCollectionsAPI(outDir: File) {
val templates = sequenceOf(
::elements,
::filtering,
::ordering,
::arrays,
::snapshots,
::mapping,
::sets,
::aggregates,
::guards,
::generators,
::strings,
::sequences,
::specialJVM,
::ranges,
::numeric,
::comparables
).flatMap { it().sortedBy { it.signature }.asSequence() }
val groupedConcreteFunctions = templates.flatMap { it.instantiate().asSequence() }.groupBy { it.sourceFile }
for ((sourceFile, functions) in groupedConcreteFunctions) {
functions.writeTo(outDir, sourceFile)
}
}
fun generateCollectionsJsAPI(outDir: File) {
specialJS().writeTo(File(outDir, "kotlin_special.kt")) { build() }
}
@@ -18,11 +18,12 @@ private val COMMON_AUTOGENERATED_WARNING: String = """//
*/
fun main(args: Array<String>) {
require(args.size == 1) { "Expecting Kotlin project home path as an argument" }
val baseDir = File(args.first())
val outDir = File(File(args[0]), "libraries/stdlib/src/generated")
val outDir = baseDir.resolve("libraries/stdlib/src/generated")
require(outDir.exists()) { "$outDir doesn't exist!" }
val jsCoreDir = File(args[0], "js/js.libraries/src/core")
val jsCoreDir = baseDir.resolve("js/js.libraries/src/core/generated")
require(jsCoreDir.exists()) { "$jsCoreDir doesn't exist!" }
generateCollectionsAPI(outDir)
@@ -30,37 +31,60 @@ fun main(args: Array<String>) {
}
fun List<GenericFunction>.writeTo(file: File, builder: GenericFunction.() -> String) {
println("Generating file: $file")
val its = FileWriter(file)
fun generateCollectionsAPI(outDir: File) {
val templates = sequenceOf(
::elements,
::filtering,
::ordering,
::arrays,
::snapshots,
::mapping,
::sets,
::aggregates,
::guards,
::generators,
::strings,
::sequences,
::specialJVM,
::ranges,
::numeric,
::comparables
).flatMap { it().sortedBy { it.signature }.asSequence() }
its.use {
its.append("package kotlin.collections\n\n")
its.append("$COMMON_AUTOGENERATED_WARNING\n\n")
its.append("import java.util.*\n\n")
for (t in this.sortedBy { it.signature }) {
its.append(t.builder())
}
templates.groupByFileAndWrite(outDir)
}
fun generateCollectionsJsAPI(outDir: File) {
specialJS().asSequence().groupByFileAndWrite(outDir, { "_${it.name.capitalize()}Js.kt"})
}
private fun Sequence<GenericFunction>.groupByFileAndWrite(
outDir: File,
fileNameBuilder: (SourceFile) -> String = { "_${it.name.capitalize()}.kt" }
) {
val groupedConcreteFunctions = flatMap { it.instantiate().asSequence() }.groupBy { it.sourceFile }
for ((sourceFile, functions) in groupedConcreteFunctions) {
val file = outDir.resolve(fileNameBuilder(sourceFile))
functions.writeTo(file, sourceFile)
}
}
fun List<ConcreteFunction>.writeTo(outDir: File, sourceFile: SourceFile) {
val file = File(outDir, sourceFile.fileName)
private fun List<ConcreteFunction>.writeTo(file: File, sourceFile: SourceFile) {
println("Generating file: $file")
val its = FileWriter(file)
its.use {
FileWriter(file).use { writer ->
if (sourceFile.multifile) {
its.append("@file:kotlin.jvm.JvmMultifileClass\n")
writer.append("@file:kotlin.jvm.JvmMultifileClass\n")
}
its.append("@file:kotlin.jvm.JvmName(\"${sourceFile.jvmClassName}\")\n\n")
its.append("package ${sourceFile.packageName ?: "kotlin"}\n\n")
its.append("$COMMON_AUTOGENERATED_WARNING\n\n")
its.append("import kotlin.comparisons.*\n")
its.append("import java.util.*\n\n")
writer.append("@file:kotlin.jvm.JvmName(\"${sourceFile.jvmClassName}\")\n\n")
writer.append("package ${sourceFile.packageName ?: "kotlin"}\n\n")
writer.append("$COMMON_AUTOGENERATED_WARNING\n\n")
writer.append("import kotlin.comparisons.*\n")
writer.append("import java.util.*\n\n")
for (f in this) {
f.textBuilder(its)
f.textBuilder(writer)
}
}
}
@@ -13,6 +13,4 @@ enum class SourceFile(jvmClassName: String? = null, val multifile: Boolean = tru
;
val jvmClassName = jvmClassName ?: (name.capitalize() + "Kt")
val fileName: String get() = "_${name.capitalize()}.kt"
}