Gradle plugin: do not store generated folder for android into sourceSets, because they are reused for different buildTypes and flavors

#KT-8202 Fixed #KT-9715 Fixed
This commit is contained in:
Natalia Ukhorskaya
2015-10-26 16:37:13 +03:00
parent 10eed8f7cd
commit e83315f5bc
2 changed files with 31 additions and 25 deletions
@@ -10,8 +10,8 @@ import org.gradle.api.GradleException
import org.gradle.api.file.SourceDirectorySet import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.api.tasks.SourceTask import org.gradle.api.tasks.SourceTask
import java.util.HashSet
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.compile.AbstractCompile
import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLICompiler
@@ -26,13 +26,8 @@ import org.jetbrains.kotlin.cli.js.K2JSCompiler
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.utils.LibraryUtils import org.jetbrains.kotlin.utils.LibraryUtils
import org.gradle.api.file.FileCollection
import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.org.objectweb.asm.ClassWriter
import java.io.IOException
import java.lang.ref.WeakReference
import java.io.File import java.io.File
import java.util.*
val DEFAULT_ANNOTATIONS = "org.jebrains.kotlin.gradle.defaultAnnotations" val DEFAULT_ANNOTATIONS = "org.jebrains.kotlin.gradle.defaultAnnotations"
@@ -102,7 +97,8 @@ public open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments
override val compiler = K2JVMCompiler() override val compiler = K2JVMCompiler()
override fun createBlankArgs(): K2JVMCompilerArguments = K2JVMCompilerArguments() override fun createBlankArgs(): K2JVMCompilerArguments = K2JVMCompilerArguments()
val srcDirsSources = HashSet<SourceDirectorySet>() // Should be SourceDirectorySet or File
val srcDirsSources = HashSet<Any>()
override fun populateTargetSpecificArgs(args: K2JVMCompilerArguments) { override fun populateTargetSpecificArgs(args: K2JVMCompilerArguments) {
// show kotlin compiler where to look for java source files // show kotlin compiler where to look for java source files
@@ -178,30 +174,43 @@ public open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments
} }
} }
// override setSource to track source directory sets // override setSource to track source directory sets and files (for generated android folders)
override fun setSource(source: Any?) { override fun setSource(source: Any?) {
srcDirsSources.clear() srcDirsSources.clear()
if (source is SourceDirectorySet) { if (source is SourceDirectorySet) {
srcDirsSources.add(source) srcDirsSources.add(source)
} }
else if (source is File) {
srcDirsSources.add(source)
}
super.setSource(source) super.setSource(source)
} }
// override source to track source directory sets // override source to track source directory sets and files (for generated android folders)
override fun source(vararg sources: Any?): SourceTask? { override fun source(vararg sources: Any?): SourceTask? {
for (source in sources) { for (source in sources) {
if (source is SourceDirectorySet) { if (source is SourceDirectorySet) {
srcDirsSources.add(source) srcDirsSources.add(source)
} }
else if (source is File) {
srcDirsSources.add(source)
}
} }
return super.source(sources) return super.source(sources)
} }
fun findSrcDirRoot(file: File): File? { fun findSrcDirRoot(file: File): File? {
for (source in srcDirsSources) { for (source in srcDirsSources) {
for (root in source.getSrcDirs()) { if (source is SourceDirectorySet) {
if (FileUtil.isAncestor(root, file, false)) { for (root in source.getSrcDirs()) {
return root if (FileUtil.isAncestor(root, file, false)) {
return root
}
}
}
else if (source is File) {
if (FileUtil.isAncestor(source, file, false)) {
return source
} }
} }
} }
@@ -374,18 +374,6 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
} }
} }
fun configureDefaultSourceSet() {
val defaultSourceSet = variantData.getVariantConfiguration().getDefaultSourceSet()
val kotlinSourceDirectorySet = getExtension<KotlinSourceSet>(defaultSourceSet, "kotlin").getKotlin()
// 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 = variantData.getJavaSources().filterIsInstance(javaClass<File>())
kotlinSourceDirectorySet.addSourceDirectories(additionalSourceFiles)
}
configureDefaultSourceSet()
val aptFiles = arrayListOf<File>() val aptFiles = arrayListOf<File>()
// getSortedSourceProviders should return only actual java sources, generated sources should be collected earlier // getSortedSourceProviders should return only actual java sources, generated sources should be collected earlier
@@ -405,6 +393,15 @@ 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 = variantData.getJavaSources().filterIsInstance(javaClass<File>())
for (file in additionalSourceFiles) {
kotlinTask.source(file)
logger.kotlinDebug("Source directory with generated files ${file.getAbsolutePath()} was added to kotlin source for $kotlinTaskName")
}
subpluginEnvironment.addSubpluginArguments(project, kotlinTask) subpluginEnvironment.addSubpluginArguments(project, kotlinTask)
kotlinTask doFirst { kotlinTask doFirst {