From 3dc61822bd53084b130d6b628f35f40509fd4d9f Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Wed, 30 Nov 2022 16:50:16 +0100 Subject: [PATCH] [Gradle] Ide dependency resolvers: support KlibExtra and isIdeaProjectLevel KT-55189 --- .../ide/IdeMultiplatformImportFactory.kt | 5 +++ .../IdeNativePlatformDependencyResolver.kt | 11 +++--- .../IdeNativeStdlibDependencyResolver.kt | 36 +++++++++++++++---- ...deTransformedMetadataDependencyResolver.kt | 6 +++- .../kotlin/gradle/plugin/ide/factories.kt | 14 ++++++++ 5 files changed, 61 insertions(+), 11 deletions(-) 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 fcd96343ad9..3455c6a10e9 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,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) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativePlatformDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativePlatformDependencyResolver.kt index 19c42cdd22d..b7ef49c56ad 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativePlatformDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativePlatformDependencyResolver.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativeStdlibDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativeStdlibDependencyResolver.kt index 22cd5c5bb0a..5945a8d7791 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativeStdlibDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeNativeStdlibDependencyResolver.kt @@ -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 { + 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 + } ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeTransformedMetadataDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeTransformedMetadataDependencyResolver.kt index 972236d367a..08b04f87614 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeTransformedMetadataDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeTransformedMetadataDependencyResolver.kt @@ -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 + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt index 748da01019d..0319bcf6735 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/factories.kt @@ -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 + ) +} \ No newline at end of file