From d55a8f8054725db5c6ad828bb0a9b9fc9972b850 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 22 Jul 2016 21:05:25 +0300 Subject: [PATCH] Refactor source configuration for android --- .../internal/AnnotationProcessingManager.kt | 18 ++++--- .../kotlin/gradle/plugin/KotlinPlugin.kt | 50 +++++++++---------- .../android/AndroidGradleWrapper.groovy | 14 +++++- 3 files changed, 47 insertions(+), 35 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt index c711981e09f..e6cc8162e20 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt @@ -54,6 +54,8 @@ fun Project.initKapt( kotlinTask.destinationDir = stubsDir kotlinTask.kaptOptions.generateStubs = true + kotlinAfterJavaTask.source(kaptManager.generatedKotlinSourceDir) + kotlinAfterJavaTask.source(kaptManager.aptOutputDir) val javaDestinationDir = project.files(javaTask.destinationDir) javaTask.doLast { kotlinAfterJavaTask.source(kotlinTask.source) @@ -80,7 +82,6 @@ fun Project.initKapt( kotlinTask.doFirst { kaptManager.generateJavaHackFile() - kotlinAfterJavaTask?.source(kaptManager.getGeneratedKotlinSourceDir()) } var originalJavaCompilerArgs: List? = null @@ -88,7 +89,7 @@ fun Project.initKapt( originalJavaCompilerArgs = (javaTask as JavaCompile).options.compilerArgs kaptManager.setupKapt() kaptManager.generateJavaHackFile() - kotlinAfterJavaTask?.source(kaptManager.getGeneratedKotlinSourceDir()) + kotlinAfterJavaTask?.source(kaptManager.generatedKotlinSourceDir) } javaTask.doLast { @@ -148,11 +149,12 @@ public class AnnotationProcessingManager( return File(wrappersDirectory, "annotations.$taskQualifier.txt") } - fun getGeneratedKotlinSourceDir(): File { - val kotlinGeneratedDir = File(aptWorkingDir, "kotlinGenerated") - if (!kotlinGeneratedDir.exists()) kotlinGeneratedDir.mkdirs() - return kotlinGeneratedDir - } + val generatedKotlinSourceDir: File + get() { + val kotlinGeneratedDir = File(aptWorkingDir, "kotlinGenerated") + if (!kotlinGeneratedDir.exists()) kotlinGeneratedDir.mkdirs() + return kotlinGeneratedDir + } fun setupKapt() { if (aptFiles.isEmpty()) return @@ -207,7 +209,7 @@ public class AnnotationProcessingManager( private fun appendAnnotationsArguments() { javaTask.modifyCompilerArguments { list -> list.add("-Akapt.annotations=" + getAnnotationFile()) - list.add("-Akapt.kotlin.generated=" + getGeneratedKotlinSourceDir()) + list.add("-Akapt.kotlin.generated=" + generatedKotlinSourceDir) } } 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 a4bfb28937b..37443d8aa67 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 @@ -372,25 +372,9 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand kotlinTask.description = "Compiles the ${variantDataName} kotlin." kotlinTask.setDependsOn(javaTask.dependsOn) - fun SourceDirectorySet.addSourceDirectories(additionalSourceFiles: Collection) { - for (dir in additionalSourceFiles) { - this.srcDir(dir) - logger.kotlinDebug("Source directory ${dir.absolutePath} was added to kotlin source for $kotlinTaskName") - } - } - val aptFiles = arrayListOf() - // getSortedSourceProviders should return only actual java sources, generated sources should be collected earlier - val providers = variantData.variantConfiguration.sortedSourceProviders - for (provider in providers) { - val javaSrcDirs = AndroidGradleWrapper.getJavaSrcDirs(provider as AndroidSourceSet) - val kotlinSourceSet = getExtension(provider, "kotlin") - val kotlinSourceDirectorySet = kotlinSourceSet.getKotlin() - kotlinTask.source(kotlinSourceDirectorySet) - - kotlinSourceDirectorySet.addSourceDirectories(javaSrcDirs) - + for (provider in variantData.sourceProviders) { val aptConfiguration = aptConfigurations[(provider as AndroidSourceSet).name] // Ignore if there's only an annotation processor wrapper in dependencies (added by default) if (aptConfiguration != null && aptConfiguration.dependencies.size > 1) { @@ -399,15 +383,6 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand } } - // getJavaSources should return the Java sources used for compilation - // We want to collect only generated files, like R-class output dir - // Actual java sources will be collected later - val additionalSourceFiles = AndroidGradleWrapper.getGeneratedSourceDirs(variantData) - for (file in additionalSourceFiles) { - kotlinTask.source(file) - logger.kotlinDebug("Source directory with generated files ${file.absolutePath} was added to kotlin source for $kotlinTaskName") - } - subpluginEnvironment.addSubpluginArguments(project, kotlinTask) // should not be evaluated until right before compileKotlin evaluation since android can change @@ -435,11 +410,34 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager, variantDataName, kotlinOptions, subpluginEnvironment, tasksProvider) } + configureSources(kotlinTask, variantData) + if (kotlinAfterJavaTask != null) { + configureSources(kotlinAfterJavaTask, variantData) + } + configureJavaTask(kotlinTask, javaTask, kotlinAfterJavaTask, logger) createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, variantDataName) } } + private fun configureSources(kotlinTask: KotlinCompile, variantData: BaseVariantData) { + val logger = kotlinTask.project.logger + + for (provider in variantData.sourceProviders) { + val kotlinSourceSet = getExtension(provider, "kotlin") + val kotlinSourceDirectorySet = kotlinSourceSet.getKotlin() + kotlinTask.source(kotlinSourceDirectorySet) + } + + for (javaSrcDir in AndroidGradleWrapper.getJavaSources(variantData)) { + kotlinTask.source(javaSrcDir) + logger.kotlinDebug("Source directory $javaSrcDir was added to kotlin source for ${kotlinTask.name}") + } + } + + private val BaseVariantData<*>.sourceProviders: List + get() = variantConfiguration.sortedSourceProviders + fun getExtension(obj: Any, extensionName: String): T { if (obj is ExtensionAware) { val result = obj.extensions.findByName(extensionName) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy index 2f170f9350f..bb0b0dd399a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy @@ -8,6 +8,8 @@ import com.android.build.gradle.api.BaseVariant import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.VariantManager import com.android.build.gradle.internal.variant.BaseVariantData +import com.android.builder.model.SourceProvider +import org.gradle.api.file.ConfigurableFileTree import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.util.PatternFilterable @@ -100,14 +102,24 @@ class AndroidGradleWrapper { return plugin.getVariantManager() } - static def List getGeneratedSourceDirs(BaseVariantData variantData) { + static def List getJavaSources(BaseVariantData variantData) { def result = new ArrayList() def getJavaSourcesMethod = variantData.getMetaClass().getMetaMethod("getJavaSources") if (getJavaSourcesMethod.returnType.metaClass == Object[].metaClass) { result.addAll(variantData.getJavaSources().findAll { it instanceof File }) } + else if (getJavaSourcesMethod.returnType.metaClass == List.metaClass) { + def fileTrees = variantData.getJavaSources().findAll { it instanceof ConfigurableFileTree } + result.addAll(fileTrees.collect { it.getDir() }) + } else { + // Old impl copied from android tools source. Delete? + List providers = variantData.variantConfiguration.getSortedSourceProviders(); + for (SourceProvider provider : providers) { + result.addAll((provider as AndroidSourceSet).getJava().getSourceDirectoryTrees()); + } + if (variantData.scope.getGenerateRClassTask() != null) { result.add(variantData.scope.getRClassSourceOutputDir()); }