[Gradle, MPP] findAndroidTarget: Return null when missing

Prior to this change a 'Collection is empty.' error was reported
when the Android plugin was applied without an Android Kotlin target
being registered.

^KT-41641 Verification Pending
This commit is contained in:
sebastian.sellmair
2021-11-10 15:14:31 +01:00
committed by Space
parent c7cfa97748
commit db21bfe13b
4 changed files with 54 additions and 10 deletions
@@ -0,0 +1,32 @@
/*
* Copyright 2010-2021 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
import com.android.build.gradle.LibraryExtension
import org.jetbrains.kotlin.gradle.targets.android.findAndroidTarget
import org.junit.Test
import kotlin.test.assertNull
import kotlin.test.assertSame
class KT41641AbsentAndroidTarget : MultiplatformExtensionTest() {
@Test
fun `test android plugin without android target`() {
project.plugins.apply("kotlin-multiplatform")
project.plugins.apply("android-library")
/* Arbitrary minimal Android setup */
val android = project.extensions.getByName("android") as LibraryExtension
android.compileSdkVersion(30)
kotlin.jvm()
/* Previously failed with 'Collection is empty.' */
assertNull(project.findAndroidTarget())
assertSame(kotlin.android(), project.findAndroidTarget())
}
}
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets
import org.jetbrains.kotlin.gradle.targets.android.findAndroidTarget
import org.jetbrains.kotlin.gradle.targets.jvm.JvmCompilationsTestRunSource
import org.jetbrains.kotlin.gradle.tasks.locateTask
import org.jetbrains.kotlin.gradle.testing.KotlinTaskTestRun
@@ -207,15 +208,6 @@ private fun chooseAndAddStdlibDependency(
}
}
private fun Project.findAndroidTarget(): KotlinAndroidTarget? {
val kotlinExtension = project.kotlinExtension
return when (kotlinExtension) {
is KotlinMultiplatformExtension -> kotlinExtension.targets.withType(KotlinAndroidTarget::class.java).single()
is KotlinAndroidProjectExtension -> kotlinExtension.target
else -> null
}
}
private fun androidMainSourceSetName(project: Project): String {
val target = project.findAndroidTarget() ?: error("No Android target found")
return AbstractAndroidProjectHandler.kotlinSourceSetNameForAndroidSourceSet(target, "main")
@@ -58,4 +58,4 @@ internal fun Project.sourceSetMetadataConfigurationByScope(sourceSet: KotlinSour
COMPILE_ONLY_SCOPE -> sourceSet.compileOnlyMetadataConfigurationName
RUNTIME_ONLY_SCOPE -> sourceSet.runtimeOnlyMetadataConfigurationName
}
)
)
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2021 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.
*/
package org.jetbrains.kotlin.gradle.targets.android
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
internal fun Project.findAndroidTarget(): KotlinAndroidTarget? {
return when (val kotlinExtension = project.kotlinExtension) {
is KotlinMultiplatformExtension -> kotlinExtension.targets.withType(KotlinAndroidTarget::class.java).singleOrNull()
is KotlinAndroidProjectExtension -> kotlinExtension.target
else -> null
}
}