From 26ed1c37560e5efe5ff6887f1552905615fc4b4b Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 11 Dec 2015 13:46:00 +0300 Subject: [PATCH] Move Android Extensions subplugin to the main kotlin-gradle-plugin artifact --- .../main/kotlin/example/ExampleSubplugin.kt | 6 ++- .../tools/kotlin-android-extensions/pom.xml | 42 ------------------- ...kotlin.gradle.plugin.KotlinGradleSubplugin | 1 - .../gradle/plugin/KotlinGradleSubplugin.kt | 3 +- libraries/tools/kotlin-gradle-plugin/pom.xml | 5 +++ .../gradle/internal}/AndroidSubplugin.kt | 31 ++++++++++++-- .../kotlin/gradle/plugin/KotlinPlugin.kt | 33 ++++++++------- .../kotlin-android-extensions.properties | 1 + ...kotlin.gradle.plugin.KotlinGradleSubplugin | 1 + 9 files changed, 59 insertions(+), 64 deletions(-) delete mode 100644 libraries/tools/kotlin-android-extensions/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin rename libraries/tools/{kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android => kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal}/AndroidSubplugin.kt (69%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-android-extensions.properties create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin diff --git a/libraries/examples/kotlin-gradle-subplugin-example/src/main/kotlin/example/ExampleSubplugin.kt b/libraries/examples/kotlin-gradle-subplugin-example/src/main/kotlin/example/ExampleSubplugin.kt index 9515b0604ce..ec2fb8c5a57 100644 --- a/libraries/examples/kotlin-gradle-subplugin-example/src/main/kotlin/example/ExampleSubplugin.kt +++ b/libraries/examples/kotlin-gradle-subplugin-example/src/main/kotlin/example/ExampleSubplugin.kt @@ -23,7 +23,11 @@ import org.jetbrains.kotlin.gradle.plugin.SubpluginOption public class ExampleSubplugin : KotlinGradleSubplugin { - override fun getExtraArguments(project: Project, task: AbstractCompile): List? { + override fun isApplicable(project: Project, task: AbstractCompile): Boolean { + return true + } + + override fun getExtraArguments(project: Project, task: AbstractCompile): List { println("ExampleSubplugin loaded") return listOf(SubpluginOption("exampleKey", "exampleValue")) } diff --git a/libraries/tools/kotlin-android-extensions/pom.xml b/libraries/tools/kotlin-android-extensions/pom.xml index b2760c2d6c1..5867129e6e3 100644 --- a/libraries/tools/kotlin-android-extensions/pom.xml +++ b/libraries/tools/kotlin-android-extensions/pom.xml @@ -21,49 +21,7 @@ Android compiler plugin for Kotlin - - - org.jetbrains.kotlin - kotlin-stdlib - ${project.version} - provided - - - org.jetbrains.kotlin - kotlin-gradle-plugin - ${project.version} - provided - - - org.jetbrains.kotlin - kotlin-gradle-plugin-api - ${project.version} - provided - - - org.jetbrains.kotlin - gradle-api - 2.2 - provided - - - com.android.tools.build - gradle - 1.1.0 - provided - - - - ${project.basedir}/src/main/kotlin - - - - ${project.basedir}/src/main/resources - true - - - kotlin-maven-plugin diff --git a/libraries/tools/kotlin-android-extensions/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin b/libraries/tools/kotlin-android-extensions/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin deleted file mode 100644 index 3237be5f789..00000000000 --- a/libraries/tools/kotlin-android-extensions/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.kotlin.android.AndroidSubplugin \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt index fda340afdef..d70679f7c43 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt @@ -22,7 +22,8 @@ import org.gradle.api.tasks.compile.AbstractCompile public class SubpluginOption(val key: String, val value: String) public interface KotlinGradleSubplugin { - public fun getExtraArguments(project: Project, task: AbstractCompile): List? + public fun isApplicable(project: Project, task: AbstractCompile): Boolean + public fun getExtraArguments(project: Project, task: AbstractCompile): List public fun getPluginName(): String public fun getGroupName(): String public fun getArtifactName(): String diff --git a/libraries/tools/kotlin-gradle-plugin/pom.xml b/libraries/tools/kotlin-gradle-plugin/pom.xml index 7dd2f8dd5e3..b3f7e32c57c 100644 --- a/libraries/tools/kotlin-gradle-plugin/pom.xml +++ b/libraries/tools/kotlin-gradle-plugin/pom.xml @@ -25,6 +25,11 @@ kotlin-stdlib ${project.version} + + org.jetbrains.kotlin + kotlin-android-extensions + ${project.version} + com.android.tools.build gradle diff --git a/libraries/tools/kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android/AndroidSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AndroidSubplugin.kt similarity index 69% rename from libraries/tools/kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android/AndroidSubplugin.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AndroidSubplugin.kt index 3d925158ca7..7df069ab79f 100644 --- a/libraries/tools/kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android/AndroidSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AndroidSubplugin.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2014 JetBrains s.r.o. + * Copyright 2010-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,10 +14,11 @@ * limitations under the License. */ -package org.jetbrains.kotlin.android +package org.jetbrains.kotlin.gradle.internal import com.android.build.gradle.BaseExtension import com.android.build.gradle.api.AndroidSourceSet +import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.compile.AbstractCompile import org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin @@ -27,11 +28,33 @@ import org.w3c.dom.Document import java.io.File import javax.xml.parsers.DocumentBuilderFactory +// Use apply plugin: 'kotlin-android-extensions' to enable Android Extensions in an Android project. +// Just a marker plugin. +public class AndroidExtensionsSubpluginIndicator : Plugin { + override fun apply(target: Project?) {} +} + public class AndroidSubplugin : KotlinGradleSubplugin { + private companion object { + @Volatile + var migrateWarningReported: Boolean = false + } - override fun getExtraArguments(project: Project, task: AbstractCompile): List? { - val androidExtension = project.extensions.getByName("android") as? BaseExtension ?: return null + override fun isApplicable(project: Project, task: AbstractCompile): Boolean { + project.extensions.getByName("android") as? BaseExtension ?: return false + if (project.plugins.findPlugin(AndroidExtensionsSubpluginIndicator::class.java) == null) { + val dependencies = project.buildscript.configurations.getByName("classpath").dependencies + if (dependencies.any { it.name == getArtifactName() && it.group == getGroupName() } && !migrateWarningReported) { + project.logger.warn("To enable Android Extensions, use: \"apply plugin: 'kotlin-android-extensions'\"") + migrateWarningReported = true + } + return false + } + return true + } + override fun getExtraArguments(project: Project, task: AbstractCompile): List { + val androidExtension = project.extensions.getByName("android") as? BaseExtension ?: return emptyList() val sourceSets = androidExtension.sourceSets val pluginOptions = arrayListOf() 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 d8c0efdd8cd..8621c244f2f 100644 --- 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 @@ -455,19 +455,21 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand private fun loadSubplugins(project: Project): SubpluginEnvironment { try { - val subplugins = ServiceLoader.load( - KotlinGradleSubplugin::class.java, project.buildscript.classLoader).toList() - val subpluginDependencyNames = - subplugins.mapTo(hashSetOf()) { it.getGroupName() + ":" + it.getArtifactName() } + val subplugins = ServiceLoader.load(KotlinGradleSubplugin::class.java, project.buildscript.classLoader).toList() val classpath = project.buildscript.configurations.getByName("classpath") - val subpluginClasspaths = hashMapOf>() + val resolvedClasspathArtifacts = classpath.resolvedConfiguration.resolvedArtifacts.toList() + val subpluginClasspaths = hashMapOf>() for (subplugin in subplugins) { - val files = classpath.dependencies - .filter { subpluginDependencyNames.contains(it.group + ":" + it.name) } - .flatMap { classpath.files(it).map { it.absolutePath } } - subpluginClasspaths.put(subplugin, files) + val file = resolvedClasspathArtifacts + .firstOrNull { + val id = it.moduleVersion.id + subplugin.getGroupName() == id.group && subplugin.getArtifactName() == id.name + }?.file + if (file != null) { + subpluginClasspaths.put(subplugin, listOf(file)) + } } return SubpluginEnvironment(subpluginClasspaths, subplugins) @@ -479,7 +481,7 @@ private fun loadSubplugins(project: Project): SubpluginEnvironment { } class SubpluginEnvironment( - val subpluginClasspaths: Map>, + val subpluginClasspaths: Map>, val subplugins: List ) { @@ -488,17 +490,18 @@ class SubpluginEnvironment( val pluginArguments = arrayListOf() fun getPluginOptionString(pluginId: String, key: String, value: String) = "plugin:$pluginId:$key=$value" - subplugins.forEach { subplugin -> - val args = subplugin.getExtraArguments(project, compileTask) + for (subplugin in subplugins) { + if (!subplugin.isApplicable(project, compileTask)) continue with (subplugin) { project.logger.kotlinDebug("Subplugin ${getPluginName()} (${getGroupName()}:${getArtifactName()}) loaded.") } val subpluginClasspath = subpluginClasspaths[subplugin] - if (args != null && subpluginClasspath != null) { - realPluginClasspaths.addAll(subpluginClasspath) - for (arg in args) { + if (subpluginClasspath != null) { + subpluginClasspath.forEach { realPluginClasspaths.add(it.absolutePath) } + + for (arg in subplugin.getExtraArguments(project, compileTask)) { val option = getPluginOptionString(subplugin.getPluginName(), arg.key, arg.value) pluginArguments.add(option) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-android-extensions.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-android-extensions.properties new file mode 100644 index 00000000000..a2d03208772 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-android-extensions.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.gradle.internal.AndroidExtensionsSubpluginIndicator \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin new file mode 100644 index 00000000000..c4858027308 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin @@ -0,0 +1 @@ +org.jetbrains.kotlin.gradle.internal.AndroidSubplugin \ No newline at end of file