[Gradle] Ide dependency resolvers: support KlibExtra and isIdeaProjectLevel

KT-55189
This commit is contained in:
Sebastian Sellmair
2022-11-30 16:50:16 +01:00
committed by Space Team
parent a68140e51d
commit 3dc61822bd
5 changed files with 61 additions and 11 deletions
@@ -6,7 +6,10 @@
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.KlibExtra
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isIdeaProjectLevelKey
import org.jetbrains.kotlin.gradle.kpm.idea.kotlinDebugKey
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint
import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.*
@@ -103,6 +106,8 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
registerExtrasSerializationExtension {
register(kotlinDebugKey, IdeaKotlinExtrasSerializer.javaIoSerializable())
register(KlibExtra.key, IdeaKotlinExtrasSerializer.javaIoSerializable())
register(isIdeaProjectLevelKey, IdeaKotlinBooleanExtrasSerializer)
}
}
}
@@ -11,16 +11,17 @@ import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
import org.jetbrains.kotlin.commonizer.platformLibsDir
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.compilerRunner.konanVersion
import org.jetbrains.kotlin.gradle.idea.kpm.IdeaKpmDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isIdeaProjectLevel
import org.jetbrains.kotlin.gradle.idea.tcs.extras.klibExtra
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.ide.KlibExtra
import org.jetbrains.kotlin.gradle.plugin.sources.project
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.library.*
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
import java.io.File
object IdeNativePlatformDependencyResolver : IdeDependencyResolver {
@@ -48,13 +49,15 @@ object IdeNativePlatformDependencyResolver : IdeDependencyResolver {
return IdeaKotlinResolvedBinaryDependency(
binaryType = IdeaKotlinDependency.CLASSPATH_BINARY_TYPE,
binaryFile = file,
extras = mutableExtrasOf(),
coordinates = IdeaKotlinBinaryCoordinates(
group = "org.jetbrains.kotlin.native",
module = kotlinLibrary.packageFqName ?: kotlinLibrary.shortName ?: kotlinLibrary.uniqueName,
version = project.konanVersion.toString()
),
)
).apply {
isIdeaProjectLevel = true
klibExtra = KlibExtra(kotlinLibrary)
}
} catch (t: Throwable) {
logger.error("Failed resolving library ${file.path}", t)
return null
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.commonizer.KonanDistribution
import org.jetbrains.kotlin.commonizer.stdlib
import org.jetbrains.kotlin.compilerRunner.konanHome
@@ -12,23 +14,45 @@ import org.jetbrains.kotlin.compilerRunner.konanVersion
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isIdeaProjectLevel
import org.jetbrains.kotlin.gradle.idea.tcs.extras.klibExtra
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.ide.KlibExtra
import org.jetbrains.kotlin.gradle.plugin.sources.project
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.library.ToolingSingleFileKlibResolveStrategy
import org.jetbrains.kotlin.library.resolveSingleFileKlib
internal object IdeNativeStdlibDependencyResolver : IdeDependencyResolver {
private val logger: Logger = Logging.getLogger(IdeNativePlatformDependencyResolver::class.java)
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> {
val binaryFile = KonanDistribution(sourceSet.project.konanHome).stdlib
val klibExtra = try {
val kotlinLibrary = resolveSingleFileKlib(
libraryFile = File(binaryFile.absolutePath),
strategy = ToolingSingleFileKlibResolveStrategy
)
KlibExtra(kotlinLibrary)
} catch (error: Throwable) {
logger.error("Failed to resolve Native Stdlib", error)
null
}
return setOf(
IdeaKotlinResolvedBinaryDependency(
binaryType = IdeaKotlinDependency.CLASSPATH_BINARY_TYPE,
binaryFile = KonanDistribution(sourceSet.project.konanHome).stdlib,
extras = mutableExtrasOf(),
binaryFile = binaryFile,
coordinates = IdeaKotlinBinaryCoordinates(
"org.jetbrains.kotlin", "stdlib-native", sourceSet.project.konanVersion.toString(),
"org.jetbrains.kotlin.native", "stdlib", sourceSet.project.konanVersion.toString(),
)
)
).apply {
this.isIdeaProjectLevel = true
this.klibExtra = klibExtra
}
)
}
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isIdeaProjectLevel
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets
@@ -49,7 +50,10 @@ internal object IdeTransformedMetadataDependencyResolver : IdeDependencyResolver
version = metadataProvider.moduleDependencyVersion,
sourceSetName = visibleSourceSet
)
)
).apply {
/* Those libraries are stored in project wide .gradle and are scoped by hash */
isIdeaProjectLevel = true
}
}
}
}
@@ -11,9 +11,11 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinProjectCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.extras.KlibExtra
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
import org.jetbrains.kotlin.gradle.plugin.sources.project
import org.jetbrains.kotlin.library.*
internal fun IdeaKotlinProjectCoordinates(identifier: ProjectComponentIdentifier): IdeaKotlinProjectCoordinates {
@@ -46,3 +48,15 @@ fun IdeaKotlinBinaryCoordinates(identifier: ModuleComponentIdentifier): IdeaKotl
version = identifier.version
)
}
internal fun KlibExtra(library: KotlinLibrary): KlibExtra {
return KlibExtra(
builtInsPlatform = library.builtInsPlatform,
uniqueName = library.uniqueName,
shortName = library.shortName,
packageFqName = library.packageFqName,
nativeTargets = library.nativeTargets,
commonizerTarget = library.commonizerTarget,
isInterop = library.isInterop
)
}