diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionTypesUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionTypesUtil.java index bf54c65d519..ffeb9c84f7e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionTypesUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionTypesUtil.java @@ -22,6 +22,10 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.Type; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor; +import org.jetbrains.jet.lang.resolve.ImportPath; +import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetTypeImpl; @@ -30,6 +34,7 @@ import org.jetbrains.jet.lang.types.TypeProjectionImpl; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class FunctionTypesUtil { @@ -49,22 +54,18 @@ public class FunctionTypesUtil { K_MEMBER_FUNCTIONS = new ArrayList(n); K_EXTENSION_FUNCTIONS = new ArrayList(n); + ModuleDescriptor module = new ModuleDescriptorImpl(Name.special(""), + Collections.emptyList(), JavaToKotlinClassMap.getInstance()); + MutablePackageFragmentDescriptor kotlin = new MutablePackageFragmentDescriptor(module, new FqName("kotlin")); + MutablePackageFragmentDescriptor reflect = new MutablePackageFragmentDescriptor(module, new FqName("kotlin.reflect")); + KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance(); for (int i = 0; i < n; i++) { - Name functionImpl = Name.identifier("FunctionImpl" + i); - FUNCTIONS.add(createFunctionImplDescriptor(functionImpl, builtIns.getFunction(i))); - - Name extensionFunctionImpl = Name.identifier("ExtensionFunctionImpl" + i); - EXTENSION_FUNCTIONS.add(createFunctionImplDescriptor(extensionFunctionImpl, builtIns.getExtensionFunction(i))); - - Name kFunctionImpl = Name.identifier("KFunctionImpl" + i); - K_FUNCTIONS.add(createFunctionImplDescriptor(kFunctionImpl, builtIns.getKFunction(i))); - - Name kMemberFunctionImpl = Name.identifier("KMemberFunctionImpl" + i); - K_MEMBER_FUNCTIONS.add(createFunctionImplDescriptor(kMemberFunctionImpl, builtIns.getKMemberFunction(i))); - - Name kExtensionFunctionImpl = Name.identifier("KExtensionFunctionImpl" + i); - K_EXTENSION_FUNCTIONS.add(createFunctionImplDescriptor(kExtensionFunctionImpl, builtIns.getKExtensionFunction(i))); + createFunctionImpl(FUNCTIONS, kotlin, "FunctionImpl" + i, builtIns.getFunction(i)); + createFunctionImpl(EXTENSION_FUNCTIONS, kotlin, "ExtensionFunctionImpl" + i, builtIns.getExtensionFunction(i)); + createFunctionImpl(K_FUNCTIONS, reflect, "KFunctionImpl" + i, builtIns.getKFunction(i)); + createFunctionImpl(K_MEMBER_FUNCTIONS, reflect, "KMemberFunctionImpl" + i, builtIns.getKMemberFunction(i)); + createFunctionImpl(K_EXTENSION_FUNCTIONS, reflect, "KExtensionFunctionImpl" + i, builtIns.getKExtensionFunction(i)); } ImmutableMap.Builder builder = ImmutableMap.builder(); @@ -137,22 +138,25 @@ public class FunctionTypesUtil { ); } - @NotNull - private static ClassDescriptor createFunctionImplDescriptor(@NotNull Name name, @NotNull ClassDescriptor functionInterface) { - PackageFragmentDescriptor builtinsFragment = KotlinBuiltIns.getInstance().getBuiltInsPackageFragment(); + private static void createFunctionImpl( + @NotNull List result, + @NotNull PackageFragmentDescriptor containingDeclaration, + @NotNull String name, + @NotNull ClassDescriptor functionInterface + ) { MutableClassDescriptor functionImpl = new MutableClassDescriptor( - builtinsFragment, - builtinsFragment.getMemberScope(), + containingDeclaration, + containingDeclaration.getMemberScope(), ClassKind.CLASS, false, - name + Name.identifier(name) ); functionImpl.setModality(Modality.FINAL); functionImpl.setVisibility(Visibilities.PUBLIC); functionImpl.setTypeParameterDescriptors(functionInterface.getDefaultType().getConstructor().getParameters()); functionImpl.createTypeConstructor(); - return functionImpl; + result.add(functionImpl); } @NotNull @@ -170,10 +174,10 @@ public class FunctionTypesUtil { public static Type getFunctionImplType(@NotNull FunctionDescriptor descriptor) { int paramCount = descriptor.getValueParameters().size(); if (descriptor.getReceiverParameter() != null) { - return Type.getObjectType("jet/ExtensionFunctionImpl" + paramCount); + return Type.getObjectType("kotlin/ExtensionFunctionImpl" + paramCount); } else { - return Type.getObjectType("jet/FunctionImpl" + paramCount); + return Type.getObjectType("kotlin/FunctionImpl" + paramCount); } } } diff --git a/compiler/testData/codegen/box/callableReference/toString.kt b/compiler/testData/codegen/box/callableReference/toString.kt index ce5a8438ca5..f36150769ff 100644 --- a/compiler/testData/codegen/box/callableReference/toString.kt +++ b/compiler/testData/codegen/box/callableReference/toString.kt @@ -9,15 +9,15 @@ fun A.baz() {} fun box(): String { val f = "${::foo}" - if (f != "jet.KFunctionImpl1") return "Fail foo: $f" + if (f != "kotlin.reflect.KFunctionImpl1") return "Fail foo: $f" val nameOfA = (A() as java.lang.Object).getClass().getName() val g = "${A::bar}" - if (g != "jet.KMemberFunctionImpl0<$nameOfA, java.lang.String>") return "Fail bar: $g" + if (g != "kotlin.reflect.KMemberFunctionImpl0<$nameOfA, java.lang.String>") return "Fail bar: $g" val h = "${A::baz}" - if (h != "jet.KExtensionFunctionImpl0<$nameOfA, jet.Unit>") return "Fail baz: $h" + if (h != "kotlin.reflect.KExtensionFunctionImpl0<$nameOfA, jet.Unit>") return "Fail baz: $h" return "OK" } diff --git a/compiler/testData/codegen/box/functions/functionNtoString.kt b/compiler/testData/codegen/box/functions/functionNtoString.kt index bfef8690d4a..20c04c58b13 100644 --- a/compiler/testData/codegen/box/functions/functionNtoString.kt +++ b/compiler/testData/codegen/box/functions/functionNtoString.kt @@ -6,22 +6,22 @@ fun check(expected: String, obj: Any?) { fun box(): String { - check("jet.FunctionImpl0") + check("kotlin.FunctionImpl0") { () : Unit -> } - check("jet.FunctionImpl0") + check("kotlin.FunctionImpl0") { () : Int -> 42 } - check("jet.FunctionImpl1") + check("kotlin.FunctionImpl1") { (s: String) : Long -> 42.toLong() } - check("jet.FunctionImpl2") + check("kotlin.FunctionImpl2") { (x: Int, y: Int) : Unit -> } - check("jet.ExtensionFunctionImpl0") + check("kotlin.ExtensionFunctionImpl0") { Int.() : Unit -> } - check("jet.ExtensionFunctionImpl0") + check("kotlin.ExtensionFunctionImpl0") { Unit.() : Int -> 42 } - check("jet.ExtensionFunctionImpl1") + check("kotlin.ExtensionFunctionImpl1") { String.(s: String) : Long -> 42.toLong() } - check("jet.ExtensionFunctionImpl2") + check("kotlin.ExtensionFunctionImpl2") { Int.(x: Int, y: Int) : Unit -> } return "OK" diff --git a/compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt b/compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt index 2f2ccf64913..c22b8fa4bce 100644 --- a/compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt +++ b/compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt @@ -19,15 +19,15 @@ val extensionFun = { Any.() : Unit -> } val extensionWithArgFun = { Long.(x: Any) : Date -> Date() } fun box(): String { - assertGenericSuper("jet.FunctionImpl0", unitFun) - assertGenericSuper("jet.FunctionImpl0", intFun) - assertGenericSuper("jet.FunctionImpl1", stringParamFun) - assertGenericSuper("jet.FunctionImpl1, java.util.List>", listFun) - assertGenericSuper("jet.FunctionImpl1, java.util.List>", mutableListFun) - assertGenericSuper("jet.FunctionImpl1, jet.Unit>", funWithIn) + assertGenericSuper("kotlin.FunctionImpl0", unitFun) + assertGenericSuper("kotlin.FunctionImpl0", intFun) + assertGenericSuper("kotlin.FunctionImpl1", stringParamFun) + assertGenericSuper("kotlin.FunctionImpl1, java.util.List>", listFun) + assertGenericSuper("kotlin.FunctionImpl1, java.util.List>", mutableListFun) + assertGenericSuper("kotlin.FunctionImpl1, jet.Unit>", funWithIn) - assertGenericSuper("jet.ExtensionFunctionImpl0", extensionFun) - assertGenericSuper("jet.ExtensionFunctionImpl1", extensionWithArgFun) + assertGenericSuper("kotlin.ExtensionFunctionImpl0", extensionFun) + assertGenericSuper("kotlin.ExtensionFunctionImpl1", extensionWithArgFun) return "OK" } diff --git a/core/runtime.jvm/src/jet/ExtensionFunctionsImpl.kt b/core/runtime.jvm/src/kotlin/ExtensionFunctionsImpl.kt similarity index 99% rename from core/runtime.jvm/src/jet/ExtensionFunctionsImpl.kt rename to core/runtime.jvm/src/kotlin/ExtensionFunctionsImpl.kt index 42b8cdb5dd1..10631e8505b 100644 --- a/core/runtime.jvm/src/jet/ExtensionFunctionsImpl.kt +++ b/core/runtime.jvm/src/kotlin/ExtensionFunctionsImpl.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package jet +package kotlin public abstract class ExtensionFunctionImpl0 : ExtensionFunction0, DefaultJetObject() { override fun toString() = "${getClass().getGenericSuperclass()}" diff --git a/core/runtime.jvm/src/jet/FunctionsImpl.kt b/core/runtime.jvm/src/kotlin/FunctionsImpl.kt similarity index 99% rename from core/runtime.jvm/src/jet/FunctionsImpl.kt rename to core/runtime.jvm/src/kotlin/FunctionsImpl.kt index c568869c254..ec80a685523 100644 --- a/core/runtime.jvm/src/jet/FunctionsImpl.kt +++ b/core/runtime.jvm/src/kotlin/FunctionsImpl.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package jet +package kotlin public abstract class FunctionImpl0 : Function0, DefaultJetObject() { override fun toString() = "${getClass().getGenericSuperclass()}" diff --git a/core/runtime.jvm/src/jet/KExtensionFunctionsImpl.kt b/core/runtime.jvm/src/kotlin/reflect/KExtensionFunctionsImpl.kt similarity index 99% rename from core/runtime.jvm/src/jet/KExtensionFunctionsImpl.kt rename to core/runtime.jvm/src/kotlin/reflect/KExtensionFunctionsImpl.kt index f207333a90a..d8cbb81b22f 100644 --- a/core/runtime.jvm/src/jet/KExtensionFunctionsImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/KExtensionFunctionsImpl.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package jet +package kotlin.reflect public abstract class KExtensionFunctionImpl0 : KExtensionFunction0, DefaultJetObject() { override fun toString() = "${getClass().getGenericSuperclass()}" diff --git a/core/runtime.jvm/src/jet/KFunctionsImpl.kt b/core/runtime.jvm/src/kotlin/reflect/KFunctionsImpl.kt similarity index 99% rename from core/runtime.jvm/src/jet/KFunctionsImpl.kt rename to core/runtime.jvm/src/kotlin/reflect/KFunctionsImpl.kt index 15bb5e7ea8f..8a1c31a5988 100644 --- a/core/runtime.jvm/src/jet/KFunctionsImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/KFunctionsImpl.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package jet +package kotlin.reflect public abstract class KFunctionImpl0 : KFunction0, DefaultJetObject() { override fun toString() = "${getClass().getGenericSuperclass()}" diff --git a/core/runtime.jvm/src/jet/KMemberFunctionsImpl.kt b/core/runtime.jvm/src/kotlin/reflect/KMemberFunctionsImpl.kt similarity index 99% rename from core/runtime.jvm/src/jet/KMemberFunctionsImpl.kt rename to core/runtime.jvm/src/kotlin/reflect/KMemberFunctionsImpl.kt index 814f09a8194..97749f8d26b 100644 --- a/core/runtime.jvm/src/jet/KMemberFunctionsImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/KMemberFunctionsImpl.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package jet +package kotlin.reflect public abstract class KMemberFunctionImpl0 : KMemberFunction0, DefaultJetObject() { override fun toString() = "${getClass().getGenericSuperclass()}" diff --git a/generators/src/org/jetbrains/jet/generators/builtins/functions.kt b/generators/src/org/jetbrains/jet/generators/builtins/functions.kt index 061e3362399..d504e245544 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/functions.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/functions.kt @@ -34,10 +34,12 @@ enum class FunctionKind( K_EXTENSION_FUNCTION : FunctionKind("KExtensionFunction", true, "ExtensionFunction") fun getFileName() = classNamePrefix + "s.kt" - fun getImplFileName() = classNamePrefix + "sImpl.kt" + fun getImplFileName() = (if (isReflection()) "reflect/" else "") + classNamePrefix + "sImpl.kt" fun getClassName(i: Int) = classNamePrefix + i fun getImplClassName(i: Int) = classNamePrefix + "Impl" + i fun getSuperClassName(i: Int) = superClassNamePrefix?.plus(i) + + private fun isReflection() = superClassNamePrefix != null } abstract class GenerateFunctionsBase(out: PrintWriter, val kind: FunctionKind): BuiltInsSourceGenerator(out) { @@ -85,9 +87,6 @@ class GenerateFunctions(out: PrintWriter, kind: FunctionKind) : GenerateFunction K_FUNCTION, K_MEMBER_FUNCTION, K_EXTENSION_FUNCTION -> { out.println() } - else -> { - throw IllegalStateException("Unknown kind: " + kind) - } } fun generateInvokeSignature(i: Int) { @@ -103,6 +102,11 @@ class GenerateFunctions(out: PrintWriter, kind: FunctionKind) : GenerateFunction } class GenerateFunctionsImpl(out: PrintWriter, kind: FunctionKind) : GenerateFunctionsBase(out, kind) { + override fun getPackage() = when (kind) { + FUNCTION, EXTENSION_FUNCTION -> "kotlin" + K_FUNCTION, K_MEMBER_FUNCTION, K_EXTENSION_FUNCTION -> "kotlin.reflect" + } + override fun generateBody() { for (i in 0..MAX_PARAM_COUNT) { out.print("public abstract class " + kind.getImplClassName(i)) diff --git a/generators/src/org/jetbrains/jet/generators/builtins/generateBuiltIns.kt b/generators/src/org/jetbrains/jet/generators/builtins/generateBuiltIns.kt index d15255ef122..8dd3d3fe1b9 100644 --- a/generators/src/org/jetbrains/jet/generators/builtins/generateBuiltIns.kt +++ b/generators/src/org/jetbrains/jet/generators/builtins/generateBuiltIns.kt @@ -28,18 +28,20 @@ fun assertExists(file: File): Unit = if (!file.exists()) error("Output dir does not exist: ${file.getAbsolutePath()}") val BUILT_INS_DIR = File("core/builtins/src/jet/") -val RUNTIME_JVM_DIR = File("core/runtime.jvm/src/jet/") +val RUNTIME_JVM_DIR = File("core/runtime.jvm/src/kotlin/") abstract class BuiltInsSourceGenerator(val out: PrintWriter) { protected abstract fun generateBody(): Unit + protected open fun getPackage(): String = "jet" + 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("package ${getPackage()}") out.println() generateBody() @@ -64,6 +66,7 @@ fun generateBuiltIns(generate: (File, (PrintWriter) -> BuiltInsSourceGenerator) fun main(args: Array) { generateBuiltIns { file, generator -> println("generating $file") + file.getParentFile()?.mkdirs() PrintWriter(file) use { generator(it).generate() }