[Gradle] Replace IdeMultiplatformImport.*Level enums with simpler IdeMultiplatformImport.Priority

KT-58601
This commit is contained in:
Sebastian Sellmair
2023-05-10 15:10:30 +02:00
committed by Space Team
parent d4e1321c65
commit e1e2c04044
6 changed files with 161 additions and 72 deletions
@@ -98,7 +98,7 @@ fun KotlinMultiplatformExtension.androidTargetPrototype(): PrototypeAndroidTarge
AndroidBootClasspathIdeDependencyResolver(project), AndroidBootClasspathIdeDependencyResolver(project),
constraint = IdeMultiplatformImport.SourceSetConstraint { sourceSet -> sourceSet.android != null }, constraint = IdeMultiplatformImport.SourceSetConstraint { sourceSet -> sourceSet.android != null },
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
} }
} }
@@ -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 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 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 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 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 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 registerExtrasSerializationExtension (Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinExtrasSerializationExtension;)V
public abstract fun resolveDependencies (Ljava/lang/String;)Ljava/util/Set; 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 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 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 PostAdditionalArtifactResolution Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$AdditionalArtifactResolutionPhase;
public static final field PreAdditionalArtifactResolution 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 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 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 BinaryDependencyResolution Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$DependencyResolutionPhase;
public static final field PostDependencyResolution 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 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 <init> (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 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 static final field Companion Lorg/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport$SourceSetConstraint$Companion;
public abstract fun invoke (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;)Z public abstract fun invoke (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;)Z
@@ -10,7 +10,6 @@ import org.gradle.api.Project
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi 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.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializationExtension 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.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.extraProperties 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.ide.IdeMultiplatformImport.SourceSetConstraint
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.sources.internal
@@ -60,28 +57,28 @@ interface IdeMultiplatformImport {
/** /**
* Registers a given [resolver] to run during Gradle import: * Registers a given [resolver] to run during Gradle import:
* The given resolver will only run if [constraint] matches and if not overwritten by another * 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 level=[DependencyResolutionLevel.Overwrite] * resolver registered in the same [phase] and higher [Priority]
*/ */
@ExternalKotlinTargetApi @ExternalKotlinTargetApi
fun registerDependencyResolver( fun registerDependencyResolver(
resolver: IdeDependencyResolver, resolver: IdeDependencyResolver,
constraint: SourceSetConstraint, constraint: SourceSetConstraint,
phase: DependencyResolutionPhase, phase: DependencyResolutionPhase,
level: DependencyResolutionLevel = Default, priority: Priority = Priority.normal,
) )
/** /**
* Registers a given [resolver] to run during Gradle import: * Registers a given [resolver] to run during Gradle import:
* The given resolver will only run if [constraint] matches and if not overwritten by another * 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 level [AdditionalArtifactResolutionLevel.Overwrite] * resolver registered in the same [phase] and higher [Priority]
*/ */
@ExternalKotlinTargetApi @ExternalKotlinTargetApi
fun registerAdditionalArtifactResolver( fun registerAdditionalArtifactResolver(
resolver: IdeAdditionalArtifactResolver, resolver: IdeAdditionalArtifactResolver,
constraint: SourceSetConstraint, constraint: SourceSetConstraint,
phase: AdditionalArtifactResolutionPhase, 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. * Indicating the 'priority' of a given [IdeDependencyResolver] or [IdeAdditionalArtifactResolver]:
* Generally, all resolvers registered in a given resolution level will work collaboratively, meaning the dependency resolution * When resolving dependencies, only the highest priority resolver will be selected and executed.
* result is the aggregation of all resolvers running. * 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. * By 'default' resolvers are registered using [Priority.normal].
* If resolvers with level [Overwrite] are found, then only those will contribute to the dependency resolution. * The Kotlin Gradle Plugin is not expected to register resolvers outside the [normal] or [high] priorities
* Otherwise, all [Default] resolvers will run. * 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 @ExternalKotlinTargetApi
enum class DependencyResolutionLevel { class Priority(val value: Int) : Comparable<Priority> {
Default, Overwrite 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 @ExternalKotlinTargetApi
enum class AdditionalArtifactResolutionPhase { enum class AdditionalArtifactResolutionPhase {
PreAdditionalArtifactResolution, PreAdditionalArtifactResolution,
@@ -175,11 +213,6 @@ interface IdeMultiplatformImport {
PostAdditionalArtifactResolution PostAdditionalArtifactResolution
} }
@ExternalKotlinTargetApi
enum class AdditionalArtifactResolutionLevel {
Default, Overwrite
}
/** /**
* Any [IdeDependencyResolver] has to be registered for a given transformation phase. * Any [IdeDependencyResolver] has to be registered for a given transformation phase.
* The phases will be executed in the order of this enums ordinal. * The phases will be executed in the order of this enums ordinal.
@@ -20,98 +20,98 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
resolver = IdeDependsOnDependencyResolver, resolver = IdeDependsOnDependencyResolver,
constraint = SourceSetConstraint.unconstrained, constraint = SourceSetConstraint.unconstrained,
phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeFriendSourceDependencyResolver, resolver = IdeFriendSourceDependencyResolver,
constraint = SourceSetConstraint.unconstrained, constraint = SourceSetConstraint.unconstrained,
phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeVisibleMultiplatformSourceDependencyResolver, resolver = IdeVisibleMultiplatformSourceDependencyResolver,
constraint = !SourceSetConstraint.isLeaf, constraint = !SourceSetConstraint.isLeaf,
phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeJvmAndAndroidSourceDependencyResolver, resolver = IdeJvmAndAndroidSourceDependencyResolver,
constraint = SourceSetConstraint.isJvmAndAndroid, constraint = SourceSetConstraint.isJvmAndAndroid,
phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeNativeStdlibDependencyResolver, resolver = IdeNativeStdlibDependencyResolver,
constraint = SourceSetConstraint.isNative, constraint = SourceSetConstraint.isNative,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default, priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeNativePlatformDependencyResolver, resolver = IdeNativePlatformDependencyResolver,
constraint = SourceSetConstraint.isNative, constraint = SourceSetConstraint.isNative,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeCommonizedNativePlatformDependencyResolver, resolver = IdeCommonizedNativePlatformDependencyResolver,
constraint = SourceSetConstraint.isNative, constraint = SourceSetConstraint.isNative,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeTransformedMetadataDependencyResolver, resolver = IdeTransformedMetadataDependencyResolver,
constraint = !SourceSetConstraint.isLeaf and !SourceSetConstraint.isJvmAndAndroid, constraint = !SourceSetConstraint.isLeaf and !SourceSetConstraint.isJvmAndAndroid,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeOriginalMetadataDependencyResolver, resolver = IdeOriginalMetadataDependencyResolver,
constraint = !SourceSetConstraint.isLeaf, constraint = !SourceSetConstraint.isLeaf,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default, priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeBinaryDependencyResolver(), resolver = IdeBinaryDependencyResolver(),
constraint = SourceSetConstraint.isSinglePlatformType, constraint = SourceSetConstraint.isSinglePlatformType,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdePlatformCinteropDependencyResolver, resolver = IdePlatformCinteropDependencyResolver,
constraint = SourceSetConstraint.isSingleKotlinTarget and SourceSetConstraint.isNative, constraint = SourceSetConstraint.isSingleKotlinTarget and SourceSetConstraint.isNative,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default, priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeCommonizedCinteropDependencyResolver, resolver = IdeCommonizedCinteropDependencyResolver,
constraint = { sourceSet -> sourceSet.commonizerTarget.getOrThrow() is SharedCommonizerTarget }, constraint = { sourceSet -> sourceSet.commonizerTarget.getOrThrow() is SharedCommonizerTarget },
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default, priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeCInteropMetadataDependencyClasspathResolver, resolver = IdeCInteropMetadataDependencyClasspathResolver,
constraint = SourceSetConstraint.isNative and !SourceSetConstraint.isSingleKotlinTarget, constraint = SourceSetConstraint.isNative and !SourceSetConstraint.isSingleKotlinTarget,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default, priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeProjectToProjectCInteropDependencyResolver, resolver = IdeProjectToProjectCInteropDependencyResolver,
constraint = SourceSetConstraint.isNative and SourceSetConstraint.isSingleKotlinTarget, constraint = SourceSetConstraint.isNative and SourceSetConstraint.isSingleKotlinTarget,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, 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), resolver = IdeJvmAndAndroidPlatformBinaryDependencyResolver(extension.project),
constraint = SourceSetConstraint.isJvmAndAndroid, constraint = SourceSetConstraint.isJvmAndAndroid,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdePlatformSourcesResolver(), resolver = IdePlatformSourcesResolver(),
constraint = SourceSetConstraint.isSinglePlatformType, constraint = SourceSetConstraint.isSinglePlatformType,
phase = IdeMultiplatformImport.DependencyResolutionPhase.SourcesAndDocumentationResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourcesAndDocumentationResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
registerAdditionalArtifactResolver( registerAdditionalArtifactResolver(
resolver = IdeMetadataSourcesResolver(), resolver = IdeMetadataSourcesResolver(),
constraint = !SourceSetConstraint.isSinglePlatformType, constraint = !SourceSetConstraint.isSinglePlatformType,
phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution, phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution,
level = IdeMultiplatformImport.AdditionalArtifactResolutionLevel.Default priority = IdeMultiplatformImport.Priority.normal
) )
if (extension.project.kotlinPropertiesProvider.enableSlowIdeSourcesJarResolver) { if (extension.project.kotlinPropertiesProvider.enableSlowIdeSourcesJarResolver) {
@@ -144,7 +144,7 @@ internal fun IdeMultiplatformImport(extension: KotlinProjectExtension): IdeMulti
resolver = IdeArtifactResolutionQuerySourcesAndDocumentationResolver, resolver = IdeArtifactResolutionQuerySourcesAndDocumentationResolver,
constraint = SourceSetConstraint.unconstrained, constraint = SourceSetConstraint.unconstrained,
phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution, 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, resolver = IdeDependencyResolver.empty,
constraint = SourceSetConstraint.isAndroid, constraint = SourceSetConstraint.isAndroid,
phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Overwrite priority = IdeMultiplatformImport.Priority.high
) )
registerDependencyResolver( registerDependencyResolver(
resolver = IdeDependencyResolver.empty, resolver = IdeDependencyResolver.empty,
constraint = SourceSetConstraint.isAndroid, constraint = SourceSetConstraint.isAndroid,
phase = IdeMultiplatformImport.DependencyResolutionPhase.SourcesAndDocumentationResolution, phase = IdeMultiplatformImport.DependencyResolutionPhase.SourcesAndDocumentationResolution,
level = IdeMultiplatformImport.DependencyResolutionLevel.Overwrite priority = IdeMultiplatformImport.Priority.high
) )
registerAdditionalArtifactResolver( registerAdditionalArtifactResolver(
resolver = IdeAdditionalArtifactResolver.empty, resolver = IdeAdditionalArtifactResolver.empty,
constraint = SourceSetConstraint.isAndroid, constraint = SourceSetConstraint.isAndroid,
phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution, phase = IdeMultiplatformImport.AdditionalArtifactResolutionPhase.SourcesAndDocumentationResolution,
level = IdeMultiplatformImport.AdditionalArtifactResolutionLevel.Overwrite priority = IdeMultiplatformImport.Priority.high
) )
} }
} }
@@ -63,10 +63,10 @@ internal class IdeMultiplatformImportImpl(
resolver: IdeDependencyResolver, resolver: IdeDependencyResolver,
constraint: SourceSetConstraint, constraint: SourceSetConstraint,
phase: DependencyResolutionPhase, phase: DependencyResolutionPhase,
level: DependencyResolutionLevel priority: Priority,
) { ) {
registeredDependencyResolvers.add( registeredDependencyResolvers.add(
RegisteredDependencyResolver(extension.project.kotlinIdeMultiplatformImportStatistics, resolver, constraint, phase, level) RegisteredDependencyResolver(extension.project.kotlinIdeMultiplatformImportStatistics, resolver, constraint, phase, priority)
) )
if (resolver is IdeDependencyResolver.WithBuildDependencies) { if (resolver is IdeDependencyResolver.WithBuildDependencies) {
@@ -91,11 +91,11 @@ internal class IdeMultiplatformImportImpl(
resolver: IdeAdditionalArtifactResolver, resolver: IdeAdditionalArtifactResolver,
constraint: SourceSetConstraint, constraint: SourceSetConstraint,
phase: AdditionalArtifactResolutionPhase, phase: AdditionalArtifactResolutionPhase,
level: AdditionalArtifactResolutionLevel priority: Priority
) { ) {
registeredAdditionalArtifactResolvers.add( registeredAdditionalArtifactResolvers.add(
RegisteredAdditionalArtifactResolver( 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 val applicableResolvers = registeredDependencyResolvers
.filter { it.phase == phase } .filter { it.phase == phase }
.filter { it.constraint(sourceSet) } .filter { it.constraint(sourceSet) }
.groupBy { it.level } .groupBy { it.priority }
/* Find resolvers in the highest resolution level and only consider those */ /* Find resolvers in the highest resolution level and only consider those */
DependencyResolutionLevel.values().reversed().forEach { level -> applicableResolvers.keys.sortedDescending().forEach { priority ->
val resolvers = applicableResolvers[level].orEmpty() val resolvers = applicableResolvers[priority].orEmpty()
if (resolvers.isNotEmpty()) { if (resolvers.isNotEmpty()) {
return@resolve IdeDependencyResolver(resolvers).resolve(sourceSet) return@resolve IdeDependencyResolver(resolvers).resolve(sourceSet)
} }
@@ -145,10 +145,10 @@ internal class IdeMultiplatformImportImpl(
val applicableResolvers = registeredAdditionalArtifactResolvers val applicableResolvers = registeredAdditionalArtifactResolvers
.filter { it.phase == phase } .filter { it.phase == phase }
.filter { it.constraint(sourceSet) } .filter { it.constraint(sourceSet) }
.groupBy { it.level } .groupBy { it.priority }
AdditionalArtifactResolutionLevel.values().reversed().forEach { level -> applicableResolvers.keys.sortedDescending().forEach { priority ->
val resolvers = applicableResolvers[level].orEmpty() val resolvers = applicableResolvers[priority].orEmpty()
if (resolvers.isNotEmpty()) { if (resolvers.isNotEmpty()) {
resolvers.forEach { resolver -> resolver.resolve(sourceSet, dependencies) } resolvers.forEach { resolver -> resolver.resolve(sourceSet, dependencies) }
return@resolve return@resolve
@@ -202,7 +202,7 @@ internal class IdeMultiplatformImportImpl(
private val resolver: IdeDependencyResolver, private val resolver: IdeDependencyResolver,
val constraint: SourceSetConstraint, val constraint: SourceSetConstraint,
val phase: DependencyResolutionPhase, val phase: DependencyResolutionPhase,
val level: DependencyResolutionLevel, val priority: Priority,
) : IdeDependencyResolver { ) : IdeDependencyResolver {
private class TimeMeasuredResult(val timeInMillis: Long, val dependencies: Set<IdeaKotlinDependency>) private class TimeMeasuredResult(val timeInMillis: Long, val dependencies: Set<IdeaKotlinDependency>)
@@ -245,7 +245,7 @@ internal class IdeMultiplatformImportImpl(
private val resolver: IdeAdditionalArtifactResolver, private val resolver: IdeAdditionalArtifactResolver,
val constraint: SourceSetConstraint, val constraint: SourceSetConstraint,
val phase: AdditionalArtifactResolutionPhase, val phase: AdditionalArtifactResolutionPhase,
val level: AdditionalArtifactResolutionLevel val priority: Priority,
) : IdeAdditionalArtifactResolver { ) : IdeAdditionalArtifactResolver {
override fun resolve(sourceSet: KotlinSourceSet, dependencies: Set<IdeaKotlinDependency>) { override fun resolve(sourceSet: KotlinSourceSet, dependencies: Set<IdeaKotlinDependency>) {
runCatching { measureTimeMillis { resolver.resolve(sourceSet, dependencies) } } runCatching { measureTimeMillis { resolver.resolve(sourceSet, dependencies) } }
@@ -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)
}
}
}