diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt index 6996315a43c..2d98fe27bf6 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt @@ -26,6 +26,7 @@ class K2JSDceArguments : CommonToolArguments() { valueDescription = "", description = "Output directory" ) + @GradleOption(DefaultValues.StringNullDefault::class) var outputDirectory: String? by FreezableVar(null) @Argument( 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 c8767045ffa..2f778dbb2ca 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 @@ -221,6 +221,30 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() { fun testDce() { val project = Project("kotlin2JsDceProject", "2.10", minLogLevel = LogLevel.INFO) + project.build("runRhino") { + assertSuccessful() + val pathPrefix = "mainProject/build/kotlin-js-min/main" + assertFileExists("$pathPrefix/exampleapp.js.map") + assertFileExists("$pathPrefix/examplelib.js.map") + assertFileContains("$pathPrefix/exampleapp.js.map", "\"../../../src/main/kotlin/exampleapp/main.kt\"") + + assertFileExists("$pathPrefix/kotlin.js") + assertTrue(fileInWorkingDir("$pathPrefix/kotlin.js").length() < 500 * 1000, "Looks like kotlin.js file was not minified by DCE") + } + } + + @Test + fun testDceOutputPath() { + val project = Project("kotlin2JsDceProject", "2.10", minLogLevel = LogLevel.INFO) + + project.setupWorkingDir() + File(project.projectDir, "mainProject/build.gradle").modify { + it + "\n" + + "runDceKotlinJs.dceOptions.outputDirectory = \"\${buildDir}/min\"\n" + + "runRhino.args = [\"-f\", \"min/kotlin.js\", \"-f\", \"min/examplelib.js\", \"-f\", \"min/exampleapp.js\"," + + "\"-f\", \"../check.js\"]\n" + } + project.build("runRhino") { assertSuccessful() val pathPrefix = "mainProject/build/min" @@ -245,10 +269,10 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() { project.build("runRhino") { assertSuccessful() - val pathPrefix = "mainProject/build/min" + val pathPrefix = "mainProject/build/kotlin-js-min/main" assertFileExists("$pathPrefix/exampleapp.js.map") assertFileExists("$pathPrefix/examplelib.js.map") - assertFileContains("$pathPrefix/exampleapp.js.map", "\"../../src/main/kotlin/exampleapp/main.kt\"") + assertFileContains("$pathPrefix/exampleapp.js.map", "\"../../../src/main/kotlin/exampleapp/main.kt\"") assertFileExists("$pathPrefix/kotlin.js") assertTrue(fileInWorkingDir("$pathPrefix/kotlin.js").length() > 1000 * 1000, "Looks like kotlin.js file was minified by DCE") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsDceProject/mainProject/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsDceProject/mainProject/build.gradle index c7d3ba5b19f..18d5928527d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsDceProject/mainProject/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsDceProject/mainProject/build.gradle @@ -32,7 +32,11 @@ task runRhino(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath workingDir = "${buildDir}" main = 'org.mozilla.javascript.tools.shell.Main' - args = ["-opt", "-1", "-f", "min/kotlin.js", "-f", "min/examplelib.js", "-f", "min/exampleapp.js", "-f", "../check.js"] + args = ["-opt", "-1", + "-f", "kotlin-js-min/main/kotlin.js", + "-f", "kotlin-js-min/main/examplelib.js", + "-f", "kotlin-js-min/main/exampleapp.js", + "-f", "../check.js"] } runRhino.dependsOn(runDceKotlinJs) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptions.kt index c0db6250847..a7f5615d279 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptions.kt @@ -5,8 +5,14 @@ package org.jetbrains.kotlin.gradle.dsl interface KotlinJsDceOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonToolOptions { /** - * Development mode: don't strip out any code, just copy dependencies and remap source maps + * Development mode: don't strip out any code, just copy dependencies * Default value: false */ var devMode: kotlin.Boolean + + /** + * Output directory + * Default value: null + */ + var outputDirectory: kotlin.String? } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptionsBase.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptionsBase.kt index 92d0ae54837..98d2bc796b3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptionsBase.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsDceOptionsBase.kt @@ -24,11 +24,17 @@ internal abstract class KotlinJsDceOptionsBase : org.jetbrains.kotlin.gradle.dsl get() = devModeField ?: false set(value) { devModeField = value } + private var outputDirectoryField: kotlin.String?? = null + override var outputDirectory: kotlin.String? + get() = outputDirectoryField ?: null + set(value) { outputDirectoryField = value } + internal open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JSDceArguments) { allWarningsAsErrorsField?.let { args.allWarningsAsErrors = it } suppressWarningsField?.let { args.suppressWarnings = it } verboseField?.let { args.verbose = it } devModeField?.let { args.devMode = it } + outputDirectoryField?.let { args.outputDirectory = it } } } @@ -37,4 +43,5 @@ internal fun org.jetbrains.kotlin.cli.common.arguments.K2JSDceArguments.fillDefa suppressWarnings = false verbose = false devMode = false + outputDirectory = null } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt index 9dc087e9d5d..d3355bd3700 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt @@ -43,7 +43,7 @@ class KotlinJsDcePlugin : Plugin { } project.afterEvaluate { - val outputDir = File(kotlinTask.outputFile).parentFile + val outputDir = File(File(project.buildDir, DEFAULT_OUT_DIR), sourceSet.name) val configuration = project.configurations.findByName(sourceSet.compileConfigurationName) val dceInputTrees = listOf(project.fileTree(kotlinTask.outputFile)) + configuration.map { project.fileTree(it) } @@ -51,7 +51,7 @@ class KotlinJsDcePlugin : Plugin { with (dceTask) { classpath = sourceSet.compileClasspath - destinationDir = File(outputDir, "min") + destinationDir = dceTask.dceOptions.outputDirectory?.let { File(it) } ?: outputDir source(dceInputFiles) } } @@ -60,5 +60,6 @@ class KotlinJsDcePlugin : Plugin { companion object { private const val TASK_SUFFIX = "kotlinJs" private const val DCE_TASK_PREFIX = "runDce" + private const val DEFAULT_OUT_DIR = "kotlin-js-min" } } \ No newline at end of file