Introduce fictitious numbered Function class descriptors

This commit is contained in:
Alexander Udalov
2015-04-16 17:58:18 +03:00
parent 27ed098467
commit 4141e0a8df
32 changed files with 807 additions and 70 deletions
@@ -0,0 +1,80 @@
/*
* Copyright 2010-2015 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.kotlin.generators.builtins.functionImpl
import org.jetbrains.kotlin.generators.builtins.functions.MAX_PARAM_COUNT
import org.jetbrains.kotlin.generators.builtins.generateBuiltIns.BuiltInsSourceGenerator
import org.jetbrains.kotlin.generators.builtins.generateBuiltIns.BuiltInsSourceGenerator.Language
import java.io.PrintWriter
class GenerateFunctionImpl(out: PrintWriter) : BuiltInsSourceGenerator(out) {
override fun getPackage() = "kotlin.jvm.internal"
override val language = Language.JAVA
override fun generateBody() {
val n = MAX_PARAM_COUNT
out.print("""import kotlin.Function;
import kotlin.jvm.functions.*;
import java.io.Serializable;
public abstract class FunctionImpl
implements Function, Serializable,""")
for (i in 0..n) {
if (i % 10 == 0) {
// Insert newline sometimes to avoid very long lines
out.println()
out.print(" ")
}
out.print("Function$i")
if (i < n) out.print(", ")
}
out.println(" {")
out.println("""
public abstract int getArity();
public Object invokeVararg(Object... p) {
throw new UnsupportedOperationException();
}
private void checkArity(int expected) {
if (getArity() != expected) {
throwWrongArity(expected);
}
}
private void throwWrongArity(int expected) {
throw new IllegalStateException("Wrong function arity, expected: " + expected + ", actual: " + getArity());
}""")
for (i in 0..n) {
out.println()
out.println(" @Override")
out.println(" public Object invoke(" + (1..i).joinToString { "Object p$it" } + ") {")
out.println(" checkArity($i);")
out.println(" return invokeVararg(" + (1..i).joinToString { "p$it" } + ");")
out.println(" }")
}
out.println("}")
}
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.generators.builtins.generateBuiltIns
import org.jetbrains.kotlin.generators.builtins.arrayIterators.GenerateArrayIterators
import org.jetbrains.kotlin.generators.builtins.arrays.GenerateArrays
import org.jetbrains.kotlin.generators.builtins.functionImpl.GenerateFunctionImpl
import org.jetbrains.kotlin.generators.builtins.functions.FunctionKind
import org.jetbrains.kotlin.generators.builtins.functions.GenerateFunctions
import org.jetbrains.kotlin.generators.builtins.iterators.GenerateIterators
@@ -40,13 +41,21 @@ abstract class BuiltInsSourceGenerator(val out: PrintWriter) {
protected open fun getPackage(): String = "kotlin"
protected open val language: Language = Language.KOTLIN
enum class Language {
KOTLIN
JAVA
}
final fun generate() {
out.println(File("license/LICENSE.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 ${getPackage()}")
out.print("package ${getPackage()}")
if (language == Language.KOTLIN) out.println() else out.println(";")
out.println()
generateBody()
@@ -63,6 +72,7 @@ fun generateBuiltIns(generate: (File, (PrintWriter) -> BuiltInsSourceGenerator)
generate(File(dir, kind.fileName)) { GenerateFunctions(it, kind) }
}
generate(File(RUNTIME_JVM_DIR, "kotlin/jvm/internal/FunctionImpl.java")) { GenerateFunctionImpl(it) }
generate(File(BUILT_INS_NATIVE_DIR, "kotlin/Arrays.kt")) { GenerateArrays(it) }
generate(File(BUILT_INS_NATIVE_DIR, "kotlin/Primitives.kt")) { GeneratePrimitives(it) }
generate(File(BUILT_INS_SRC_DIR, "kotlin/Iterators.kt")) { GenerateIterators(it) }