package org.jetbrains.kotlin.tools import kotlin.* import kotlin.io.* import kotlin.util.* import java.io.* import java.util.* 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 stdlib = File("stdlib") if (!stdlib.exists()) { stdlib = File("../stdlib") if (!stdlib.exists()) { println("Cannot find stdlib!") return } } val srcDir = File(stdlib, "ktSrc") val outDir = File(srcDir, "generated") // JavaIterables - Generic iterable stuff generateFile(File(outDir, "ArraysFromJavaIterables.kt"), "package kotlin\n\nimport kotlin.util.*", File(srcDir, "JavaIterables.kt")) { it.replaceAll("java.lang.Iterable