From 016dd91e3730b8adae25262ffb9361bfb0bd4de3 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 6 Feb 2020 19:29:41 +0300 Subject: [PATCH] [Gradle, JS] Fix destination dir for link tasks - Add test on empty output with empty inputs --- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 40 +++++++++++++++++++ .../kotlin-js-nodejs-project/build.gradle.kts | 21 ++++++++++ .../settings.gradle.kts | 8 ++++ .../src/main/kotlin/Base.kt | 14 +++++++ .../kotlin/gradle/plugin/KotlinPlugin.kt | 11 +++-- .../gradle/targets/js/npm/NpmProject.kt | 6 ++- 6 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/src/main/kotlin/Base.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 9382e739a8e..6e1e68c42cd 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -29,6 +29,44 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) { assert(dts.readText().contains("function bar(): string")) } } + + @Test + fun testCleanOutputWithEmptySources() { + with(Project("kotlin-js-nodejs-project", GradleVersionRequired.AtLeast("5.2"))) { + setupWorkingDir() + gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl) + + build( + "build", + options = defaultBuildOptions().copy(jsCompilerType = JsCompilerType.ir) + ) { + assertSuccessful() + + assertTasksExecuted(":compileProductionKotlinJs") + + assertFileExists("build/js/packages/kotlin-js-nodejs/kotlin/kotlin-js-nodejs.js") + } + + File("${projectDir.canonicalPath}/src").deleteRecursively() + + gradleBuildScript().appendText( + """${"\n"} + tasks { + compileProductionKotlinJs { + type = org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrType.DEVELOPMENT + } + } + """.trimIndent() + ) + + build("build") { + assertSuccessful() + + assertNoSuchFile("build/js/packages/kotlin-js-nodejs/kotlin/") + } + } + } } class Kotlin2JsGradlePluginIT : AbstractKotlin2JsGradlePluginIT(false) { @@ -547,4 +585,6 @@ abstract class AbstractKotlin2JsGradlePluginIT(private val irBackend: Boolean) : assertFileExists("app/build/distributions/index.html") } } + + } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/build.gradle.kts new file mode 100644 index 00000000000..bb955532c57 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + kotlin("js").version("") +} + +dependencies { + implementation(kotlin("stdlib-js")) +} + +repositories { + mavenLocal() + jcenter() +} + +kotlin { + target { + useCommonJs() + produceExecutable() + nodejs { + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/settings.gradle.kts new file mode 100644 index 00000000000..b39d9d0e83b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/settings.gradle.kts @@ -0,0 +1,8 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } +} + +rootProject.name = "kotlin-js-nodejs" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/src/main/kotlin/Base.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/src/main/kotlin/Base.kt new file mode 100644 index 00000000000..e69d852c3e0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-nodejs-project/src/main/kotlin/Base.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package com.example + +fun best(): Int { + return 42 +} + +fun simpleBest(): Int { + return 73 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 10928594e69..024f341134f 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -41,6 +41,7 @@ import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrLink import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrType +import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -106,11 +107,14 @@ internal abstract class KotlinSourceSetProcessor>( kotlinCompilation.output.addClassesDir { project.files(task.map { it.destinationDir }) } } - protected fun registerKotlinCompileTask(name: String = kotlinCompilation.compileKotlinTaskName): TaskProvider { + protected fun registerKotlinCompileTask( + name: String = kotlinCompilation.compileKotlinTaskName, + compileDestinationDir: File = defaultKotlinDestinationDir + ): TaskProvider { logger.kotlinDebug("Creating kotlin compile task $name") KotlinCompileTaskData.register(name, kotlinCompilation).apply { - destinationDir.set(project.provider { defaultKotlinDestinationDir }) + destinationDir.set(project.provider { compileDestinationDir }) } return doRegisterTask(project, name) { @@ -374,7 +378,8 @@ internal class KotlinJsIrSourceSetProcessor( compilation.developmentLinkTaskName ).onEach { taskName -> registerKotlinCompileTask( - taskName + taskName, + compilation.npmProject.dist ) }.forEach { taskName -> project.tasks.named(taskName).configure { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt index a2c22978c0f..b5e5667dcfa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt @@ -52,8 +52,11 @@ open class NpmProject(val compilation: KotlinJsCompilation) { val packageJsonTask: KotlinPackageJsonTask get() = project.tasks.getByName(packageJsonTaskName) as KotlinPackageJsonTask + val dist: File + get() = dir.resolve(DIST_FOLDER) + val main: String - get() = "kotlin/$name.js" + get() = "$DIST_FOLDER/$name.js" val externalsDirRoot: File get() = project.buildDir.resolve("externals").resolve(name) @@ -115,5 +118,6 @@ open class NpmProject(val compilation: KotlinJsCompilation) { companion object { const val PACKAGE_JSON = "package.json" const val NODE_MODULES = "node_modules" + const val DIST_FOLDER = "kotlin" } } \ No newline at end of file