Refactor built-ins source generators
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user