[Gradle] NativeDistributionCommonizerTask: Use safe project extension

... to access `KotlinMultiplatformExtension` on subprojects.
This will prevent strange ClassCastExceptions and show users
a proper error message when the operation fails because of isolated
classpaths.

This will also be lenient if the isoalted Kotlin plugin is not
a multiplatform plugin.

^KT-50592 Verification Pending
This commit is contained in:
sebastian.sellmair
2021-12-30 10:39:16 +01:00
committed by Space
parent a355fefd05
commit 0b981a54bc
@@ -7,18 +7,15 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.resolveCommonizedDirectory
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCommonizerToolRunner
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.compilerRunner.registerCommonizerClasspathConfigurationIfNecessary
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR
@@ -31,7 +28,7 @@ internal open class NativeDistributionCommonizerTask : DefaultTask() {
@get:Input
internal val commonizerTargets: Set<SharedCommonizerTarget>
get() = project.getAllCommonizerTargets()
get() = project.collectAllSharedCommonizerTargetsFromBuild()
@get:Internal
internal val commonizerRunner = KotlinNativeCommonizerToolRunner(project)
@@ -56,7 +53,7 @@ internal open class NativeDistributionCommonizerTask : DefaultTask() {
NativeDistributionCommonizationCache(project, GradleCliCommonizer(commonizerRunner)).commonizeNativeDistribution(
konanHome = konanHome,
outputDirectory = getRootOutputDirectory(),
outputTargets = project.getAllCommonizerTargets(),
outputTargets = project.collectAllSharedCommonizerTargetsFromBuild(),
logLevel = project.commonizerLogLevel
)
}
@@ -66,18 +63,15 @@ internal open class NativeDistributionCommonizerTask : DefaultTask() {
}
}
private fun Project.getAllCommonizerTargets(): Set<SharedCommonizerTarget> {
return allprojects.flatMapTo(mutableSetOf<SharedCommonizerTarget>()) { project ->
val kotlin = project.extensions.findByName("kotlin")
?.let { it as KotlinProjectExtension }
?.let { it as? KotlinMultiplatformExtension }
?: return@flatMapTo emptySet()
kotlin.sourceSets
.mapNotNull { sourceSet -> project.getCommonizerTarget(sourceSet) }
.filterIsInstance<SharedCommonizerTarget>()
}
private fun Project.collectAllSharedCommonizerTargetsFromBuild(): Set<SharedCommonizerTarget> {
return allprojects.flatMap { project -> project.collectAllSharedCommonizerTargetsFromProject() }.toSet()
}
private fun Project.collectAllSharedCommonizerTargetsFromProject(): Set<SharedCommonizerTarget> {
return (project.multiplatformExtensionOrNull ?: return emptySet()).sourceSets
.mapNotNull { sourceSet -> project.getCommonizerTarget(sourceSet) }
.filterIsInstance<SharedCommonizerTarget>()
.toSet()
}
private fun urlEncode(value: String): String = URLEncoder.encode(value, Charsets.UTF_8.name())