diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt new file mode 100644 index 00000000000..cdb52c51826 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt @@ -0,0 +1,93 @@ +/* + * Copyright 2010-2022 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.plugin + +import org.gradle.api.GradleException +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry +import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies +import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.applyUserDefinedAttributes +import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider +import org.jetbrains.kotlin.gradle.utils.androidPluginIds +import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility + +internal open class KotlinAndroidPlugin( + private val registry: ToolingModelBuilderRegistry +) : Plugin { + + override fun apply(project: Project) { + checkGradleCompatibility() + + project.dynamicallyApplyWhenAndroidPluginIsApplied( + { + project.objects.newInstance( + KotlinAndroidTarget::class.java, + "", + project + ).also { + (project.kotlinExtension as KotlinAndroidProjectExtension).target = it + } + } + ) { androidTarget -> + applyUserDefinedAttributes(androidTarget) + customizeKotlinDependencies(project) + registry.register(KotlinModelBuilder(project.getKotlinPluginVersion(), androidTarget)) + project.whenEvaluated { project.components.addAll(androidTarget.components) } + } + } + + companion object { + private val minimalSupportedAgpVersion = AndroidGradlePluginVersion(4, 1, 3) + fun androidTargetHandler(): AndroidProjectHandler { + val tasksProvider = KotlinTasksProvider() + val androidGradlePluginVersion = AndroidGradlePluginVersion.currentOrNull + + if (androidGradlePluginVersion != null) { + if (androidGradlePluginVersion < minimalSupportedAgpVersion) { + throw IllegalStateException( + "Kotlin: Unsupported version of com.android.tools.build:gradle plugin: " + + "version $minimalSupportedAgpVersion or higher should be used with kotlin-android plugin" + ) + } + } + + return AndroidProjectHandler(KotlinConfigurationTools(tasksProvider)) + } + + internal fun Project.dynamicallyApplyWhenAndroidPluginIsApplied( + kotlinAndroidTargetProvider: () -> KotlinAndroidTarget, + additionalConfiguration: (KotlinAndroidTarget) -> Unit = {} + ) { + var wasConfigured = false + + androidPluginIds.forEach { pluginId -> + plugins.withId(pluginId) { + wasConfigured = true + val target = kotlinAndroidTargetProvider() + androidTargetHandler().configureTarget(target) + additionalConfiguration(target) + } + } + + afterEvaluate { + if (!wasConfigured) { + throw GradleException( + """ + |'kotlin-android' plugin requires one of the Android Gradle plugins. + |Please apply one of the following plugins to '${project.path}' project: + |${androidPluginIds.joinToString(prefix = "- ", separator = "\n\t- ")} + """.trimMargin() + ) + } + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index fa21aa5c8e3..78b479dcdbe 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -9,8 +9,6 @@ import com.android.build.gradle.* import org.gradle.api.* import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.jetbrains.kotlin.gradle.dsl.* -import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies -import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin @@ -80,79 +78,6 @@ internal open class KotlinPlugin( } } -internal open class KotlinAndroidPlugin( - private val registry: ToolingModelBuilderRegistry -) : Plugin { - - override fun apply(project: Project) { - checkGradleCompatibility() - - project.dynamicallyApplyWhenAndroidPluginIsApplied( - { - project.objects.newInstance( - KotlinAndroidTarget::class.java, - "", - project - ).also { - (project.kotlinExtension as KotlinAndroidProjectExtension).target = it - } - } - ) { androidTarget -> - applyUserDefinedAttributes(androidTarget) - customizeKotlinDependencies(project) - registry.register(KotlinModelBuilder(project.getKotlinPluginVersion(), androidTarget)) - project.whenEvaluated { project.components.addAll(androidTarget.components) } - } - } - - companion object { - private val minimalSupportedAgpVersion = AndroidGradlePluginVersion(4, 1, 3) - fun androidTargetHandler(): AndroidProjectHandler { - val tasksProvider = KotlinTasksProvider() - val androidGradlePluginVersion = AndroidGradlePluginVersion.currentOrNull - - if (androidGradlePluginVersion != null) { - if (androidGradlePluginVersion < minimalSupportedAgpVersion) { - throw IllegalStateException( - "Kotlin: Unsupported version of com.android.tools.build:gradle plugin: " + - "version $minimalSupportedAgpVersion or higher should be used with kotlin-android plugin" - ) - } - } - - return AndroidProjectHandler(KotlinConfigurationTools(tasksProvider)) - } - - internal fun Project.dynamicallyApplyWhenAndroidPluginIsApplied( - kotlinAndroidTargetProvider: () -> KotlinAndroidTarget, - additionalConfiguration: (KotlinAndroidTarget) -> Unit = {} - ) { - var wasConfigured = false - - androidPluginIds.forEach { pluginId -> - plugins.withId(pluginId) { - wasConfigured = true - val target = kotlinAndroidTargetProvider() - androidTargetHandler().configureTarget(target) - additionalConfiguration(target) - } - } - - afterEvaluate { - if (!wasConfigured) { - throw GradleException( - """ - |'kotlin-android' plugin requires one of the Android Gradle plugins. - |Please apply one of the following plugins to '${project.path}' project: - |${androidPluginIds.joinToString(prefix = "- ", separator = "\n\t- ")} - """.trimMargin() - ) - } - } - } - } -} - class KotlinConfigurationTools internal constructor( @Suppress("EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_WARNING", "EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_ERROR") val kotlinTasksProvider: KotlinTasksProvider