From 443f7d1048716019a63f77d2618082711c6b743d Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Wed, 21 Sep 2022 13:53:43 +0000 Subject: [PATCH] [K/JS] Do not run generate-file-tests task if the source was not changed --- js/js.tests/build.gradle.kts | 102 +++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 41 deletions(-) diff --git a/js/js.tests/build.gradle.kts b/js/js.tests/build.gradle.kts index ab06524b40f..b849d80741f 100644 --- a/js/js.tests/build.gradle.kts +++ b/js/js.tests/build.gradle.kts @@ -156,55 +156,74 @@ val unzipJsShell by task { val testDataDir = project(":js:js.translator").projectDir.resolve("testData") val typescriptTestsDir = testDataDir.resolve("typescript-export") -val generateJsExportOnFileTestFilesForTS by task { - val exportFileDirPostfix = "-in-exported-file" - - from(typescriptTestsDir) { - include("**/*.kt") - include("**/*.ts") - include("**/tsconfig.json") - exclude("selective-export/*") - exclude("implicit-export/*") - exclude("inheritance/*") - exclude("strict-implicit-export/*") - exclude("*$exportFileDirPostfix") - - eachFile { - path = "${relativePath.parent}$exportFileDirPostfix/$name" - - var isFirstLine = true - filter { - when { - isFirstLine && name.endsWith(".kt") -> "/** This file is generated by {@link :js:js.test:generateJsExportOnFileTestFilesForTS} task. DO NOT MODIFY MANUALLY */\n\n$it" - .also { isFirstLine = false } - - it.contains("// FILE") -> "$it\n\n@file:JsExport" - else -> it.replace("@JsExport", "") - } - } - - } - - } - - into(typescriptTestsDir) -} - val installTsDependencies = task("installTsDependencies") { workingDir.set(testDataDir) args.set(listOf("install")) } -fun sequential(first: Task, tasks: List): Task { - tasks.fold(first) { previousTask, currentTask -> - currentTask.dependsOn(previousTask) +fun sequential(first: Task? = null, tasks: List): Task { + val callback = { previousTask: Task, currentTask: Task -> currentTask.dependsOn(previousTask) } + if (first != null) { + tasks.fold(first, callback) + } else { + tasks.reduce(callback) } return tasks.last() } +val exportFileDirPostfix = "-in-exported-file" + +fun generateJsExportOnFileTestFor(dir: String): Task = task("generate-js-export-on-file-for-$dir") { + val dirPostfix = exportFileDirPostfix + val inputDir = fileTree(typescriptTestsDir.resolve(dir)) + val outputDir = typescriptTestsDir.resolve("$dir$dirPostfix") + + inputs.files(inputDir.matching { + include("**/*.kt") + include("**/*.ts") + include("**/tsconfig.json") + }) + outputs.dir(outputDir.toPath()) + + from(inputDir) { + include("**/*.kt") + include("**/*.ts") + include("**/tsconfig.json") + } + + eachFile { + var isFirstLine = true + filter { + when { + isFirstLine && name.endsWith(".kt") -> "/** This file is generated by {@link :js:js.test:generateJsExportOnFileTestFilesForTS} task. DO NOT MODIFY MANUALLY */\n\n$it" + .also { isFirstLine = false } + + it.contains("// FILE") -> "$it\n\n@file:JsExport" + else -> it.replace("@JsExport", "") + } + } + } + + into(outputDir) +} + +val generateTypeScriptJsExportOnFileTests = sequential( + tasks = typescriptTestsDir + .listFiles { it: File -> + it.isDirectory && + !it.path.endsWith("/selective-export") && + !it.path.endsWith("/implicit-export") && + !it.path.endsWith("/inheritance") && + !it.path.endsWith("/strict-implicit-export") && + !it.path.endsWith(exportFileDirPostfix) + } + .map { generateJsExportOnFileTestFor(it.name) } +) + + fun generateTypeScriptTestFor(dir: String): Task = task("generate-ts-for-$dir") { - val baseDir = fileTree(testDataDir.resolve("./typescript-export/$dir")) + val baseDir = fileTree(typescriptTestsDir.resolve(dir)) workingDir.set(testDataDir) inputs.files(baseDir.include("*.ts")) @@ -214,8 +233,7 @@ fun generateTypeScriptTestFor(dir: String): Task = task("generate-ts-fo val generateTypeScriptTests = sequential( installTsDependencies, - typescriptTestsDir.listFiles() - .filter { it.isDirectory } + typescriptTestsDir.listFiles { it: File -> it.isDirectory } .map { generateTypeScriptTestFor(it.name) } ) @@ -349,7 +367,9 @@ testsJar {} val generateTests by generator("org.jetbrains.kotlin.generators.tests.GenerateJsTestsKt") { dependsOn(":compiler:generateTestData") - dependsOn(generateJsExportOnFileTestFilesForTS) + if (!project.hasProperty("teamcity")) { + dependsOn(generateTypeScriptJsExportOnFileTests) + } } val prepareMochaTestData by tasks.registering(Copy::class) {