[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 packageFqName: String?,
val nativeTargets: List<String>?,
val commonizerNativeTargets: List<String>?,
val commonizerTarget: String?,
val isInterop: Boolean?
) : 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.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
* the same, no matter in which Gradle project / IntelliJ module it will be used
*/
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.tcs.extras.KlibExtra
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.plugin.ide.IdeMultiplatformImport.SourceSetConstraint
import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.*
@@ -108,6 +110,8 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
register(kotlinDebugKey, IdeaKotlinExtrasSerializer.javaIoSerializable())
register(KlibExtra.key, IdeaKotlinExtrasSerializer.javaIoSerializable())
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.IdeaKotlinResolvedBinaryDependency
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.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.konan.target.KonanTarget
import org.jetbrains.kotlin.library.*
import java.io.File
@@ -32,14 +34,14 @@ object IdeNativePlatformDependencyResolver : IdeDependencyResolver {
return sourceSet.project.konanDistribution.platformLibsDir.resolve(konanTarget.name)
.listFiles().orEmpty()
.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }
.mapNotNull { libraryFile -> sourceSet.project.resolveKlib(libraryFile) }
.mapNotNull { libraryFile -> sourceSet.project.resolveKlib(libraryFile, konanTarget) }
.toSet()
}
private val Project.konanDistribution: KonanDistribution
get() = KonanDistribution(project.file(konanHome))
private fun Project.resolveKlib(file: File): IdeaKotlinResolvedBinaryDependency? {
private fun Project.resolveKlib(file: File, konanTarget: KonanTarget): IdeaKotlinResolvedBinaryDependency? {
try {
val kotlinLibrary = resolveSingleFileKlib(
org.jetbrains.kotlin.konan.file.File(file.absolutePath),
@@ -52,10 +54,12 @@ object IdeNativePlatformDependencyResolver : IdeDependencyResolver {
coordinates = IdeaKotlinBinaryCoordinates(
group = "org.jetbrains.kotlin.native",
module = kotlinLibrary.packageFqName ?: kotlinLibrary.shortName ?: kotlinLibrary.uniqueName,
version = project.konanVersion.toString()
version = project.konanVersion.toString(),
sourceSetName = konanTarget.toString()
),
).apply {
isIdeaProjectLevel = true
isNativeDistribution = true
klibExtra = KlibExtra(kotlinLibrary)
}
} 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.IdeaKotlinResolvedBinaryDependency
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.plugin.KotlinSourceSet
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(),
)
).apply {
this.isNativeDistribution = true
this.isNativeStdlib = true
this.isIdeaProjectLevel = true
this.klibExtra = klibExtra
}
@@ -56,7 +56,8 @@ internal fun KlibExtra(library: KotlinLibrary): KlibExtra {
shortName = library.shortName,
packageFqName = library.packageFqName,
nativeTargets = library.nativeTargets,
commonizerNativeTargets = library.commonizerNativeTargets,
commonizerTarget = library.commonizerTarget,
isInterop = library.isInterop
)
}
}
@@ -20,7 +20,6 @@ operator fun <T : Any> Extras.Key<T>.getValue(receiver: HasExtras, property: KPr
return receiver.extras[this]
}
operator fun <T : Any> Extras.Key<T>.setValue(receiver: HasMutableExtras, property: KProperty<*>, value: T?) {
if (value == null) {
receiver.extras.remove(this)