Refactor built-ins source generators
This commit is contained in:
@@ -16,11 +16,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.generators.builtins
|
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.*
|
import org.jetbrains.jet.generators.builtins.ProgressionKind.*
|
||||||
|
|
||||||
|
trait BuiltInsSourceGenerator {
|
||||||
|
fun generate(): Unit
|
||||||
|
}
|
||||||
|
|
||||||
enum class ProgressionKind {
|
enum class ProgressionKind {
|
||||||
BYTE
|
BYTE
|
||||||
CHAR
|
CHAR
|
||||||
@@ -49,39 +50,3 @@ fun floatToIntBits(v: String) = "java.lang.Float.floatToIntBits($v)"
|
|||||||
|
|
||||||
fun doubleToLongBits(v: String) = "java.lang.Double.doubleToLongBits($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)
|
fun getSuperClassName(i: Int) = superClassNamePrefix?.plus(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
class GenerateFunctions(val out: PrintWriter, val kind: FunctionKind) {
|
abstract class GenerateFunctionsBase(val out: PrintWriter, val kind: FunctionKind): BuiltInsSourceGenerator {
|
||||||
fun generateFunctionClasses() {
|
fun generateTypeParameters(i: Int, variance: Boolean) {
|
||||||
generatedBy(out)
|
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) {
|
for (i in 0..MAX_PARAM_COUNT) {
|
||||||
out.print("public trait " + kind.getClassName(i))
|
out.print("public trait " + kind.getClassName(i))
|
||||||
generateTypeParameters(i, true)
|
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) {
|
fun generateSuperClass(i: Int) {
|
||||||
val superClass = kind.getSuperClassName(i)
|
val superClass = kind.getSuperClassName(i)
|
||||||
if (superClass != null) {
|
if (superClass != null) {
|
||||||
@@ -97,21 +100,20 @@ class GenerateFunctions(val out: PrintWriter, val kind: FunctionKind) {
|
|||||||
}
|
}
|
||||||
out.println("): R")
|
out.println("): R")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun generateTypeParameters(i: Int, variance: Boolean) {
|
class GenerateFunctionsImpl(out: PrintWriter, kind: FunctionKind) : GenerateFunctionsBase(out, kind) {
|
||||||
out.print("<")
|
override fun generate() {
|
||||||
if (kind.hasReceiverParameter) {
|
for (i in 0..MAX_PARAM_COUNT) {
|
||||||
if (variance) out.print("in ")
|
out.print("public abstract class " + kind.getImplClassName(i))
|
||||||
out.print("T, ")
|
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() {
|
fun generateToStringForFunctionImpl() {
|
||||||
@@ -119,15 +121,3 @@ class GenerateFunctions(val out: PrintWriter, val kind: FunctionKind) {
|
|||||||
out.println(" override fun toString() = \"\${getClass().getGenericSuperclass()}\"")
|
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()
|
val capitalized: String get() = name().toLowerCase().capitalize()
|
||||||
}
|
}
|
||||||
|
|
||||||
class GenerateIterators(val out: PrintWriter) {
|
class GenerateIterators(val out: PrintWriter) : BuiltInsSourceGenerator {
|
||||||
fun generate() {
|
override fun generate() {
|
||||||
generatedBy(out)
|
|
||||||
for (kind in IteratorKind.values()) {
|
for (kind in IteratorKind.values()) {
|
||||||
val s = kind.capitalized
|
val s = kind.capitalized
|
||||||
out.println("public abstract class ${s}Iterator : Iterator<$s> {")
|
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) {
|
class GenerateProgressionIterators(val out: PrintWriter) : BuiltInsSourceGenerator {
|
||||||
fun generate() {
|
override fun generate() {
|
||||||
generatedBy(out)
|
|
||||||
out.println("import jet.runtime.ProgressionUtil")
|
out.println("import jet.runtime.ProgressionUtil")
|
||||||
out.println()
|
out.println()
|
||||||
for (kind in ProgressionKind.values()) {
|
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 org.jetbrains.jet.generators.builtins.ProgressionKind.*
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
|
|
||||||
class GenerateProgressions(val out: PrintWriter) {
|
class GenerateProgressions(val out: PrintWriter) : BuiltInsSourceGenerator {
|
||||||
fun generate() {
|
override fun generate() {
|
||||||
generatedBy(out)
|
|
||||||
for (kind in ProgressionKind.values()) {
|
for (kind in ProgressionKind.values()) {
|
||||||
val t = kind.capitalized
|
val t = kind.capitalized
|
||||||
val progression = "${t}Progression"
|
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 org.jetbrains.jet.generators.builtins.ProgressionKind.*
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
|
|
||||||
class GenerateRanges(val out: PrintWriter) {
|
class GenerateRanges(val out: PrintWriter) : BuiltInsSourceGenerator {
|
||||||
fun generate() {
|
override fun generate() {
|
||||||
generatedBy(out)
|
|
||||||
for (kind in ProgressionKind.values()) {
|
for (kind in ProgressionKind.values()) {
|
||||||
val t = kind.capitalized
|
val t = kind.capitalized
|
||||||
val range = "${t}Range"
|
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