[Gradle] Mark dependencies coming from nativeDistribution

KT-55189
This commit is contained in:
Sebastian Sellmair
2022-12-01 10:04:42 +01:00
committed by Space Team
parent 45ebbede2f
commit e002bbe906
7 changed files with 36 additions and 6 deletions
@@ -21,6 +21,7 @@ data class KlibExtra(
val shortName: String?, val shortName: String?,
val packageFqName: String?, val packageFqName: String?,
val nativeTargets: List<String>?, val nativeTargets: List<String>?,
val commonizerNativeTargets: List<String>?,
val commonizerTarget: String?, val commonizerTarget: String?,
val isInterop: Boolean? val isInterop: Boolean?
) : Serializable { ) : Serializable {
@@ -10,10 +10,27 @@ import org.jetbrains.kotlin.tooling.core.extrasKeyOf
import org.jetbrains.kotlin.tooling.core.getValue import org.jetbrains.kotlin.tooling.core.getValue
import org.jetbrains.kotlin.tooling.core.setValue import org.jetbrains.kotlin.tooling.core.setValue
val isIdeaProjectLevelKey = extrasKeyOf<Boolean>("IdeaKotlinBinaryDependency.isIdeaProjectLevel") val isIdeaProjectLevelKey = extrasKeyOf<Boolean>("isIdeaProjectLevel")
/** /**
* Marks any binary dependency as Global in the sense of "this library is considered * Marks any binary dependency as Global in the sense of "this library is considered
* the same, no matter in which Gradle project / IntelliJ module it will be used * the same, no matter in which Gradle project / IntelliJ module it will be used
*/ */
var IdeaKotlinBinaryDependency.isIdeaProjectLevel by isIdeaProjectLevelKey var IdeaKotlinBinaryDependency.isIdeaProjectLevel by isIdeaProjectLevelKey
val isNativeDistributionKey = extrasKeyOf<Boolean>("isNativeDistribution")
/**
* Marks this dependency as 'coming from the native distribution'
*/
var IdeaKotlinBinaryDependency.isNativeDistribution by isNativeDistributionKey
val isNativeStdlibKey = extrasKeyOf<Boolean>("isNativeStdlib")
/**
* Marks the dependency as the native stdlib (which is special in the native distribution)
*/
var IdeaKotlinBinaryDependency.isNativeStdlib by isNativeStdlibKey
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinBooleanExtrasSeriali
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializer 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.KlibExtra
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isIdeaProjectLevelKey import org.jetbrains.kotlin.gradle.idea.tcs.extras.isIdeaProjectLevelKey
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isNativeDistributionKey
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isNativeStdlibKey
import org.jetbrains.kotlin.gradle.kpm.idea.kotlinDebugKey import org.jetbrains.kotlin.gradle.kpm.idea.kotlinDebugKey
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint
import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.* import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.*
@@ -108,6 +110,8 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
register(kotlinDebugKey, IdeaKotlinExtrasSerializer.javaIoSerializable()) register(kotlinDebugKey, IdeaKotlinExtrasSerializer.javaIoSerializable())
register(KlibExtra.key, IdeaKotlinExtrasSerializer.javaIoSerializable()) register(KlibExtra.key, IdeaKotlinExtrasSerializer.javaIoSerializable())
register(isIdeaProjectLevelKey, IdeaKotlinBooleanExtrasSerializer) register(isIdeaProjectLevelKey, IdeaKotlinBooleanExtrasSerializer)
register(isNativeDistributionKey, IdeaKotlinBooleanExtrasSerializer)
register(isNativeStdlibKey, IdeaKotlinBooleanExtrasSerializer)
} }
} }
} }
@@ -15,12 +15,14 @@ import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency 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.isIdeaProjectLevel
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isNativeDistribution
import org.jetbrains.kotlin.gradle.idea.tcs.extras.klibExtra import org.jetbrains.kotlin.gradle.idea.tcs.extras.klibExtra
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.ide.KlibExtra import org.jetbrains.kotlin.gradle.plugin.ide.KlibExtra
import org.jetbrains.kotlin.gradle.plugin.sources.project import org.jetbrains.kotlin.gradle.plugin.sources.project
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.*
import java.io.File import java.io.File
@@ -32,14 +34,14 @@ object IdeNativePlatformDependencyResolver : IdeDependencyResolver {
return sourceSet.project.konanDistribution.platformLibsDir.resolve(konanTarget.name) return sourceSet.project.konanDistribution.platformLibsDir.resolve(konanTarget.name)
.listFiles().orEmpty() .listFiles().orEmpty()
.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION } .filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }
.mapNotNull { libraryFile -> sourceSet.project.resolveKlib(libraryFile) } .mapNotNull { libraryFile -> sourceSet.project.resolveKlib(libraryFile, konanTarget) }
.toSet() .toSet()
} }
private val Project.konanDistribution: KonanDistribution private val Project.konanDistribution: KonanDistribution
get() = KonanDistribution(project.file(konanHome)) get() = KonanDistribution(project.file(konanHome))
private fun Project.resolveKlib(file: File): IdeaKotlinResolvedBinaryDependency? { private fun Project.resolveKlib(file: File, konanTarget: KonanTarget): IdeaKotlinResolvedBinaryDependency? {
try { try {
val kotlinLibrary = resolveSingleFileKlib( val kotlinLibrary = resolveSingleFileKlib(
org.jetbrains.kotlin.konan.file.File(file.absolutePath), org.jetbrains.kotlin.konan.file.File(file.absolutePath),
@@ -52,10 +54,12 @@ object IdeNativePlatformDependencyResolver : IdeDependencyResolver {
coordinates = IdeaKotlinBinaryCoordinates( coordinates = IdeaKotlinBinaryCoordinates(
group = "org.jetbrains.kotlin.native", group = "org.jetbrains.kotlin.native",
module = kotlinLibrary.packageFqName ?: kotlinLibrary.shortName ?: kotlinLibrary.uniqueName, module = kotlinLibrary.packageFqName ?: kotlinLibrary.shortName ?: kotlinLibrary.uniqueName,
version = project.konanVersion.toString() version = project.konanVersion.toString(),
sourceSetName = konanTarget.toString()
), ),
).apply { ).apply {
isIdeaProjectLevel = true isIdeaProjectLevel = true
isNativeDistribution = true
klibExtra = KlibExtra(kotlinLibrary) klibExtra = KlibExtra(kotlinLibrary)
} }
} catch (t: Throwable) { } catch (t: Throwable) {
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency 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.isIdeaProjectLevel
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isNativeDistribution
import org.jetbrains.kotlin.gradle.idea.tcs.extras.isNativeStdlib
import org.jetbrains.kotlin.gradle.idea.tcs.extras.klibExtra import org.jetbrains.kotlin.gradle.idea.tcs.extras.klibExtra
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
@@ -50,6 +52,8 @@ internal object IdeNativeStdlibDependencyResolver : IdeDependencyResolver {
"org.jetbrains.kotlin.native", "stdlib", sourceSet.project.konanVersion.toString(), "org.jetbrains.kotlin.native", "stdlib", sourceSet.project.konanVersion.toString(),
) )
).apply { ).apply {
this.isNativeDistribution = true
this.isNativeStdlib = true
this.isIdeaProjectLevel = true this.isIdeaProjectLevel = true
this.klibExtra = klibExtra this.klibExtra = klibExtra
} }
@@ -56,7 +56,8 @@ internal fun KlibExtra(library: KotlinLibrary): KlibExtra {
shortName = library.shortName, shortName = library.shortName,
packageFqName = library.packageFqName, packageFqName = library.packageFqName,
nativeTargets = library.nativeTargets, nativeTargets = library.nativeTargets,
commonizerNativeTargets = library.commonizerNativeTargets,
commonizerTarget = library.commonizerTarget, commonizerTarget = library.commonizerTarget,
isInterop = library.isInterop isInterop = library.isInterop
) )
} }
@@ -20,7 +20,6 @@ operator fun <T : Any> Extras.Key<T>.getValue(receiver: HasExtras, property: KPr
return receiver.extras[this] return receiver.extras[this]
} }
operator fun <T : Any> Extras.Key<T>.setValue(receiver: HasMutableExtras, property: KProperty<*>, value: T?) { operator fun <T : Any> Extras.Key<T>.setValue(receiver: HasMutableExtras, property: KProperty<*>, value: T?) {
if (value == null) { if (value == null) {
receiver.extras.remove(this) receiver.extras.remove(this)