Reorganize stdlib-js sources specific to the current JS backend

Move kotlin-stdlib-js project and the sources specific to the current backend to 'stdlib/js-v1' directory,
but leave sources that can be shared with the new IR backend in the common 'stdlib/js' location
with exception for 'stdlib/js/src/generated', which is used exclusively for current backend.
This simplifies sourceset configuration when building stdlib with the new backend.
This commit is contained in:
Svyatoslav Kuzmich
2019-04-11 16:25:40 +03:00
parent 9dd9efd4aa
commit b1d303b027
70 changed files with 72 additions and 115 deletions
+22 -54
View File
@@ -22,7 +22,7 @@ sourceSets {
}
val unimplementedNativeBuiltIns =
(file("$rootDir/core/builtins/native/kotlin/").list().toSet() - file("$rootDir/libraries/stdlib/js/irRuntime/builtins/").list())
(file("$rootDir/core/builtins/native/kotlin/").list().toSet() - file("$rootDir/libraries/stdlib/js-ir/builtins/").list())
.map { "core/builtins/native/kotlin/$it" }
// Required to compile native builtins with the rest of runtime
@@ -35,74 +35,37 @@ val builtInsHeader = """@file:Suppress(
)
"""
val fullRuntimeSources by task<Copy> {
val fullRuntimeSources by task<Sync> {
val sources = listOf(
"core/builtins/src/kotlin/",
"libraries/stdlib/common/src/",
"libraries/stdlib/src/kotlin/",
"libraries/stdlib/js/src/kotlin/",
"libraries/stdlib/js/src/generated/",
"libraries/stdlib/js/irRuntime/",
"libraries/stdlib/js/runtime/",
"libraries/stdlib/unsigned/",
"libraries/stdlib/js/src/",
"libraries/stdlib/js/runtime/",
"libraries/stdlib/js-ir/builtins/",
"libraries/stdlib/js-ir/src/",
"libraries/stdlib/js-ir/runtime/",
// TODO get rid - move to test module
"js/js.translator/testData/_commonFiles/"
) + unimplementedNativeBuiltIns
val excluded = listOf(
// stdlib/js/src/generated is used exclusively for current `js-v1` backend.
"libraries/stdlib/js/src/generated/**",
"libraries/stdlib/common/src/kotlin/JvmAnnotationsH.kt",
"libraries/stdlib/src/kotlin/annotations/Multiplatform.kt",
"libraries/stdlib/common/src/kotlin/NativeAnnotationsH.kt",
// TODO: Support Int.pow
"libraries/stdlib/js/src/kotlin/random/PlatformRandom.kt",
// Fails with: EXPERIMENTAL_IS_NOT_ENABLED
"libraries/stdlib/common/src/kotlin/annotations/Annotations.kt",
// Conflicts with libraries/stdlib/js/src/kotlin/annotations.kt
"libraries/stdlib/js/runtime/hacks.kt",
// TODO: Reuse in IR BE
"libraries/stdlib/js/runtime/Enum.kt",
// JS-specific optimized version of emptyArray() already defined
"core/builtins/src/kotlin/ArrayIntrinsics.kt",
// Unnecessary for now
"libraries/stdlib/js/src/kotlin/dom/**",
"libraries/stdlib/js/src/kotlin/browser/**",
// TODO: fix compilation issues in arrayPlusCollection
// Replaced with irRuntime/kotlinHacks.kt
"libraries/stdlib/js/src/kotlin/kotlin.kt",
"libraries/stdlib/js/src/kotlin/currentBeMisc.kt",
// IR BE has its own generated sources
"libraries/stdlib/js/src/generated/**",
"libraries/stdlib/js/src/kotlin/collectionsExternal.kt",
// Full version is defined in stdlib
// This file is useful for smaller subset of runtime sources
"libraries/stdlib/js/irRuntime/smallRuntimeMissingDeclarations.kt",
// Mostly array-specific stuff
"libraries/stdlib/js/src/kotlin/builtins.kt",
// coroutines
// TODO: merge coroutines_13 with JS BE coroutines
"libraries/stdlib/js/src/kotlin/coroutines/intrinsics/IntrinsicsJs.kt",
"libraries/stdlib/js/src/kotlin/coroutines/CoroutineImpl.kt",
// Inlining of js fun doesn't update the variables inside
"libraries/stdlib/js/src/kotlin/jsTypeOf.kt",
"libraries/stdlib/js/src/kotlin/collections/utils.kt",
// TODO: Remove stub
"libraries/stdlib/js/src/kotlin/builtins.kt",
// Expect declarations get thrown away and libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt doesn't compile
"libraries/stdlib/common/src/kotlin/NativeAnnotationsH.kt"
)
@@ -127,7 +90,7 @@ val fullRuntimeSources by task<Copy> {
}
}
val reducedRuntimeSources by task<Copy> {
val reducedRuntimeSources by task<Sync> {
dependsOn(fullRuntimeSources)
from(fullRuntimeSources.outputs.files.singleFile) {
@@ -151,8 +114,11 @@ val reducedRuntimeSources by task<Copy> {
"libraries/stdlib/common/src/kotlin/UMath.kt",
"libraries/stdlib/common/src/kotlin/collections/**",
"libraries/stdlib/common/src/kotlin/ioH.kt",
"libraries/stdlib/js/irRuntime/collectionsHacks.kt",
"libraries/stdlib/js/irRuntime/generated/**",
"libraries/stdlib/js-ir/runtime/collectionsHacks.kt",
"libraries/stdlib/js-ir/src/generated/**",
"libraries/stdlib/js/src/jquery/**",
"libraries/stdlib/js/src/org.w3c/**",
"libraries/stdlib/js/src/kotlin/char.kt",
"libraries/stdlib/js/src/kotlin/collections.kt",
"libraries/stdlib/js/src/kotlin/collections/**",
"libraries/stdlib/js/src/kotlin/console.kt",
@@ -171,13 +137,15 @@ val reducedRuntimeSources by task<Copy> {
"libraries/stdlib/src/kotlin/random/URandom.kt",
"libraries/stdlib/src/kotlin/text/**",
"libraries/stdlib/src/kotlin/util/KotlinVersion.kt",
"libraries/stdlib/src/kotlin/util/Tuples.kt"
"libraries/stdlib/src/kotlin/util/Tuples.kt",
"libraries/stdlib/js/src/kotlin/dom/**",
"libraries/stdlib/js/src/kotlin/browser/**"
)
)
}
from("$rootDir/libraries/stdlib/js/irRuntime/smallRuntimeMissingDeclarations.kt") {
into("libraries/stdlib/js/irRuntime/")
from("$rootDir/libraries/stdlib/js-ir/smallRuntime") {
into("libraries/stdlib/js-ir/runtime/")
}
into("$buildDir/reducedRuntime/src")
@@ -34,8 +34,10 @@ class CodeConformanceTest : TestCase() {
"js/js.translator/testData/node_modules",
"libraries/kotlin.test/js/it/.gradle",
"libraries/kotlin.test/js/it/node_modules",
"libraries/stdlib/js/.gradle",
"libraries/stdlib/js/build",
"libraries/stdlib/js-v1/.gradle",
"libraries/stdlib/js-v1/build",
"libraries/stdlib/js-ir/.gradle",
"libraries/stdlib/js-ir/build",
"libraries/reflect/build",
"libraries/reflect/api/src/java9/java/kotlin/reflect/jvm/internal/impl",
"libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools",
@@ -66,12 +68,14 @@ class CodeConformanceTest : TestCase() {
"js/js.tests/.gradle",
"js/js.translator/testData/node_modules",
"libraries/stdlib/common/build",
"libraries/stdlib/js/.gradle",
"libraries/stdlib/js/build",
"libraries/stdlib/js/irRuntime/longjs.kt",
"libraries/stdlib/js-v1/.gradle",
"libraries/stdlib/js-v1/build",
"libraries/stdlib/js-ir/.gradle",
"libraries/stdlib/js-ir/build",
"libraries/stdlib/js-ir/runtime/longjs.kt",
"libraries/kotlin.test/js/it/.gradle",
"libraries/kotlin.test/js/it/node_modules",
"libraries/stdlib/js/node_modules",
"libraries/stdlib/js-v1/node_modules",
"libraries/tools/kotlin-maven-plugin-test/target",
"libraries/tools/kotlin-gradle-plugin-integration-tests/build",
"libraries/tools/kotlin-test-nodejs-runner/node_modules",
+2 -2
View File
@@ -6,14 +6,14 @@ There are various Kotlin APIs to JavaScript environments in the [standard librar
## Compiling the Kotlin Standard Library for JavaScript
The Kotlin Standard Library for JS is built with gradle, see the corresponding module's [ReadMe](../libraries/stdlib/js/ReadMe.md).
The Kotlin Standard Library for JS is built with gradle, see the corresponding module's [ReadMe](../libraries/stdlib/js-v1/ReadMe.md).
## Reusing JVM based test cases in JavaScript
Any Kotlin test cases using the **org.junit.Test** annotation and the [kotlin.test](../libraries/kotlin.test) package, such as [this test case](../libraries/stdlib/test/text/StringNumberConversionTest.kt#L16) are automatically converted to JavaScript using [QUnit](https://qunitjs.com/).
This allows the test cases to be [run directly in a web page in any web browser](../libraries/stdlib/js/ReadMe.md).
This allows the test cases to be [run directly in a web page in any web browser](../libraries/stdlib/js-v1/ReadMe.md).
## Using the Kotlin Library in JavaScript
@@ -154,7 +154,7 @@ object NashornJsTestChecker : AbstractNashornJsTestChecker() {
class NashornIrJsTestChecker : AbstractNashornJsTestChecker() {
override val preloadedScripts = listOf(
BasicBoxTest.TEST_DATA_DIR_PATH + "nashorn-polyfills.js",
"libraries/stdlib/js/src/js/polyfills.js"
"libraries/stdlib/js-v1/src/js/polyfills.js"
)
}
@@ -111,14 +111,14 @@ public fun isChar(c: Any): Boolean {
}
// TODO: Distinguish Boolean/Byte and Short/Char
public fun isBooleanArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "BooleanArray"
public fun isBooleanArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` === "BooleanArray"
public fun isByteArray(a: dynamic): Boolean = js("a instanceof Int8Array").unsafeCast<Boolean>()
public fun isShortArray(a: dynamic): Boolean = js("a instanceof Int16Array").unsafeCast<Boolean>()
public fun isCharArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "CharArray"
public fun isCharArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` === "CharArray"
public fun isIntArray(a: dynamic): Boolean = js("a instanceof Int32Array").unsafeCast<Boolean>()
public fun isFloatArray(a: dynamic): Boolean = js("a instanceof Float32Array").unsafeCast<Boolean>()
public fun isDoubleArray(a: dynamic): Boolean = js("a instanceof Float64Array").unsafeCast<Boolean>()
public fun isLongArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "LongArray"
public fun isLongArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` === "LongArray"
internal fun jsIn(x: String, y: dynamic): Boolean = js("x in y")
+9
View File
@@ -0,0 +1,9 @@
## Kotlin Standard Library for JS
This module produces a `kotlin-stdlib-js` jar which contains all the Kotlin standard kotlin library code compiled to JavaScript.
The tests of this module can be run and debugged inside any browser by opening the **web/index.html** file in this directory to run the test cases using [Mocha](https://mochajs.org/).
You should execute `installMocha` gradle task before running these tests to fetch the required Mocha dependency and `testClasses` task to compile test code.
These tests are also run during CI build with [Node.js plugin](https://github.com/srs/gradle-node-plugin).
@@ -15,6 +15,7 @@ def builtinsSrcDir = "${buildDir}/builtin-sources"
def builtinsSrcDir2 = "${buildDir}/builtin-sources-for-builtins"
def commonSrcDir = "${projectDir}/../src/kotlin"
def commonSrcDir2 = "${projectDir}/../common/src"
def jsCommonDir = "${projectDir}/../js"
def coroutinesExpJsSrcDir = "${rootDir}/libraries/stdlib/coroutines-experimental/js/src"
def builtinsDir = "${rootDir}/core/builtins"
@@ -22,8 +23,12 @@ def unsignedCommonSrcDir = "${rootDir}/libraries/stdlib/unsigned/src"
def experimentalSrcDir = "${rootDir}/libraries/stdlib/experimental"
def experimentalJsModuleName = 'kotlin-experimental'
def coroutinesJsModuleName = 'kotlin-stdlib-coroutines'
def jsSrcDir = "src"
def jsCommonSrcDir = "${jsCommonDir}/src"
def jsTestSrcDir = "test"
def jsCommonTestSrcDir = "${jsCommonDir}/test"
def jsSrcJsDir = "${jsSrcDir}/js"
def jsOutputFile = "${buildDir}/classes/kotlin.js"
def jsOutputMetaFile = "${buildDir}/classes/kotlin.meta.js"
@@ -34,11 +39,11 @@ def kotlinTestJsOutputFile = "${project(':kotlin-test:kotlin-test-js').buildDir}
def jsTestOutputFile = "${buildDir}/classes/kotlin/test/kotlin-stdlib-js_test.js"
def kotlinTestJsTestOutputFile = "${project(':kotlin-test:kotlin-test-js').buildDir}/classes/kotlin/test/kotlin-test-js_test.js"
sourceSets {
builtins {
kotlin {
srcDir builtinsSrcDir2
srcDir "${jsCommonDir}/runtime"
srcDir 'runtime'
}
}
@@ -46,6 +51,7 @@ sourceSets {
main {
kotlin {
srcDir builtinsSrcDir
srcDir jsCommonSrcDir
srcDir jsSrcDir
}
}
@@ -60,6 +66,7 @@ sourceSets {
test {
kotlin {
srcDir jsTestSrcDir
srcDir jsCommonTestSrcDir
}
}
@@ -145,7 +152,7 @@ compileKotlin2Js {
sourceMap = true
sourceMapPrefix = "./"
freeCompilerArgs += [
"-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, commonSrcDir, commonSrcDir2, unsignedCommonSrcDir].collect { file(it).absoluteFile }.join(File.pathSeparator),
"-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, jsCommonSrcDir, commonSrcDir, commonSrcDir2, unsignedCommonSrcDir].collect { file(it).absoluteFile }.join(File.pathSeparator),
"-Xuse-experimental=kotlin.Experimental",
"-Xuse-experimental=kotlin.ExperimentalMultiplatform",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
@@ -198,6 +205,7 @@ task compileJs(type: NoDebugJavaExec) {
inputs.files(compileExperimentalKotlin2Js.outputs.files)
inputs.files(compileCoroutinesExperimentalKotlin2Js.outputs.files)
inputs.dir(jsSrcDir)
inputs.dir(jsCommonSrcDir)
outputs.file(jsOutputFile)
outputs.file("${jsOutputFile}.map")
@@ -239,15 +247,15 @@ task compileJs(type: NoDebugJavaExec) {
def sourceMapBasePaths = [
"./",
"libraries/stdlib/js/src/js/",
"libraries/stdlib/js/src/",
"libraries/stdlib/js-v1/src/js/",
"libraries/stdlib/js-v1/src/",
]
sourceMap.sources = sourceMap.sources.collect { sourcePath ->
def prefixToRemove = sourceMapBasePaths.find { basePath -> sourcePath.startsWith(basePath) }
if (prefixToRemove != null) sourcePath.substring(prefixToRemove.length()) else sourcePath
}
def sourceMapSourcesBaseDirs = [jsSrcDir, jsSrcJsDir, builtinsSrcDir, commonSrcDir, commonSrcDir2, projectDir, experimentalSrcDir, unsignedCommonSrcDir]
def sourceMapSourcesBaseDirs = [jsSrcDir, jsCommonSrcDir, jsSrcJsDir, builtinsSrcDir, commonSrcDir, commonSrcDir2, projectDir, experimentalSrcDir, unsignedCommonSrcDir]
sourceMap.sourcesContent = sourceMap.sources.collect { sourceName ->
def text = sourceMapSourcesBaseDirs.collect { file("$it/$sourceName") }.find { it.exists() }?.text
+3 -7
View File
@@ -1,9 +1,5 @@
## Kotlin Standard Library for JS
This directory contains shared sources of Kotlin/JS Standard Library for current and IR backends.
This module produces a `kotlin-stdlib-js` jar which contains all the Kotlin standard kotlin library code compiled to JavaScript.
Note that `stdlib/js/src/generated` is not shared but used exclusively for current `js-v1` backend.
The tests of this module can be run and debugged inside any browser by opening the **web/index.html** file in this directory to run the test cases using [Mocha](https://mochajs.org/).
You should execute `installMocha` gradle task before running these tests to fetch the required Mocha dependency and `testClasses` task to compile test code.
These tests are also run during CI build with [Node.js plugin](https://github.com/srs/gradle-node-plugin).
Kotlin/JS Standard Library module is moved to `libraries/stdlib/js-v1`.
@@ -1,28 +0,0 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package kotlin.random
import kotlin.math.pow
// TODO: use stdlib file when math.pow is fixed
internal actual fun defaultPlatformRandom(): Random =
Random(js("(Math.random() * Math.pow(2, 32)) | 0").unsafeCast<Int>())
internal actual fun fastLog2(value: Int): Int {
// TODO: not so fast, make faster
var v = value
var log = -1
while (v != 0) {
v = v.ushr(1)
log++
}
return log
}
internal actual fun doubleFromParts(hi26: Int, low27: Int): Double =
hi26 * (2.0.pow(-26)) + low27 * (2.0.pow(-53))
@@ -73,7 +73,7 @@ internal object PrimitiveClasses {
fun functionClass(arity: Int): KClassImpl<Any> {
return functionClasses.get(arity) ?: run {
val result = PrimitiveKClassImpl(js("Function").unsafeCast<JsClass<Any>>(), "Function$arity",
{ jsTypeOf(it) === "function" && it.asDynamic().length == arity })
{ jsTypeOf(it) === "function" && it.asDynamic().length === arity })
functionClasses.asDynamic()[arity] = result
result
}
@@ -45,7 +45,7 @@ fun main(args: Array<String>) {
targetBaseDirs[KotlinTarget.Common] = baseDir.resolveExistingDir("libraries/stdlib/common/src/generated")
targetBaseDirs[KotlinTarget.JVM] = baseDir.resolveExistingDir("libraries/stdlib/jvm/src/generated")
targetBaseDirs[KotlinTarget.JS] = baseDir.resolveExistingDir("libraries/stdlib/js/src/generated")
targetBaseDirs[KotlinTarget.JS_IR] = baseDir.resolveExistingDir("libraries/stdlib/js/irRuntime/generated")
targetBaseDirs[KotlinTarget.JS_IR] = baseDir.resolveExistingDir("libraries/stdlib/js-ir/src/generated")
}
2 -> {
val (targetName, targetDir) = args
+2 -2
View File
@@ -65,11 +65,11 @@ the Kotlin IntelliJ IDEA plugin:
- License: Apache 2 ([license/third_party/gwt_license.txt][gwt])
- Origin: Derived from GWT, (C) 2007-08 Google Inc.
- Path: libraries/stdlib/js/src/js/long.js
- Path: libraries/stdlib/js-v1/src/js/long.js
- License: Apache 2 ([license/third_party/closure-compiler_LICENSE.txt][closure-compiler])
- Origin: Google Closure Library, Copyright 2009 The Closure Library Authors
- Path: libraries/stdlib/js/src/js/polyfills.js
- Path: libraries/stdlib/js-v1/src/js/polyfills.js
- License: Boost Software License 1.0 ([license/third_party/boost_LICENSE.txt][boost])
- Origin: Derived from boost special math functions, Copyright Eric Ford & Hubert Holin 2001.
+1 -1
View File
@@ -247,7 +247,7 @@ if (flags.inJpsBuildIdeaSync) {
project(':kotlin-stdlib-common').projectDir = "$rootDir/libraries/stdlib/common" as File
project(':kotlin-stdlib').projectDir = "$rootDir/libraries/stdlib/jvm" as File
project(':kotlin-stdlib-js').projectDir = "$rootDir/libraries/stdlib/js" as File
project(':kotlin-stdlib-js').projectDir = "$rootDir/libraries/stdlib/js-v1" as File
project(':kotlin-stdlib-jdk7').projectDir = "$rootDir/libraries/stdlib/jdk7" as File
project(':kotlin-stdlib-jdk8').projectDir = "$rootDir/libraries/stdlib/jdk8" as File
project(':kotlin-stdlib:samples').projectDir = "$rootDir/libraries/stdlib/samples" as File