From df5b86c2896a5088dd7a97923fbc51dd72d0e5a0 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 28 Jan 2020 19:37:38 +0300 Subject: [PATCH] [Gradle, JS] Use include instead of sources for link stage of compiler --- .../gradle/targets/js/ir/CompilerFlags.kt | 2 ++ .../gradle/targets/js/ir/KotlinJsIrLink.kt | 29 ++++++++++++++----- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 7 +++-- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt index 45226542746..03717645e44 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt @@ -9,6 +9,8 @@ package org.jetbrains.kotlin.gradle.targets.js.ir * @see [compiler/testData/cli/js/jsExtraHelp.out] */ +const val ENTRY_IR_MODULE = "-Xinclude" + const val DISABLE_PRE_IR = "-Xir-only" const val ENABLE_DCE = "-Xir-dce" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt index bc9d3fb0f22..836d7634bea 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt @@ -7,13 +7,12 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.file.FileTree import org.gradle.api.file.RegularFileProperty -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.* +import org.gradle.api.tasks.incremental.IncrementalTaskInputs import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrType.DEVELOPMENT import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrType.PRODUCTION import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile -import org.jetbrains.kotlin.gradle.tasks.SourceRoots import org.jetbrains.kotlin.gradle.utils.newFileProperty import java.io.File @@ -21,10 +20,22 @@ open class KotlinJsIrLink : Kotlin2JsCompile() { @Input lateinit var type: KotlinJsIrType - override fun getSourceRoots() = SourceRoots.KotlinOnly.create( - emptyList() as FileTree, - emptyList() - ) + @Internal + override fun getSource(): FileTree = super.getSource() + + @get:SkipWhenEmpty + @get:InputDirectory + val entryModule: File + get() = File( + (taskData.compilation as KotlinJsIrCompilation) + .output + .classesDirs + .asPath + ) + + override fun skipCondition(inputs: IncrementalTaskInputs): Boolean { + return !inputs.isIncremental && !entryModule.exists() + } @OutputFile val outputFileProperty: RegularFileProperty = project.newFileProperty { @@ -43,7 +54,9 @@ open class KotlinJsIrLink : Kotlin2JsCompile() { } private fun KotlinJsOptions.configureOptions(vararg additionalCompilerArgs: String) { - freeCompilerArgs += additionalCompilerArgs.toList() + PRODUCE_JS + freeCompilerArgs += additionalCompilerArgs.toList() + + PRODUCE_JS + + "$ENTRY_IR_MODULE=${entryModule.canonicalPath}" } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 63a03a09588..51279ac89e2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.daemon.common.MultiModuleICSettings import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.incremental.ChangedFiles import org.jetbrains.kotlin.gradle.internal.* -import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles import org.jetbrains.kotlin.gradle.logging.* @@ -286,6 +285,10 @@ abstract class AbstractKotlinCompile() : AbstractKo } } + protected open fun skipCondition(inputs: IncrementalTaskInputs): Boolean { + return !inputs.isIncremental && getSourceRoots().kotlinSourceFiles.isEmpty() + } + private fun executeImpl(inputs: IncrementalTaskInputs) { // Check that the JDK tools are available in Gradle (fail-fast, instead of a fail during the compiler run): findToolsJar() @@ -295,7 +298,7 @@ abstract class AbstractKotlinCompile() : AbstractKo logger.kotlinDebug { "All kotlin sources: ${allKotlinSources.pathsAsStringRelativeTo(project.rootProject.projectDir)}" } - if (!inputs.isIncremental && allKotlinSources.isEmpty()) { + if (skipCondition(inputs)) { // Skip running only if non-incremental run. Otherwise, we may need to do some cleanup. logger.kotlinDebug { "No Kotlin files found, skipping Kotlin compiler task" } return