From 2dc774c1fe46821255dc6eb0a0845579ff323532 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Fri, 25 Feb 2022 10:49:14 +0100 Subject: [PATCH] Build Tooling Metadata 1.1.0: Add `isKPMEnabled` flag Build Tooling Metadata now can carry information whether project built with Kotlin Project Model or not. KT-49704 --- .../kotlin/tooling/JsonConversion.kt | 4 +- .../kotlin/tooling/KotlinToolingMetadata.kt | 3 +- .../tooling/DeserializationFailureTest.kt | 2 +- .../kotlin/tooling/DeserializeStringTest.kt | 119 ++++++++++++++++++ .../tooling/SerializeAndDeserializeTest.kt | 3 +- 5 files changed, 127 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/JsonConversion.kt b/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/JsonConversion.kt index f6144cba493..d7403a5f31b 100644 --- a/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/JsonConversion.kt +++ b/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/JsonConversion.kt @@ -30,6 +30,7 @@ private fun KotlinToolingMetadata.ProjectSettings.toJsonObject(): JsonObject { return JsonObject().apply { addProperty("isHmppEnabled", isHmppEnabled) addProperty("isCompatibilityMetadataVariantEnabled", isCompatibilityMetadataVariantEnabled) + addProperty("isKPMEnabled", isKPMEnabled) } } @@ -138,7 +139,8 @@ private fun JsonObject.toKotlinToolingMetadataOrThrow(): KotlinToolingMetadata { private fun JsonObject.toProjectSettingsOrThrow(): KotlinToolingMetadata.ProjectSettings { return KotlinToolingMetadata.ProjectSettings( isHmppEnabled = getOrThrow("isHmppEnabled").asBoolean, - isCompatibilityMetadataVariantEnabled = getOrThrow("isCompatibilityMetadataVariantEnabled").asBoolean + isCompatibilityMetadataVariantEnabled = getOrThrow("isCompatibilityMetadataVariantEnabled").asBoolean, + isKPMEnabled = get("isKPMEnabled")?.asBoolean ?: false ) } diff --git a/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/KotlinToolingMetadata.kt b/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/KotlinToolingMetadata.kt index c54ca3c7c96..48a3e4eeba9 100644 --- a/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/KotlinToolingMetadata.kt +++ b/libraries/tools/kotlin-tooling-metadata/src/main/kotlin/org/jetbrains/kotlin/tooling/KotlinToolingMetadata.kt @@ -31,6 +31,7 @@ data class KotlinToolingMetadata( data class ProjectSettings( val isHmppEnabled: Boolean, val isCompatibilityMetadataVariantEnabled: Boolean, + val isKPMEnabled: Boolean, ) data class ProjectTargetMetadata( @@ -68,7 +69,7 @@ data class KotlinToolingMetadata( } companion object { - const val currentSchemaVersion: String = "1.0.0" + const val currentSchemaVersion: String = "1.1.0" } } diff --git a/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializationFailureTest.kt b/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializationFailureTest.kt index c344e24ec40..18e6274f2fb 100644 --- a/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializationFailureTest.kt +++ b/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializationFailureTest.kt @@ -62,7 +62,7 @@ class DeserializationFailureTest { buildSystemVersion = "", buildPlugin = "", buildPluginVersion = "", - projectSettings = KotlinToolingMetadata.ProjectSettings(false, false), + projectSettings = KotlinToolingMetadata.ProjectSettings(false, false, false), projectTargets = emptyList() ).toJsonString() diff --git a/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializeStringTest.kt b/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializeStringTest.kt index 6ee284950f5..dee7981961b 100644 --- a/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializeStringTest.kt +++ b/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/DeserializeStringTest.kt @@ -81,6 +81,7 @@ class DeserializeStringTest { assertEquals("1.6.255-SNAPSHOT", metadata.buildPluginVersion) assertFalse(metadata.projectSettings.isHmppEnabled) assertTrue(metadata.projectSettings.isCompatibilityMetadataVariantEnabled) + assertFalse(metadata.projectSettings.isKPMEnabled) assertEquals(5, metadata.projectTargets.size, "Expected exactly 4 targets") val androidJvmTarget = metadata.projectTargets.single { it.platformType == "androidJvm" } @@ -124,4 +125,122 @@ class DeserializeStringTest { assertNull(commonTarget.extras.js) assertNull(commonTarget.extras.native) } + + @Test + fun `schemaVersion 1 1 0`() { + @Language("JSON") val json = """ + { + "schemaVersion": "1.1.0", + "buildSystem": "Gradle", + "buildSystemVersion": "7.1", + "buildPlugin": "org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper", + "buildPluginVersion": "1.6.255-SNAPSHOT", + "projectSettings": { + "isHmppEnabled": false, + "isCompatibilityMetadataVariantEnabled": true, + "isKPMEnabled": true + }, + "projectTargets": [ + { + "target": "org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget", + "platformType": "androidJvm", + "extras": { + "android": { + "sourceCompatibility": "1.7", + "targetCompatibility": "1.7" + } + } + }, + { + "target": "org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget", + "platformType": "js", + "extras": { + "js": { + "isBrowserConfigured": true, + "isNodejsConfigured": true + } + } + }, + { + "target": "org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget", + "platformType": "jvm", + "extras": { + "jvm": { + "jvmTarget": "1.8", + "withJavaEnabled": false + } + } + }, + { + "target": "org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithHostTests", + "platformType": "native", + "extras": { + "native": { + "konanTarget": "linux_x64", + "konanVersion": "1.5-dev-17775", + "konanAbiVersion": "1.4.2" + } + } + }, + { + "target": "org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget", + "platformType": "common" + } + ] + } + """.trimIndent() + + val metadata = KotlinToolingMetadata.parseJsonOrThrow(json) + assertEquals("1.1.0", metadata.schemaVersion) + assertEquals("Gradle", metadata.buildSystem) + assertEquals("7.1", metadata.buildSystemVersion) + assertEquals("org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper", metadata.buildPlugin) + assertEquals("1.6.255-SNAPSHOT", metadata.buildPluginVersion) + assertFalse(metadata.projectSettings.isHmppEnabled) + assertTrue(metadata.projectSettings.isCompatibilityMetadataVariantEnabled) + assertTrue(metadata.projectSettings.isKPMEnabled) + assertEquals(5, metadata.projectTargets.size, "Expected exactly 4 targets") + + val androidJvmTarget = metadata.projectTargets.single { it.platformType == "androidJvm" } + assertEquals("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget", androidJvmTarget.target) + assertEquals("1.7", androidJvmTarget.extras.android?.sourceCompatibility) + assertEquals("1.7", androidJvmTarget.extras.android?.targetCompatibility) + assertNull(androidJvmTarget.extras.jvm) + assertNull(androidJvmTarget.extras.js) + assertNull(androidJvmTarget.extras.native) + + val jsTarget = metadata.projectTargets.single { it.platformType == "js" } + assertEquals("org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget", jsTarget.target) + assertEquals(true, jsTarget.extras.js?.isBrowserConfigured) + assertEquals(true, jsTarget.extras.js?.isNodejsConfigured) + assertNull(jsTarget.extras.android) + assertNull(jsTarget.extras.jvm) + assertNull(jsTarget.extras.native) + + val jvmTarget = metadata.projectTargets.single { it.platformType == "jvm" } + assertEquals("org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget", jvmTarget.target) + assertEquals(false, jvmTarget.extras.jvm?.withJavaEnabled) + assertEquals("1.8", jvmTarget.extras.jvm?.jvmTarget) + assertNull(jvmTarget.extras.android) + assertNull(jvmTarget.extras.js) + assertNull(jvmTarget.extras.native) + + val nativeTarget = metadata.projectTargets.single { it.platformType == "native" } + assertEquals("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithHostTests", nativeTarget.target) + val nativeExtras = assertNotNull(nativeTarget.extras.native) + assertEquals("linux_x64", nativeExtras.konanTarget) + assertEquals("1.5-dev-17775", nativeExtras.konanVersion) + assertEquals("1.4.2", nativeExtras.konanAbiVersion) + assertNull(nativeTarget.extras.android) + assertNull(nativeTarget.extras.jvm) + assertNull(nativeTarget.extras.js) + + val commonTarget = metadata.projectTargets.single { it.platformType == "common" } + assertEquals("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget", commonTarget.target) + assertNull(commonTarget.extras.android) + assertNull(commonTarget.extras.jvm) + assertNull(commonTarget.extras.js) + assertNull(commonTarget.extras.native) +} + } diff --git a/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/SerializeAndDeserializeTest.kt b/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/SerializeAndDeserializeTest.kt index a1f32907ac5..f58ca49573f 100644 --- a/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/SerializeAndDeserializeTest.kt +++ b/libraries/tools/kotlin-tooling-metadata/src/test/kotlin/org/jetbrains/kotlin/tooling/SerializeAndDeserializeTest.kt @@ -91,7 +91,8 @@ private fun defaultKotlinToolingMetadata(): KotlinToolingMetadata { buildPluginVersion = "v1.0 (build plugin)", projectSettings = KotlinToolingMetadata.ProjectSettings( isHmppEnabled = false, - isCompatibilityMetadataVariantEnabled = true + isCompatibilityMetadataVariantEnabled = true, + isKPMEnabled = false, ), projectTargets = emptyList() )