Tasks wiring improvements & Kapt3 integration through variant wrapping
This commit is contained in:
committed by
Alexey Tsvetkov
parent
b0c2c4eba9
commit
d2a08c5fe4
@@ -44,7 +44,7 @@ dependencies {
|
|||||||
compileOnly 'org.codehaus.groovy:groovy-all:2.3.9'
|
compileOnly 'org.codehaus.groovy:groovy-all:2.3.9'
|
||||||
compileOnly 'org.jetbrains.kotlin:gradle-api:2.2'
|
compileOnly 'org.jetbrains.kotlin:gradle-api:2.2'
|
||||||
|
|
||||||
agp25CompileOnly 'com.android.tools.build:gradle:2.4.0-dev'
|
agp25CompileOnly 'com.android.tools.build:gradle:3.0.0-dev'
|
||||||
agp25CompileOnly 'org.codehaus.groovy:groovy-all:2.3.9'
|
agp25CompileOnly 'org.codehaus.groovy:groovy-all:2.3.9'
|
||||||
agp25CompileOnly gradleApi()
|
agp25CompileOnly gradleApi()
|
||||||
|
|
||||||
@@ -57,7 +57,6 @@ tasks.withType(project.compileKotlin.class) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compileKotlin.dependsOn compileGroovy
|
compileKotlin.dependsOn compileGroovy
|
||||||
compileAgp25Kotlin.dependsOn compileGroovy
|
|
||||||
compileGroovy.dependsOn.remove("compileJava")
|
compileGroovy.dependsOn.remove("compileJava")
|
||||||
|
|
||||||
def groovyClassesDir = file("${buildDir}/mainGroovyClasses")
|
def groovyClassesDir = file("${buildDir}/mainGroovyClasses")
|
||||||
@@ -73,6 +72,8 @@ sourceSets {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compileAgp25Kotlin.dependsOn compileGroovy
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
expand(project.properties)
|
expand(project.properties)
|
||||||
}
|
}
|
||||||
|
|||||||
+26
-5
@@ -9,6 +9,8 @@ import com.android.builder.model.SourceProvider
|
|||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.tasks.compile.AbstractCompile
|
import org.gradle.api.tasks.compile.AbstractCompile
|
||||||
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin
|
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin
|
||||||
|
import org.jetbrains.kotlin.gradle.internal.KaptTask
|
||||||
|
import org.jetbrains.kotlin.gradle.internal.WrappedVariantData
|
||||||
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -58,10 +60,12 @@ class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools
|
|||||||
project.files()
|
project.files()
|
||||||
).builtBy(kotlinTask)
|
).builtBy(kotlinTask)
|
||||||
|
|
||||||
|
|
||||||
val preJavaClasspathKey = variantData.registerPreJavacGeneratedBytecode(preJavaKotlinOutput)
|
val preJavaClasspathKey = variantData.registerPreJavacGeneratedBytecode(preJavaKotlinOutput)
|
||||||
val kotlinClasspath = variantData.getCompileClasspath(preJavaClasspathKey)
|
kotlinTask.dependsOn(variantData.getSourceFolders(SourceKind.JAVA))
|
||||||
|
|
||||||
kotlinTask.conventionMapping.map("classpath") {
|
kotlinTask.conventionMapping.map("classpath") {
|
||||||
|
val kotlinClasspath = variantData.getCompileClasspath(preJavaClasspathKey)
|
||||||
kotlinClasspath + project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt))
|
kotlinClasspath + project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,12 +75,12 @@ class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools
|
|||||||
// Use kapt1 annotations file for up-to-date check since annotation processing is done with javac
|
// Use kapt1 annotations file for up-to-date check since annotation processing is done with javac
|
||||||
kotlinTask.annotationsFile?.let { javaTask.inputs.file(it) }
|
kotlinTask.annotationsFile?.let { javaTask.inputs.file(it) }
|
||||||
|
|
||||||
val kotlinAfterJavaOutput = project.files(kotlinAfterJavaTask).builtBy(kotlinAfterJavaTask)
|
|
||||||
variantData.registerPostJavacGeneratedBytecode(kotlinAfterJavaOutput)
|
|
||||||
|
|
||||||
if (kotlinAfterJavaTask != null) {
|
if (kotlinAfterJavaTask != null) {
|
||||||
|
val kotlinAfterJavaOutput = project.files(kotlinAfterJavaTask.destinationDir).builtBy(kotlinAfterJavaTask)
|
||||||
|
variantData.registerPostJavacGeneratedBytecode(kotlinAfterJavaOutput)
|
||||||
|
|
||||||
// Then don't register kotlinTask output, but only use it for Java compilation
|
// Then don't register kotlinTask output, but only use it for Java compilation
|
||||||
javaTask.appendClasspath(kotlinTask.destinationDir)
|
javaTask.classpath = project.files(kotlinTask.destinationDir).from(javaTask.classpath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,4 +116,21 @@ class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools
|
|||||||
// Though it is affordable not to implement this for the first previews, because the impact is tolerable
|
// Though it is affordable not to implement this for the first previews, because the impact is tolerable
|
||||||
// to some degree -- the dependent projects will rebuild non-incrementally when a library project changes
|
// to some degree -- the dependent projects will rebuild non-incrementally when a library project changes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private inner class WrappedVariant(variantData: BaseVariant) : org.jetbrains.kotlin.gradle.internal.WrappedVariantData<BaseVariant>(variantData) {
|
||||||
|
override val name: String = getVariantName(variantData)
|
||||||
|
override val sourceProviders: Iterable<SourceProvider> = getSourceProviders(variantData)
|
||||||
|
override fun addJavaSourceFoldersToModel(generatedFilesDir: File) = addJavaSourceDirectoryToVariantModel(variantData, generatedFilesDir)
|
||||||
|
|
||||||
|
override val annotationProcessorOptions: Map<String, String>? = variantData.javaCompileOptions.annotationProcessorOptions.arguments
|
||||||
|
|
||||||
|
override fun wireKaptTask(project: Project, task: KaptTask, kotlinTask: KotlinCompile, javaTask: AbstractCompile) {
|
||||||
|
task.dependsOn(kotlinTask.dependsOn.minus(task))
|
||||||
|
|
||||||
|
val kaptSourceOutput = project.fileTree(task.destinationDir).builtBy(task)
|
||||||
|
variantData.registerExternalAptJavaOutput(kaptSourceOutput)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun wrapVariantData(variantData: BaseVariant): WrappedVariantData<BaseVariant> = WrappedVariant(variantData)
|
||||||
}
|
}
|
||||||
+17
-8
@@ -44,6 +44,14 @@ class Kapt3GradleSubplugin : Plugin<Project> {
|
|||||||
override fun apply(project: Project) {}
|
override fun apply(project: Project) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class WrappedVariantData<T>(val variantData: T) {
|
||||||
|
abstract val name: String
|
||||||
|
abstract val sourceProviders: Iterable<SourceProvider>
|
||||||
|
abstract fun addJavaSourceFoldersToModel(generatedFilesDir: File)
|
||||||
|
abstract val annotationProcessorOptions: Map<String, String>?
|
||||||
|
abstract fun wireKaptTask(project: Project, task: KaptTask, kotlinTask: KotlinCompile, javaTask: AbstractCompile)
|
||||||
|
}
|
||||||
|
|
||||||
// Subplugin for the Kotlin Gradle plugin
|
// Subplugin for the Kotlin Gradle plugin
|
||||||
class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -131,7 +139,7 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val sourceSetName = if (variantData != null) {
|
val sourceSetName = if (variantData != null) {
|
||||||
for (provider in (variantData as BaseVariantData<*>).sourceProviders) {
|
for (provider in (variantData as WrappedVariantData<*>).sourceProviders) {
|
||||||
handleSourceSet((provider as AndroidSourceSet).name)
|
handleSourceSet((provider as AndroidSourceSet).name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +175,7 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
|
|
||||||
val generatedFilesDir = getKaptGeneratedDir(project, sourceSetName)
|
val generatedFilesDir = getKaptGeneratedDir(project, sourceSetName)
|
||||||
if (variantData != null) {
|
if (variantData != null) {
|
||||||
(variantData as BaseVariantData<*>).addJavaSourceFoldersToModel(generatedFilesDir)
|
(variantData as WrappedVariantData<*>).addJavaSourceFoldersToModel(generatedFilesDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
pluginOptions += SubpluginOption("aptMode", aptMode)
|
pluginOptions += SubpluginOption("aptMode", aptMode)
|
||||||
@@ -195,15 +203,17 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val androidOptions = if (variantData != null)
|
val androidOptions = if (variantData != null)
|
||||||
AndroidGradleWrapper.getAnnotationProcessorOptionsFromAndroidVariant(variantData) ?: emptyMap()
|
(variantData as WrappedVariantData<*>).annotationProcessorOptions ?: emptyMap()
|
||||||
else
|
else
|
||||||
emptyMap()
|
emptyMap()
|
||||||
|
|
||||||
kotlinSourcesOutputDir.mkdirs()
|
kotlinSourcesOutputDir.mkdirs()
|
||||||
|
|
||||||
val apOptions = kaptExtension.getAdditionalArguments(project, variantData, androidPlugin) +
|
val apOptions = kaptExtension.getAdditionalArguments(
|
||||||
androidOptions +
|
project,
|
||||||
mapOf("kapt.kotlin.generated" to kotlinSourcesOutputDir.absolutePath)
|
(variantData as WrappedVariantData<*>).variantData,
|
||||||
|
androidPlugin
|
||||||
|
) + androidOptions + mapOf("kapt.kotlin.generated" to kotlinSourcesOutputDir.absolutePath)
|
||||||
|
|
||||||
pluginOptions += SubpluginOption("apoptions", encodeOptions(apOptions))
|
pluginOptions += SubpluginOption("apoptions", encodeOptions(apOptions))
|
||||||
|
|
||||||
@@ -272,10 +282,9 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
|
|
||||||
kaptTask.dependsOn(kaptGenerateStubsTask)
|
kaptTask.dependsOn(kaptGenerateStubsTask)
|
||||||
kotlinCompile.dependsOn(kaptTask)
|
kotlinCompile.dependsOn(kaptTask)
|
||||||
|
(variantData as WrappedVariantData<*>).wireKaptTask(project, kaptTask, kotlinCompile, javaCompile)
|
||||||
|
|
||||||
// Add generated source dir as a source root for kotlinCompile and javaCompile
|
|
||||||
kotlinCompile.source(sourcesOutputDir, kotlinSourcesOutputDir)
|
kotlinCompile.source(sourcesOutputDir, kotlinSourcesOutputDir)
|
||||||
javaCompile.source(sourcesOutputDir)
|
|
||||||
|
|
||||||
buildAndAddOptionsTo(kaptTask.pluginOptions, aptMode = "apt")
|
buildAndAddOptionsTo(kaptTask.pluginOptions, aptMode = "apt")
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-11
@@ -22,11 +22,8 @@ import org.gradle.api.tasks.compile.JavaCompile
|
|||||||
import org.jetbrains.kotlin.com.intellij.openapi.util.io.FileUtil
|
import org.jetbrains.kotlin.com.intellij.openapi.util.io.FileUtil
|
||||||
import org.jetbrains.kotlin.com.intellij.openapi.util.text.StringUtil.compareVersionNumbers
|
import org.jetbrains.kotlin.com.intellij.openapi.util.text.StringUtil.compareVersionNumbers
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
|
||||||
import org.jetbrains.kotlin.gradle.internal.AnnotationProcessingManager
|
import org.jetbrains.kotlin.gradle.internal.*
|
||||||
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin
|
|
||||||
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin
|
|
||||||
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin.Companion.getKaptClasssesDir
|
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin.Companion.getKaptClasssesDir
|
||||||
import org.jetbrains.kotlin.gradle.internal.initKapt
|
|
||||||
import org.jetbrains.kotlin.gradle.tasks.*
|
import org.jetbrains.kotlin.gradle.tasks.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion
|
import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion
|
||||||
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
||||||
@@ -378,7 +375,6 @@ abstract class AbstractAndroidProjectHandler<V>(private val kotlinConfigurationT
|
|||||||
|
|
||||||
protected val KotlinCompile.annotationsFile: File? get() = kaptOptions.annotationsFile
|
protected val KotlinCompile.annotationsFile: File? get() = kaptOptions.annotationsFile
|
||||||
protected fun KotlinCompile.setJavaOutput(file: File) { javaOutputDir = file }
|
protected fun KotlinCompile.setJavaOutput(file: File) { javaOutputDir = file }
|
||||||
protected fun AbstractCompile.appendClasspath(file: File) = appendClasspathDynamically(file)
|
|
||||||
|
|
||||||
protected val logger = Logging.getLogger(this.javaClass)
|
protected val logger = Logging.getLogger(this.javaClass)
|
||||||
|
|
||||||
@@ -406,6 +402,8 @@ abstract class AbstractAndroidProjectHandler<V>(private val kotlinConfigurationT
|
|||||||
kotlinTask: KotlinCompile,
|
kotlinTask: KotlinCompile,
|
||||||
kotlinAfterJavaTask: KotlinCompile?)
|
kotlinAfterJavaTask: KotlinCompile?)
|
||||||
|
|
||||||
|
protected abstract fun wrapVariantData(variantData: V): WrappedVariantData<V>
|
||||||
|
|
||||||
fun handleProject(project: Project) {
|
fun handleProject(project: Project) {
|
||||||
val ext = project.extensions.getByName("android") as BaseExtension
|
val ext = project.extensions.getByName("android") as BaseExtension
|
||||||
val aptConfigurations = hashMapOf<String, Configuration>()
|
val aptConfigurations = hashMapOf<String, Configuration>()
|
||||||
@@ -492,9 +490,6 @@ abstract class AbstractAndroidProjectHandler<V>(private val kotlinConfigurationT
|
|||||||
removeAnnotationProcessingPluginClasspathEntry(kotlinTask)
|
removeAnnotationProcessingPluginClasspathEntry(kotlinTask)
|
||||||
}
|
}
|
||||||
|
|
||||||
val appliedPlugins = subpluginEnvironment.addSubpluginOptions(
|
|
||||||
project, kotlinTask, javaTask, variantData, null)
|
|
||||||
|
|
||||||
var kotlinAfterJavaTask: KotlinCompile? = null
|
var kotlinAfterJavaTask: KotlinCompile? = null
|
||||||
|
|
||||||
if (javaTask is JavaCompile && aptFiles.isNotEmpty() && !isKapt3Enabled) {
|
if (javaTask is JavaCompile && aptFiles.isNotEmpty() && !isKapt3Enabled) {
|
||||||
@@ -513,13 +508,16 @@ abstract class AbstractAndroidProjectHandler<V>(private val kotlinConfigurationT
|
|||||||
configureSources(task, variantData)
|
configureSources(task, variantData)
|
||||||
}
|
}
|
||||||
|
|
||||||
appliedPlugins.flatMap { it.getSubpluginKotlinTasks(project, kotlinTask) }
|
|
||||||
.forEach { configureSources(it, variantData) }
|
|
||||||
|
|
||||||
wireKotlinTasks(project, androidPlugin, androidExt, variantData, javaTask,
|
wireKotlinTasks(project, androidPlugin, androidExt, variantData, javaTask,
|
||||||
kotlinTask, kotlinAfterJavaTask)
|
kotlinTask, kotlinAfterJavaTask)
|
||||||
|
|
||||||
configureMultiProjectIc(project, variantData, javaTask, kotlinTask, kotlinAfterJavaTask)
|
configureMultiProjectIc(project, variantData, javaTask, kotlinTask, kotlinAfterJavaTask)
|
||||||
|
|
||||||
|
val appliedPlugins = subpluginEnvironment.addSubpluginOptions(
|
||||||
|
project, kotlinTask, javaTask, wrapVariantData(variantData), null)
|
||||||
|
|
||||||
|
appliedPlugins.flatMap { it.getSubpluginKotlinTasks(project, kotlinTask) }
|
||||||
|
.forEach { configureSources(it, variantData) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun configureSources(compileTask: AbstractCompile, variantData: V) {
|
private fun configureSources(compileTask: AbstractCompile, variantData: V) {
|
||||||
|
|||||||
+23
@@ -9,6 +9,8 @@ import com.android.builder.model.SourceProvider
|
|||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.ProjectConfigurationException
|
import org.gradle.api.ProjectConfigurationException
|
||||||
import org.gradle.api.tasks.compile.AbstractCompile
|
import org.gradle.api.tasks.compile.AbstractCompile
|
||||||
|
import org.jetbrains.kotlin.gradle.internal.KaptTask
|
||||||
|
import org.jetbrains.kotlin.gradle.internal.WrappedVariantData
|
||||||
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
||||||
@@ -103,4 +105,25 @@ internal class LegacyAndroidAndroidProjectHandler(kotlinConfigurationTools: Kotl
|
|||||||
|
|
||||||
private val BaseVariantData<*>.sourceProviders: List<SourceProvider>
|
private val BaseVariantData<*>.sourceProviders: List<SourceProvider>
|
||||||
get() = variantConfiguration.sortedSourceProviders
|
get() = variantConfiguration.sortedSourceProviders
|
||||||
|
|
||||||
|
private inner class WrappedLegacyVariantData(variantData: BaseVariantData<out BaseVariantOutputData>)
|
||||||
|
: WrappedVariantData<BaseVariantData<out BaseVariantOutputData>>(variantData) {
|
||||||
|
|
||||||
|
override val name: String = variantData.name
|
||||||
|
override val sourceProviders: Iterable<SourceProvider> = getSourceProviders(variantData)
|
||||||
|
override fun addJavaSourceFoldersToModel(generatedFilesDir: File) =
|
||||||
|
addJavaSourceDirectoryToVariantModel(variantData, generatedFilesDir)
|
||||||
|
|
||||||
|
override val annotationProcessorOptions: Map<String, String>? =
|
||||||
|
AndroidGradleWrapper.getAnnotationProcessorOptionsFromAndroidVariant(variantData)
|
||||||
|
|
||||||
|
override fun wireKaptTask(project: Project, task: KaptTask, kotlinTask: KotlinCompile, javaTask: AbstractCompile) {
|
||||||
|
task.dependsOn(*(javaTask.dependsOn.filter { it !== kotlinTask }.toTypedArray()))
|
||||||
|
javaTask.source(task.destinationDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun wrapVariantData(variantData: BaseVariantData<out BaseVariantOutputData>)
|
||||||
|
: WrappedVariantData<BaseVariantData<out BaseVariantOutputData>> =
|
||||||
|
WrappedLegacyVariantData(variantData)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user