diff --git a/generators/src/org/jetbrains/jet/generators/builtins/common.kt b/generators/src/org/jetbrains/jet/generators/builtins/common.kt index 9852d102ebc..1970955e3ad 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/common.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/common.kt @@ -16,11 +16,12 @@ package org.jetbrains.jet.generators.builtins -import java.io.File -import kotlin.properties.Delegates -import java.io.PrintWriter import org.jetbrains.jet.generators.builtins.ProgressionKind.* +trait BuiltInsSourceGenerator { + fun generate(): Unit +} + enum class ProgressionKind { BYTE CHAR @@ -49,39 +50,3 @@ fun floatToIntBits(v: String) = "java.lang.Float.floatToIntBits($v)" fun doubleToLongBits(v: String) = "java.lang.Double.doubleToLongBits($v)" - - -fun existingDirectory(path: String): File { - val result = File(path) - if (!result.exists()) { - throw IllegalStateException("Output dir does not exist: ${result.getAbsolutePath()}") - } - return result -} - -val BUILT_INS_DIR: File by Delegates.lazy { existingDirectory("core/builtins/src/jet/") } -val RUNTIME_JVM_DIR: File by Delegates.lazy { existingDirectory("core/runtime.jvm/src/jet/") } - -fun generateFile(dir: File, name: String, generate: (PrintWriter) -> Unit) { - val file = File(dir, name) - println("generating $file") - PrintWriter(file) use generate -} - -fun generateBuiltInFile(name: String, generate: (PrintWriter) -> Unit) { - generateFile(BUILT_INS_DIR, name, generate) -} - -fun generateRuntimeJvmFile(name: String, generate: (PrintWriter) -> Unit) { - generateFile(RUNTIME_JVM_DIR, name, generate) -} - -fun generatedBy(out: PrintWriter) { - out.println(File("injector-generator/copyright.txt").readText()) - // Don't include generator class name in the message: these are built-in sources, - // and we don't want to scare users with any internal information about our project - out.println("// Auto-generated file. DO NOT EDIT!") - out.println() - out.println("package jet") - out.println() -} diff --git a/generators/src/org/jetbrains/jet/generators/builtins/functions.kt b/generators/src/org/jetbrains/jet/generators/builtins/functions.kt index 12fa2825d15..fe65689dae5 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/functions.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/functions.kt @@ -40,9 +40,26 @@ enum class FunctionKind( fun getSuperClassName(i: Int) = superClassNamePrefix?.plus(i) } -class GenerateFunctions(val out: PrintWriter, val kind: FunctionKind) { - fun generateFunctionClasses() { - generatedBy(out) +abstract class GenerateFunctionsBase(val out: PrintWriter, val kind: FunctionKind): BuiltInsSourceGenerator { + fun generateTypeParameters(i: Int, variance: Boolean) { + out.print("<") + if (kind.hasReceiverParameter) { + if (variance) out.print("in ") + out.print("T, ") + } + + for (j in 1..i) { + if (variance) out.print("in ") + out.print("P$j, ") + } + + if (variance) out.print("out ") + out.print("R>") + } +} + +class GenerateFunctions(out: PrintWriter, kind: FunctionKind) : GenerateFunctionsBase(out, kind) { + override fun generate() { for (i in 0..MAX_PARAM_COUNT) { out.print("public trait " + kind.getClassName(i)) generateTypeParameters(i, true) @@ -51,20 +68,6 @@ class GenerateFunctions(val out: PrintWriter, val kind: FunctionKind) { } } - fun generateFunctionImplClasses() { - generatedBy(out) - for (i in 0..MAX_PARAM_COUNT) { - out.print("public abstract class " + kind.getImplClassName(i)) - generateTypeParameters(i, true) - out.print(" : ") - out.print(kind.getClassName(i)) - generateTypeParameters(i, false) - out.println(", DefaultJetObject() {") - generateToStringForFunctionImpl() - out.println("}") - } - } - fun generateSuperClass(i: Int) { val superClass = kind.getSuperClassName(i) if (superClass != null) { @@ -97,21 +100,20 @@ class GenerateFunctions(val out: PrintWriter, val kind: FunctionKind) { } out.println("): R") } +} - fun generateTypeParameters(i: Int, variance: Boolean) { - out.print("<") - if (kind.hasReceiverParameter) { - if (variance) out.print("in ") - out.print("T, ") +class GenerateFunctionsImpl(out: PrintWriter, kind: FunctionKind) : GenerateFunctionsBase(out, kind) { + override fun generate() { + for (i in 0..MAX_PARAM_COUNT) { + out.print("public abstract class " + kind.getImplClassName(i)) + generateTypeParameters(i, true) + out.print(" : ") + out.print(kind.getClassName(i)) + generateTypeParameters(i, false) + out.println(", DefaultJetObject() {") + generateToStringForFunctionImpl() + out.println("}") } - - for (j in 1..i) { - if (variance) out.print("in ") - out.print("P$j, ") - } - - if (variance) out.print("out ") - out.print("R>") } fun generateToStringForFunctionImpl() { @@ -119,15 +121,3 @@ class GenerateFunctions(val out: PrintWriter, val kind: FunctionKind) { out.println(" override fun toString() = \"\${getClass().getGenericSuperclass()}\"") } } - -fun main(args: Array) { - for (kind in FunctionKind.values()) { - generateBuiltInFile(kind.getFileName()) { - GenerateFunctions(it, kind).generateFunctionClasses() - } - - generateRuntimeJvmFile(kind.getImplFileName()) { - GenerateFunctions(it, kind).generateFunctionImplClasses() - } - } -} diff --git a/generators/src/org/jetbrains/jet/generators/builtins/generateBuiltIns.kt b/generators/src/org/jetbrains/jet/generators/builtins/generateBuiltIns.kt new file mode 100644 index 00000000000..15d29b9f0a9 --- /dev/null +++ b/generators/src/org/jetbrains/jet/generators/builtins/generateBuiltIns.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.generators.builtins + +import org.jetbrains.jet.generators.builtins.functions.* +import org.jetbrains.jet.generators.builtins.iterators.* +import org.jetbrains.jet.generators.builtins.progressionIterators.* +import org.jetbrains.jet.generators.builtins.progressions.* +import org.jetbrains.jet.generators.builtins.ranges.* +import java.io.PrintWriter +import java.io.File +import kotlin.properties.Delegates + +fun existingDirectory(path: String): File { + val result = File(path) + if (!result.exists()) { + throw IllegalStateException("Output dir does not exist: ${result.getAbsolutePath()}") + } + return result +} + +val BUILT_INS_DIR: File by Delegates.lazy { existingDirectory("core/builtins/src/jet/") } +val RUNTIME_JVM_DIR: File by Delegates.lazy { existingDirectory("core/runtime.jvm/src/jet/") } + +fun generateFile(dir: File, name: String, generator: (PrintWriter) -> BuiltInsSourceGenerator) { + val file = File(dir, name) + println("generating $file") + PrintWriter(file) use { + fileHeader(it) + generator(it).generate() + } +} + +fun fileHeader(out: PrintWriter) { + out.println(File("injector-generator/copyright.txt").readText()) + // Don't include generator class name in the message: these are built-in sources, + // and we don't want to scare users with any internal information about our project + out.println("// Auto-generated file. DO NOT EDIT!") + out.println() + out.println("package jet") + out.println() +} + + +fun main(args: Array) { + fun generateBuiltInFile(name: String, generator: (PrintWriter) -> BuiltInsSourceGenerator) { + generateFile(BUILT_INS_DIR, name, generator) + } + + fun generateRuntimeJvmFile(name: String, generator: (PrintWriter) -> BuiltInsSourceGenerator) { + generateFile(RUNTIME_JVM_DIR, name, generator) + } + + for (kind in FunctionKind.values()) { + generateBuiltInFile(kind.getFileName()) { GenerateFunctions(it, kind) } + generateRuntimeJvmFile(kind.getImplFileName()) { GenerateFunctionsImpl(it, kind) } + } + + generateBuiltInFile("Iterators.kt") { GenerateIterators(it) } + generateBuiltInFile("ProgressionIterators.kt") { GenerateProgressionIterators(it) } + generateBuiltInFile("Progressions.kt") { GenerateProgressions(it) } + generateBuiltInFile("Ranges.kt") { GenerateRanges(it) } +} diff --git a/generators/src/org/jetbrains/jet/generators/builtins/iterators.kt b/generators/src/org/jetbrains/jet/generators/builtins/iterators.kt index d20f33426d2..18189754b18 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/iterators.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/iterators.kt @@ -32,9 +32,8 @@ enum class IteratorKind { val capitalized: String get() = name().toLowerCase().capitalize() } -class GenerateIterators(val out: PrintWriter) { - fun generate() { - generatedBy(out) +class GenerateIterators(val out: PrintWriter) : BuiltInsSourceGenerator { + override fun generate() { for (kind in IteratorKind.values()) { val s = kind.capitalized out.println("public abstract class ${s}Iterator : Iterator<$s> {") @@ -46,9 +45,3 @@ class GenerateIterators(val out: PrintWriter) { } } } - -fun main(args: Array) { - generateBuiltInFile("Iterators.kt") { - GenerateIterators(it).generate() - } -} diff --git a/generators/src/org/jetbrains/jet/generators/builtins/progressionIterators.kt b/generators/src/org/jetbrains/jet/generators/builtins/progressionIterators.kt index b7cc8b2080b..f8bb5d59bd9 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/progressionIterators.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/progressionIterators.kt @@ -66,9 +66,8 @@ fun floatingPointProgressionIterator(kind: ProgressionKind): String { }""" } -class GenerateProgressionIterators(val out: PrintWriter) { - fun generate() { - generatedBy(out) +class GenerateProgressionIterators(val out: PrintWriter) : BuiltInsSourceGenerator { + override fun generate() { out.println("import jet.runtime.ProgressionUtil") out.println() for (kind in ProgressionKind.values()) { @@ -82,9 +81,3 @@ class GenerateProgressionIterators(val out: PrintWriter) { } } } - -fun main(args: Array) { - generateBuiltInFile("ProgressionIterators.kt") { - GenerateProgressionIterators(it).generate() - } -} diff --git a/generators/src/org/jetbrains/jet/generators/builtins/progressions.kt b/generators/src/org/jetbrains/jet/generators/builtins/progressions.kt index b8882b28b3e..cc9794dfa3a 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/progressions.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/progressions.kt @@ -20,9 +20,8 @@ import org.jetbrains.jet.generators.builtins.* import org.jetbrains.jet.generators.builtins.ProgressionKind.* import java.io.PrintWriter -class GenerateProgressions(val out: PrintWriter) { - fun generate() { - generatedBy(out) +class GenerateProgressions(val out: PrintWriter) : BuiltInsSourceGenerator { + override fun generate() { for (kind in ProgressionKind.values()) { val t = kind.capitalized val progression = "${t}Progression" @@ -82,9 +81,3 @@ class GenerateProgressions(val out: PrintWriter) { } } } - -fun main(args: Array) { - generateBuiltInFile("Progressions.kt") { - GenerateProgressions(it).generate() - } -} diff --git a/generators/src/org/jetbrains/jet/generators/builtins/ranges.kt b/generators/src/org/jetbrains/jet/generators/builtins/ranges.kt index 09d69d6220c..4d485d98363 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/ranges.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/ranges.kt @@ -20,9 +20,8 @@ import org.jetbrains.jet.generators.builtins.* import org.jetbrains.jet.generators.builtins.ProgressionKind.* import java.io.PrintWriter -class GenerateRanges(val out: PrintWriter) { - fun generate() { - generatedBy(out) +class GenerateRanges(val out: PrintWriter) : BuiltInsSourceGenerator { + override fun generate() { for (kind in ProgressionKind.values()) { val t = kind.capitalized val range = "${t}Range" @@ -79,9 +78,3 @@ class GenerateRanges(val out: PrintWriter) { } } } - -fun main(args: Array) { - generateBuiltInFile("Ranges.kt") { - GenerateRanges(it).generate() - } -}