[Gradle][KPM] Create BuiltKotlinMetadata task per KPM Module
Use main module for tests KT-49704
This commit is contained in:
+26
-13
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.gradle
|
package org.jetbrains.kotlin.gradle
|
||||||
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule
|
||||||
import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask
|
import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import org.jetbrains.kotlin.tooling.KotlinToolingMetadata
|
import org.jetbrains.kotlin.tooling.KotlinToolingMetadata
|
||||||
@@ -17,7 +18,19 @@ import kotlin.test.assertEquals
|
|||||||
class KotlinToolingMetadataMppIT : BaseGradleIT() {
|
class KotlinToolingMetadataMppIT : BaseGradleIT() {
|
||||||
override val defaultGradleVersion: GradleVersionRequired = GradleVersionRequired.FOR_MPP_SUPPORT
|
override val defaultGradleVersion: GradleVersionRequired = GradleVersionRequired.FOR_MPP_SUPPORT
|
||||||
|
|
||||||
private val defaultKotlinToolingMetadataJsonPath = "build/kotlinToolingMetadata/kotlin-tooling-metadata.json"
|
private val defaultKotlinToolingMetadataJsonPath get() =
|
||||||
|
if (isKpmModelMappingEnabled) {
|
||||||
|
"build/kotlinToolingMetadata/main/kotlin-tooling-metadata.json"
|
||||||
|
} else {
|
||||||
|
"build/kotlinToolingMetadata/kotlin-tooling-metadata.json"
|
||||||
|
}
|
||||||
|
|
||||||
|
private val buildKotlinToolingMetadataTaskName get() =
|
||||||
|
if (isKpmModelMappingEnabled) {
|
||||||
|
BuildKotlinToolingMetadataTask.taskNameForKotlinModule(KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
} else {
|
||||||
|
BuildKotlinToolingMetadataTask.defaultTaskName
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `new-mpp-published`() = with(transformProjectWithPluginsDsl("new-mpp-published")) {
|
fun `new-mpp-published`() = with(transformProjectWithPluginsDsl("new-mpp-published")) {
|
||||||
@@ -25,17 +38,17 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
|
|||||||
|
|
||||||
build("publish") {
|
build("publish") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksExecuted(
|
assertTasksExecuted(":$buildKotlinToolingMetadataTaskName")
|
||||||
":${BuildKotlinToolingMetadataTask.defaultTaskName}"
|
|
||||||
)
|
|
||||||
/* Check metadata file in build dir */
|
/* Check metadata file in build dir */
|
||||||
assertFileExists(defaultKotlinToolingMetadataJsonPath)
|
assertFileExists(defaultKotlinToolingMetadataJsonPath)
|
||||||
val metadataJson = projectDir.resolve(defaultKotlinToolingMetadataJsonPath).readText()
|
val metadataJson = projectDir.resolve(defaultKotlinToolingMetadataJsonPath).readText()
|
||||||
val metadata = KotlinToolingMetadata.parseJsonOrThrow(metadataJson)
|
val metadata = KotlinToolingMetadata.parseJsonOrThrow(metadataJson)
|
||||||
assertEquals(
|
assertEquals(
|
||||||
listOf(
|
listOfNotNull(
|
||||||
KotlinPlatformType.common.name, KotlinPlatformType.jvm.name,
|
KotlinPlatformType.common.name.takeIf { !isKpmModelMappingEnabled },
|
||||||
KotlinPlatformType.js.name, KotlinPlatformType.native.name
|
KotlinPlatformType.jvm.name,
|
||||||
|
KotlinPlatformType.js.name,
|
||||||
|
KotlinPlatformType.native.name
|
||||||
).sorted(),
|
).sorted(),
|
||||||
metadata.projectTargets.map { it.platformType }.sorted()
|
metadata.projectTargets.map { it.platformType }.sorted()
|
||||||
)
|
)
|
||||||
@@ -55,7 +68,7 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
|
|||||||
build("publish") {
|
build("publish") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
// Nothing changed. Should be up-to-date
|
// Nothing changed. Should be up-to-date
|
||||||
assertTasksUpToDate(":${BuildKotlinToolingMetadataTask.defaultTaskName}")
|
assertTasksUpToDate(":$buildKotlinToolingMetadataTaskName")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adding macos target
|
// Adding macos target
|
||||||
@@ -68,7 +81,7 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
|
|||||||
|
|
||||||
build("publish") {
|
build("publish") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksExecuted(":${BuildKotlinToolingMetadataTask.defaultTaskName}")
|
assertTasksExecuted(":$buildKotlinToolingMetadataTaskName")
|
||||||
val metadata = KotlinToolingMetadata.parseJsonOrThrow(projectDir.resolve(defaultKotlinToolingMetadataJsonPath).readText())
|
val metadata = KotlinToolingMetadata.parseJsonOrThrow(projectDir.resolve(defaultKotlinToolingMetadataJsonPath).readText())
|
||||||
assertEquals(
|
assertEquals(
|
||||||
listOf(KonanTarget.LINUX_X64.name, KonanTarget.MACOS_X64.name).sorted(),
|
listOf(KonanTarget.LINUX_X64.name, KonanTarget.MACOS_X64.name).sorted(),
|
||||||
@@ -85,7 +98,7 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
|
|||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertNoSuchFile(defaultKotlinToolingMetadataJsonPath)
|
assertNoSuchFile(defaultKotlinToolingMetadataJsonPath)
|
||||||
assertTasksNotRealized(
|
assertTasksNotRealized(
|
||||||
":${BuildKotlinToolingMetadataTask.defaultTaskName}"
|
":$buildKotlinToolingMetadataTaskName"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -96,9 +109,9 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
|
|||||||
projectDir.resolve("gradle.properties").appendText("\nkotlin.mpp.enableKotlinToolingMetadataArtifact=true")
|
projectDir.resolve("gradle.properties").appendText("\nkotlin.mpp.enableKotlinToolingMetadataArtifact=true")
|
||||||
build(BuildKotlinToolingMetadataTask.defaultTaskName) {
|
build(BuildKotlinToolingMetadataTask.defaultTaskName) {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksExecuted(":app:${BuildKotlinToolingMetadataTask.defaultTaskName}")
|
assertTasksExecuted(":app:$buildKotlinToolingMetadataTaskName")
|
||||||
assertTasksExecuted(":base:${BuildKotlinToolingMetadataTask.defaultTaskName}")
|
assertTasksExecuted(":base:$buildKotlinToolingMetadataTaskName")
|
||||||
assertTasksExecuted(":lib:${BuildKotlinToolingMetadataTask.defaultTaskName}")
|
assertTasksExecuted(":lib:$buildKotlinToolingMetadataTaskName")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-13
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
|
|||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
||||||
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
||||||
import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask
|
import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask
|
||||||
|
import org.jetbrains.kotlin.gradle.tooling.buildKotlinToolingMetadataForMainKpmModuleTask
|
||||||
import org.jetbrains.kotlin.gradle.tooling.buildKotlinToolingMetadataTask
|
import org.jetbrains.kotlin.gradle.tooling.buildKotlinToolingMetadataTask
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
||||||
@@ -41,6 +42,7 @@ import org.junit.runner.RunWith
|
|||||||
import org.junit.runners.Parameterized
|
import org.junit.runners.Parameterized
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFalse
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
@RunWith(Parameterized::class)
|
@RunWith(Parameterized::class)
|
||||||
@@ -73,18 +75,18 @@ class BuildKotlinToolingMetadataTest {
|
|||||||
assertEquals(project.gradle.gradleVersion, metadata.buildSystemVersion)
|
assertEquals(project.gradle.gradleVersion, metadata.buildSystemVersion)
|
||||||
assertEquals(KotlinMultiplatformPluginWrapper::class.java.canonicalName, metadata.buildPlugin)
|
assertEquals(KotlinMultiplatformPluginWrapper::class.java.canonicalName, metadata.buildPlugin)
|
||||||
assertEquals(project.getKotlinPluginVersion(), metadata.buildPluginVersion)
|
assertEquals(project.getKotlinPluginVersion(), metadata.buildPluginVersion)
|
||||||
assertEquals(1, metadata.projectTargets.size, "Expected one target (metadata)")
|
if (kpmModelMappingEnabled) {
|
||||||
val targetMetadata = metadata.projectTargets.single()
|
assertEquals(0, metadata.projectTargets.size, "Expected no targets in KPM")
|
||||||
val targetClass = if (kpmModelMappingEnabled) {
|
|
||||||
KotlinGradleFragment::class
|
|
||||||
} else {
|
} else {
|
||||||
KotlinMetadataTarget::class
|
assertEquals(1, metadata.projectTargets.size, "Expected one target (metadata)")
|
||||||
|
val targetMetadata = metadata.projectTargets.single()
|
||||||
|
val targetClass = KotlinMetadataTarget::class
|
||||||
|
assertTrue(
|
||||||
|
targetClass.java.isAssignableFrom(Class.forName(targetMetadata.target)),
|
||||||
|
"Expect target to implement ${targetClass.simpleName}"
|
||||||
|
)
|
||||||
|
assertEquals(common.name, targetMetadata.platformType)
|
||||||
}
|
}
|
||||||
assertTrue(
|
|
||||||
targetClass.java.isAssignableFrom(Class.forName(targetMetadata.target)),
|
|
||||||
"Expect target to implement ${targetClass.simpleName}"
|
|
||||||
)
|
|
||||||
assertEquals(common.name, targetMetadata.platformType)
|
|
||||||
assertTrue(metadata.toJsonString().isNotBlank(), "Expected non blank json representation")
|
assertTrue(metadata.toJsonString().isNotBlank(), "Expected non blank json representation")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,9 +112,14 @@ class BuildKotlinToolingMetadataTest {
|
|||||||
val metadata = getKotlinToolingMetadata()
|
val metadata = getKotlinToolingMetadata()
|
||||||
assertEquals(KotlinMultiplatformPluginWrapper::class.java.canonicalName, metadata.buildPlugin)
|
assertEquals(KotlinMultiplatformPluginWrapper::class.java.canonicalName, metadata.buildPlugin)
|
||||||
|
|
||||||
|
if (kpmModelMappingEnabled) {
|
||||||
|
assertFalse("Kotlin Tooling Metadata generated from KPM should not contain target of 'common' platform") {
|
||||||
|
metadata.projectTargets.any { it.platformType == common.name }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val expectedTargets = if (kpmModelMappingEnabled) {
|
val expectedTargets = if (kpmModelMappingEnabled) {
|
||||||
mapOf(
|
mapOf(
|
||||||
common to KotlinGradleFragmentInternal::class,
|
|
||||||
androidJvm to LegacyMappedVariantWithRuntime::class,
|
androidJvm to LegacyMappedVariantWithRuntime::class,
|
||||||
jvm to KotlinJvmVariant::class,
|
jvm to KotlinJvmVariant::class,
|
||||||
js to LegacyMappedVariantWithRuntime::class,
|
js to LegacyMappedVariantWithRuntime::class,
|
||||||
@@ -257,8 +264,15 @@ class BuildKotlinToolingMetadataTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getKotlinToolingMetadata(): KotlinToolingMetadata {
|
private fun getKotlinToolingMetadata(): KotlinToolingMetadata {
|
||||||
val task = project.buildKotlinToolingMetadataTask?.get() ?: error("No ${BuildKotlinToolingMetadataTask.defaultTaskName} task")
|
if (!kpmModelMappingEnabled) {
|
||||||
return task.kotlinToolingMetadata
|
val task = project.buildKotlinToolingMetadataTask?.get() ?: error("No ${BuildKotlinToolingMetadataTask.defaultTaskName} task")
|
||||||
|
return task.kotlinToolingMetadata
|
||||||
|
} else {
|
||||||
|
val task = project.buildKotlinToolingMetadataForMainKpmModuleTask
|
||||||
|
?.get()
|
||||||
|
?: error("No ${BuildKotlinToolingMetadataTask.defaultTaskName} for Main module task")
|
||||||
|
return task.kotlinToolingMetadata
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+2
-2
@@ -42,7 +42,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension
|
|||||||
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements
|
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements
|
||||||
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
|
||||||
import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestsRegistry
|
import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestsRegistry
|
||||||
import org.jetbrains.kotlin.gradle.tooling.buildKotlinToolingMetadataTask
|
import org.jetbrains.kotlin.gradle.tooling.registerBuildKotlinToolingMetadataTask
|
||||||
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
|
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
|
||||||
import org.jetbrains.kotlin.gradle.utils.getOrPut
|
import org.jetbrains.kotlin.gradle.utils.getOrPut
|
||||||
import org.jetbrains.kotlin.gradle.utils.loadPropertyFromResources
|
import org.jetbrains.kotlin.gradle.utils.loadPropertyFromResources
|
||||||
@@ -120,7 +120,7 @@ abstract class KotlinBasePluginWrapper : Plugin<Project> {
|
|||||||
|
|
||||||
project.addNpmDependencyExtension()
|
project.addNpmDependencyExtension()
|
||||||
|
|
||||||
project.buildKotlinToolingMetadataTask
|
project.registerBuildKotlinToolingMetadataTask()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addKotlinCompilerConfiguration(project: Project) {
|
private fun addKotlinCompilerConfiguration(project: Project) {
|
||||||
|
|||||||
+3
-3
@@ -44,14 +44,14 @@ internal fun setupPublicationForModule(module: KotlinGradleModule) {
|
|||||||
it.fromResolutionOf(metadataDependencyConfiguration)
|
it.fromResolutionOf(metadataDependencyConfiguration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
publication.setupKotlinToolingMetadataIfNeeded(project)
|
publication.setupKotlinToolingMetadataIfNeeded(module)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MavenPublication.setupKotlinToolingMetadataIfNeeded(project: Project) {
|
private fun MavenPublication.setupKotlinToolingMetadataIfNeeded(module: KotlinGradleModule) {
|
||||||
val buildKotlinToolingMetadataTask = project.buildKotlinToolingMetadataTask ?: return
|
val buildKotlinToolingMetadataTask = module.buildKotlinToolingMetadataTask ?: return
|
||||||
|
|
||||||
artifact(buildKotlinToolingMetadataTask.map { it.outputFile }) { artifact ->
|
artifact(buildKotlinToolingMetadataTask.map { it.outputFile }) { artifact ->
|
||||||
artifact.classifier = "kotlin-tooling-metadata"
|
artifact.classifier = "kotlin-tooling-metadata"
|
||||||
|
|||||||
+102
-45
@@ -8,7 +8,9 @@ package org.jetbrains.kotlin.gradle.tooling
|
|||||||
import com.android.build.gradle.BaseExtension
|
import com.android.build.gradle.BaseExtension
|
||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.Task
|
||||||
import org.gradle.api.internal.GeneratedSubclass
|
import org.gradle.api.internal.GeneratedSubclass
|
||||||
|
import org.gradle.api.provider.Property
|
||||||
import org.gradle.api.tasks.*
|
import org.gradle.api.tasks.*
|
||||||
import org.jetbrains.kotlin.compilerRunner.konanVersion
|
import org.jetbrains.kotlin.compilerRunner.konanVersion
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
||||||
@@ -16,6 +18,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
|||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
|
||||||
@@ -24,29 +27,92 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl
|
|||||||
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateTask
|
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
||||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
||||||
import org.jetbrains.kotlin.tooling.KotlinToolingMetadata
|
import org.jetbrains.kotlin.tooling.KotlinToolingMetadata
|
||||||
import org.jetbrains.kotlin.tooling.toJsonString
|
import org.jetbrains.kotlin.tooling.toJsonString
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register
|
||||||
|
*/
|
||||||
|
internal fun Project.registerBuildKotlinToolingMetadataTask() {
|
||||||
|
if (!project.kotlinPropertiesProvider.enableKotlinToolingMetadataArtifact) return
|
||||||
|
|
||||||
|
if (hasKpmModel) {
|
||||||
|
buildKotlinToolingMetadataForAllKpmModulesTask
|
||||||
|
} else {
|
||||||
|
buildKotlinToolingMetadataTask
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal val Project.buildKotlinToolingMetadataForMainKpmModuleTask: TaskProvider<BuildKotlinToolingMetadataTask.FromKpmModule>?
|
||||||
|
get() {
|
||||||
|
require(hasKpmModel)
|
||||||
|
val mainModule = kpmModules.getByName(KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
return mainModule.buildKotlinToolingMetadataTask
|
||||||
|
}
|
||||||
|
|
||||||
|
private val Project.buildKotlinToolingMetadataForAllKpmModulesTask
|
||||||
|
get() = locateOrRegisterTask<Task>(BuildKotlinToolingMetadataTask.defaultTaskName) { task ->
|
||||||
|
task.group = "build"
|
||||||
|
task.description = "Build metadata json file containing information about the used Kotlin tooling"
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default task managed by the Kotlin Gradle plugin or `null` if the task is disabled.
|
* The default task managed by the Kotlin Gradle plugin or `null` if the task is disabled.
|
||||||
* @see [PropertiesProvider.enableKotlinToolingMetadataArtifact]
|
* @see [PropertiesProvider.enableKotlinToolingMetadataArtifact]
|
||||||
*/
|
*/
|
||||||
internal val Project.buildKotlinToolingMetadataTask: TaskProvider<BuildKotlinToolingMetadataTask>?
|
internal val Project.buildKotlinToolingMetadataTask: TaskProvider<BuildKotlinToolingMetadataTask.FromKotlinExtension>?
|
||||||
get() {
|
get() {
|
||||||
if (!PropertiesProvider(this).enableKotlinToolingMetadataArtifact) return null
|
if (!kotlinPropertiesProvider.enableKotlinToolingMetadataArtifact) return null
|
||||||
locateTask<BuildKotlinToolingMetadataTask>(BuildKotlinToolingMetadataTask.defaultTaskName)?.let { return it }
|
val taskName = BuildKotlinToolingMetadataTask.defaultTaskName
|
||||||
return registerTask(BuildKotlinToolingMetadataTask.defaultTaskName) { task ->
|
return locateOrRegisterTask(taskName) { task ->
|
||||||
task.group = "build"
|
task.group = "build"
|
||||||
task.description = "Build metadata json file containing information about the used Kotlin tooling"
|
task.description = "Build metadata json file containing information about the used Kotlin tooling"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal val KotlinGradleModule.buildKotlinToolingMetadataTask: TaskProvider<BuildKotlinToolingMetadataTask.FromKpmModule>?
|
||||||
|
get() {
|
||||||
|
if (!project.kotlinPropertiesProvider.enableKotlinToolingMetadataArtifact) return null
|
||||||
|
val taskName = BuildKotlinToolingMetadataTask.taskNameForKotlinModule(name)
|
||||||
|
|
||||||
|
return project.locateOrRegisterTask<BuildKotlinToolingMetadataTask.FromKpmModule>(taskName) { task ->
|
||||||
|
task.module.set(this)
|
||||||
|
|
||||||
|
task.group = "build"
|
||||||
|
task.description = "Build metadata json file containing information about the used Kotlin tooling in module $name"
|
||||||
|
}.also { task ->
|
||||||
|
project.buildKotlinToolingMetadataForAllKpmModulesTask.dependsOn(task)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
abstract class BuildKotlinToolingMetadataTask : DefaultTask() {
|
abstract class BuildKotlinToolingMetadataTask : DefaultTask() {
|
||||||
|
|
||||||
|
abstract class FromKpmModule : BuildKotlinToolingMetadataTask() {
|
||||||
|
|
||||||
|
@get:Internal
|
||||||
|
abstract val module: Property<KotlinGradleModule>
|
||||||
|
|
||||||
|
override val outputDirectory: File
|
||||||
|
get() = project.buildDir.resolve("kotlinToolingMetadata").resolve(module.get().name)
|
||||||
|
|
||||||
|
override fun buildKotlinToolingMetadata() = module.get().getKotlinToolingMetadata()
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class FromKotlinExtension : BuildKotlinToolingMetadataTask() {
|
||||||
|
|
||||||
|
override val outputDirectory: File
|
||||||
|
get() = project.buildDir.resolve("kotlinToolingMetadata")
|
||||||
|
|
||||||
|
override fun buildKotlinToolingMetadata() = project.kotlinExtension.getKotlinToolingMetadata()
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
/**
|
/**
|
||||||
* The name of the default task managed by the Kotlin Gradle plugin.
|
* The name of the default task managed by the Kotlin Gradle plugin.
|
||||||
@@ -54,27 +120,28 @@ abstract class BuildKotlinToolingMetadataTask : DefaultTask() {
|
|||||||
* @see PropertiesProvider.enableKotlinToolingMetadataArtifact
|
* @see PropertiesProvider.enableKotlinToolingMetadataArtifact
|
||||||
*/
|
*/
|
||||||
const val defaultTaskName: String = "buildKotlinToolingMetadata"
|
const val defaultTaskName: String = "buildKotlinToolingMetadata"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the default [FromKpmModule] task of the given [KotlinGradleModule]'s name
|
||||||
|
*/
|
||||||
|
fun taskNameForKotlinModule(moduleName: String): String = lowerCamelCaseName(defaultTaskName, moduleName)
|
||||||
}
|
}
|
||||||
|
|
||||||
@get:OutputDirectory
|
@get:OutputDirectory
|
||||||
val outputDirectory: File = project.buildDir.resolve("kotlinToolingMetadata")
|
abstract val outputDirectory: File
|
||||||
|
|
||||||
@get:Internal /* Covered by 'outputDirectory' */
|
@get:Internal /* Covered by 'outputDirectory' */
|
||||||
val outputFile: File = outputDirectory.resolve("kotlin-tooling-metadata.json")
|
val outputFile: File get() = outputDirectory.resolve("kotlin-tooling-metadata.json")
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val kotlinToolingMetadata by lazy {
|
internal val kotlinToolingMetadata by lazy { buildKotlinToolingMetadata() }
|
||||||
if (project.hasKpmModel) {
|
|
||||||
project.kpmModelContainer.getKotlinToolingMetadata(project)
|
|
||||||
} else {
|
|
||||||
project.kotlinExtension.getKotlinToolingMetadata()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@get:Input
|
@get:Input
|
||||||
internal val kotlinToolingMetadataJson
|
internal val kotlinToolingMetadataJson
|
||||||
get() = kotlinToolingMetadata.toJsonString()
|
get() = kotlinToolingMetadata.toJsonString()
|
||||||
|
|
||||||
|
protected abstract fun buildKotlinToolingMetadata(): KotlinToolingMetadata
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
internal fun createToolingMetadataFile() {
|
internal fun createToolingMetadataFile() {
|
||||||
/* Ensure output directory exists and is empty */
|
/* Ensure output directory exists and is empty */
|
||||||
@@ -85,7 +152,7 @@ abstract class BuildKotlinToolingMetadataTask : DefaultTask() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KpmGradleProjectModelContainer.getKotlinToolingMetadata(project: Project): KotlinToolingMetadata {
|
private fun KotlinGradleModule.getKotlinToolingMetadata(): KotlinToolingMetadata {
|
||||||
return KotlinToolingMetadata(
|
return KotlinToolingMetadata(
|
||||||
schemaVersion = KotlinToolingMetadata.currentSchemaVersion,
|
schemaVersion = KotlinToolingMetadata.currentSchemaVersion,
|
||||||
buildSystem = "Gradle",
|
buildSystem = "Gradle",
|
||||||
@@ -105,36 +172,26 @@ private fun Project.buildProjectSettings(): KotlinToolingMetadata.ProjectSetting
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KpmGradleProjectModelContainer.buildProjectTargets(): List<KotlinToolingMetadata.ProjectTargetMetadata> =
|
private fun KotlinGradleModule.buildProjectTargets(): List<KotlinToolingMetadata.ProjectTargetMetadata> =
|
||||||
modules
|
variants.map { variant ->
|
||||||
.filter { it.isMain }
|
KotlinToolingMetadata.ProjectTargetMetadata(
|
||||||
.flatMap { module ->
|
target = variant.javaClass.canonicalName,
|
||||||
val commonTarget = KotlinToolingMetadata.ProjectTargetMetadata(
|
platformType = variant.platformType.name,
|
||||||
target = module.common.javaClass.canonicalName,
|
extras = KotlinToolingMetadata.ProjectTargetMetadata.Extras(
|
||||||
platformType = KotlinPlatformType.common.name,
|
jvm = variant.jvmExtrasOrNull(),
|
||||||
extras = KotlinToolingMetadata.ProjectTargetMetadata.Extras()
|
android = variant.androidExtrasOrNull(),
|
||||||
|
js = variant.jsExtrasOrNull(),
|
||||||
|
native = variant.nativeExtrasOrNull()
|
||||||
)
|
)
|
||||||
|
)
|
||||||
module.variants.map { variant ->
|
}.distinct() // some variants may look identical. e.g. androidRelease and androidDebug, so just keep one of them.
|
||||||
KotlinToolingMetadata.ProjectTargetMetadata(
|
|
||||||
target = variant.javaClass.canonicalName,
|
|
||||||
platformType = variant.platformType.name,
|
|
||||||
extras = KotlinToolingMetadata.ProjectTargetMetadata.Extras(
|
|
||||||
jvm = variant.jvmExtrasOrNull(),
|
|
||||||
android = variant.androidExtrasOrNull(),
|
|
||||||
js = variant.jsExtrasOrNull(),
|
|
||||||
native = variant.nativeExtrasOrNull()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
} + commonTarget
|
|
||||||
}.distinct()
|
|
||||||
|
|
||||||
private fun KotlinGradleVariant.jvmExtrasOrNull() =
|
private fun KotlinGradleVariant.jvmExtrasOrNull() =
|
||||||
when (this) {
|
when (this) {
|
||||||
is KotlinJvmVariant -> KotlinToolingMetadata.ProjectTargetMetadata.JvmExtras(
|
is KotlinJvmVariant -> KotlinToolingMetadata.ProjectTargetMetadata.JvmExtras(
|
||||||
jvmTarget = compilationData.kotlinOptions.jvmTarget,
|
jvmTarget = compilationData.kotlinOptions.jvmTarget,
|
||||||
withJavaEnabled = false
|
withJavaEnabled = false
|
||||||
)
|
)
|
||||||
is LegacyMappedVariant -> buildJvmExtrasOrNull(compilation.target)
|
is LegacyMappedVariant -> buildJvmExtrasOrNull(compilation.target)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
@@ -154,10 +211,10 @@ private fun KotlinGradleVariant.jsExtrasOrNull() =
|
|||||||
private fun KotlinGradleVariant.nativeExtrasOrNull() =
|
private fun KotlinGradleVariant.nativeExtrasOrNull() =
|
||||||
when (this) {
|
when (this) {
|
||||||
is KotlinNativeVariantInternal -> KotlinToolingMetadata.ProjectTargetMetadata.NativeExtras(
|
is KotlinNativeVariantInternal -> KotlinToolingMetadata.ProjectTargetMetadata.NativeExtras(
|
||||||
konanTarget = konanTarget.name,
|
konanTarget = konanTarget.name,
|
||||||
konanVersion = project.konanVersion.toString(),
|
konanVersion = project.konanVersion.toString(),
|
||||||
konanAbiVersion = KotlinAbiVersion.CURRENT.toString()
|
konanAbiVersion = KotlinAbiVersion.CURRENT.toString()
|
||||||
)
|
)
|
||||||
is LegacyMappedVariant -> buildNativeExtrasOrNull(compilation.target)
|
is LegacyMappedVariant -> buildNativeExtrasOrNull(compilation.target)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -7,10 +7,16 @@ package org.jetbrains.kotlin.gradle.tooling
|
|||||||
|
|
||||||
import com.android.build.gradle.AppExtension
|
import com.android.build.gradle.AppExtension
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
|
||||||
|
|
||||||
internal fun Project.includeKotlinToolingMetadataInApk() {
|
internal fun Project.includeKotlinToolingMetadataInApk() {
|
||||||
plugins.withId("com.android.application") {
|
plugins.withId("com.android.application") {
|
||||||
val buildKotlinToolingMetadataTask = buildKotlinToolingMetadataTask ?: return@withId
|
val buildKotlinToolingMetadataTask = if (hasKpmModel) {
|
||||||
|
buildKotlinToolingMetadataForMainKpmModuleTask
|
||||||
|
} else {
|
||||||
|
buildKotlinToolingMetadataTask
|
||||||
|
} ?: return@withId
|
||||||
|
|
||||||
val android = project.extensions.getByName("android") as AppExtension
|
val android = project.extensions.getByName("android") as AppExtension
|
||||||
android.applicationVariants.configureEach { variant ->
|
android.applicationVariants.configureEach { variant ->
|
||||||
if (!variant.buildType.isDebuggable) {
|
if (!variant.buildType.isDebuggable) {
|
||||||
|
|||||||
Reference in New Issue
Block a user