Add GenerateBuiltInsTest

Tests that generated sources of built-ins (Functions, Ranges, etc.) are
up-to-date
This commit is contained in:
Alexander Udalov
2014-01-28 19:54:46 +04:00
parent 71d956a568
commit 7edc4b0ff7
8 changed files with 93 additions and 59 deletions
@@ -18,10 +18,6 @@ package org.jetbrains.jet.generators.builtins
import org.jetbrains.jet.generators.builtins.ProgressionKind.*
trait BuiltInsSourceGenerator {
fun generate(): Unit
}
enum class ProgressionKind {
BYTE
CHAR
@@ -18,7 +18,7 @@ package org.jetbrains.jet.generators.builtins.functions
import java.io.PrintWriter
import org.jetbrains.jet.generators.builtins.functions.FunctionKind.*
import org.jetbrains.jet.generators.builtins.*
import org.jetbrains.jet.generators.builtins.generateBuiltIns.*
val MAX_PARAM_COUNT = 22
@@ -40,7 +40,7 @@ enum class FunctionKind(
fun getSuperClassName(i: Int) = superClassNamePrefix?.plus(i)
}
abstract class GenerateFunctionsBase(val out: PrintWriter, val kind: FunctionKind): BuiltInsSourceGenerator {
abstract class GenerateFunctionsBase(out: PrintWriter, val kind: FunctionKind): BuiltInsSourceGenerator(out) {
fun generateTypeParameters(i: Int, variance: Boolean) {
out.print("<")
if (kind.hasReceiverParameter) {
@@ -59,7 +59,7 @@ abstract class GenerateFunctionsBase(val out: PrintWriter, val kind: FunctionKin
}
class GenerateFunctions(out: PrintWriter, kind: FunctionKind) : GenerateFunctionsBase(out, kind) {
override fun generate() {
override fun generateBody() {
for (i in 0..MAX_PARAM_COUNT) {
out.print("public trait " + kind.getClassName(i))
generateTypeParameters(i, true)
@@ -103,7 +103,7 @@ class GenerateFunctions(out: PrintWriter, kind: FunctionKind) : GenerateFunction
}
class GenerateFunctionsImpl(out: PrintWriter, kind: FunctionKind) : GenerateFunctionsBase(out, kind) {
override fun generate() {
override fun generateBody() {
for (i in 0..MAX_PARAM_COUNT) {
out.print("public abstract class " + kind.getImplClassName(i))
generateTypeParameters(i, true)
@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.jetbrains.jet.generators.builtins
package org.jetbrains.jet.generators.builtins.generateBuiltIns
import org.jetbrains.jet.generators.builtins.functions.*
import org.jetbrains.jet.generators.builtins.iterators.*
@@ -23,55 +23,49 @@ 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
}
fun assertExists(file: File): Unit =
if (!file.exists()) error("Output dir does not exist: ${file.getAbsolutePath()}")
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/") }
val BUILT_INS_DIR = File("core/builtins/src/jet/")
val RUNTIME_JVM_DIR = File("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()
abstract class BuiltInsSourceGenerator(val out: PrintWriter) {
protected abstract fun generateBody(): Unit
final fun generate() {
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()
generateBody()
}
}
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)
}
fun generateBuiltIns(generate: (File, (PrintWriter) -> BuiltInsSourceGenerator) -> Unit) {
assertExists(BUILT_INS_DIR)
assertExists(RUNTIME_JVM_DIR)
for (kind in FunctionKind.values()) {
generateBuiltInFile(kind.getFileName()) { GenerateFunctions(it, kind) }
generateRuntimeJvmFile(kind.getImplFileName()) { GenerateFunctionsImpl(it, kind) }
generate(File(BUILT_INS_DIR, kind.getFileName())) { GenerateFunctions(it, kind) }
generate(File(RUNTIME_JVM_DIR, 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) }
generate(File(BUILT_INS_DIR, "Iterators.kt")) { GenerateIterators(it) }
generate(File(BUILT_INS_DIR, "ProgressionIterators.kt")) { GenerateProgressionIterators(it) }
generate(File(BUILT_INS_DIR, "Progressions.kt")) { GenerateProgressions(it) }
generate(File(BUILT_INS_DIR, "Ranges.kt")) { GenerateRanges(it) }
}
fun main(args: Array<String>) {
generateBuiltIns { file, generator ->
println("generating $file")
PrintWriter(file) use {
generator(it).generate()
}
}
}
@@ -16,7 +16,7 @@
package org.jetbrains.jet.generators.builtins.iterators
import org.jetbrains.jet.generators.builtins.*
import org.jetbrains.jet.generators.builtins.generateBuiltIns.*
import java.io.PrintWriter
enum class IteratorKind {
@@ -32,8 +32,8 @@ enum class IteratorKind {
val capitalized: String get() = name().toLowerCase().capitalize()
}
class GenerateIterators(val out: PrintWriter) : BuiltInsSourceGenerator {
override fun generate() {
class GenerateIterators(out: PrintWriter) : BuiltInsSourceGenerator(out) {
override fun generateBody() {
for (kind in IteratorKind.values()) {
val s = kind.capitalized
out.println("public abstract class ${s}Iterator : Iterator<$s> {")
@@ -17,6 +17,7 @@
package org.jetbrains.jet.generators.builtins.progressionIterators
import org.jetbrains.jet.generators.builtins.*
import org.jetbrains.jet.generators.builtins.generateBuiltIns.*
import org.jetbrains.jet.generators.builtins.ProgressionKind.*
import java.io.PrintWriter
@@ -66,8 +67,8 @@ fun floatingPointProgressionIterator(kind: ProgressionKind): String {
}"""
}
class GenerateProgressionIterators(val out: PrintWriter) : BuiltInsSourceGenerator {
override fun generate() {
class GenerateProgressionIterators(out: PrintWriter) : BuiltInsSourceGenerator(out) {
override fun generateBody() {
out.println("import jet.runtime.ProgressionUtil")
out.println()
for (kind in ProgressionKind.values()) {
@@ -17,11 +17,12 @@
package org.jetbrains.jet.generators.builtins.progressions
import org.jetbrains.jet.generators.builtins.*
import org.jetbrains.jet.generators.builtins.generateBuiltIns.*
import org.jetbrains.jet.generators.builtins.ProgressionKind.*
import java.io.PrintWriter
class GenerateProgressions(val out: PrintWriter) : BuiltInsSourceGenerator {
override fun generate() {
class GenerateProgressions(out: PrintWriter) : BuiltInsSourceGenerator(out) {
override fun generateBody() {
for (kind in ProgressionKind.values()) {
val t = kind.capitalized
val progression = "${t}Progression"
@@ -17,11 +17,12 @@
package org.jetbrains.jet.generators.builtins.ranges
import org.jetbrains.jet.generators.builtins.*
import org.jetbrains.jet.generators.builtins.generateBuiltIns.*
import org.jetbrains.jet.generators.builtins.ProgressionKind.*
import java.io.PrintWriter
class GenerateRanges(val out: PrintWriter) : BuiltInsSourceGenerator {
override fun generate() {
class GenerateRanges(out: PrintWriter) : BuiltInsSourceGenerator(out) {
override fun generateBody() {
for (kind in ProgressionKind.values()) {
val t = kind.capitalized
val range = "${t}Range"
@@ -0,0 +1,41 @@
/*
* 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.test
import java.io.PrintWriter
import org.jetbrains.jet.generators.builtins.generateBuiltIns.generateBuiltIns
import java.io.StringWriter
import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.util.io.FileUtil
import junit.framework.Assert
import com.intellij.testFramework.UsefulTestCase
class GenerateBuiltInsTest : UsefulTestCase() {
fun testBuiltInsAreUpToDate() {
generateBuiltIns { file, generator ->
val sw = StringWriter()
PrintWriter(sw) use {
generator(it).generate()
}
val expected = StringUtil.convertLineSeparators(sw.toString().trim())
val actual = StringUtil.convertLineSeparators(FileUtil.loadFile(file).trim())
Assert.assertEquals("To fix this problem you need to regenerate built-ins (run generateBuiltIns.kt)", expected, actual)
}
}
}