diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 8c3c5379392..cb9a78c81cd 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -101,4 +101,4 @@
-
\ No newline at end of file
+
diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml
index d18ab3d82aa..018eca501da 100644
--- a/.idea/inspectionProfiles/idea_default.xml
+++ b/.idea/inspectionProfiles/idea_default.xml
@@ -453,4 +453,4 @@
-
\ No newline at end of file
+
diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/JvmAndAndroidIntermediateSourceSetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/JvmAndAndroidIntermediateSourceSetTest.kt
new file mode 100644
index 00000000000..c3107a45f87
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/JvmAndAndroidIntermediateSourceSetTest.kt
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2010-2020 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("invisible_reference", "invisible_member", "FunctionName", "DuplicatedCode")
+
+package org.jetbrains.kotlin.gradle
+
+import com.android.build.gradle.LibraryExtension
+import org.gradle.api.Project
+import org.gradle.api.internal.project.ProjectInternal
+import org.gradle.api.plugins.ExtraPropertiesExtension
+import org.gradle.testfixtures.ProjectBuilder
+import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
+import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
+import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
+import org.jetbrains.kotlin.gradle.plugin.mpp.buildKotlinProjectStructureMetadata
+import kotlin.test.*
+
+class JvmAndAndroidIntermediateSourceSetTest {
+
+ private lateinit var project: ProjectInternal
+ private lateinit var kotlin: KotlinMultiplatformExtension
+ private lateinit var jvmAndAndroidMain: KotlinSourceSet
+
+ @BeforeTest
+ fun setup() {
+ project = ProjectBuilder.builder().build() as ProjectInternal
+ project.extensions.getByType(ExtraPropertiesExtension::class.java).set("kotlin.mpp.enableGranularSourceSetsMetadata", "true")
+
+ 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 Setup */
+ kotlin = project.multiplatformExtension
+ kotlin.jvm()
+ kotlin.android()
+ jvmAndAndroidMain = kotlin.sourceSets.create("jvmAndAndroidMain")
+ kotlin.sourceSets.run {
+ jvmAndAndroidMain.dependsOn(getByName("commonMain"))
+
+ getByName("jvmMain") {
+ it.dependsOn(jvmAndAndroidMain)
+ }
+ getByName("androidMain") {
+ it.dependsOn(jvmAndAndroidMain)
+ }
+ }
+ }
+
+ @Test
+ fun `metadata compilation is created and disabled`() {
+ /* evaluate */
+ project.evaluate()
+
+ /* Check if compilation is created correctly */
+ val jvmAndAndroidMainMetadataCompilations = kotlin.targets.flatMap { it.compilations }
+ .filterIsInstance>()
+ .filter { it.name == jvmAndAndroidMain.name }
+
+ assertEquals(
+ 1, jvmAndAndroidMainMetadataCompilations.size,
+ "Expected exactly one metadata compilation created for jvmAndAndroidMain source set"
+ )
+
+ val compilation = jvmAndAndroidMainMetadataCompilations.single()
+ assertFalse(
+ compilation.compileKotlinTaskProvider.get().enabled,
+ "Expected compilation task to be disabled, because not supported yet"
+ )
+ }
+
+ @Test
+ fun `KotlinProjectStructureMetadata jvmAndAndroidMain exists in jvm variants`() {
+ project.evaluate()
+ val metadata = assertNotNull(buildKotlinProjectStructureMetadata(project))
+ assertTrue("jvmAndAndroidMain" in metadata.sourceSetNamesByVariantName["jvmApiElements"].orEmpty())
+ assertTrue("jvmAndAndroidMain" in metadata.sourceSetNamesByVariantName["jvmRuntimeElements"].orEmpty())
+ }
+
+ @Test
+ fun `KotlinProjectStructureMetadata jvmAndAndroidMain exists in android variants`() {
+ project.evaluate()
+ val metadata = assertNotNull(buildKotlinProjectStructureMetadata(project))
+ assertTrue("jvmAndAndroidMain" in metadata.sourceSetNamesByVariantName["debugApiElements"].orEmpty())
+ assertTrue("jvmAndAndroidMain" in metadata.sourceSetNamesByVariantName["debugRuntimeElements"].orEmpty())
+ assertTrue("jvmAndAndroidMain" in metadata.sourceSetNamesByVariantName["releaseApiElements"].orEmpty())
+ assertTrue("jvmAndAndroidMain" in metadata.sourceSetNamesByVariantName["releaseRuntimeElements"].orEmpty())
+ }
+
+ @Test
+ fun `Android Kotlin Components are marked as not publishable when variant is not published`() {
+ val target = kotlin.targets.getByName("android") as KotlinAndroidTarget
+ target.publishLibraryVariants = emptyList()
+ project.evaluate()
+ val kotlinComponents = target.kotlinComponents
+ assertTrue(kotlinComponents.isNotEmpty(), "Expected at least one KotlinComponent to be present")
+
+ kotlinComponents.forEach { component ->
+ assertFalse(component.publishable, "Expected component to not publishable, because no publication is configured")
+ }
+ }
+
+ @Test
+ fun `Android Kotlin Components are marked as publishable when variant is published`() {
+ val target = kotlin.targets.getByName("android") as KotlinAndroidTarget
+ target.publishLibraryVariants = listOf("release")
+ project.evaluate()
+ val kotlinComponents = target.kotlinComponents
+ assertTrue(kotlinComponents.isNotEmpty(), "Expected at least one KotlinComponent to be present")
+
+ kotlinComponents.forEach { component ->
+ val isReleaseComponent = "release" in component.name.toLowerCase()
+ if (isReleaseComponent) {
+ assertTrue(component.publishable, "Expected release component to be marked as publishable")
+ } else {
+ assertFalse(component.publishable, "Expected non-release component to be marked as not publishable")
+ }
+ }
+ }
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidDependsOnEdgesTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidDependsOnEdgesTest.kt
index fa437508ba9..0cc60d7f636 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidDependsOnEdgesTest.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidDependsOnEdgesTest.kt
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// TODO KT-34102
-@file:Suppress("invisible_reference", "invisible_member")
+@file:Suppress("invisible_reference", "invisible_member", "FunctionName")
package org.jetbrains.kotlin.gradle
import com.android.build.gradle.LibraryExtension
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt
index 0f1a5d588cb..3e408b4c360 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt
@@ -1,4 +1,3 @@
-
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
@@ -28,6 +27,8 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.logging.kotlinWarn
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild
+import org.jetbrains.kotlin.gradle.utils.androidPluginIds
+import java.util.concurrent.atomic.AtomicBoolean
abstract class KotlinPlatformPluginBase(protected val platformName: String) : Plugin {
companion object {
@@ -182,6 +183,7 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin
private fun getKotlinSourceSetsSafe(project: Project): NamedDomainObjectCollection {
// Access through reflection, because another project's KotlinProjectExtension might be loaded by a different class loader:
val kotlinExt = project.extensions.getByName("kotlin")
+
@Suppress("UNCHECKED_CAST")
val sourceSets = kotlinExt.javaClass.getMethod("getSourceSets").invoke(kotlinExt) as NamedDomainObjectCollection
return sourceSets
@@ -210,8 +212,24 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin
internal fun Project.whenEvaluated(fn: Project.() -> T) {
if (state.executed) {
fn()
- } else {
- afterEvaluate { it.fn() }
+ return
+ }
+
+ /* Make sure that all afterEvaluate blocks from the AndroidPlugin get scheduled first */
+ val isDispatched = AtomicBoolean(false)
+ androidPluginIds.forEach { androidPluginId ->
+ pluginManager.withPlugin(androidPluginId) {
+ if (!isDispatched.getAndSet(true)) {
+ afterEvaluate { fn() }
+ }
+ }
+ }
+
+ afterEvaluate {
+ /* If no Android plugin was loaded, then the action was not dispatched and we can freely execute it now */
+ if (!isDispatched.getAndSet(true)) {
+ fn()
+ }
}
}
@@ -263,4 +281,4 @@ private fun warnAboutKotlin12xMppDeprecation(project: Project) {
if (project.findProperty(KOTLIN_12X_MPP_DEPRECATION_SUPPRESS_FLAG) != "true") {
SingleWarningPerBuild.show(project, KOTLIN_12X_MPP_DEPRECATION_WARNING)
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt
index 3627cd19f72..ee3320b92ee 100755
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt
@@ -796,11 +796,6 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
kotlinOptions.noJdk = true
ext.addExtension(KOTLIN_OPTIONS_DSL_NAME, kotlinOptions)
- val androidPluginIds = listOf(
- "android", "com.android.application", "android-library", "com.android.library",
- "com.android.test", "com.android.feature", "com.android.dynamic-feature", "com.android.instantapp"
- )
-
val plugin by lazy {
androidPluginIds.asSequence()
.mapNotNull { project.plugins.findPlugin(it) as? BasePlugin }
@@ -904,6 +899,7 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
// Trivial mapping of Android variants to Android source set names is impossible here,
// because some variants have their dedicated source sets with mismatching names,
+ // because some variants have their dedicated source sets with mismatching names,
// e.g. variant 'fooBarDebugAndroidTest' <-> source set 'androidTestFooBarDebug'
// In single-platform projects, the Kotlin compilations already reference the Android plugin's configurations by the names,
@@ -974,6 +970,8 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
// Register the source only after the task is created, because the task is required for that:
compilation.source(defaultSourceSet)
+
+ compilation.androidVariant.forEachKotlinSourceSet { kotlinSourceSet -> compilation.source(kotlinSourceSet) }
}
private fun postprocessVariant(
@@ -983,7 +981,6 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
androidExt: BaseExtension,
androidPlugin: BasePlugin
) {
- val javaTask = variantData.getJavaTaskProvider()
getTestedVariantData(variantData)?.let { testedVariant ->
val testedVariantName = getVariantName(testedVariant)
@@ -991,34 +988,24 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
compilation.associateWith(testedCompilation)
}
+ val javaTask = variantData.getJavaTaskProvider()
val kotlinTask = compilation.compileKotlinTaskProvider
- processAndroidKotlinAndJavaSources(
- compilation,
- addKotlinSources = { kotlinSourceSet -> compilation.source(kotlinSourceSet) },
- addJavaSources = { sources -> compilation.compileKotlinTaskProvider.configure { it.source(sources) } }
- )
+ compilation.androidVariant.forEachJavaSourceDir { sources -> kotlinTask.configure { it.source(sources) } }
wireKotlinTasks(project, compilation, androidPlugin, androidExt, variantData, javaTask, kotlinTask)
}
}
-private fun getAllJavaSources(variantData: BaseVariant): Iterable =
- variantData.getSourceFolders(SourceKind.JAVA).map { it.dir }
-
-internal fun processAndroidKotlinAndJavaSources(
- compilation: KotlinJvmAndroidCompilation,
- addKotlinSources: (KotlinSourceSet) -> Unit,
- addJavaSources: (Iterable) -> Unit
-) {
- val variantData = compilation.androidVariant
-
- for (provider in variantData.sourceSets) {
- val kotlinSourceSet = provider.getConvention(KOTLIN_DSL_NAME) as? KotlinSourceSet ?: continue
- addKotlinSources(kotlinSourceSet)
- }
-
- addJavaSources(getAllJavaSources(variantData))
+internal inline fun BaseVariant.forEachKotlinSourceSet(action: (KotlinSourceSet) -> Unit) {
+ sourceSets
+ .mapNotNull { provider -> provider.getConvention(KOTLIN_DSL_NAME) as? KotlinSourceSet }
+ .forEach(action)
}
+internal inline fun BaseVariant.forEachJavaSourceDir(action: (File) -> Unit) {
+ getSourceFolders(SourceKind.JAVA).map { it.dir }.forEach(action)
+}
+
+
internal fun configureJavaTask(
kotlinTaskProvider: TaskProvider,
javaTaskProvider: TaskProvider
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt
index 9037842fd79..619e39f4274 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt
@@ -486,4 +486,4 @@ fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration {
attributes.attribute(KotlinNativeTarget.konanTargetAttribute, target.konanTarget.name)
}
return this
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/RunOnceAfterEvaluated.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/RunOnceAfterEvaluated.kt
index cd92b89a3ce..00d24d97af3 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/RunOnceAfterEvaluated.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/RunOnceAfterEvaluated.kt
@@ -51,12 +51,8 @@ internal fun Project.runOnceAfterEvaluated(name: String, task: TaskProvider<*>,
}
internal fun Project.runOnceAfterEvaluated(runOnce: RunOnceAfterEvaluated, task: TaskProvider<*>) {
- if (state.executed) {
- runOnce.onEvaluated()
- } else {
- afterEvaluate { runOnce.onEvaluated() }
- }
+ whenEvaluated { runOnce.onEvaluated() }
task.configure {
runOnce.onConfigure()
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt
index b563c0e6fcb..187e833622e 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt
@@ -114,11 +114,8 @@ class SubpluginEnvironment(
internal fun addCompilationSourcesToExternalCompileTask(compilation: KotlinCompilation<*>, task: TaskProvider) {
if (compilation is KotlinJvmAndroidCompilation) {
- processAndroidKotlinAndJavaSources(
- compilation,
- addKotlinSources = { sourceSet -> task.configure { it.source(sourceSet.kotlin) } },
- addJavaSources = { sources -> task.configure { it.source(sources) }}
- )
+ compilation.androidVariant.forEachKotlinSourceSet { sourceSet -> task.configure { it.source(sourceSet.kotlin) } }
+ compilation.androidVariant.forEachJavaSourceDir { sources -> task.configure { it.source(sources) } }
} else {
task.configure { taskInstance ->
compilation.allKotlinSourceSets.forEach { sourceSet -> taskInstance.source(sourceSet.kotlin) }
@@ -174,4 +171,4 @@ internal fun findJavaTaskForKotlinCompilation(compilation: KotlinCompilation<*>)
is KotlinWithJavaCompilation -> compilation.compileJavaTaskProvider
is KotlinJvmCompilation -> compilation.compileJavaTaskProvider // may be null for Kotlin-only JVM target in MPP
else -> null
- }
\ No newline at end of file
+ }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt
index 6aa874f0be9..99f848782a4 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCommonCompilation.kt
@@ -38,4 +38,4 @@ class KotlinCommonCompilation(
val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(target.project, defaultSourceSet)
project.files(friendSourceSets.mapNotNull { target.compilations.findByName(it.name)?.output?.classesDirs })
})
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt
index 38ec9ade5c2..3df0be30d5f 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt
@@ -139,4 +139,4 @@ private fun Project.resolvableConfigurationFromCompilationByScope(
}
return project.configurations.getByName(configurationName)
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt
index 8c7771f5480..6c35baf1ec5 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt
@@ -363,4 +363,4 @@ internal object CompilationSourceSetUtil {
private val invalidModuleNameCharactersRegex = """[\\/\r\n\t]""".toRegex()
private fun filterModuleName(moduleName: String): String =
- moduleName.replace(invalidModuleNameCharactersRegex, "_")
\ No newline at end of file
+ moduleName.replace(invalidModuleNameCharactersRegex, "_")
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt
index 15a1cbc1ce2..6971fe16ee2 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt
@@ -238,4 +238,4 @@ abstract class KotlinOnlyTarget>(
override var disambiguationClassifier: String? = null
internal set
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt
index 734555a765d..51712cbfbd9 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution
+import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.gradle.utils.*
import java.io.File
import java.lang.reflect.Constructor
@@ -84,7 +85,7 @@ class DefaultKotlinSourceSet(
// Fail-fast approach: check on each new added edge and report a circular dependency at once when the edge is added.
checkForCircularDependencies()
- project.afterEvaluate { defaultSourceSetLanguageSettingsChecker.runAllChecks(this, other) }
+ project.whenEvaluated { defaultSourceSetLanguageSettingsChecker.runAllChecks(this@DefaultKotlinSourceSet, other) }
}
private val dependsOnSourceSetsImpl = mutableSetOf()
@@ -247,4 +248,4 @@ private fun Class.constructorOrNull(vararg parameterTypes: Class<*>): Con
getConstructor(*parameterTypes)
} catch (e: NoSuchMethodException) {
null
- }
\ No newline at end of file
+ }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt
index 0597c24984a..7b2cde1e95e 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt
@@ -43,7 +43,9 @@ open class KotlinAndroidTarget(
* all library variants will be published, but not test or application variants. */
var publishLibraryVariants: List? = listOf()
// Workaround for Groovy GString items in a list:
- set(value) { field = value?.map(Any::toString) }
+ set(value) {
+ field = value?.map(Any::toString)
+ }
/** Add Android library variant names to [publishLibraryVariants]. */
fun publishLibraryVariants(vararg names: String) {
@@ -91,11 +93,16 @@ open class KotlinAndroidTarget(
KotlinAndroidPlugin.androidTargetHandler(project.getKotlinPluginVersion()!!, this).doCreateComponents()
}
+ private fun isVariantPublished(variant: BaseVariant): Boolean {
+ return publishLibraryVariants?.contains(getVariantName(variant)) ?: true
+ }
+
private fun AbstractAndroidProjectHandler.doCreateComponents(): Set {
+
val publishableVariants = mutableListOf()
.apply { project.forEachVariant { add(it) } }
.toList() // Defensive copy against unlikely modification by the lambda that captures the list above in forEachVariant { }
- .filter { getLibraryOutputTask(it) != null && publishLibraryVariants?.contains(getVariantName(it)) ?: true }
+ .filter { getLibraryOutputTask(it) != null }
val publishableVariantGroups = publishableVariants.groupBy { variant ->
val flavorNames = getFlavorNames(variant)
@@ -118,12 +125,12 @@ open class KotlinAndroidTarget(
val artifactClassifier = buildTypeName.takeIf { it != "release" && publishLibraryVariantsGroupedByFlavor }
- val usageContexts = createAndroidUsageContexts(androidVariant, compilation, artifactClassifier)
createKotlinVariant(
lowerCamelCaseName(compilation.target.name, *flavorGroupNameParts.toTypedArray()),
compilation,
- usageContexts
+ createAndroidUsageContexts(androidVariant, compilation, artifactClassifier)
).apply {
+ publishable = isVariantPublished(androidVariant)
sourcesArtifacts = setOf(
sourcesJarArtifact(
compilation, compilation.disambiguateName(""),
@@ -148,10 +155,10 @@ open class KotlinAndroidTarget(
if (publishLibraryVariantsGroupedByFlavor) {
JointAndroidKotlinTargetComponent(
- this@KotlinAndroidTarget,
- nestedVariants,
- flavorGroupNameParts,
- nestedVariants.flatMap { it.sourcesArtifacts }.toSet()
+ target = this@KotlinAndroidTarget,
+ nestedVariants = nestedVariants.filter { it.publishable }.toSet(),
+ flavorNames = flavorGroupNameParts,
+ sourcesArtifacts = nestedVariants.filter { it.publishable }.flatMap { it.sourcesArtifacts }.toSet()
)
} else {
nestedVariants.single()
@@ -195,4 +202,4 @@ open class KotlinAndroidTarget(
)
}
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt
index fcb64f2e1ab..788ab3bd7a0 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt
@@ -70,4 +70,4 @@ class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin {
)
}
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt
index 9abe4433d6f..b5d537b0eaa 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt
@@ -88,4 +88,4 @@ class KotlinJsDcePlugin : Plugin {
private const val DCE_TASK_PREFIX = "runDce"
private const val DEFAULT_OUT_DIR = "kotlin-js-min"
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt
index 3df34b22c05..75e86aa811f 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt
@@ -98,4 +98,4 @@ internal fun jsPluginDeprecationMessage(id: String): String =
The `$id` Gradle plugin has been deprecated.
Please use `org.jetbrains.kotlin.js` plugin instead `kotlin2js` and `org.jetbrains.kotlin.frontend`
For usage details, see https://kotlinlang.org/docs/reference/js-project-setup.html
- """.trimIndent()
\ No newline at end of file
+ """.trimIndent()
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt
index a7e320a2b59..42d69f3f31a 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt
@@ -128,4 +128,4 @@ class KotlinJsSingleTargetPreset(
override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator(
kotlinPluginVersion
)
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt
index b102777bf3c..7ad6c4e6456 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt
@@ -256,4 +256,4 @@ abstract class KotlinJsIrSubTarget(
const val PREPARE_JS_LIBRARY_TASK_NAME = "prepare"
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt
index cb3edae4660..6b5666a536d 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt
@@ -94,4 +94,4 @@ class KotlinJsIrSingleTargetPreset(
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator =
KotlinJsIrTargetConfigurator(kotlinPluginVersion)
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt
index b74da88dde3..699f363a05d 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt
@@ -127,4 +127,4 @@ internal class KotlinProjectNpmResolver(
*/
internal fun TaskCollection.implementing(kclass: KClass): TaskCollection =
@Suppress("UNCHECKED_CAST")
- withType(kclass.java as Class)
\ No newline at end of file
+ withType(kclass.java as Class)
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt
index 8c38540eb47..7a7930dd4b8 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt
@@ -166,4 +166,4 @@ abstract class KotlinJsSubTarget(
companion object {
const val RUN_TASK_NAME = "run"
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt
index ca5a0bdd768..899c3465013 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetConfigurator.kt
@@ -76,4 +76,4 @@ class KotlinJvmTargetConfigurator(kotlinPluginVersion: String) :
val tasksProvider = KotlinTasksProvider(compilation.target.targetName)
return Kotlin2JvmSourceSetProcessor(tasksProvider, compilation, kotlinPluginVersion)
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt
index 177cfca900c..c74b0f8d1b3 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt
@@ -77,4 +77,4 @@ import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
val compileJavaTaskProvider: TaskProvider
get() = target.project.tasks.withType(JavaCompile::class.java).named(javaSourceSet.compileJavaTaskName)
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt
index 3140523aeba..ac3bde84131 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.*
+import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets
import org.jetbrains.kotlin.gradle.plugin.sources.*
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.tasks.*
@@ -163,7 +164,7 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
private fun setupDependencyTransformationForCommonSourceSets(target: KotlinMetadataTarget) {
target.project.whenEvaluated {
- val publishedCommonSourceSets: Set = getPublishedCommonSourceSets(project)
+ val publishedCommonSourceSets: Set = getCommonSourceSetsForMetadataCompilation(project)
kotlinExtension.sourceSets.all {
setupDependencyTransformationForSourceSet(target.project, it, it in publishedCommonSourceSets)
@@ -177,12 +178,17 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
) = target.project.whenEvaluated {
// Do this after all targets are configured by the user build script
- val publishedCommonSourceSets: Set = getPublishedCommonSourceSets(project)
+ val publishedCommonSourceSets: Set = getCommonSourceSetsForMetadataCompilation(project)
val hostSpecificSourceSets: Set = getHostSpecificSourceSets(project).toSet()
- val sourceSetsWithMetadataCompilations: Map> =
- publishedCommonSourceSets.associate { sourceSet ->
- sourceSet to createMetadataCompilation(target, sourceSet, allMetadataJar, sourceSet in hostSpecificSourceSets)
+ val sourceSetsWithMetadataCompilations: Map> = publishedCommonSourceSets
+ .associateWith { sourceSet ->
+ createMetadataCompilation(target, sourceSet, allMetadataJar, sourceSet in hostSpecificSourceSets)
+ }
+ .onEach { (sourceSet, compilation) ->
+ if (!isMetadataCompilationSupported(target.project, sourceSet)) {
+ compilation.compileKotlinTaskProvider.configure { it.enabled = false }
+ }
}
if (project.isCompatibilityMetadataVariantEnabled) {
@@ -195,6 +201,30 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
}
}
+ private fun isMetadataCompilationSupported(project: Project, sourceSet: KotlinSourceSet): Boolean {
+ val platforms = compilationsBySourceSets(project)[sourceSet].orEmpty()
+ .filter { it.target !is KotlinMetadataTarget }
+ .map { it.target.platformType }.distinct()
+
+ /*
+ Android and jvm do share the JVM backend which is not supported for metadata compilation
+ See [HMPP: Bad IDEA dependencies for JVM and Android intermediate source set](https://youtrack.jetbrains.com/issue/KT-42383)
+ See [HMPP: JVM and Android intermediate source set publication](https://youtrack.jetbrains.com/issue/KT-42468)
+ */
+ if (platforms.all { it == KotlinPlatformType.jvm || it == KotlinPlatformType.androidJvm }) {
+ return false
+ }
+
+ /* Metadata compilation for a single platform is only supported native and common source sets */
+ if (platforms.size == 1) {
+ val platform = platforms.single()
+ return platform == KotlinPlatformType.native || platform == KotlinPlatformType.common
+ }
+
+ /* Source sets sharing code between multiple backends are supported */
+ return true
+ }
+
private fun configureProjectStructureMetadataGeneration(project: Project, allMetadataJar: TaskProvider) {
val generateMetadata = project.createGenerateProjectStructureMetadataTask()
@@ -256,7 +286,7 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
val compilationName = sourceSet.name
- val platformCompilations = CompilationSourceSetUtil.compilationsBySourceSets(project).getValue(sourceSet)
+ val platformCompilations = compilationsBySourceSets(project).getValue(sourceSet)
val isNativeSourceSet = platformCompilations.all { compilation -> compilation.target is KotlinNativeTarget }
@@ -271,7 +301,6 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
return compilationFactory.create(compilationName).apply {
target.compilations.add(this@apply)
addExactSourceSetsEagerly(setOf(sourceSet))
-
configureMetadataDependenciesForCompilation(this@apply)
if (!isHostSpecific) {
@@ -513,14 +542,18 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
}
}
-internal fun getPublishedCommonSourceSets(project: Project): Set {
+/**
+ * @return All common source sets that can potentially be published. Right now, not all combinations of platforms actually
+ * support metadata compilation (see [KotlinMetadataTargetConfigurator.isMetadataCompilationSupported].
+ * Those compilations will be created but the corresponding tasks will be disabled.
+ */
+internal fun getCommonSourceSetsForMetadataCompilation(project: Project): Set {
val compilationsBySourceSet: Map>> =
- CompilationSourceSetUtil.compilationsBySourceSets(project)
+ compilationsBySourceSets(project)
val sourceSetsUsedInMultipleTargets = compilationsBySourceSet.filterValues { compilations ->
compilations.map { it.target.platformType }.distinct().run {
- size > 1 && toSet() != setOf(KotlinPlatformType.androidJvm, KotlinPlatformType.jvm) ||
- singleOrNull() == KotlinPlatformType.native && compilations.map { it.target }.distinct().size > 1
+ size > 1 || singleOrNull() == KotlinPlatformType.native && compilations.map { it.target }.distinct().size > 1
// TODO: platform-shared source sets other than Kotlin/Native ones are not yet supported; support will be needed for JVM, JS
}
}
@@ -565,4 +598,4 @@ internal fun Project.filesWithUnpackedArchives(from: FileCollection, extensions:
internal fun Project.getMetadataCompilationForSourceSet(sourceSet: KotlinSourceSet): AbstractKotlinCompilation<*>? {
return multiplatformExtension.metadata().compilations.findByName(sourceSet.name)
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt
index 753de8b5282..73401418a26 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt
@@ -166,4 +166,4 @@ open class KotlinNativeTargetWithHostTests @Inject constructor(project: Project,
KotlinNativeTargetWithTests(project, konanTarget)
open class KotlinNativeTargetWithSimulatorTests @Inject constructor(project: Project, konanTarget: KonanTarget) :
- KotlinNativeTargetWithTests(project, konanTarget)
\ No newline at end of file
+ KotlinNativeTargetWithTests(project, konanTarget)
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt
index e4cccd19f0e..3f068b07a16 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt
@@ -593,4 +593,4 @@ open class KotlinCocoapodsPlugin : Plugin {
gemListRetCode == 0 && gemListOutput.contains("cocoapods-generate")
}
}
-}
\ No newline at end of file
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/androidPluginIds.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/androidPluginIds.kt
new file mode 100644
index 00000000000..93902bd610b
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/androidPluginIds.kt
@@ -0,0 +1,11 @@
+/*
+ * Copyright 2010-2020 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.utils
+
+internal val androidPluginIds = listOf(
+ "android", "com.android.application", "android-library", "com.android.library",
+ "com.android.test", "com.android.feature", "com.android.dynamic-feature", "com.android.instantapp"
+)