diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt index 8d70e6c449d..bba1d195d1d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt @@ -653,6 +653,24 @@ class KotlinJavaToolchainTest : KGPBaseTest() { } } + @DisplayName("Toolchain should take into account kotlin options that are set via android extension") + @GradleTestVersions(minVersion = "6.7.1") + @GradleTest + internal fun kotlinOptionsAndroidAndToolchain(gradleVersion: GradleVersion) { + project("android".fullProjectName, gradleVersion) { + useToolchainExtension(11) + + //language=properties + gradleProperties.append( + """ + kotlin.jvm.target.validation.mode = error + """.trimIndent() + ) + + build("assembleDebug", "-Pagp_version=${TestVersions.AGP.AGP_42}") + } + } + private fun BuildResult.assertJdkHomeIsUsingJdk( javaexecPath: String ) = assertOutputContains("[KOTLIN] Kotlin compilation 'jdkHome' argument: $javaexecPath") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt index 6a34be63e96..842b639ec9c 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/TestVersions.kt @@ -20,4 +20,8 @@ interface TestVersions { val CURRENT get() = System.getProperty("kotlinVersion") ?: error("Required to specify kotlinVersion system property for tests") } + + object AGP { + const val AGP_42 = "4.2.2" + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/build.gradle new file mode 100644 index 00000000000..fac044f0ac2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/build.gradle @@ -0,0 +1,34 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +repositories { + mavenLocal() + google() + mavenCentral() +} + +android { + compileSdkVersion 30 + defaultConfig { + applicationId "com.example.myapplication" + minSdkVersion 30 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/settings.gradle new file mode 100644 index 00000000000..bbe0b104ba1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/settings.gradle @@ -0,0 +1,21 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + google() + } + + plugins { + id "org.jetbrains.kotlin.jvm" version "$kotlin_version" + id "org.jetbrains.kotlin.android" version "$kotlin_version" + id "org.jetbrains.kotlin.kapt" version "$kotlin_version" + } + + resolutionStrategy { + eachPlugin { + if (requested.id.id == "com.android.application") { + useModule("com.android.tools.build:gradle:$agp_version") + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..551a58ce9a4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/AndroidManifest.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/java/example/App.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/java/example/App.java new file mode 100644 index 00000000000..b27ed3a4650 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/java/example/App.java @@ -0,0 +1,9 @@ +package example; + +import android.app.Application; + +class App extends Application { + public App() { + super(); + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/java/example/MainActivity.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/java/example/MainActivity.kt new file mode 100644 index 00000000000..a7ff49d298c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/android/src/main/java/example/MainActivity.kt @@ -0,0 +1,7 @@ +package example + +import android.app.Activity + +class MainActivity : Activity() { + +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt index 4242587b6c1..2ae4f445bb5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt @@ -17,8 +17,7 @@ import org.gradle.api.tasks.Internal import org.gradle.internal.jvm.Jvm import org.gradle.jvm.toolchain.* import org.gradle.util.GradleVersion -import org.jetbrains.kotlin.gradle.dsl.KotlinCompile as KotlinCompileTask -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsBase +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl import org.jetbrains.kotlin.gradle.tasks.KotlinJavaToolchain.Companion.TOOLCHAIN_SUPPORTED_VERSION import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead import org.jetbrains.kotlin.gradle.utils.property @@ -31,7 +30,7 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor( private val objects: ObjectFactory, projectLayout: ProjectLayout, gradle: Gradle, - kotlinCompileTaskProvider: () -> KotlinCompileTask? + kotlinCompileTaskProvider: () -> KotlinCompile? ) : KotlinJavaToolchain { private val currentGradleVersion = GradleVersion.version(gradle.gradleVersion) @@ -120,15 +119,19 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor( ?: throw GradleException("Toolchain support is available from $TOOLCHAIN_SUPPORTED_VERSION") private abstract class JvmTargetUpdater( - private val kotlinCompileTaskProvider: () -> KotlinCompileTask? + private val kotlinCompileTaskProvider: () -> KotlinCompile? ) { fun updateJvmTarget( jdkVersion: JavaVersion ) { - kotlinCompileTaskProvider()?.kotlinOptions { - if (jvmTargetField == null) { + kotlinCompileTaskProvider()?.let { task -> + // parentKotlinOptionsImpl is set from 'kotlin-android' plugin + val appliedJvmTargets = listOfNotNull(task.kotlinOptions, task.parentKotlinOptionsImpl.orNull) + .mapNotNull { (it as KotlinJvmOptionsImpl).jvmTargetField } + + if (appliedJvmTargets.isEmpty()) { // For Java 9 JavaVersion returns "1.9" that is not accepted by Kotlin compiler - jvmTarget = if (jdkVersion == JavaVersion.VERSION_1_9) { + task.kotlinOptions.jvmTarget = if (jdkVersion == JavaVersion.VERSION_1_9) { "9" } else { jdkVersion.toString() @@ -141,7 +144,7 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor( private class DefaultJdkSetter( private val providedJvm: Property, private val currentGradleVersion: GradleVersion, - kotlinCompileTaskProvider: () -> KotlinCompileTask? + kotlinCompileTaskProvider: () -> KotlinCompile? ) : JvmTargetUpdater(kotlinCompileTaskProvider), KotlinJavaToolchain.JdkSetter { @@ -174,7 +177,7 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor( private inner class DefaultJavaToolchainSetter( private val providedJvm: Property, - kotlinCompileTaskProvider: () -> KotlinCompileTask? + kotlinCompileTaskProvider: () -> KotlinCompile? ) : JvmTargetUpdater(kotlinCompileTaskProvider), KotlinJavaToolchain.JavaToolchainSetter { override fun use(