diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyResolver.kt index 52ddfa9bd10..2eb7048ed39 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyResolver.kt @@ -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 + interface WithBuildDependencies { + /** + * return anything accepted to be passed to [org.gradle.api.Task.dependsOn] + */ + fun dependencies(project: Project): Iterable + } + object Empty : IdeDependencyResolver { override fun resolve(sourceSet: KotlinSourceSet): Set = emptySet() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt index a23efc20ef4..e19995d9531 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportFactory.kt @@ -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) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt index 309cb2ca50b..4e71ca62f68 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt @@ -50,6 +50,7 @@ internal class IdeMultiplatformImportImpl( private val registeredDependencyEffects = mutableListOf() private val registeredExtrasSerializationExtensions = mutableListOf() + @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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/PrepareKotlinIdeaImportTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/PrepareKotlinIdeaImportTask.kt index 295508bb960..3785c1d0f47 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/PrepareKotlinIdeaImportTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/PrepareKotlinIdeaImportTask.kt @@ -18,7 +18,7 @@ internal fun Project.ideaImportDependsOn(task: TaskProvider<*>) { prepareKotlinIdeaImportTask.dependsOn(task) } -@UnsafeApi("Use 'ideaImportDependsOn' instead") +@Idea222Api internal val Project.prepareKotlinIdeaImportTask: TaskProvider get() = locateOrRegisterTask( "prepareKotlinIdeaImport", diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedNativePlatformDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedNativePlatformDependencyResolver.kt index df913789265..2b4c4c742c8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedNativePlatformDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCommonizedNativePlatformDependencyResolver.kt @@ -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 { 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 { + return listOfNotNull(project.commonizeNativeDistributionTask) + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/kotlinExtrasSerialization.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/kotlinExtrasSerialization.kt new file mode 100644 index 00000000000..9eecef1d8f6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/kotlinExtrasSerialization.kt @@ -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) +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index c09bc91bfcd..1f0927eef58 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -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 { exportProjectStructureMetadataForOtherBuilds(kotlinMultiplatformExtension) + // Ensure that the instance is created and configured during apply + project.kotlinIdeMultiplatformImport project.locateOrRegisterIdeResolveDependenciesTask() }