Move Android Extensions subplugin to the main kotlin-gradle-plugin artifact
This commit is contained in:
+5
-1
@@ -23,7 +23,11 @@ import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
|
||||
|
||||
public class ExampleSubplugin : KotlinGradleSubplugin {
|
||||
|
||||
override fun getExtraArguments(project: Project, task: AbstractCompile): List<SubpluginOption>? {
|
||||
override fun isApplicable(project: Project, task: AbstractCompile): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun getExtraArguments(project: Project, task: AbstractCompile): List<SubpluginOption> {
|
||||
println("ExampleSubplugin loaded")
|
||||
return listOf(SubpluginOption("exampleKey", "exampleValue"))
|
||||
}
|
||||
|
||||
@@ -21,49 +21,7 @@
|
||||
|
||||
<description>Android compiler plugin for Kotlin</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-stdlib</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-gradle-plugin</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-gradle-plugin-api</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>gradle-api</artifactId>
|
||||
<version>2.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.android.tools.build</groupId>
|
||||
<artifactId>gradle</artifactId>
|
||||
<version>1.1.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
|
||||
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>${project.basedir}/src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
|
||||
-1
@@ -1 +0,0 @@
|
||||
org.jetbrains.kotlin.android.AndroidSubplugin
|
||||
+2
-1
@@ -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<SubpluginOption>?
|
||||
public fun isApplicable(project: Project, task: AbstractCompile): Boolean
|
||||
public fun getExtraArguments(project: Project, task: AbstractCompile): List<SubpluginOption>
|
||||
public fun getPluginName(): String
|
||||
public fun getGroupName(): String
|
||||
public fun getArtifactName(): String
|
||||
|
||||
@@ -25,6 +25,11 @@
|
||||
<artifactId>kotlin-stdlib</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-android-extensions</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.android.tools.build</groupId>
|
||||
<artifactId>gradle</artifactId>
|
||||
|
||||
+27
-4
@@ -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<Project> {
|
||||
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<SubpluginOption>? {
|
||||
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<SubpluginOption> {
|
||||
val androidExtension = project.extensions.getByName("android") as? BaseExtension ?: return emptyList()
|
||||
val sourceSets = androidExtension.sourceSets
|
||||
|
||||
val pluginOptions = arrayListOf<SubpluginOption>()
|
||||
+18
-15
@@ -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<String>()) { 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<KotlinGradleSubplugin, List<String>>()
|
||||
val resolvedClasspathArtifacts = classpath.resolvedConfiguration.resolvedArtifacts.toList()
|
||||
val subpluginClasspaths = hashMapOf<KotlinGradleSubplugin, List<File>>()
|
||||
|
||||
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<KotlinGradleSubplugin, List<String>>,
|
||||
val subpluginClasspaths: Map<KotlinGradleSubplugin, List<File>>,
|
||||
val subplugins: List<KotlinGradleSubplugin>
|
||||
) {
|
||||
|
||||
@@ -488,17 +490,18 @@ class SubpluginEnvironment(
|
||||
val pluginArguments = arrayListOf<String>()
|
||||
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)
|
||||
}
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
implementation-class=org.jetbrains.kotlin.gradle.internal.AndroidExtensionsSubpluginIndicator
|
||||
+1
@@ -0,0 +1 @@
|
||||
org.jetbrains.kotlin.gradle.internal.AndroidSubplugin
|
||||
Reference in New Issue
Block a user