KotlinToolingMetadata.json: Add konanVersion and abiVersion as extras to KotlinNativeTarget

This commit is contained in:
sebastian.sellmair
2021-02-03 14:19:03 +01:00
committed by TeamCityServer
parent ac8b4c1b79
commit 896e77cd32
2 changed files with 25 additions and 17 deletions
@@ -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"])
}
@@ -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<String, String>
}
is KotlinNativeTarget -> {
extras["konanTarget"] = target.konanTarget.name
extras["konanVersion"] = target.project.konanVersion.toString()
extras["abiVersion"] = KotlinAbiVersion.CURRENT.toString()
}
}
return extras.toMap()