Refactor built-ins source generators

This commit is contained in:
Alexander Udalov
2014-01-28 17:53:54 +04:00
parent 1f15e57918
commit 71d956a568
7 changed files with 121 additions and 117 deletions
@@ -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()
}
@@ -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<String>) {
for (kind in FunctionKind.values()) {
generateBuiltInFile(kind.getFileName()) {
GenerateFunctions(it, kind).generateFunctionClasses()
}
generateRuntimeJvmFile(kind.getImplFileName()) {
GenerateFunctions(it, kind).generateFunctionImplClasses()
}
}
}
@@ -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<String>) {
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) }
}
@@ -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<String>) {
generateBuiltInFile("Iterators.kt") {
GenerateIterators(it).generate()
}
}
@@ -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<String>) {
generateBuiltInFile("ProgressionIterators.kt") {
GenerateProgressionIterators(it).generate()
}
}
@@ -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<String>) {
generateBuiltInFile("Progressions.kt") {
GenerateProgressions(it).generate()
}
}
@@ -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<String>) {
generateBuiltInFile("Ranges.kt") {
GenerateRanges(it).generate()
}
}