diff --git a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt index 7bcf875bb6d..45cbfca319f 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt @@ -21,7 +21,6 @@ fun generateCollectionsAPI(outDir: File) { ::sequences, ::specialJVM, ::ranges, - ::toPrimitiveArrays, ::numeric, ::comparables ).flatMap { it().sortedBy { it.signature }.asSequence() } diff --git a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt index f594bcbb229..d8279483b12 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt @@ -52,6 +52,9 @@ fun List.writeTo(outDir: File, sourceFile: SourceFile) { val its = FileWriter(file) its.use { + if (sourceFile.multifile) { + its.append("@file:kotlin.jvm.JvmMultifileClass\n") + } its.append("@file:kotlin.jvm.JvmName(\"${sourceFile.jvmClassName}\")\n\n") its.append("package kotlin\n\n") its.append("$COMMON_AUTOGENERATED_WARNING\n\n") diff --git a/libraries/tools/kotlin-stdlib-gen/src/generators/SourceFile.kt b/libraries/tools/kotlin-stdlib-gen/src/generators/SourceFile.kt index b6560878635..1bb4c7118de 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/generators/SourceFile.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/generators/SourceFile.kt @@ -1,6 +1,6 @@ package generators -enum class SourceFile(jvmClassName: String? = null) { +enum class SourceFile(jvmClassName: String? = null, val multifile: Boolean = true) { Arrays(), Collections(), @@ -9,7 +9,7 @@ enum class SourceFile(jvmClassName: String? = null) { Sequences(), Ranges(), Strings(), - Numbers(), + Misc(), ; val name = this.name() diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Arrays.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Arrays.kt index 6381fc746f5..e00b9075082 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Arrays.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Arrays.kt @@ -54,13 +54,7 @@ fun arrays(): List { } } - return templates -} - - - -fun toPrimitiveArrays(): List = - PrimitiveType.values().map { primitive -> + templates addAll PrimitiveType.values().map { primitive -> val arrayType = primitive.name + "Array" f("to$arrayType()") { only(ArraysOfObjects, Collections) @@ -88,3 +82,6 @@ fun toPrimitiveArrays(): List = } } } + + return templates +} \ No newline at end of file diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt index d3723b0119c..abf719694ab 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt @@ -1,11 +1,13 @@ package templates +import generators.SourceFile import templates.Family.* fun comparables(): List { val templates = arrayListOf() templates add f("coerceAtLeast(minimumValue: SELF)") { + sourceFile(SourceFile.Ranges) only(Primitives, Generic) only(numericPrimitives) returns("SELF") @@ -26,6 +28,7 @@ fun comparables(): List { } templates add f("coerceAtMost(maximumValue: SELF)") { + sourceFile(SourceFile.Ranges) only(Primitives, Generic) only(numericPrimitives) returns("SELF") @@ -45,6 +48,7 @@ fun comparables(): List { } templates add f("coerceIn(range: Range)") { + sourceFile(SourceFile.Ranges) only(Primitives, Generic) only(numericPrimitives) returns("SELF") @@ -65,6 +69,7 @@ fun comparables(): List { } templates add f("coerceIn(minimumValue: SELF?, maximumValue: SELF?)") { + sourceFile(SourceFile.Ranges) only(Primitives, Generic) only(numericPrimitives) returns("SELF") diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Engine.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Engine.kt index 5a4233ab107..b1d148641ce 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Engine.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Engine.kt @@ -113,6 +113,7 @@ class GenericFunction(val signature: String, val keyword: String = "fun") { } val customPrimitiveBodies = HashMap, String>() val annotations = FamilyProperty() + val sourceFile = FamilyProperty() fun bodyForTypes(family: Family, vararg primitiveTypes: PrimitiveType, b: () -> String) { include(family) @@ -185,17 +186,17 @@ class GenericFunction(val signature: String, val keyword: String = "fun") { } } - private fun sourceFileFor(f: Family) = getDefaultSourceFile(f) + private fun sourceFileFor(f: Family) = sourceFile[f] ?: getDefaultSourceFile(f) private fun getDefaultSourceFile(f: Family): SourceFile = when (f) { Iterables, Collections, Lists -> SourceFile.Collections Sequences -> SourceFile.Sequences Sets -> SourceFile.Sets Ranges, RangesOfPrimitives, ProgressionsOfPrimitives -> SourceFile.Ranges - ArraysOfObjects, ArraysOfObjectsSubtype, InvariantArraysOfObjects, ArraysOfPrimitives -> SourceFile.Arrays + ArraysOfObjects, InvariantArraysOfObjects, ArraysOfPrimitives -> SourceFile.Arrays Maps -> SourceFile.Maps Strings -> SourceFile.Strings - Primitives, Generic -> SourceFile.Numbers + Primitives, Generic -> SourceFile.Misc } fun build(vararg families: Family = Family.values()): String { diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Ranges.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Ranges.kt index e4440303988..6716276725f 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Ranges.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Ranges.kt @@ -1,5 +1,6 @@ package templates +import generators.SourceFile import templates.Family.* fun ranges(): List { @@ -47,6 +48,7 @@ fun ranges(): List { } fun downTo(fromType: PrimitiveType, toType: PrimitiveType) = f("downTo(to: $toType)") { + sourceFile(SourceFile.Ranges) only(Primitives) only(fromType) val elementType = PrimitiveType.maxByCapacity(fromType, toType) @@ -79,6 +81,7 @@ fun ranges(): List { templates addAll primitivePermutations.map { downTo(it.first, it.second) } fun until(fromType: PrimitiveType, toType: PrimitiveType) = f("until(to: $toType)") { + sourceFile(SourceFile.Ranges) only(Primitives) only(fromType) val elementType = PrimitiveType.maxByCapacity(fromType, toType)