From 896e77cd326bd995d76a8097f41eb7a28aa59b9f Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 3 Feb 2021 14:19:03 +0100 Subject: [PATCH] KotlinToolingMetadata.json: Add konanVersion and abiVersion as extras to KotlinNativeTarget --- .../gradle/BuildKotlinToolingMetadataTest.kt | 38 ++++++++++--------- .../tooling/BuildKotlinToolingMetadataTask.kt | 4 ++ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/BuildKotlinToolingMetadataTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/BuildKotlinToolingMetadataTest.kt index cafaf12dfed..76657c6f1bc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/BuildKotlinToolingMetadataTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/BuildKotlinToolingMetadataTest.kt @@ -3,7 +3,8 @@ * 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("FunctionName") +/* Associate compilations are not yet supported by the IDE. KT-34102 */ +@file:Suppress("invisible_reference", "invisible_member", "FunctionName", "DuplicatedCode") package org.jetbrains.kotlin.gradle @@ -11,15 +12,18 @@ import com.android.build.gradle.BaseExtension import org.gradle.api.JavaVersion import org.gradle.api.internal.project.ProjectInternal import org.gradle.testfixtures.ProjectBuilder +import org.jetbrains.kotlin.compilerRunner.konanVersion import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.* import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask import org.jetbrains.kotlin.konan.target.KonanTarget +import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.tooling.KotlinToolingMetadata import org.jetbrains.kotlin.tooling.toJsonString import kotlin.test.Test @@ -29,8 +33,8 @@ import kotlin.test.assertTrue class BuildKotlinToolingMetadataTest { private val project = ProjectBuilder.builder().build() as ProjectInternal - private val multiplatform get() = project.extensions.getByType(KotlinMultiplatformExtension::class.java) - private val js get() = project.extensions.getByType(KotlinJsProjectExtension::class.java) + private val multiplatformExtension get() = project.extensions.getByType(KotlinMultiplatformExtension::class.java) + private val jsExtension get() = project.extensions.getByType(KotlinJsProjectExtension::class.java) @Test fun `multiplatform empty setup`() { @@ -47,19 +51,17 @@ class BuildKotlinToolingMetadataTest { KotlinMetadataTarget::class.java.isAssignableFrom(Class.forName(metadata.projectTargets.single().target)), "Expect target to be implement ${KotlinMetadataTarget::class.simpleName}" ) - assertEquals( - KotlinPlatformType.common.name, metadata.projectTargets.single().platformType - ) + assertEquals(common.name, metadata.projectTargets.single().platformType) assertTrue(metadata.toJsonString().isNotBlank(), "Expected non blank json representation") } @Test - fun `multiplatform JS JVM Android setup`() { + fun `multiplatform JS JVM Android linuxX64 setup`() { project.plugins.apply("com.android.application") project.plugins.apply("kotlin-multiplatform") val android = project.extensions.getByType(BaseExtension::class.java) - val kotlin = multiplatform + val kotlin = multiplatformExtension android.compileSdkVersion(28) kotlin.android() @@ -68,6 +70,7 @@ class BuildKotlinToolingMetadataTest { nodejs() browser() } + kotlin.linuxX64() project.evaluate() @@ -75,8 +78,7 @@ class BuildKotlinToolingMetadataTest { assertEquals(KotlinMultiplatformPluginWrapper::class.java.canonicalName, metadata.buildPlugin) assertEquals( - listOf(KotlinPlatformType.common, KotlinPlatformType.androidJvm, KotlinPlatformType.jvm, KotlinPlatformType.js) - .map { it.name }.sorted(), + listOf(common, androidJvm, jvm, js, native).map { it.name }.sorted(), metadata.projectTargets.map { it.platformType }.sorted() ) } @@ -86,7 +88,7 @@ class BuildKotlinToolingMetadataTest { project.plugins.apply("kotlin-multiplatform") project.plugins.apply("com.android.application") val android = project.extensions.getByType(BaseExtension::class.java) - val kotlin = multiplatform + val kotlin = multiplatformExtension android.compileSdkVersion(28) kotlin.android() android.compileOptions.setSourceCompatibility(JavaVersion.VERSION_1_6) @@ -94,7 +96,7 @@ class BuildKotlinToolingMetadataTest { project.evaluate() val androidTargetMetadata = getKotlinToolingMetadata() - .projectTargets.single { it.platformType == KotlinPlatformType.androidJvm.name } + .projectTargets.single { it.platformType == androidJvm.name } assertEquals("1.6", androidTargetMetadata.extras["sourceCompatibility"]) assertEquals("1.8", androidTargetMetadata.extras["targetCompatibility"]) @@ -103,7 +105,7 @@ class BuildKotlinToolingMetadataTest { @Test fun `multiplatform JVM with different targets`() { project.plugins.apply("kotlin-multiplatform") - val kotlin = multiplatform + val kotlin = multiplatformExtension val jvm = kotlin.jvm() jvm.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME).kotlinOptions.jvmTarget = "12" jvm.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME).kotlinOptions.jvmTarget = "10" @@ -118,24 +120,26 @@ class BuildKotlinToolingMetadataTest { @Test fun `multiplatform with native target`() { project.plugins.apply("kotlin-multiplatform") - val kotlin = multiplatform + val kotlin = multiplatformExtension kotlin.linuxX64() val metadata = getKotlinToolingMetadata() - val linuxTarget = metadata.projectTargets.single { it.platformType == KotlinPlatformType.native.name } + val linuxTarget = metadata.projectTargets.single { it.platformType == native.name } assertEquals(KonanTarget.LINUX_X64.name, linuxTarget.extras["konanTarget"]) + assertEquals(project.konanVersion.toString(), linuxTarget.extras["konanVersion"]) + assertEquals(KotlinAbiVersion.CURRENT.toString(), linuxTarget.extras["abiVersion"]) } @Test fun js() { project.plugins.apply("org.jetbrains.kotlin.js") - val kotlin = js + val kotlin = jsExtension kotlin.js { nodejs() } val metadata = getKotlinToolingMetadata() assertEquals(org.jetbrains.kotlin.gradle.plugin.KotlinJsPluginWrapper::class.java.canonicalName, metadata.buildPlugin) - val jsTarget = metadata.projectTargets.single { it.platformType == KotlinPlatformType.js.name } + val jsTarget = metadata.projectTargets.single { it.platformType == js.name } assertEquals("true", jsTarget.extras["isNodejsConfigured"]) assertEquals("false", jsTarget.extras["isBrowserConfigured"]) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt index 509ba1a9249..6f9ef33091c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt @@ -12,6 +12,7 @@ import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction +import org.jetbrains.kotlin.compilerRunner.konanVersion import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled +import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.tooling.KotlinToolingMetadata import org.jetbrains.kotlin.tooling.toJsonString import java.io.File @@ -120,6 +122,8 @@ private fun buildTargetMetadataExtras(target: KotlinTarget): Map } is KotlinNativeTarget -> { extras["konanTarget"] = target.konanTarget.name + extras["konanVersion"] = target.project.konanVersion.toString() + extras["abiVersion"] = KotlinAbiVersion.CURRENT.toString() } } return extras.toMap()