[Gradle] IdeMultiplatformImportImpl: Catch exceptions in dependency resolvers

KT-54977
This commit is contained in:
Sebastian Sellmair
2022-11-29 14:00:09 +01:00
committed by Space Team
parent fb2485f83c
commit d268a7e117
2 changed files with 41 additions and 19 deletions
@@ -7,6 +7,8 @@
package org.jetbrains.kotlin.gradle.plugin.ide
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.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
@@ -159,6 +161,8 @@ interface IdeMultiplatformImport {
}
companion object {
internal val logger: Logger = Logging.getLogger(IdeMultiplatformImport::class.java)
@JvmStatic
fun instance(project: Project): IdeMultiplatformImport {
return project.extraProperties.getOrPut(IdeMultiplatformImport::class.java.name) {
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaSerializationContext
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.*
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.Companion.logger
import org.jetbrains.kotlin.tooling.core.Extras
@@ -43,24 +44,6 @@ internal class IdeMultiplatformImportImpl(
return context.extrasSerializationExtension.serializer(key)?.serialize(context, value)
}
private data class RegisteredDependencyResolver(
val resolver: IdeDependencyResolver,
val constraint: SourceSetConstraint,
val phase: DependencyResolutionPhase,
val level: DependencyResolutionLevel,
)
private data class RegisteredDependencyTransformer(
val transformer: IdeDependencyTransformer,
val constraint: SourceSetConstraint,
val phase: DependencyTransformationPhase
)
private data class RegisteredDependencyEffect(
val effect: IdeDependencyEffect,
val constraint: SourceSetConstraint,
)
private val registeredDependencyResolvers = mutableListOf<RegisteredDependencyResolver>()
private val registeredDependencyTransformers = mutableListOf<RegisteredDependencyTransformer>()
private val registeredDependencyEffects = mutableListOf<RegisteredDependencyEffect>()
@@ -116,7 +99,7 @@ internal class IdeMultiplatformImportImpl(
/* Find resolvers in the highest resolution level and only consider those */
DependencyResolutionLevel.values().reversed().forEach { level ->
val resolvers = applicableResolvers[level].orEmpty().map { it.resolver }
val resolvers = applicableResolvers[level].orEmpty()
if (resolvers.isNotEmpty()) {
return@resolve IdeDependencyResolver(resolvers).resolve(sourceSet)
}
@@ -155,4 +138,39 @@ internal class IdeMultiplatformImportImpl(
extrasSerializationExtensions = registeredExtrasSerializationExtensions.toList()
)
}
private data class RegisteredDependencyTransformer(
val transformer: IdeDependencyTransformer,
val constraint: SourceSetConstraint,
val phase: DependencyTransformationPhase
)
private data class RegisteredDependencyEffect(
val effect: IdeDependencyEffect,
val constraint: SourceSetConstraint,
)
private class RegisteredDependencyResolver(
private val resolver: IdeDependencyResolver,
val constraint: SourceSetConstraint,
val phase: DependencyResolutionPhase,
val level: DependencyResolutionLevel,
) : IdeDependencyResolver {
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> {
return runCatching { resolver.resolve(sourceSet) }
.onFailure { error -> reportError(sourceSet, error) }
.onSuccess { dependencies -> reportSuccess(sourceSet, dependencies) }
.getOrNull().orEmpty()
}
private fun reportError(sourceSet: KotlinSourceSet, error: Throwable) {
logger.error("e: ${resolver::class.java.name} failed on ${IdeaKotlinSourceCoordinates(sourceSet)}", error)
}
private fun reportSuccess(sourceSet: KotlinSourceSet, dependencies: Set<IdeaKotlinDependency>) {
if (!logger.isDebugEnabled) return
logger.debug("${resolver::class.java.name} resolved on ${IdeaKotlinSourceCoordinates(sourceSet)}: $dependencies")
}
}
}