Implementing workaround for not being able to set java task classpath statically and therefore making it unable to detect changes in kotlin classes

KT-8487
This commit is contained in:
Ilya Chernikov
2016-01-27 09:24:32 +01:00
committed by Alexey Tsvetkov
parent df63fc30f6
commit ddf3ca276b
2 changed files with 21 additions and 0 deletions
@@ -62,6 +62,8 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments>() : AbstractCo
var kotlinOptions: T = createBlankArgs()
var kotlinDestinationDir: File? = destinationDir
var compilerCalled: Boolean = false
// TODO: consider more reliable approach (see usage)
var anyClassesCompiled: Boolean = false
private val loggerInstance = Logging.getLogger(this.javaClass)
override fun getLogger() = loggerInstance
@@ -361,6 +363,8 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
fun outputRelativePath(f: File) = f.toRelativeString(outputDir)
anyClassesCompiled = false
// TODO: decide what to do if no files are considered dirty - rebuild or skip the module
var (sourcesToCompile, isIncrementalDecided) = calculateSourcesToCompile()
@@ -450,6 +454,9 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
lookupStorage.flush(false)
lookupStorage.close()
caches.values.forEach { it.flush(false); it.close() }
if (allGeneratedFiles.isNotEmpty()) {
anyClassesCompiled = true
}
}
private data class CompileChangedResults(val exitCode: ExitCode, val generatedFiles: List<GeneratedFile<TargetId>>)
@@ -133,6 +133,20 @@ class Kotlin2JvmSourceSetProcessor(
val javaTask = project.tasks.findByName(sourceSet.compileJavaTaskName) as AbstractCompile?
if (javaTask != null) {
// Since we cannot update classpath statically, java not able to detect changes in the classpath after kotlin compiler.
// Therefore this (probably inefficient since java cannot decide "uptodateness" by the list of changed class files, but told
// explicitly being out of date whenever any kotlin files are compiled
kotlinTask.property("anyClassesCompiled")?.let {
kotlinTask.setProperty("anyClassesCompiled", false)
javaTask.outputs.upToDateWhen { task ->
val kotlinClassesCompiled = kotlinTask.property("anyClassesCompiled") as? Boolean ?: false
if (kotlinClassesCompiled) {
logger.info("Marking $task out of date, because kotlin classes are changed")
}
!kotlinClassesCompiled
}
}
javaTask.dependsOn(kotlinTaskName)
javaTask.doFirst {
javaTask.classpath += project.files(kotlinDestinationDir)