From 313cd4f7bc4df40d687c63ac29cb495a3a4903b8 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 24 Oct 2017 19:31:58 +0300 Subject: [PATCH] Turn off IC for multiplatform projects by default Multiplatform IC is enabled when a corresponding platform property is enabled and 'kotlin.incremental.multiplatform' is set to `true`. See KT-20840 --- .../kotlin/gradle/MultiplatformGradleIT.kt | 37 ++++++++++++++++++ .../plugin/KotlinMultiplatformPlugin.kt | 10 +++++ .../kotlin/gradle/plugin/KotlinProperties.kt | 39 ++++++++++++------- 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt index 5dcc6b06f79..1ae1e438c53 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.gradle import org.jetbrains.kotlin.gradle.plugin.EXPECTED_BY_CONFIG_NAME import org.jetbrains.kotlin.gradle.plugin.IMPLEMENT_CONFIG_NAME import org.jetbrains.kotlin.gradle.plugin.IMPLEMENT_DEPRECATION_WARNING +import org.jetbrains.kotlin.gradle.util.allKotlinFiles +import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.modify import org.junit.Test import java.io.File @@ -121,4 +123,39 @@ class MultiplatformGradleIT : BaseGradleIT() { } } } + + @Test + fun testNonIncrementalCompileByDefault(): Unit = Project("multiplatformProject", GRADLE_VERSION).run { + val compileCommonTask = ":lib:compileKotlinCommon" + val compileJsTask = ":libJs:compileKotlin2Js" + val compileJvmTask = ":libJvm:compileKotlin" + val allKotlinTasks = listOf(compileCommonTask, compileJsTask, compileJvmTask) + + build("build") { + assertSuccessful() + } + + val commonProjectDir = File(projectDir, "lib") + commonProjectDir.getFileByName("PlatformClass.kt").modify { it + "\n" } + build("build") { + assertSuccessful() + assertTasksExecuted(allKotlinTasks) + } + + val jvmProjectDir = File(projectDir, "libJvm") + jvmProjectDir.getFileByName("PlatformClass.kt").modify { it + "\n" } + build("build") { + assertSuccessful() + assertTasksExecuted(listOf(compileJvmTask)) + assertTasksUpToDate(listOf(compileCommonTask, compileJsTask)) + } + + val jsProjectDir = File(projectDir, "libJs") + jsProjectDir.getFileByName("PlatformClass.kt").modify { it + "\n" } + build("build") { + assertSuccessful() + assertTasksExecuted(listOf(compileJsTask)) + assertTasksUpToDate(listOf(compileCommonTask, compileJvmTask)) + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt index 74e1ae6ea40..17c4c2570d3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt @@ -81,6 +81,16 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin } } } + + val incrementalMultiplatform = PropertiesProvider(project).incrementalMultiplatform ?: false + project.afterEvaluate { + project.tasks.withType(AbstractKotlinCompile::class.java).all { + if (it.incremental && !incrementalMultiplatform) { + project.logger.debug("IC is turned off for task '${it.path}' because multiplatform IC is not enabled") + } + it.incremental = it.incremental && incrementalMultiplatform + } + } } private var implementConfigurationIsUsed = false diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index ce625e0c56b..39b372406a4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -25,27 +25,21 @@ import java.util.* import kotlin.reflect.KMutableProperty1 fun mapKotlinTaskProperties(project: Project, task: AbstractKotlinCompile<*>) { - val properties = PropertiesProvider(project) + PropertiesProvider(project).apply { + coroutines?.let { task.coroutinesFromGradleProperties = it } - properties["kotlin.coroutines"]?.let { - task.coroutinesFromGradleProperties = Coroutines.byCompilerArgument(it) - } - - if (task is KotlinCompile) { - properties["kotlin.incremental"]?.let { - task.incremental = it.toBoolean() + if (task is KotlinCompile) { + incrementalJvm?.let { task.incremental = it } } - } - if (task is Kotlin2JsCompile) { - properties["kotlin.incremental.js"]?.let { - task.incremental = it.toBoolean() + if (task is Kotlin2JsCompile) { + incrementalJs?.let { task.incremental = it } } } } -private class PropertiesProvider(private val project: Project) { - val localProperties = Properties() +internal class PropertiesProvider(private val project: Project) { + private val localProperties = Properties() init { val localPropertiesFile = project.rootProject.file("local.properties") @@ -56,7 +50,22 @@ private class PropertiesProvider(private val project: Project) { } } - operator fun get(propName: String): String? = + val coroutines: Coroutines? + get() = property("kotlin.coroutines")?.let { Coroutines.byCompilerArgument(it) } + + val incrementalJvm: Boolean? + get() = booleanProperty("kotlin.incremental") + + val incrementalJs: Boolean? + get() = booleanProperty("kotlin.incremental.js") + + val incrementalMultiplatform: Boolean? + get() = booleanProperty("kotlin.incremental.multiplatform") + + private fun booleanProperty(propName: String): Boolean? = + property(propName)?.toBoolean() + + private fun property(propName: String): String? = if (project.hasProperty(propName)) { project.property(propName) as? String }