[Gradle] Implement IdeDependencyResolver.WithBuildDependencies

KT-55238
This commit is contained in:
Sebastian Sellmair
2022-12-02 16:04:16 +01:00
committed by Space Team
parent 4b036cc627
commit ee07fcc00b
7 changed files with 52 additions and 15 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.plugin.ide
import org.gradle.api.Project
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
@@ -13,6 +14,13 @@ import org.jetbrains.kotlin.tooling.core.extrasReadWriteProperty
fun interface IdeDependencyResolver {
fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency>
interface WithBuildDependencies {
/**
* return anything accepted to be passed to [org.gradle.api.Task.dependsOn]
*/
fun dependencies(project: Project): Iterable<Any>
}
object Empty : IdeDependencyResolver {
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> = emptySet()
}
@@ -6,11 +6,6 @@
package org.jetbrains.kotlin.gradle.plugin.ide
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinBooleanExtrasSerializer
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializer
import org.jetbrains.kotlin.gradle.idea.tcs.extras.*
import org.jetbrains.kotlin.gradle.kpm.idea.kotlinDebugKey
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint
import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.*
import org.jetbrains.kotlin.gradle.plugin.ide.dependencyTransformers.IdePlatformStdlibCommonDependencyFilter
@@ -118,13 +113,6 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
constraint = SourceSetConstraint.unconstrained
)
registerExtrasSerializationExtension {
register(kotlinDebugKey, IdeaKotlinExtrasSerializer.javaIoSerializable())
register(KlibExtra.key, IdeaKotlinExtrasSerializer.javaIoSerializable())
register(isIdeaProjectLevelKey, IdeaKotlinBooleanExtrasSerializer)
register(isNativeDistributionKey, IdeaKotlinBooleanExtrasSerializer)
register(isNativeStdlibKey, IdeaKotlinBooleanExtrasSerializer)
register(isCommonizedKey, IdeaKotlinBooleanExtrasSerializer)
}
registerExtrasSerializationExtension(kotlinExtrasSerialization)
}
}
@@ -50,6 +50,7 @@ internal class IdeMultiplatformImportImpl(
private val registeredDependencyEffects = mutableListOf<RegisteredDependencyEffect>()
private val registeredExtrasSerializationExtensions = mutableListOf<IdeaKotlinExtrasSerializationExtension>()
@OptIn(Idea222Api::class)
@ExternalKotlinTargetApi
override fun registerDependencyResolver(
resolver: IdeDependencyResolver,
@@ -60,6 +61,13 @@ internal class IdeMultiplatformImportImpl(
registeredDependencyResolvers.add(
RegisteredDependencyResolver(resolver, constraint, phase, level)
)
if (resolver is IdeDependencyResolver.WithBuildDependencies) {
val project = extension.project
val dependencies = project.provider { resolver.dependencies(project) }
extension.project.locateOrRegisterIdeResolveDependenciesTask().configure { it.dependsOn(dependencies) }
extension.project.prepareKotlinIdeaImportTask.configure { it.dependsOn(dependencies) }
}
}
@ExternalKotlinTargetApi
@@ -18,7 +18,7 @@ internal fun Project.ideaImportDependsOn(task: TaskProvider<*>) {
prepareKotlinIdeaImportTask.dependsOn(task)
}
@UnsafeApi("Use 'ideaImportDependsOn' instead")
@Idea222Api
internal val Project.prepareKotlinIdeaImportTask: TaskProvider<Task>
get() = locateOrRegisterTask(
"prepareKotlinIdeaImport",
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers
import org.gradle.api.Project
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.resolveCommonizedDirectory
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
@@ -16,7 +17,9 @@ import org.jetbrains.kotlin.gradle.targets.native.internal.commonizeNativeDistri
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
internal object IdeCommonizedNativePlatformDependencyResolver : IdeDependencyResolver {
internal object IdeCommonizedNativePlatformDependencyResolver :
IdeDependencyResolver, IdeDependencyResolver.WithBuildDependencies {
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> {
val project = sourceSet.project
val commonizerTarget = getCommonizerTarget(sourceSet) as? SharedCommonizerTarget ?: return emptySet()
@@ -29,4 +32,8 @@ internal object IdeCommonizedNativePlatformDependencyResolver : IdeDependencyRes
.onEach { dependency -> dependency.isCommonized = true }
.toSet()
}
override fun dependencies(project: Project): Iterable<Any> {
return listOfNotNull(project.commonizeNativeDistributionTask)
}
}
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.ide
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinBooleanExtrasSerializer
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializationExtension
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializer.Companion.javaIoSerializable
import org.jetbrains.kotlin.gradle.idea.tcs.extras.*
import org.jetbrains.kotlin.gradle.kpm.idea.kotlinDebugKey
@InternalKotlinGradlePluginApi
val kotlinExtrasSerialization = IdeaKotlinExtrasSerializationExtension {
register(kotlinDebugKey, javaIoSerializable())
register(KlibExtra.key, javaIoSerializable())
register(isIdeaProjectLevelKey, IdeaKotlinBooleanExtrasSerializer)
register(isNativeDistributionKey, IdeaKotlinBooleanExtrasSerializer)
register(isNativeStdlibKey, IdeaKotlinBooleanExtrasSerializer)
register(isCommonizedKey, IdeaKotlinBooleanExtrasSerializer)
}
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.ide.IdeResolveDependenciesTask
import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport
import org.jetbrains.kotlin.gradle.plugin.ide.locateOrRegisterIdeResolveDependenciesTask
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.handleHierarchicalStructureFlagsMigration
@@ -80,6 +81,8 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
exportProjectStructureMetadataForOtherBuilds(kotlinMultiplatformExtension)
// Ensure that the instance is created and configured during apply
project.kotlinIdeMultiplatformImport
project.locateOrRegisterIdeResolveDependenciesTask()
}