From bd1f95da04c4363cb7f5da4c6a9eef8e6cdca882 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 16 Apr 2019 18:45:00 +0300 Subject: [PATCH] Disable automatic JVM target 1.8 detection in Android projects, KT-31027 This is a soft revert of the fix for KT-21030 (commit ffbd0e8a). The logic introduced for KT-21030 should now only run when a property flag is provided, kotlin.setJvmTargetFromAndroidCompileOptions. We can't set the JVM target to 1.8 automatically until an Android Gradle plugin version appears that can correctly desugar the bytecode produced by the Kotlin compiler. So we disable the logic introduced in the fix for KT-26432 with the plan to enable it back and apply it conditionally once there is an Android Gradle plugin version that processes the calls correctly. Issue #KT-31027 Fixed --- .../kotlin/gradle/AbstractKotlinAndroidGradleTests.kt | 9 +++++++-- .../org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt | 8 +++++++- .../jetbrains/kotlin/gradle/plugin/KotlinProperties.kt | 3 +++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt index a3b09b10d63..687c5448c50 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt @@ -680,7 +680,7 @@ fun getSomething() = 10 val kotlinJvmTarget18Regex = Regex("Kotlin compiler args: .* -jvm-target 1.8") - build(":Lib:assemble") { + build(":Lib:assembleDebug", "-Pkotlin.setJvmTargetFromAndroidCompileOptions=true") { assertSuccessful() assertNotContains(kotlinJvmTarget18Regex) } @@ -694,7 +694,12 @@ fun getSomething() = 10 """.trimIndent() ) - build(":Lib:assemble") { + build("clean", ":Lib:assembleDebug") { + assertSuccessful() + assertNotContains(kotlinJvmTarget18Regex) + } + + build(":Lib:assembleDebug", "-Pkotlin.setJvmTargetFromAndroidCompileOptions=true") { assertSuccessful() assertContainsRegex(kotlinJvmTarget18Regex) } 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 732c3eea082..8ef9ec3ccdb 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 @@ -735,7 +735,13 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationT val kotlinOptions = KotlinJvmOptionsImpl() project.whenEvaluated { - applyAndroidJavaVersion(project.extensions.getByType(BaseExtension::class.java), kotlinOptions) + // TODO don't require the flag once there is an Android Gradle plugin build that supports desugaring of Long.hashCode and + // Boolean.hashCode. Instead, run conditionally, only with the AGP versions that play well with Kotlin bytecode for + // JVM target 1.8. + // See: KT-31027 + if (PropertiesProvider(project).setJvmTargetFromAndroidCompileOptions == true) { + applyAndroidJavaVersion(project.extensions.getByType(BaseExtension::class.java), kotlinOptions) + } } kotlinOptions.noJdk = true 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 c8b3391ea3f..4955f816844 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 @@ -85,6 +85,9 @@ internal class PropertiesProvider(private val project: Project) { val ignorePluginLoadedInMultipleProjects: Boolean? get() = booleanProperty("kotlin.pluginLoadedInMultipleProjects.ignore") + val setJvmTargetFromAndroidCompileOptions: Boolean? + get() = booleanProperty("kotlin.setJvmTargetFromAndroidCompileOptions") + /** * Enables parallel tasks execution within a project with Workers API. * Does not enable using actual worker proccesses