package org.jetbrains.kotlin.tools import java.io.* fun generateFile(outFile: File, header: String, inputFile: File, f: (String)-> String) { println("Parsing $inputFile and writing $outFile") outFile.getParentFile()?.mkdirs() val writer = PrintWriter(FileWriter(outFile)) try { writer.println("// NOTE this file is auto-generated from $inputFile") writer.println(header) val reader = FileReader(inputFile).buffered() try { // TODO ideally we'd use a filterNot() here :) val iter = reader.lineIterator() while (iter.hasNext) { val line = iter.next() if (line.startsWith("package")) continue val xform = f(line) writer.println(xform) } } finally { reader.close() reader.close() } } finally { writer.close() } } /** * Generates methods in the standard library which are mostly identical * but just using a different input kind. * * Kinda like mimicking source macros here, but this avoids the inefficiency of type conversions * at runtime. */ fun main(args: Array) { var srcDir = File("src/kotlin") if (!srcDir.exists()) { srcDir = File("stdlib/src/kotlin") require(srcDir.exists(), "Could not find the src/kotlin directory!") } val outDir = File(srcDir, "../generated") val otherArrayNames = arrayList("Boolean", "Byte", "Char", "Short", "Int", "Long", "Float", "Double") // JLangIterables - Generic iterable stuff generateFile(File(outDir, "ArraysFromJLangIterables.kt"), "package kotlin\n\nimport kotlin.util.*", File(srcDir, "JLangIterables.kt")) { it.replaceAll("java.lang.Iterable java.lang.Iterable", "${arrayName}Array"). replaceAll(" java.lang.Iterable", "${arrayName}Array"). replaceAll("java.lang.Iterable", "${arrayName}Array"). replaceAll("java.lang.Iterable", "${arrayName}Array")) } generateFile(File(outDir, "${arrayName}ArraysFromJLangIterables.kt"), "package kotlin\n\nimport kotlin.util.*", File(srcDir, "JLangIterables.kt")) { replace(it) } generateFile(File(outDir, "${arrayName}ArraysFromJLangIterablesLazy.kt"), "package kotlin\n\nimport kotlin.util.*", File(srcDir, "JLangIterablesLazy.kt")) { replace(it) } } generateFile(File(outDir, "StandardFromJLangIterables.kt"), "package kotlin\n\nimport kotlin.util.*", File(srcDir, "JLangIterables.kt")) { it.replaceAll("java.lang.Iterable java.util.Collection", "${arrayName}Array"). replaceAll("java.util.Collection", "${arrayName}Array")) } } generateFile(File(outDir, "JUtilIterablesFromJUtilCollections.kt"), "package kotlin", File(srcDir, "JUtilCollections.kt")) { it.replaceAll("java.util.Collection", " ").replaceAll(" ", " "). replaceAll("", "<${arrayName}>").replaceAll("", "<${arrayName}>"). replaceAll("\\(T\\)", "(${arrayName})").replaceAll("T\\?", "${arrayName}?"). replaceAll("T,", "${arrayName},"). replaceAll("T\\)", "${arrayName})"). replaceAll(" T ", " ${arrayName} ") }