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 96f6b0509c4..0fed386cf0d 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 @@ -22,7 +22,10 @@ import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.plugins.MavenPluginConvention import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.tasks.* +import org.gradle.api.tasks.CompileClasspathNormalizer +import org.gradle.api.tasks.SourceSet +import org.gradle.api.tasks.TaskProvider +import org.gradle.api.tasks.Upload import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.compile.JavaCompile import org.gradle.jvm.tasks.Jar @@ -308,12 +311,78 @@ internal class Kotlin2JsSourceSetProcessor( private fun registerCleanSourceMapTask() { val taskName = kotlinCompilation.composeName("clean", "sourceMap") - registerTask(project, taskName, Delete::class.java) { + project.createOrRegisterTask(taskName, { it.onlyIf { kotlinTask.get().kotlinOptions.sourceMap } it.delete(object : Closure(this) { override fun call(): String? = (kotlinTask.get().property("outputFile") as File).canonicalPath + ".map" }) + }) + project.tasks.findByName("clean")?.dependsOn(taskName) + } +} + +internal class KotlinJsIrSourceSetProcessor( + project: Project, + tasksProvider: KotlinTasksProvider, + kotlinCompilation: AbstractKotlinCompilation<*>, + private val kotlinPluginVersion: String +) : KotlinSourceSetProcessor( + project, tasksProvider, taskDescription = "Compiles the Kotlin sources in $kotlinCompilation to JavaScript.", + kotlinCompilation = kotlinCompilation +) { + override fun doRegisterTask( + project: Project, + taskName: String, + configureAction: (Kotlin2JsCompile) -> (Unit) + ): TaskProvider = + tasksProvider.registerKotlinJSTask(project, taskName, kotlinCompilation, configureAction) + + override fun doTargetSpecificProcessing() { + project.tasks.named(kotlinCompilation.compileAllTaskName).configure { + it.dependsOn(kotlinTask) } + + registerCleanSourceMapTask() + + if (kotlinCompilation is KotlinWithJavaCompilation<*>) { + kotlinCompilation.javaSourceSet.clearJavaSrcDirs() + } + + // outputFile can be set later during the configuration phase, get it only after the phase: + project.runOnceAfterEvaluated("Kotlin2JsSourceSetProcessor.doTargetSpecificProcessing", kotlinTask) { + val kotlinTaskInstance = kotlinTask.get() + kotlinTaskInstance.kotlinOptions.outputFile = kotlinTaskInstance.outputFile.absolutePath + val outputDir = kotlinTaskInstance.outputFile.parentFile + + val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project, kotlinPluginVersion) + val appliedPlugins = subpluginEnvironment.addSubpluginOptions( + project, kotlinTaskInstance, null, null, null, kotlinCompilation + ) + + if (outputDir.isParentOf(project.rootDir)) + throw InvalidUserDataException( + "The output directory '$outputDir' (defined by outputFile of $kotlinTaskInstance) contains or " + + "matches the project root directory '${project.rootDir}'.\n" + + "Gradle will not be able to build the project because of the root directory lock.\n" + + "To fix this, consider using the default outputFile location instead of providing it explicitly." + ) + + kotlinTaskInstance.destinationDir = outputDir + + appliedPlugins + .flatMap { it.getSubpluginKotlinTasks(project, kotlinTaskInstance) } + .forEach { task -> kotlinCompilation.allKotlinSourceSets.forEach { sourceSet -> task.source(sourceSet.kotlin) } } + } + } + + private fun registerCleanSourceMapTask() { + val taskName = kotlinCompilation.composeName("clean", "sourceMap") + project.createOrRegisterTask(taskName, { + it.onlyIf { kotlinTask.get().kotlinOptions.sourceMap } + it.delete(object : Closure(this) { + override fun call(): String? = (kotlinTask.get().property("outputFile") as File).canonicalPath + ".map" + }) + }) project.tasks.findByName("clean")?.dependsOn(taskName) } } @@ -446,12 +515,12 @@ internal abstract class AbstractKotlinPlugin( return } val inspectTask = - registerTask(project, "inspectClassesForKotlinIC", InspectClassesForMultiModuleIC::class.java) { + project.createOrRegisterTask("inspectClassesForKotlinIC", { it.sourceSetName = SourceSet.MAIN_SOURCE_SET_NAME it.archivePath.set(project.provider { jarTask.archivePathCompatible.canonicalPath }) it.archiveName.set(project.provider { jarTask.archiveNameCompatible }) it.dependsOn(classesTask) - } + }) jarTask.dependsOn(inspectTask) } @@ -1029,7 +1098,7 @@ internal fun configureJavaTask(kotlinTask: KotlinCompile, javaTask: AbstractComp * so it's only safe to modify javaTask.classpath right before its usage */ // todo: remove? - javaTask.appendClasspathDynamically(kotlinTask.destinationDir!!) + javaTask.appendClasspathDynamically(kotlinTask.destinationDir) } private fun ifKaptEnabled(project: Project, block: () -> Unit) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt index 11464c86b80..cc7e3940b3a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile -class KotlinJsCompilation( +open class KotlinJsCompilation( target: KotlinTarget, name: String ) : AbstractKotlinCompilationToRunnableFiles(target, name), KotlinCompilationWithResources { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt new file mode 100644 index 00000000000..ca4beda36ff --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt @@ -0,0 +1,21 @@ +/* +* Copyright 2010-2018 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. +*/ + +@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility +package org.jetbrains.kotlin.gradle.plugin.mpp + +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile + +class KotlinJsIrCompilation( + target: KotlinTarget, + name: String +) : KotlinJsCompilation(target, name) { + val productionCompilation: Kotlin2JsCompile = + (target.project.tasks.getByName(compileKotlinTaskName) as Kotlin2JsCompile) + + val developmentCompilation: Kotlin2JsCompile = + (target.project.tasks.getByName(compileKotlinTaskName) as Kotlin2JsCompile) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt index 21814109f7e..596792195cf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir -import org.jetbrains.kotlin.gradle.plugin.Kotlin2JsSourceSetProcessor +import org.jetbrains.kotlin.gradle.plugin.KotlinJsIrSourceSetProcessor import org.jetbrains.kotlin.gradle.plugin.KotlinOnlyTargetConfigurator import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProcessor import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTestsConfigurator @@ -46,7 +46,7 @@ open class KotlinJsIrTargetConfigurator(kotlinPluginVersion: String) : override fun buildCompilationProcessor(compilation: KotlinJsCompilation): KotlinSourceSetProcessor<*> { val tasksProvider = KotlinTasksProvider(compilation.target.targetName) - return Kotlin2JsSourceSetProcessor(compilation.target.project, tasksProvider, compilation, kotlinPluginVersion) + return KotlinJsIrSourceSetProcessor(compilation.target.project, tasksProvider, compilation, kotlinPluginVersion) } override fun configureCompilations(target: KotlinJsIrTarget) {