[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:
committed by
Space
parent
c7cfa97748
commit
db21bfe13b
+32
@@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-9
@@ -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.resolveAllDependsOnSourceSets
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
|
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets
|
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.targets.jvm.JvmCompilationsTestRunSource
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateTask
|
import org.jetbrains.kotlin.gradle.tasks.locateTask
|
||||||
import org.jetbrains.kotlin.gradle.testing.KotlinTaskTestRun
|
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 {
|
private fun androidMainSourceSetName(project: Project): String {
|
||||||
val target = project.findAndroidTarget() ?: error("No Android target found")
|
val target = project.findAndroidTarget() ?: error("No Android target found")
|
||||||
return AbstractAndroidProjectHandler.kotlinSourceSetNameForAndroidSourceSet(target, "main")
|
return AbstractAndroidProjectHandler.kotlinSourceSetNameForAndroidSourceSet(target, "main")
|
||||||
|
|||||||
+1
-1
@@ -58,4 +58,4 @@ internal fun Project.sourceSetMetadataConfigurationByScope(sourceSet: KotlinSour
|
|||||||
COMPILE_ONLY_SCOPE -> sourceSet.compileOnlyMetadataConfigurationName
|
COMPILE_ONLY_SCOPE -> sourceSet.compileOnlyMetadataConfigurationName
|
||||||
RUNTIME_ONLY_SCOPE -> sourceSet.runtimeOnlyMetadataConfigurationName
|
RUNTIME_ONLY_SCOPE -> sourceSet.runtimeOnlyMetadataConfigurationName
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+20
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user