diff --git a/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/AndroidTargetPrototype.kt b/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/AndroidTargetPrototype.kt index 2a794baf390..9d4ed797b1f 100644 --- a/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/AndroidTargetPrototype.kt +++ b/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/AndroidTargetPrototype.kt @@ -98,7 +98,7 @@ fun KotlinMultiplatformExtension.androidTargetPrototype(): PrototypeAndroidTarge AndroidBootClasspathIdeDependencyResolver(project), constraint = IdeMultiplatformImport.SourceSetConstraint { sourceSet -> sourceSet.android != null }, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api index f52299ab971..51c5a960c1c 100644 --- a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api +++ b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api @@ -54,9 +54,9 @@ public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyTransform public abstract interface class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport { public static final field Companion Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Companion; public static fun instance (Lorg/gradle/api/Project;)Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport; - public abstract fun registerAdditionalArtifactResolver (Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeAdditionalArtifactResolver;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionPhase;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionLevel;)V + public abstract fun registerAdditionalArtifactResolver (Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeAdditionalArtifactResolver;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionPhase;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority;)V public abstract fun registerDependencyEffect (Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyEffect;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint;)V - public abstract fun registerDependencyResolver (Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyResolver;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionPhase;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionLevel;)V + public abstract fun registerDependencyResolver (Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyResolver;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionPhase;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority;)V public abstract fun registerDependencyTransformer (Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeDependencyTransformer;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint;Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyTransformationPhase;)V public abstract fun registerExtrasSerializationExtension (Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinExtrasSerializationExtension;)V public abstract fun resolveDependencies (Ljava/lang/String;)Ljava/util/Set; @@ -67,13 +67,6 @@ public abstract interface class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultip public abstract fun serialize (Lorg/jetbrains/kotlin/tooling/core/Extras$Key;Ljava/lang/Object;)[B } -public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionLevel : java/lang/Enum { - public static final field Default Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionLevel; - public static final field Overwrite Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionLevel; - public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionLevel; - public static fun values ()[Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionLevel; -} - public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionPhase : java/lang/Enum { public static final field PostAdditionalArtifactResolution Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionPhase; public static final field PreAdditionalArtifactResolution Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionPhase; @@ -86,13 +79,6 @@ public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport public final fun instance (Lorg/gradle/api/Project;)Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport; } -public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionLevel : java/lang/Enum { - public static final field Default Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionLevel; - public static final field Overwrite Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionLevel; - public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionLevel; - public static fun values ()[Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionLevel; -} - public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionPhase : java/lang/Enum { public static final field BinaryDependencyResolution Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionPhase; public static final field PostDependencyResolution Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionPhase; @@ -112,6 +98,23 @@ public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport public static fun values ()[Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyTransformationPhase; } +public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority : java/lang/Comparable { + public static final field Companion Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority$Companion; + public fun (I)V + public synthetic fun compareTo (Ljava/lang/Object;)I + public fun compareTo (Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority;)I + public fun equals (Ljava/lang/Object;)Z + public final fun getValue ()I + public fun hashCode ()I +} + +public final class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority$Companion { + public final fun getHigh ()Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority; + public final fun getLow ()Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority; + public final fun getNormal ()Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority; + public final fun getVeryHigh ()Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$Priority; +} + public abstract interface class org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint { public static final field Companion Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint$Companion; public abstract fun invoke (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;)Z diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt index 1b5abbe63cb..7a5292e051f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt @@ -10,7 +10,6 @@ import org.gradle.api.Project import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging import org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi -import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializationExtension @@ -21,8 +20,6 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.* import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.extraProperties -import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.DependencyResolutionLevel.Default -import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.DependencyResolutionLevel.Overwrite import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.sources.internal @@ -60,28 +57,28 @@ interface IdeMultiplatformImport { /** * Registers a given [resolver] to run during Gradle import: - * The given resolver will only run if [constraint] matches and if not overwritten by another - * resolver registered in the same [phase] and level=[DependencyResolutionLevel.Overwrite] + * The given resolver will only run if the [constraint] matches a given SourceSet and if not overwritten by another + * resolver registered in the same [phase] and higher [Priority] */ @ExternalKotlinTargetApi fun registerDependencyResolver( resolver: IdeDependencyResolver, constraint: SourceSetConstraint, phase: DependencyResolutionPhase, - level: DependencyResolutionLevel = Default, + priority: Priority = Priority.normal, ) /** * Registers a given [resolver] to run during Gradle import: - * The given resolver will only run if [constraint] matches and if not overwritten by another - * resolver registered in the same [phase] and level [AdditionalArtifactResolutionLevel.Overwrite] + * The given resolver will only run if the [constraint] matches a given SourceSet and if not overwritten by another + * resolver registered in the same [phase] and higher [Priority] */ @ExternalKotlinTargetApi fun registerAdditionalArtifactResolver( resolver: IdeAdditionalArtifactResolver, constraint: SourceSetConstraint, phase: AdditionalArtifactResolutionPhase, - level: AdditionalArtifactResolutionLevel = AdditionalArtifactResolutionLevel.Default, + priority: Priority = Priority.normal, ) /** @@ -155,19 +152,60 @@ interface IdeMultiplatformImport { } /** - * Any [IdeDependencyResolver] has to be registered specifying a certain resolution level. - * Generally, all resolvers registered in a given resolution level will work collaboratively, meaning the dependency resolution - * result is the aggregation of all resolvers running. + * Indicating the 'priority' of a given [IdeDependencyResolver] or [IdeAdditionalArtifactResolver]: + * When resolving dependencies, only the highest priority resolver will be selected and executed. + * If there are multiple resolvers with the same [Priority] registered, then all of them will be executed + * and the result will be merged. * - * However, only the resolvers in the highest resolution result will run e.g. - * If resolvers with level [Overwrite] are found, then only those will contribute to the dependency resolution. - * Otherwise, all [Default] resolvers will run. + * By 'default' resolvers are registered using [Priority.normal]. + * The Kotlin Gradle Plugin is not expected to register resolvers outside the [normal] or [high] priorities + * External Kotlin Target maintainers _(such as Google)_ can therefore use [veryHigh] to overwrite all resolvers + * from the Kotlin Gradle plugin or [low] to only register a resolver if there is nothing available by default + * from the Kotlin Gradle plugin. */ @ExternalKotlinTargetApi - enum class DependencyResolutionLevel { - Default, Overwrite + class Priority(val value: Int) : Comparable { + override fun equals(other: Any?): Boolean { + if (other !is Priority) return false + return other.value == value + } + + override fun hashCode(): Int { + return value.hashCode() + } + + override fun compareTo(other: Priority): Int { + return this.value.compareTo(other.value) + } + + @ExternalKotlinTargetApi + companion object { + /** + * Not used by the Kotlin Gradle plugin: Can be used by external Kotlin Target maintainers to + * provide resolvers only if KGP does not offer any out of the box. + */ + val low = Priority(-10) + + /** + * Default [Priority] used to register resolvers. + * Used by the Kotlin Gradle plugin. + */ + val normal = Priority(0) + + /** + * Used by the Kotlin Gradle plugin for special cases (like android, jvmAndAndroid, ...) + */ + val high = Priority(10) + + /** + * Not used by the Kotlin Gradle plugin: Can be used by external Kotlin Target maintainers to + * overwrite the Kotlin Gradle plugin + */ + val veryHigh = Priority(100) + } } + @ExternalKotlinTargetApi enum class AdditionalArtifactResolutionPhase { PreAdditionalArtifactResolution, @@ -175,11 +213,6 @@ interface IdeMultiplatformImport { PostAdditionalArtifactResolution } - @ExternalKotlinTargetApi - enum class AdditionalArtifactResolutionLevel { - Default, Overwrite - } - /** * Any [IdeDependencyResolver] has to be registered for a given transformation phase. * The phases will be executed in the order of this enums ordinal. 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 8e6c9cd3fa0..94b09f9e2c8 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 @@ -20,98 +20,98 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti resolver = IdeDependsOnDependencyResolver, constraint = SourceSetConstraint.unconstrained, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeFriendSourceDependencyResolver, constraint = SourceSetConstraint.unconstrained, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeVisibleMultiplatformSourceDependencyResolver, constraint = !SourceSetConstraint.isLeaf, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeJvmAndAndroidSourceDependencyResolver, constraint = SourceSetConstraint.isJvmAndAndroid, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeNativeStdlibDependencyResolver, constraint = SourceSetConstraint.isNative, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default, + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeNativePlatformDependencyResolver, constraint = SourceSetConstraint.isNative, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeCommonizedNativePlatformDependencyResolver, constraint = SourceSetConstraint.isNative, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeTransformedMetadataDependencyResolver, constraint = !SourceSetConstraint.isLeaf and !SourceSetConstraint.isJvmAndAndroid, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeOriginalMetadataDependencyResolver, constraint = !SourceSetConstraint.isLeaf, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default, + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeBinaryDependencyResolver(), constraint = SourceSetConstraint.isSinglePlatformType, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdePlatformCinteropDependencyResolver, constraint = SourceSetConstraint.isSingleKotlinTarget and SourceSetConstraint.isNative, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default, + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeCommonizedCinteropDependencyResolver, constraint = { sourceSet -> sourceSet.commonizerTarget.getOrThrow() is SharedCommonizerTarget }, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default, + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeCInteropMetadataDependencyClasspathResolver, constraint = SourceSetConstraint.isNative and !SourceSetConstraint.isSingleKotlinTarget, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default, + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdeProjectToProjectCInteropDependencyResolver, constraint = SourceSetConstraint.isNative and SourceSetConstraint.isSingleKotlinTarget, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default, + priority = IdeMultiplatformImport.Priority.normal ) /* @@ -122,21 +122,21 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti resolver = IdeJvmAndAndroidPlatformBinaryDependencyResolver(extension.project), constraint = SourceSetConstraint.isJvmAndAndroid, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerDependencyResolver( resolver = IdePlatformSourcesResolver(), constraint = SourceSetConstraint.isSinglePlatformType, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourcesAndDocumentationResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) registerAdditionalArtifactResolver( resolver = IdeMetadataSourcesResolver(), constraint = !SourceSetConstraint.isSinglePlatformType, phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution, - level = IdeMultiplatformImport.AdditionalArtifactResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) if (extension.project.kotlinPropertiesProvider.enableSlowIdeSourcesJarResolver) { @@ -144,7 +144,7 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti resolver = IdeArtifactResolutionQuerySourcesAndDocumentationResolver, constraint = SourceSetConstraint.unconstrained, phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution, - level = IdeMultiplatformImport.AdditionalArtifactResolutionLevel.Default + priority = IdeMultiplatformImport.Priority.normal ) } @@ -167,21 +167,21 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti resolver = IdeDependencyResolver.empty, constraint = SourceSetConstraint.isAndroid, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Overwrite + priority = IdeMultiplatformImport.Priority.high ) registerDependencyResolver( resolver = IdeDependencyResolver.empty, constraint = SourceSetConstraint.isAndroid, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourcesAndDocumentationResolution, - level = IdeMultiplatformImport.DependencyResolutionLevel.Overwrite + priority = IdeMultiplatformImport.Priority.high ) registerAdditionalArtifactResolver( resolver = IdeAdditionalArtifactResolver.empty, constraint = SourceSetConstraint.isAndroid, phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution, - level = IdeMultiplatformImport.AdditionalArtifactResolutionLevel.Overwrite + priority = IdeMultiplatformImport.Priority.high ) } } 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 c9d9ebfb210..b889e722ab7 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 @@ -63,10 +63,10 @@ internal class IdeMultiplatformImportImpl( resolver: IdeDependencyResolver, constraint: SourceSetConstraint, phase: DependencyResolutionPhase, - level: DependencyResolutionLevel + priority: Priority, ) { registeredDependencyResolvers.add( - RegisteredDependencyResolver(extension.project.kotlinIdeMultiplatformImportStatistics, resolver, constraint, phase, level) + RegisteredDependencyResolver(extension.project.kotlinIdeMultiplatformImportStatistics, resolver, constraint, phase, priority) ) if (resolver is IdeDependencyResolver.WithBuildDependencies) { @@ -91,11 +91,11 @@ internal class IdeMultiplatformImportImpl( resolver: IdeAdditionalArtifactResolver, constraint: SourceSetConstraint, phase: AdditionalArtifactResolutionPhase, - level: AdditionalArtifactResolutionLevel + priority: Priority ) { registeredAdditionalArtifactResolvers.add( RegisteredAdditionalArtifactResolver( - extension.project.kotlinIdeMultiplatformImportStatistics, resolver, constraint, phase, level + extension.project.kotlinIdeMultiplatformImportStatistics, resolver, constraint, phase, priority ) ) } @@ -123,11 +123,11 @@ internal class IdeMultiplatformImportImpl( val applicableResolvers = registeredDependencyResolvers .filter { it.phase == phase } .filter { it.constraint(sourceSet) } - .groupBy { it.level } + .groupBy { it.priority } /* Find resolvers in the highest resolution level and only consider those */ - DependencyResolutionLevel.values().reversed().forEach { level -> - val resolvers = applicableResolvers[level].orEmpty() + applicableResolvers.keys.sortedDescending().forEach { priority -> + val resolvers = applicableResolvers[priority].orEmpty() if (resolvers.isNotEmpty()) { return@resolve IdeDependencyResolver(resolvers).resolve(sourceSet) } @@ -145,10 +145,10 @@ internal class IdeMultiplatformImportImpl( val applicableResolvers = registeredAdditionalArtifactResolvers .filter { it.phase == phase } .filter { it.constraint(sourceSet) } - .groupBy { it.level } + .groupBy { it.priority } - AdditionalArtifactResolutionLevel.values().reversed().forEach { level -> - val resolvers = applicableResolvers[level].orEmpty() + applicableResolvers.keys.sortedDescending().forEach { priority -> + val resolvers = applicableResolvers[priority].orEmpty() if (resolvers.isNotEmpty()) { resolvers.forEach { resolver -> resolver.resolve(sourceSet, dependencies) } return@resolve @@ -202,7 +202,7 @@ internal class IdeMultiplatformImportImpl( private val resolver: IdeDependencyResolver, val constraint: SourceSetConstraint, val phase: DependencyResolutionPhase, - val level: DependencyResolutionLevel, + val priority: Priority, ) : IdeDependencyResolver { private class TimeMeasuredResult(val timeInMillis: Long, val dependencies: Set) @@ -245,7 +245,7 @@ internal class IdeMultiplatformImportImpl( private val resolver: IdeAdditionalArtifactResolver, val constraint: SourceSetConstraint, val phase: AdditionalArtifactResolutionPhase, - val level: AdditionalArtifactResolutionLevel + val priority: Priority, ) : IdeAdditionalArtifactResolver { override fun resolve(sourceSet: KotlinSourceSet, dependencies: Set) { runCatching { measureTimeMillis { resolver.resolve(sourceSet, dependencies) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/IdeMultiplatformImportPriorityTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/IdeMultiplatformImportPriorityTest.kt new file mode 100644 index 00000000000..de19574039b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/IdeMultiplatformImportPriorityTest.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2023 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. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.unitTests + +import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.Priority +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals +import kotlin.test.assertTrue + +class IdeMultiplatformImportPriorityTest { + + @Test + fun `test - equals and hashCode`() { + assertEquals(Priority(10), Priority(10)) + assertEquals(Priority(10).hashCode(), Priority(10).hashCode()) + + assertNotEquals(Priority(10), Priority(11)) + assertNotEquals(Priority(10).hashCode(), Priority(11).hashCode()) + } + + @Test + fun `test - compareTo`() { + assertTrue(Priority(10) > Priority(9)) + assertTrue(Priority(9) < Priority(10)) + assertTrue(Priority(9) < Priority(10)) + assertTrue(Priority(10) <= Priority(10)) + assertTrue(Priority(10) >= Priority(10)) + } + + @Test + fun `test - predefined values`() { + val predefinedValues = listOf( + Priority.low, + Priority.normal, + Priority.high, + Priority.veryHigh + ) + + assertEquals(predefinedValues, predefinedValues.sorted()) + assertEquals(predefinedValues.reversed(), predefinedValues.sortedDescending()) + + predefinedValues.zipWithNext { lower, higher -> + assertNotEquals(lower, higher) + assertTrue(lower < higher) + } + } +} \ No newline at end of file